Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

core, eth, les, trie: add a prefix to contract code #21080

Merged
merged 1 commit into from
Aug 21, 2020

Conversation

rjl493456442
Copy link
Member

@rjl493456442 rjl493456442 commented May 14, 2020

This PR adds a prefix for contract code in leveldb.

core/rawdb/schema.go Outdated Show resolved Hide resolved
@rjl493456442
Copy link
Member Author

@holiman @karalabe The PR is updated, please take another look!

core/rawdb/accessors_indexes_test.go Show resolved Hide resolved
eth/handler.go Outdated
Comment on lines 613 to 617
entry, err := pm.blockchain.TrieNode(hash)
if len(entry) == 0 || err != nil {
entry, err = pm.blockchain.ContractCode(hash)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit awkward. The TrieNode(hash) will:

  1. Check cleans[hash],
  2. check dirty[hash]
  3. and finally rawdb.ReadTrieNode(hash), which does db.Get(hash.Bytes())

Then we come to `ContractCode(hash), which will :

  1. Check cleans[hash],
  2. check codes[hash] ,
  3. and finally rawdb.ReadCode(db.diskdb, hash), which will do
    a) db.Get(hash) followed by
    b) db.Get(prefix .. hash).

This means that we'll do 3 separate disk-lookups for code that is stored in the new format. Those will be cached in cleans, but if someone is requesting a state entry we don't have, we'll do three disk lookups before we can say "sorry, don't have it".

There's got to be some better way of doing this, perhaps by having something which semantically means pm.blockchain.ContractCode-please-But-Dont-Bother-Look-it-up-Up-As-A-TrieNode_kthxbye

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To follow up on this, can e.g. pm.blockchain.ContractCode take a boolean to indicate whether it should also consult the non-prefixed data?

Copy link
Member Author

@rjl493456442 rjl493456442 Jul 14, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this case, we need a background upgrader to convert the original scheme.
If it's done, then we don't need to consult the non-prefixed at all.

So here is a tradeOff.

  • Should we implement the upgrade path?
  • In this API, the possibility of retrieving code with 3 db reads is quite low
    • I guess 90% APIs are used to retrieve trie nodes
    • I guess 99% APIs will only need 1 read for retrieving codes(with no prefix)(It's hitted by rawdb.ReadTrieNode)
  • But in order to reach our final goal(prefix the code, we need the upgrader anyway

How should we implement the upgrader?

  • User needs to activate the snapshot(for state iteration)
  • Iterate the snapshot, convert all non-prefixed code with new scheme

Can we do it now?

  • Snapshot is not enabled by default
  • Snapshot relevant code is not 100% production ready

Should we postpone this PR?

  • This PR separates the code, but in practice, it's noop, no legacy data will be converted(missing upgrader)
  • All code will be retrieved back by rawdb.ReadTrieNode

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • This PR separates the code, but in practice, it's noop, no legacy data will be converted(missing upgrader)

I disagree. From time to time, node operators do a full resync, if nothing else than because it cleans out some data. That means those users will be upgraded 100% to the new scheme

@holiman
Copy link
Contributor

holiman commented Jun 22, 2020

I ran this on goerli just quickly, and cancelled it, it ended on this note:

INFO [06-22|14:56:48.789] Persisted trie from memory database      nodes=2866  size=1.10MiB  time=31.949995ms  gcnodes=0     gcsize=0.00B    gctime=0s           livenodes=6951 livesize=2.40MiB
INFO [06-22|14:56:48.805] Blockchain stopped 
WARN [06-22|14:56:48.805] tx iteration error                       error="unexpected EOF"
WARN [06-22|14:56:48.805] tx iteration error                       error="unexpected EOF"
WARN [06-22|14:56:48.805] tx iteration error                       error="unexpected EOF"
WARN [06-22|14:56:48.805] tx iteration error                       error="unexpected EOF"
WARN [06-22|14:56:48.805] tx iteration error                       error="unexpected EOF"
WARN [06-22|14:56:48.805] tx iteration error                       error="unexpected EOF"
CRIT [06-22|14:56:48.805] Failed writing batch to db               error="leveldb: closed"

@rjl493456442
Copy link
Member Author

@holiman Geth seems is indexing the transactions(seems we find nil block body)

@holiman
Copy link
Contributor

holiman commented Jun 22, 2020

Ah, so I guess we left that out of the shutdown sequence, somehow. And if we shut the db down, things start failing, and we eventually exit on a log.Crit :/

@holiman
Copy link
Contributor

holiman commented Jun 22, 2020

Yeah,

				go indexBlocks(rawdb.ReadTxIndexTail(bc.db), head.Block.NumberU64(), done)

We never add this to any waitgroup

trie/database.go Outdated
code = rawdb.ReadCode(db.diskdb, hash)
if len(code) > 0 {
if db.cleans != nil {
db.cleans.Set(hash[:], code)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting question: If we want to separate code and state, should we use the un-prefixed hash as storage key for cleans? A couple of variants:

  1. Yes, store by hash in cleans (what this PR does)
  2. No, store prefixed in cleans.
  3. No don't store code in cleans at all

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's fine to use the un-prefixed hash.
The reason is even there are two same code and trie node, the hash is same and they are mapped into the same entry, it's fine since the content is correct.

The main issue for mixing the code and trie node is: it can interrupt the fast sync if we accidentally sync the code with same hash as the non-retrieved-node.

But it's ok here.

code := common.BytesToHash(account.CodeHash)
if code != emptyCode {
s.db.TrieDB().Reference(code, parent)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you deliberately remove the code from GC? If yes, shouldn't we skip triedb.InsertCode altogether and just drop it into the database?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, contract code garbage collection only makes sense if the code can be changed but it's not allowed in the protocol level? So for all codes we can blindly insert them.

shouldn't we skip triedb.InsertCode altogether

Let me see how to do it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, contract code garbage collection only makes sense if the code can be changed but it's not allowed in the protocol level? So for all codes we can blindly insert them.

I'm not sure if it is in the interest of the GC, but with a mix of CREATE2 and SELFDESTRUCT the code for a specific address can be changed.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but with a mix of CREATE2 and SELFDESTRUCT the code for a specific address can be changed.

Right, but it doesn't matter -- in those cases we'll store an old code unnecessarily, even though no active state references it.

trie/database.go Outdated Show resolved Hide resolved
trie/database.go Outdated Show resolved Hide resolved
core/rawdb/schema.go Outdated Show resolved Hide resolved
queue *prque.Prque // Priority queue with the pending requests
bloom *SyncBloom // Bloom filter for fast node existence checks
bloom *SyncBloom // Bloom filter for fast state existence checks
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The bloom filter is shared by trieNode and contractCode.

// If we're already requesting this node, add a new reference and stop
if old, ok := s.requests[req.hash]; ok {
if old, ok := reqset[req.hash]; ok {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

De-duplication will use the corresponding set.

trie/sync.go Outdated
// Bloom filter says this might be a duplicate, double check.
// If database says yes, no matter it's contract code, legacy
// contract code or trie node, the blob is present.
if blob := rawdb.ReadCode(s.database, hash); len(blob) > 0 {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to check the database with rawdb.ReadCodeWithNewFormat()

eth/handler.go Outdated
// separate these two types.
entry, err := pm.blockchain.TrieNode(hash)
if len(entry) == 0 || err != nil {
entry, err = pm.blockchain.ContractCode(hash)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can use rawdb.ReadContractWithNewFormat().

Copy link
Contributor

@holiman holiman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor nitpick, but LGTM. Will do some more testing before I thumb it up

@@ -47,10 +47,17 @@ func ReadCode(db ethdb.KeyValueReader, hash common.Hash) []byte {
// todo(rjl493456442) change the order when we forcibly upgrade the code
// scheme with snapshot.
data, _ := db.Get(hash[:])
if len(data) == 0 {
data, _ = db.Get(codeKey(hash))
if len(data) != 0 {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick:

if data,_ ;= db.Get(hash[:]); len(data) >0{
    return data
}
return ReadCodeWithPrefix(db, hash)

Copy link
Contributor

@holiman holiman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@holiman
Copy link
Contributor

holiman commented Aug 19, 2020

Some scenarios:

update in the middle of fast-sync

When a previous version is stopped during fast-sync, and we resume the fast-sync with this PR, this happens:

WARN [08-19|10:06:52.937] Upgrade blockchain database version      from=7 to=8

However, if we do this, it means that it's possible that clients have some code prefixed, and some code non-prefixed. Will this be a problem?

reverting in the middle of fast-sync

Going the other direction, this happens:

Fatal: Failed to register the Ethereum service: database version is v8, Geth 1.9.20-unstable only supports v7

Which is correct.

@karalabe
Copy link
Member

However, if we do this, it means that it's possible that clients have some code prefixed, and some code non-prefixed. Will this be a problem?

No, all code dug deep enough that we won't refetch them will just live on as a trie node and get pulled up by the fallback mechanism when the EVM tries to access it. All code that's on the boundary of the restarted fast sync will get downloaded again.

@holiman
Copy link
Contributor

holiman commented Aug 20, 2020

Synced fine
Screenshot_2020-08-20 Dual Geth - Grafana

Started at ~10:15am, done at ~17 on both machines

@rjl493456442
Copy link
Member Author

@holiman do we have any statistic about the size of contract code and trie nodes :P

@holiman
Copy link
Contributor

holiman commented Aug 20, 2020

Courtesy of @karalabe

DATABASE CATEGORY SIZE
Key-Value store Headers 43.28 MiB
Key-Value store Bodies 3.02 GiB
Key-Value store Receipts 3.24 GiB
Key-Value store Difficulties 5.14 MiB
Key-Value store Block number->hash 4.28 MiB
Key-Value store Block hash->number 418.24 MiB
Key-Value store Transaction index 27.06 GiB
Key-Value store Bloombit index 1.62 GiB
Key-Value store Contract codes 1.28 GiB
Key-Value store Trie nodes 61.03 GiB
Key-Value store Trie preimages 65.57 MiB
Key-Value store Account snapshot 0.00 B
Key-Value store Storage snapshot 0.00 B
Key-Value store Clique snapshots 0.00 B
Key-Value store Singleton metadata 151.00 B
Ancient store Headers 4.48 GiB
Ancient store Bodies 96.62 GiB
Ancient store Receipts 43.74 GiB
Ancient store Difficulties 165.13 MiB
Ancient store Block number->hash 384.75 MiB
Light client CHT trie nodes 0.00 B
Light client Bloom trie nodes 0.00 B
TOTAL 243.17 GIB

Copy link
Member

@karalabe karalabe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@karalabe karalabe merged commit 87c0ba9 into ethereum:master Aug 21, 2020
enriquefynn pushed a commit to enriquefynn/go-ethereum that referenced this pull request Mar 10, 2021
flyworker pushed a commit to nebulaai/nbai-node that referenced this pull request Apr 7, 2021
* params: update CHTs for v1.9.19

* params: release Geth v1.9.19

* params: begin v1.9.20 release cycle

* cmd/geth/tests: try to fix spurious travis failure in les tests (#21410)

* cmd/geth/tests: try to fix spurious travis failure in les tests

* cmd/geth: les_test - remove extraneous option during boot

* metrics: make meter updates lock-free (#21446)

* core/state: fixed some comments (#21450)

* build: drop disco, enable groovy on Ubuntu PPAs

* cmd/evm: statet8n output folder + tx hashes on trace filenames (#21406)

* t8ntool: add output basedir

* t8ntool: add txhash to trace filename

* t8ntool: don't default to '.' basedir, allow absolute paths

* core: more detailed metering for reorgs (#21420)

* core: define and test chain rewind corner cases (#21409)

* core: define and test chain reparation cornercases

* core: write up a variety of set-head tests

* core, eth: unify chain rollbacks, handle all the cases

* core: make linter smile

* core: remove commented out legacy code

* core, eth/downloader: fix review comments

* core: revert a removed recovery mechanism

* travis, dockerfile, appveyor, build: bump to Go 1.15

* metrics: zero temp variable in  updateMeter (#21470)

* metrics: zero temp variable in  updateMeter

Previously the temp variable was not updated properly after summing it to count.
This meant we had astronomically high metrics, now we zero out the temp whenever we
sum it onto the snapshot count

* metrics: move temp variable to be aligned, unit tests

Moves the temp variable in MeterSnapshot to be 64-bit aligned because of the atomic bug.
Adds a unit test, that catches the previous bug.

* eth/downloader: fix rollback issue on short chains

* core, eth, les, trie: add a prefix to contract code (#21080)

* core: do less lookups when writing fast-sync block bodies (#21468)

* eth: utilize sync bloom for getNodeData (#21445)

* eth/downloader, eth/handler: utilize sync bloom for getNodeData

* trie: handle if bloom is nil

* trie, downloader: check bloom nilness externally

* core/state/snapshot: reduce disk layer depth during generation

* p2p/discover: avoid dropping unverified nodes when table is almost empty (#21396)

This change improves discovery behavior in small networks. Very small
networks would often fail to bootstrap because all member nodes were
dropping table content due to findnode failure. The check is now changed
to avoid dropping nodes on findnode failure when their bucket is almost
empty. It also relaxes the liveness check requirement for FINDNODE/v4
response nodes, returning unverified nodes as results when there aren't
any verified nodes yet.

The "findnode failed" log now reports whether the node was dropped
instead of the number of results. The value of the "results" was
always zero by definition.

Co-authored-by: Felix Lange <[email protected]>

* core/rawdb: only complain loudly if truncating many items

* graphql: add support for retrieving the chain id (#21451)

* params: update CHTs for v1.9.20 release

* params: release Geth v1.9.20

* params: begin v1.9.21 release cycle

* accounts/abi/bind/backends: Disallow AdjustTime for non-empty blocks (#21334)

* accounts/abi/bind/backends: Disallow timeshift for non-empty blocks

* accounts/abi/bind/backends: added tests for adjust time

* accounts/abi/bind/simulated: added comments, fixed test for AdjustTime

* accounts/abi/bind/backends: updated comment

* core/state, eth, trie: stabilize memory use, fix memory leak

* eth: updated comments (#21490)

* go.mod | goleveldb latest update (#21448)

* go.mod | goleveldb latest update

* go.mod update

* leveldb options

* go.mod: double check

Co-authored-by: Péter Szilágyi <[email protected]>

* eth/tracers: revert reason in call_tracer + error for failed internal calls (#21387)

* tests: add testdata of call tracer

* eth/tracers: return revert reason in call_tracer

* eth/tracers: regenerate assets

* eth/tracers: add error message even if no exec occurrs, fixes #21438

Co-authored-by: Martin Holst Swende <[email protected]>

* rpc: fix issue with null JSON-RPC messages (#21497)

* accounts/abi: fix a bug in getTypeSize method (#21501)

* accounts/abi: fix a bug in getTypeSize method

e.g. for "Tuple[2]" type, the element of the array is a tuple type and the size of the tuple may not be 32.

* accounts/abi: add unit test of getTypeSize method

* internal: fix personal.sign() (#21503)

* "Downloader queue stats" is now provided once per minute (#21455)

* "Downloader queue stats" is now a DEBUG information

I think this info is more a DEBUG related information then an INFO. If it must remains an INFO, maybe it can be slow down to one time every 5 minutes or so.

* Update queue.go

"Downloader queue stats" information is now provided once every minute instead of once every 10 seconds.

* go.mod : update goja dependency (#21432)

* eth/downloader: change intial download size (#21366)

This changes how the downloader works, a little bit. Previously, when block sync started,
we immediately started filling up to 8192 blocks. Usually this is fine, blocks are small
in the early numbers. The threshold then is lowered as we measure the size of the blocks
that are filled.

However, if the node is shut down and restarts syncing while we're in a heavy segment,
that might be bad. This PR introduces a more conservative initial threshold of 2K blocks
instead.

* core, eth, trie: prepare trie sync for path based operation

* eth: added trace_call to trace on top of arbitrary blocks (#21338)

* eth: Added TraceTransactionPending

* eth: Implement Trace_Call, remove traceTxPending

* eth: debug_call -> debug_traceCall, recompute tx environment if pruned

* eth: fix nil panic

* eth: improve block retrieving logic in tracers

* internal/web3ext: add debug_traceCall to console

* accounts: abi/bid/backends; cleaned doc errors, camelCase refactors and anonymous variable assignments (#21514)

Co-authored-by: Osoro Bironga <[email protected]>

* whisper: remove whisper (#21487)

* whisper: remove whisper

* Update cmd/geth/config.go

Co-authored-by: Marius van der Wijden <[email protected]>

* cmd/geth: warn on enabling whisper + remove more whisper deps

* mobile: remove all whisper references

Co-authored-by: Marius van der Wijden <[email protected]>
Co-authored-by: Martin Holst Swende <[email protected]>

* accounts/usbwallet, signer/core: show accounts from ledger legacy derivation paths (#21517)

* accounts/usbwallet, signer/core: un-hide accounts from ledger legacy derivation paths

* Update accounts/usbwallet/wallet.go

* Update signer/core/api.go

* Update signer/core/api.go

* build: remove wnode from the list of packages binaries (#21526)

* .github: remove whisper from CODEOWNERS (#21527)

* params: update CHTs for v1.9.21 release

* params: release Geth v1.9.21

* params: begin v1.9.22 release cycle

* eth/downloader: only roll back light sync if not fully validating

* accounts/abi/bind/backends: reverted some stylistic changes (#21535)

* cmd, eth: offer maxprice flag for overwritting price cap (#21531)

* cmd, eth: offer maxprice flag for overwritting price cap

* eth: rename default price cap

* core/vm: fix benchmark overflow + prep for precompile repricings (#21530)

* core/vm/testdata: add gascost expectations to testcases

* core/vm: verify expected gas in tests for precompiles

* core/vm: fix overflow flaw in gas/s calculation

* go.mod: remove golang.org/x/sync (#21541)

* ethclient: add BlockNumber method (#21500)

This adds a new client method BlockNumber to fetch the most recent
block number of the chain.

* cmd/geth: print warning when whisper config is present in toml (#21544)

* cmd/geth: print warning when whisper config is present in toml

* Update cmd/geth/config.go

Co-authored-by: Martin Holst Swende <[email protected]>

* miner: use channels instead of atomics in update loop (#21536)

This PR changes several different things:

- Adds test cases for the miner loop
- Stops the worker if it wasn't already stopped in worker.Close()
- Uses channels instead of atomics in the miner.update() loop

Co-authored-by: Felix Lange <[email protected]>

* miner: fix regression, add test for starting while download (#21547)

Fixes a regression introduced in #21536

* p2p/discover: fix typo in comments (#21554)

* Dockerfile: unexpose port 8547 as GraphQL was merged into HTTP endpoint (#21556)

* p2p/nodestate: ensure correct callback order (#21436)

This PR adds an extra guarantee to NodeStateMachine: it ensures that all
immediate effects of a certain change are processed before any subsequent
effects of any of the immediate effects on the same node. In the original
version, if a cascaded change caused a subscription callback to be called
multiple times for the same node then these calls might have happened in a
wrong chronological order.

For example:

- a subscription to flag0 changes flag1 and flag2
- a subscription to flag1 changes flag3
- a subscription to flag1, flag2 and flag3 was called in the following order:

   [flag1] -> [flag1, flag3]
   [] -> [flag1]
   [flag1, flag3] -> [flag1, flag2, flag3]

This happened because the tree of changes was traversed in a "depth-first
order". Now it is traversed in a "breadth-first order"; each node has a
FIFO queue for pending callbacks and each triggered subscription callback
is added to the end of the list. The already existing guarantees are
retained; no SetState or SetField returns until the callback queue of the
node is empty again. Just like before, it is the responsibility of the
state machine design to ensure that infinite state loops are not possible.
Multiple changes affecting the same node can still happen simultaneously;
in this case the changes can be interleaved in the FIFO of the node but the
correct order is still guaranteed.

A new unit test is also added to verify callback order in the above scenario.

* js/tracers: make calltracer report value in selfdestructs  (#21549)

* rlp: add SplitUint64 (#21563)

This can be useful when working with raw RLP data.

* les, les/lespay/server: refactor client pool (#21236)

* les, les/lespay/server: refactor client pool

* les: use ns.Operation and sub calls where needed

* les: fixed tests

* les: removed active/inactive logic from peerSet

* les: removed active/inactive peer logic

* les: fixed linter warnings

* les: fixed more linter errors and added missing metrics

* les: addressed comments

* cmd/geth: fixed TestPriorityClient

* les: simplified clientPool state machine

* les/lespay/server: do not use goroutine for balance callbacks

* internal/web3ext: fix addBalance required parameters

* les: removed freeCapacity, always connect at minCapacity initially

* les: only allow capacity change with priority status

Co-authored-by: rjl493456442 <[email protected]>

* eth/tracers: regenerate assets from #21549 (#21564)

* COYPING: restore the full text text of GPL (#21568)

When the license was added to the repository, its text was changed (some
sections at the end removed) and, worse, the authors of go-ethereum
tried to claim copyright on the license text.

The correct way to apply GPL to a project is to copy it verbatim.
This change reverts the text of the GPL to the original.

* core/rawdb: single point of maintenance for writing and deleting tx lookup indexes (#21480)

* ethclient: fix BlockNumber (#21565)

It didn't actually work because it called a method that doesn't
exist. This fixes it also adds a test.

Co-authored-by: Felix Lange <[email protected]>

* params: allow setting Petersburg block before chain head (#21473)

* Allow setting PetersburgBlock before chainhead

if it is at the same block as ConstantinopleBlock

* Add a negative test

* les/lespay/server: bump database version (#21571)

* tests/fuzzers/abi: add fuzzer for fuzzing package accounts/abi (#21217)

* tests/fuzzers/abi: added abi fuzzer

* accounts/abi: fixed issues found by fuzzing

* tests/fuzzers/abi: update fuzzers, added repro test

* tests/fuzzers/abi: renamed abi_fuzzer to abifuzzer

* tests/fuzzers/abi: updated abi fuzzer

* tests/fuzzers/abi: updated abi fuzzer

* accounts/abi: minor style fix

* go.mod: added go-fuzz dependency

* tests/fuzzers/abi: updated abi fuzzer

* tests/fuzzers/abi: make linter happy

* tests/fuzzers/abi: make linter happy

* tests/fuzzers/abi: comment out false positives

* cmd/utils: use preconfigured testnet flags instead of networkid (#21561)

* cmd/utils: use preconfigured testnet flags instead of networkid

* cmd/utils: shorter description

Co-authored-by: Martin Holst Swende <[email protected]>

* Update flags.go

Co-authored-by: Martin Holst Swende <[email protected]>

* cmd/geth: added counters to the geth inspect report (#21495)

* database: added counters

* Improved stats for ancient db

* Small improvement

* Better message and added percentage while counting receipts

* Fast counting for receipts

* added info message

* Show both receips itemscount  from ancient db and counted receipts

* Fixed default case

* Removed counter for receipts in ancient store

* Removed counting of receipts present in leveldb

* eth/downloader: dynamically move pivot even during chain sync

* core: fix a typo in comment (#21439)

* accounts/abi: improve documentation and names (#21540)

* accounts: abi/bid/backends; cleaned doc errors, camelCase refactors and anonymous variable assignments

* acounts/abi/bind: doc errors, anonymous parameter assignments

* accounts/abi: doc edits, camelCase refactors

* accounts/abi/bind: review fix

* reverted name changes

* name revert

Co-authored-by: Osoro Bironga <[email protected]>

* mobile: better api for java users (#21580)

* (mobile): Adds string representations for types

* mobile: better interfaces add stringer to types

Co-authored-by: sarath <[email protected]>

* p2p: move rlpx into separate package (#21464)

This change moves the RLPx protocol implementation into a separate package,
p2p/rlpx. The new package can be used to establish RLPx connections for
protocol testing purposes.

Co-authored-by: Felix Lange <[email protected]>

* cmd/clef, cmd/geth: use SplitAndTrim from cmd/utils (#21579)

* trie: fix gaped range proof test case (#21484)

* trie: support empty range proof (#21199)

* internal/ethapi: add optional parameter blockNrOrHash to estimateGas (#21545)

This allows users to estimate gas on top of arbitrary blocks as well as pending and latest.
Tracing on pending is useful for most users as it takes into account the current txpool while
tracing on latest might be useful for users that have little to know knowledge of the current
transactions in the network.

If blockNrOrHash is not specified, estimateGas defaults to pending

* trie: extend range proof (#21250)

* trie: support non-existent right proof

* trie: improve test

* trie: minor linter fix

Co-authored-by: Péter Szilágyi <[email protected]>

* internal/ethapi: fix nil deref + fix estimateGas console bindings (#21601)

* tried to fix

* fix for js api

* fix for nil pointer ex

* rev space

* rev space

* input call formatter

* cmd/devp2p: add eth protocol test suite (#21598)

This change adds a test framework for the "eth" protocol and some basic
tests. The tests can be run using the './devp2p rlpx eth-test' command.

* cmd/devp2p/internal/ethtest: update version in handshake (#21603)

* cmd/devp2p/internal/ethtest: lower protocol version to 64 (#21604)

* params: update CHTs for Geth v1.9.22

* params: release Geth v1.9.22

* params: begin v1.9.23 release cycle

* accounts/abi: ABI explicit difference between Unpack and UnpackIntoInterface (#21091)

* accounts/abi: refactored abi.Unpack

* accounts/abi/bind: fixed error

* accounts/abi/bind: modified template

* accounts/abi/bind: added ToStruct for conversion

* accounts/abi: reenabled tests

* accounts/abi: fixed tests

* accounts/abi: fixed tests for packing/unpacking

* accounts/abi: fixed tests

* accounts/abi: added more logic to ToStruct

* accounts/abi/bind: fixed template

* accounts/abi/bind: fixed ToStruct conversion

* accounts/abi/: removed unused code

* accounts/abi: updated template

* accounts/abi: refactored unused code

* contracts/checkpointoracle: updated contracts to sol ^0.6.0

* accounts/abi: refactored reflection logic

* accounts/abi: less code duplication in Unpack*

* accounts/abi: fixed rebasing bug

* fix a few typos in comments

* rebase on master

Co-authored-by: Guillaume Ballet <[email protected]>

* mobile: added constructor for big int (#21597)

* mobile: added constructor for big int

* mobile: tiny nitpick

* core/vm, params: make 2200 in line with spec (#21605)

* core: free pointer from slice after popping element from price heap (#21572)

* Fix potential memory leak in price heap

* core: nil free pointer slice (alternative version)

Co-authored-by: Martin Holst Swende <[email protected]>

* internal/web3ext: improve eth_getBlockByNumber and eth_getBlockByHash console api (#21608)

* light: fix wrong description in a comment (#21573)

* p2p/enode: remove unused code (#21612)

* build: keep geth-sources.jar build result for JavaDoc (#21596)

* ci: tooltips for javadoc for mobile app

* f space

* cmd/bootnode,internal/debug: fix some comments (#21623)

* trie: use stacktrie for Derivesha operation (#21407)

core/types: use stacktrie for derivesha

trie: add stacktrie file

trie: fix linter

core/types: use stacktrie for derivesha

rebased: adapt stacktrie to the newer version of DeriveSha

Co-authored-by: Martin Holst Swende <[email protected]>

More linter fixes

review feedback: no key offset for nodes converted to hashes

trie: use EncodeRLP for full nodes

core/types: insert txs in order in derivesha

trie: tests for derivesha with stacktrie

trie: make stacktrie use pooled hashers

trie: make stacktrie reuse tmp slice space

trie: minor polishes on stacktrie

trie/stacktrie: less rlp dancing

core/types: explain the contorsions in DeriveSha

ci: fix goimport errors

trie: clear mem on subtrie hashing

squashme: linter fix

stracktrie: use pooling, less allocs (#3)

trie: in-place hex prefix, reduce allocs and add rawNode.EncodeRLP

Reintroduce the `[]node` method, add the missing `EncodeRLP` implementation for `rawNode` and calculate the hex prefix in place.

Co-authored-by: Martin Holst Swende <[email protected]>

Co-authored-by: Martin Holst Swende <[email protected]>

* accounts, signer: implement gnosis safe support (#21593)

* accounts, signer: implement gnosis safe support

* common/math: add type for marshalling big to dec

* accounts, signer: properly sign gnosis requests

* signer, clef: implement account_signGnosisTx

* signer: fix auditlog print, change rpc-name (signGnosisTx to signGnosisSafeTx)

* signer: pass validation-messages/warnings to the UI for gnonsis-safe txs

* signer/core: minor change to validationmessages of typed data

* trie: polishes to trie committer (#21351)

* trie: update tests to check commit integrity

* trie: polish committer

* trie: fix typo

* trie: remove hasvalue notion

According to the benchmarks, type assertion between the pointer and
interface is extremely fast.

BenchmarkIntmethod-12           1000000000               1.91 ns/op
BenchmarkInterface-12           1000000000               2.13 ns/op
BenchmarkTypeSwitch-12          1000000000               1.81 ns/op
BenchmarkTypeAssertion-12       2000000000               1.78 ns/op

So the overhead for asserting whether the shortnode has "valuenode"
child is super tiny. No necessary to have another field.

* trie: linter nitpicks

Co-authored-by: Martin Holst Swende <[email protected]>

* trie: add Commit-sequence tests for stacktrie commit (#21643)

* core/state/snapshot: stop generator if it hits missing trie nodes (#21649)

* core/state/snapshot: exit Geth if generator hits missing trie nodes

* core/state/snapshot: error instead of hard die on generator fault

* core/state/snapshot: don't enable logging on the tests

* cmd/faucet: enable DNS discovery for known networks (#21636)

* params: update goerli testnet bootnodes (#21659)

* params: update pegasys besu bootnode

* params: update goerli initiative bootnodes

* core/bloombits: faster generator (#21625)

* core/bloombits: add benchmark

* core/bloombits: optimize inserts

* core/types: optimize bloom filters (#21624)

* core/types: tests for bloom

* core/types: refactored bloom filter for receipts, added tests

core/types: replaced old bloom implementation

core/types: change interface of bloom add+test

* core/types: refactor bloom

* core/types: minor tweak on LogsBloom

Co-authored-by: Marius van der Wijden <[email protected]>

* cmd/devp2p/internal/ethtest: improve eth test suite (#21615)

This fixes issues with the protocol handshake and status exchange
and adds support for responding to GetBlockHeaders requests.

* node: relax websocket connection header check (#21646)

This makes it accept the "upgrade,keep-alive" header value, which
apparently is a thing.

* signer/core: don't mismatch reject and no accounts (#21677)

* signer/core: don't mismatch reject and zero accounts, fixes #21674

* signer/core: docs

* p2p/discover: remove use of shared hash instance for key derivation (#21673)

For some reason, using the shared hash causes a cryptographic incompatibility
when using Go 1.15. I noticed this during the development of Discovery v5.1
when I added test vector verification.

The go library commit that broke this is golang/go@97240d5, but the
way we used HKDF is slightly dodgy anyway and it's not a regression.

* core/vm: dedup config check in markdown logger (#21655)

* core/vm: dedup config check

* review feedback: reuse buffer

* eth/downloader: fix data race around the ancientlimit (#21681)

* eth/downloader: fix data race around the ancientlimit

* eth/downloader: initialize the ancientlimit as 0

* eth/downloader: cache parent hash instead of recomputing (#21678)

* core: fix txpool off-by-one error (#21683)

* trie: polish commit function (#21692)

* trie: polish commit function

* trie: fix typo

* accouts, consensus, core: fix some comments (#21617)

* console: fix admin.sleepBlocks (#21629)

* all: replace RWMutex with Mutex in places where RLock is not used (#21622)

* consensus/clique: unexport calcDifficulty and improve comment (#21619)

* trie: fix flaw in stacktrie pool reuse (#21699)

* internal/web3ext: improve some web3 apis (#21639)

* imporve some web3-ext apis

* Update web3ext.go

Co-authored-by: Felix Lange <[email protected]>

* eth, p2p: use truncated names  (#21698)

* peer: return localAddr instead of name to prevent spam

We currently use the name (which can be freely set by the peer) in several log messages.
This enables malicious actors to write spam into your geth log.
This commit returns the localAddr instead of the freely settable name.

* p2p: reduce usage of peer.Name in warn messages

* eth, p2p: use truncated names

* Update peer.go

Co-authored-by: Marius van der Wijden <[email protected]>
Co-authored-by: Felix Lange <[email protected]>

* cmd/geth, cmd/utils: fixed flags name (#21700)

* miner: don't interrupt mining after successful sync (#21701)

* miner: exit loop when downloader Done or Failed

Following the logic of the comment at the method,
this fixes a regression introduced at 7cf56d6f064869cb62b1673f9ee437020c595391
, which would allow external parties to DoS with
blocks, preventing mining progress.

Signed-off-by: meows <[email protected]>

* miner: remove ineff assign (lint)

Signed-off-by: meows <[email protected]>

* miner: update test re downloader events

Signed-off-by: meows <[email protected]>

* Revert "miner: remove ineff assign (lint)"

This reverts commit eaefcd34ab4862ebc936fb8a07578aa2744bc058.

* Revert "miner: exit loop when downloader Done or Failed"

This reverts commit 23abd34265aa246c38fc390bb72572ad6ae9fe3b.

* miner: add test showing imprecise TestMiner

Signed-off-by: meows <[email protected]>

* miner: fix waitForMiningState precision

This helper function would return an affirmation
on the first positive match on a desired bool.

This was imprecise; it return false positives
by not waiting initially for an 'updated' value.

This fix causes TestMiner_2 to fail, which is
expected.

Signed-off-by: meows <[email protected]>

* miner: remove TestMiner_2 demonstrating broken test

This test demonstrated the imprecision of the test
helper function waitForMiningState. This function
has been fixed with 6d365c2851, and this test test
may now be removed.

Signed-off-by: meows <[email protected]>

* miner: fix test regarding downloader event/mining expectations

See comment for logic.

Signed-off-by: meows <[email protected]>

* miner: add test describing expectations for downloader/mining events

We expect that once the downloader emits a DoneEvent,
signaling a successful sync, that subsequent StartEvents
are not longer permitted to stop the miner.

This prevents a security vulnerability where forced syncs via
fake high blocks would stall mining operation.

Signed-off-by: meows <[email protected]>

* miner: use 'canStop' state to fix downloader event handling

- Break downloader event handling into event
separating Done and Failed events. We need to
treat these cases differently since a DoneEvent
should prevent the miner from being stopped on
subsequent downloader Start events.

- Use canStop state to handle the one-off
case when a downloader first succeeds.

Signed-off-by: meows <[email protected]>

* miner: improve comment wording

Signed-off-by: meows <[email protected]>

* miner: start mining on downloader events iff not already mining

Signed-off-by: meows <[email protected]>

* miner: refactor miner update logic w/r/t downloader events

This makes mining pause/start logic regarding downloader
events more explicit. Instead of eternally handling downloader
events after the first done event, the subscription is closed
when downloader events are no longer actionable.

Signed-off-by: meows <[email protected]>

* miner: fix handling downloader events on subcription closed

Signed-off-by: meows <[email protected]>

* miner: (lint:gosimple) use range over chan instead of for/select

Signed-off-by: meows <[email protected]>

* miner: refactor update loop to remove race condition

The go routine handling the downloader events handling
vars in parallel with the parent routine, causing a
race condition.

This change, though ugly, remove the condition while
still allowing the downloader event subscription to be
closed when the miner has no further use for it (ie DoneEvent).

* miner: alternate fix for miner-flaw

Co-authored-by: meows <[email protected]>

* accounts/keystore: fix flaky test (#21703)

* accounts/keystore: add timeout to test to prevent failure on travis

The TestWalletNotifications test sporadically fails on travis.
This is because we shutdown the event collection before all events are received.
Adding a small timeout (10 milliseconds) allows the collector to be scheduled
and to consume all pending events before we shut it down.

* accounts/keystore: added newlines back in

* accounts/keystore: properly fix the walletNotifications test

* params: update CHTs (#21706)

* miner: set etherbase even if mining isn't possible at the moment (#21707)

* p2p/discover: implement v5.1 wire protocol (#21647)

This change implements the Discovery v5.1 wire protocol and
also adds an interactive test suite for this protocol.

* params: go-ethereum v1.9.23 stable

* params: begin v1.9.24 release cycle

* core/vm: marshall returnData as hexstring in trace logs (#21715)

* core/vm: marshall returnData as hexstring in trace logs

* core/vm: marshall returnData as hexstring in trace logs

* console: don't exit on ctrl-c, only on ctrl-d (#21660)

* add interrupt counter

* remove interrupt counter, allow ctrl-C to clear ONLY, ctrl-D will terminate console, stop node

* format

* add instructions to exit

* fix tests

* miner: fixed race condition in tests (#21664)

* core: track and improve tx indexing/unindexing (#21331)

* core: add background indexer to waitgroup

* core: make indexer stopable

* core/rawdb: add unit tests

* core/rawdb: fix lint

* core/rawdb: fix tests

* core/rawdb: fix linter

* eth/api: fix potential nil deref in AccountRange (#21710)

* Fix potential nil pointer error when neither block number nor hash is specified to accountRange

* Update error description

* les: remove clientPeerSet and serverSet (#21566)

* les: move NodeStateMachine from clientPool to LesServer

* les: new header broadcaster

* les: peerCommons.headInfo always contains last announced head

* les: remove clientPeerSet and serverSet

* les: fixed panic

* les: fixed --nodiscover option

* les: disconnect all peers at ns.Stop()

* les: added comments and fixed signed broadcasts

* les: removed unused parameter, fixed tests

* core: fix blockchain insert report time interval calculation (#21723)

* accounts/usbwallet: fix ledger version check (#21733)

The version check logic did not take into account the second digit (i.e. the '4' in v1.4.0) - this one line patch corrects this.

* all: implement EIP-2929 (gas cost increases for state access opcodes) + yolo-v2 (#21509)

* core/vm, core/state: implement EIP-2929 + YOLOv2

* core/state, core/vm: fix some review concerns

* core/state, core/vm: address review concerns

* core/vm: address review concerns

* core/vm: better documentation

* core/vm: unify sload cost as fully dynamic

* core/vm: fix typo

* core/vm/runtime: fix compilation flaw

* core/vm/runtime: fix renaming-err leftovers

* core/vm: renaming

* params/config: use correct yolov2 chainid for config

* core, params: use a proper new genesis for yolov2

* core/state/tests: golinter nitpicks

* cmd/devp2p/internal/ethtest: update test chain (#21742)

The old one was wrong in two ways: the first block in chain.rlp was the
genesis block, and the genesis difficulty was below minimum difficulty.

This also contains some other fixes to the test.

* utils, params: add yolov2 bootnode

* params: update yolov2 bootnode with elastic ip

* cmd/geth: fix dir path in geth attach for yolov2 network (#21749)

* accounts/abi/bind: restore error functionality (#21743)

* accounts/abi/bind: restore error functionality

* Update accounts/abi/bind/base.go

Co-authored-by: Guillaume Ballet <[email protected]>

Co-authored-by: Guillaume Ballet <[email protected]>

* core/state: maintain one more diff layer (#21730)

* core/state: maintain one more diff layer

* core/state: address comment

* core/state: disable snapshot iteration if it's not fully constructed (#21682)

* core/state/snapshot: add diskRoot function

* core/state/snapshot: disable iteration if the snapshot is generating

* core/state/snapshot: simplify the function

* core/state: panic for undefined layer

* core: improve snapshot journal recovery (#21594)

* core/state/snapshot: introduce snapshot journal version

* core: update the disk layer in an atomic way

* core: persist the disk layer generator periodically

* core/state/snapshot: improve logging

* core/state/snapshot: forcibly ensure the legacy snapshot is matched

* core/state/snapshot: add debug logs

* core, tests: fix tests and special recovery case

* core: polish

* core: add more blockchain tests for snapshot recovery

* core/state: fix comment

* core: add recovery flag for snapshot

* core: add restart after start-after-crash tests

* core/rawdb: fix imports

* core: fix tests

* core: remove log

* core/state/snapshot: fix snapshot

* core: avoid callbacks in SetHead

* core: fix setHead cornercase where the threshold root has state

* core: small docs for the test cases

Co-authored-by: Péter Szilágyi <[email protected]>

* les, p2p/simulations/adapters: fix issues found while simulating les  (#21761)

This adds a few tiny fixes for les and the p2p simulation framework:

LES Parts

- Keep the LES-SERVER connection even it's non-synced

  We had this idea to reject the connections in LES protocol if the les-server itself is
  not synced. However, in LES protocol we will also receive the connection from another
  les-server. In this case even the local node is not synced yet, we should keep the tcp
  connection for other protocols(e.g. eth protocol).

- Don't count "invalid message" for non-existing GetBlockHeadersMsg request

  In the eth syncing mechanism (full sync, fast sync, light sync), it will try to fetch
  some non-existent blocks or headers(to ensure we indeed download all the missing chain).
  In this case, it's possible that the les-server will receive the request for
  non-existent headers. So don't count it as the "invalid message" for scheduling
  dropping.

- Copy the announce object in the closure

  Before the les-server pushes the latest headers to all connected clients, it will create
  a closure and queue it in the underlying request scheduler. In some scenarios it's
  problematic. E.g, in private networks, the block can be mined very fast. So before the
  first closure is executed, we may already update the latest_announce object. So actually
  the "announce" object we want to send is replaced.

  The downsize is the client will receive two announces with the same td and then drop the
  server.

P2P Simulation Framework

- Don't double register the protocol services in p2p-simulation "Start".

  The protocols upon the devp2p are registered in the "New node stage". So don't reigster
  them again when starting a node in the p2p simulation framework

- Add one more new config field "ExternalSigner", in order to use clef service in the
  framework.

* common: remove ToHex and ToHexArray (#21610)

ToHex was deprecated a couple years ago. The last remaining use
was in ToHexArray, which itself only had a single call site.

This just moves ToHexArray near its only remaining call site and
implements it using hexutil.Encode. This changes the default behaviour
of ToHexArray and with it the behaviour of eth_getProof. Previously we
encoded an empty slice as 0, now the empty slice is encoded as 0x.

* core/state/snapshot: fix journal recovery from generating old journal (#21775)

* core/state/snapshot: print warning if failed to resolve journal

* core/state/snapshot: fix snapshot recovery

When we meet the snapshot journal consisted with:
- disk layer generator with new-format
- diff layer journal with old-format

The base layer should be returned without error.
The broken diff layer can be reconstructed later
but we definitely don't want to reconstruct the
huge diff layer.

* core: add tests

* cmd/devp2p, internal/utesting: implement TAP output (#21760)

TAP is a text format for test results. Parsers for it are available in many languages,
making it easy to consume. I want TAP output from our protocol tests because the
Hive wrapper around them needs to know about the test names and their individual
results and logs. It would also be possible to just write this info as JSON, but I don't
want to invent a new format.

This also improves the normal console output for tests (when running without --tap).
It now prints -- RUN lines before any output from the test, and indents the log output
by one space.

* cmd/devp2p/internal/ethtest: add correct chain files and improve test output (#21782)

This PR replaces the old test genesis.json and chain.rlp files in the testdata
directory for the eth protocol test suite, and also adds documentation for
running the eth test suite locally.

It also improves the test output text and adds more timeouts.

Co-authored-by: Felix Lange <[email protected]>

* core/types, rlp: optimize derivesha (#21728)

This PR contains a minor optimization in derivesha, by exposing the RLP
int-encoding and making use of it to write integers directly to a
buffer (an RLP integer is known to never require more than 9 bytes
total). rlp.AppendUint64 might be useful in other places too.

The code assumes, just as before, that the hasher (a trie) will copy the
key internally, which it does when doing keybytesToHex(key).

Co-authored-by: Felix Lange <[email protected]>

* build: stop verbose output to keep travis from overflowing

* consensus/ethash: fix the percentage progress report

* core/state/snapshot: update generator marker in sync with flushes

* trie, tests/fuzzers: implement a stacktrie fuzzer + stacktrie fixes (#21799)

* trie: fix error in stacktrie not committing small roots

* fuzzers: make trie-fuzzer use correct returnvalues

* trie: improved tests

* tests/fuzzers: fuzzer for stacktrie vs regular trie

* test/fuzzers: make stacktrie fuzzer use 32-byte keys

* trie: fix error in stacktrie with small nodes

* trie: add (skipped) testcase for stacktrie

* tests/fuzzers: address review comments for stacktrie fuzzer

* trie: fix docs in stacktrie

* travis: drop Go 1.13 builders as it's not supported any more

* build: stop building for Ubuntu Eoan, not supported any more

* p2p/simulations/adapters/exec: fix some issues (#21801)

- Remove the ws:// prefix from the status endpoint since
  the ws:// is already included in the stack.WSEndpoint().
- Don't register the services again in the node start.
  Registration is already done in the initialization stage.
- Expose admin namespace via websocket.
  This namespace is necessary for connecting the peers via websocket.
- Offer logging relevant options for exec adapter.
  It's really painful to mix all log output in the single console. So
  this PR offers two additional options for exec adapter in this case
  testers can config the log output(e.g. file output) and log level
  for each p2p node.

* scripts: create oss-fuzz script in go-ethereum (#21808)

* fuzzers: removed fuzzbuzz configuration (#21813)

We decided to move our fuzzing efforts to oss-fuzz since fuzzbuzz is still early access.

* build: add -dlgo flag in ci.go (#21824)

This new flag downloads a known version of Go and builds with it. This
is meant for environments where we can't easily upgrade the installed Go
version.

* .travis.yml: remove install step for PR test builders

We added this step originally to avoid re-building everything
for every test. go test has become much smarter in recent go
releases, so we no longer need to install anything here.

* consensus/ethash: use 64bit indexes for the DAG generation (#21793)

* Bit boundary fix for the DAG generation routine

* Fix unnecessary conversion warnings

Co-authored-by: Sergey Pavlov <[email protected]>

* build: fix regressions with the -dlgo change (#21831)

This fixes cross-build and mobile framework failures.
It also disables the mac test builder because it was failing
all the time in hard to understand ways and we can't afford
it anymore under Travis CI's new pricing.

* .travis.yml: move test builders after install builders (#21833)

* params: release Geth v1.9.24 with Go 1.15.5 (#21842)

* params: begin v1.9.25 release cycle

* crypto/bn256: improve bn256 fuzzer (#21815)

* crypto/cloudflare: fix nil deref in random G1/G2 reading

* crypto/bn256: improve fuzzer

* crypto/bn256: fix some flaws in fuzzer

* crypto/bn256: better comments for u, P and Order (#21836)

* tests/fuzzers: improve the fuzzers (#21829)

* tests/fuzzers, common/bitutil: make fuzzers use correct returnvalues + remove output

* tests/fuzzers/stacktrie: fix duplicate-key insertion in stacktrie (false positive)

* tests/fuzzers/stacktrie: fix compilation error

* tests/fuzzers: linter nits

* core/vm, protocol_params: implement eip-2565 modexp repricing (#21607)

* core/vm, protocol_params: implement eip-2565 modexp repricing

* core/vm: fix review concerns

* core, all: split vm.Context into BlockContext and TxContext (#21672)

* all: core: split vm.Config into BlockConfig and TxConfig

* core: core/vm: reset EVM between tx in block instead of creating new

* core/vm: added docs

* accounts/abi: template: set events Raw field in Parse methods (#21807)

* common: fix documentation of Address.SetBytes (#21814)

* crypto/bn256: refine comments according to #19577, #21595, and #21836 (#21847)

* consensus/ethash: fix usage of *reflect.SliceHeader (#21372)

* consensus/ethash: only use *reflect.SliceHeader, not reflect.SliceHeader. See comment here: https://github.com/golang/go/issues/40397\#issuecomment-663748689

* consensus/ethash: pr feedback from @mdempsky, makes a copy of dest such that is not mutated

* consensus/ethash: remove noop assign

* consensus/ethash: apply same fix to another location

Co-authored-by: Péter Szilágyi <[email protected]>
Co-authored-by: Martin Holst Swende <[email protected]>

* cmd/geth: remove retesteth

* crypto/secp256k1: add checking z sign in affineFromJacobian (#18419)

The z == 0 check is hit whenever we Add two points with the same x1/x2
coordinate. crypto/elliptic uses the same check in their affineFromJacobian
function. This change does not affect block processing or tx signature verification
in any way, because it does not use the Add or Double methods.

* cmd/geth: improve les test on windows (#21860)

* all: disable recording preimage of trie keys (#21402)

* cmd, core, eth, light, trie: disable recording preimage by default

* core, eth: fix unit tests

* core: fix import

* all: change to nopreimage

* cmd, core, eth, trie: use cache.preimages flag

* cmd: enable preimages for archive node

* cmd/utils, trie: simplify preimage tracking a bit

* core: fix linter

Co-authored-by: Péter Szilágyi <[email protected]>

* metrics: fix the panic for reading empty cpu stats (#21864)

* node: support expressive origin rules in ws.origins (#21481)

* Only compare hostnames in ws.origins

Also using a helper function for ToLower consolidates all preparation steps in one function for more maintainable consistency.

Spaces => tabs

Remove a semicolon

Add space at start of comment

Remove parens around conditional

Handle case wehre parsed hostname is empty

When passing a single word like "localhost" the parsed hostname is an empty string. Handle this and the error-parsing case together as default, and the nonempty hostname case in the conditional.

Refactor with new originIsAllowed functions

Adds originIsAllowed() & ruleAllowsOrigin(); removes prepOriginForComparison

Remove blank line

Added tests for simple allowed-orign rule

which does not specify a protocol or port, just a hostname

Fix copy-paste: `:=` => `=`

Remove parens around conditional

Remove autoadded whitespace on blank lines

Compare scheme, hostname, and port with rule

if the rule specifies those portions.

Remove one autoadded trailing whitespace

Better handle case where only origin host is given

e.g. "localhost"

Remove parens around conditional

Refactor: attemptWebsocketConnectionFromOrigin DRY

Include return type on helper function

Provide srv obj in helper fn

Provide srv to helper fn

Remove stray underscore

Remove blank line

parent 93e666b4c1e7e49b8406dc83ed93f4a02ea49ac1
author wbt <[email protected]> 1598559718 -0400
committer Martin Holst Swende <[email protected]> 1605602257 +0100
gpgsig -----BEGIN PGP SIGNATURE-----

 iQFFBAABCAAvFiEEypmrtbNuJK1doP1AaDtDjAWl3fAFAl+zi9ARHG1hcnRpbkBz
 d2VuZGUuc2UACgkQaDtDjAWl3fDRiwgAoMtzU8dwRV7Q9xkCwWEx9Wz2f3n6jUr2
 VWBycDKGKwRkPPOER3oc9kzjGU/P1tFlK07PjfnAKZ9KWzxpDcJZwYM3xCBurG7A
 16y4YsQnzgPNONv3xIkdi3RZtDBIiPFFEmdZFFvZ/jKexfI6JIYPngCAoqdTIFb9
 On/aPvvVWQn1ExfmarsvvJ7kUDUG77tZipuacEH5FfFsfelBWOEYPe+I9ToUHskv
 +qO6rOkV1Ojk8eBc6o0R1PnApwCAlEhJs7aM/SEOg4B4ZJJneiFuEXBIG9+0yS2I
 NOicuDPLGucOB5nBsfIKI3USPeE+3jxdT8go2lN5Nrhm6MimoILDsQ==
 =sgUp
 -----END PGP SIGNATURE-----

Refactor: drop err var for more concise test lines

Add several tests for new WebSocket origin checks

Remove autoadded whitespace on blank lines

Restore TestWebsocketOrigins originally-named test

and rename the others to be helpers rather than full tests

Remove autoadded whitespace on blank line

Temporarily comment out new test sets

Uncomment test around origin rule with scheme

Remove tests without scheme on browser origin

per https://github.com/ethereum/go-ethereum/pull/21481/files#r479371498

Uncomment tests with port; remove some blank lines

Handle when browser does not specify scheme/port

Uncomment test for including scheme & port in rule

Add IP tests

* node: more tests + table-driven, ws origin changes

Co-authored-by: Martin Holst Swende <[email protected]>

* trie, rpc, cmd/geth: fix tests on 32-bit and windows + minor rpc fixes (#21871)

* trie: fix tests to work on 32-bit systems

* les: make test work on 32-bit platform

* cmd/geth: fix windows-issues on tests

* trie: improve balance

* cmd/geth: make account tests less verbose + less mem intense

* rpc: make debug-level log output less verbose

* cmd/geth: lint

* crypto/bn256: fix bn256Mul fuzzer to not hang on large input (#21872)

* crypto/bn256: fix bn256Mul fuzzer to not hang on large input

* Update crypto/bn256/bn256_fuzz.go

Co-authored-by: ligi <[email protected]>

Co-authored-by: ligi <[email protected]>

* p2p: avoid spinning loop on out-of-handles (#21878)

* p2p: avoid busy-loop on temporary errors

* p2p: address review concerns

* les/utils: protect against WeightedRandomSelect overflow (#21839)

Also fixes a bug in les/flowcontrol that caused the overflow.

* github: Add new style of issue-templates

closes #20024

* tests/fuzzers/bls1381: add bls fuzzer (#21796)

* added bls fuzzer

* crypto/bls12381: revert bls-changes, fixup fuzzer tests

* fuzzers: split bls fuzzing into 8 different units

* fuzzers/bls: remove (now stale) corpus

* crypto/bls12381: added blsfuzz corpus

* fuzzers/bls12381: fix the bls corpus

* fuzzers: fix oss-fuzz script

* tests/fuzzers: fixups on bls corpus

* test/fuzzers: remove leftover corpus

Co-authored-by: Marius van der Wijden <[email protected]>

* cmd/faucet: improve handling of facebook post url (#21838)

Resolves #21532

Co-authored-by: roger <[email protected]>

* les: fix GetProofsV2 bug (#21896)

* github: Remove vulnerability.md (#21894)

This type is automatically offered by github after changing to the new style and a security.md being present

* cmd/devp2p/internal/ethtest: add 'large announcement' tests (#21792)

* cmd/devp2p/internal/ethtest: added large announcement tests

* cmd/devp2p/internal/ethtest: added large announcement tests

* cmd/devp2p/internal/ethtest: refactored stuff a bit

* cmd/devp2p/internal/ethtest: added TestMaliciousStatus/Handshake

* cmd/devp2p/internal/ethtest: fixed rebasing issue

* happy linter, happy life

* cmd/devp2p/internal/ethtest: used readAndServe

* stuff

* cmd/devp2p/internal/ethtest: fixed test cases

* core/types: fixed typo (#21897)

* all: simplify nested complexity and if blocks ending with a return statement (#21854)

Changes:

    Simplify nested complexity
    If an if blocks ends with a return statement then remove the else nesting.

Most of the changes has also been reported in golint https://goreportcard.com/report/github.com/ethereum/go-ethereum#golint

* graphql: always return 400 if errors are present in the response (#21882)

* Make sure to return 400 when errors are present in the response

* graphql: use less memory in chainconfig for tests

Co-authored-by: Martin Holst Swende <[email protected]>

* all: remove redundant conversions and import names (#21903)

* p2p/discover: fix deadlock in discv5 message dispatch (#21858)

This fixes a deadlock that could occur when a response packet arrived
after a call had already received enough responses and was about to
signal completion to the dispatch loop.

Co-authored-by: Felix Lange <[email protected]>

* crypto: signing builds with signify/minisign (#21798)

* internal/build: implement signify's signing func
* Add signify to the ci utility
* fix output file format
* Add unit test for signify
* holiman's + travis' feedback
* internal/build: verify signify's output
* crypto: move signify to common dir
* use go-minisign to verify binaries
* more holiman feedback
* crypto, ci: support minisign output
* only accept one-line trusted comments
* configurable untrusted comments
* code cleanup in tests
* revert to use ed25519 from the stdlib
* bug: fix for empty untrusted comments
* write timestamp as comment if trusted comment isn't present
* rename line checker to commentHasManyLines
* crypto: added signify fuzzer (#6)
* crypto: added signify fuzzer
* stuff
* crypto: updated signify fuzzer to fuzz comments
* crypto: repro signify crashes
* rebased fuzzer on build-signify branch
* hide fuzzer behind gofuzz build flag
* extract key data inside a single function
* don't treat \r as a newline
* travis: fix signing command line
* do not use an external binary in tests
* crypto: move signify to crypto/signify
* travis: fix formatting issue
* ci: fix linter build after package move

Co-authored-by: Marius van der Wijden <[email protected]>

* accounts, signer: fix Ledger Live account derivation path (clef) (#21757)

* signer/core/api: fix derivation of ledger live accounts

For ledger hardware wallets, change account iteration as follows:

- ledger legacy: m/44'/60'/0'/X; for 0<=X<5
- ledger live: m/44'/60'/0'/0/X; for 0<=X<5

- ledger legacy: m/44'/60'/0'/X; for 0<=X<10
- ledger live: m/44'/60'/X'/0/0; for 0<=X<10

Non-ledger derivation is unchanged and remains as:
- non-ledger: m/44'/60'/0'/0/X; for 0<=X<10

* signer/core/api: derive ten default paths for all hardware wallets, plus ten legacy and ten live paths for ledger wallets

* signer/core/api: as .../0'/0/0 already included by default paths, do not include it again with ledger live paths

* accounts, signer: implement path iterators for hd wallets

Co-authored-by: Martin Holst Swende <[email protected]>

* accounts/keystore: add missing function doc for SignText (#21914)

Co-authored-by: Pascal Dierich <[email protected]>

* cmd/geth: make tests run quicker + use less memory and disk (#21919)

* cmd/devp2p/internal/ethtest: add transaction tests (#21857)

* p2p/nodestate: fix deadlock during shutdown of les server (#21927)

This PR fixes a deadlock reported here: #21925

The cause is that many operations may be pending, but if the close happens, only one of them gets awoken and exits, the others remain waiting for a signal that never comes.

* les: fix nodiscover option (#21906)

* params: update CHTs (#21941)

* eth: fix error in tracing if reexec is set (#21830)

* eth: fix error in tracing if reexec is set

* eth: change pointer embedding to value-embedding

* go.mod: update github.com/golang/snappy(#21934)

This updates the snappy library depency to include a fix for
a Go 1.16 incompatibility issue.

* cmd/devp2p: add node filter for snap + fix arg error (#21950)

* core/vm/runtime: remove duplicated line (#21956)


This line is duplicated, though it doesn't cause any issues.

* core: improve contextual information on core errors (#21869)

A lot of times when we hit 'core' errors, example: invalid tx, the information provided is
insufficient. We miss several pieces of information: what account has nonce too high,
and what transaction in that block was offending?

This PR adds that information, using the new type of wrapped errors.
It also adds a testcase which (partly) verifies the output from the errors.

The first commit changes all usage of direct equality-checks on core errors, into
using errors.Is. The second commit adds contextual information. This wraps most
of the core errors with more information, and also wraps it one more time in
stateprocessor, to further provide tx index and tx hash, if such a tx is encoutered in
a block. The third commit uses the chainmaker to try to generate chains with such
errors in them, thus triggering the errors and checking that the generated string meets
expectations.

* cmd/geth: implement vulnerability check (#21859)

* cmd/geth: implement vulnerability check

* cmd/geth: use minisign to verify vulnerability feed

* cmd/geth: add the test too

* cmd/geth: more minisig/signify testing

* cmd/geth: support multiple pubfiles for signing

* cmd/geth: add @holiman minisig pubkey

* cmd/geth: polishes on vulnerability check

* cmd/geth: fix ineffassign linter nit

* cmd/geth: add CVE to version check struct

* cmd/geth/testdata: add missing testfile

* cmd/geth: add more keys to versionchecker

* cmd/geth: support file:// URLs in version check

* cmd/geth: improve key ID printing when signature check fails

Co-authored-by: Felix Lange <[email protected]>

* les: cosmetic rewrite of the arm64 float bug workaround (#21960)

* les: revert arm float bug workaround to check go 1.15

* add traces to reproduce outside travis

* simpler workaround

* crypto/secp256k1: add workaround for go mod vendor (#21735)

Go won't vendor C files if there are no Go files present in the directory.
Workaround is to add dummy Go files.

Fixes: #20232

* accounts/abi/bind: allow specifying signer on transactOpts (#21356)

This commit enables users to specify which signer they want to use while creating their transactOpts.
Previously all contract interactions used the homestead signer. Now a user can specify whether they
want to sign with homestead or EIP155 and specify the chainID which adds another layer of security.

Closes #16484

* common: improve printing of Hash and Address (#21834)

Both Hash and Address have a String method, which returns the value as
hex with 0x prefix. They also had a Format method which tried to print
the value using printf of []byte. The way Format worked was at odds with
String though, leading to a situation where fmt.Sprintf("%v", hash)
returned the decimal notation and hash.String() returned a hex string.

This commit makes it consistent again. Both types now support the %v,
%s, %q format verbs for 0x-prefixed hex output. %x, %X creates
unprefixed hex output. %d is also supported and returns the decimal
notation "[1 2 3...]".

For Address, the case of hex characters in %v, %s, %q output is
determined using the EIP-55 checksum. Using %x, %X with Address
disables checksumming.

Co-authored-by: Felix Lange <[email protected]>

* core,les: headerchain import in batches (#21471)

* core: add test for headerchain inserts

* core, light: write headerchains in batches

* core: change to one callback per batch of inserted headers + review concerns

* core: error-check on batch write

* core: unexport writeHeaders

* core: remove callback parameter in InsertHeaderChain

The semantics of InsertHeaderChain are now much simpler: it is now an
all-or-nothing operation. The new WriteStatus return value allows
callers to check for the canonicality of the insertion. This change
simplifies use of HeaderChain in package les, where the callback was
previously used to post chain events.

* core: skip some hashing when writing headers

* core: less hashing in header validation

* core: fix headerchain flaw regarding blacklisted hashes

Co-authored-by: Felix Lange <[email protected]>

* cmd/geth: add test to verify regexps in version check (#21962)

* crypto/signify, build: fix archive signing with signify (#21977)

This fixes some issues in crypto/signify and makes release signing work.

The archive signing step in ci.go used getenvBase64, which decodes the key data.
This is incorrect here because crypto/signify already base64-decodes the key.

* p2p/enode: avoid crashing for invalid IP (#21981)

The database panicked for invalid IPs. This is usually no problem
because all code paths leading to node DB access verify the IP, but it's
dangerous because improper validation can turn this panic into a DoS
vulnerability. The quick fix here is to just turn database accesses
using invalid IP into a noop. This isn't great, but I'm planning to
remove the node DB for discv5 long-term, so it should be fine to have
this quick fix for half a year.

Fixes #21849

* les, light: remove untrusted header retrieval in ODR (#21907)

* les, light: remove untrusted header retrieval in ODR

* les: polish

* light: check the hash equality in odr

* core, trie: speed up some tests with quadratic processing flaw (#21987)

This commit fixes a flaw in two testcases, and brings down the exec-time from ~40s to ~8s for trie/TestIncompleteSync.

The checkConsistency was performed over and over again on the complete set of nodes, not just the recently added, turning it into a quadratic runtime.

* les: introduce forkID (#21974)

* les: introduce forkID

* les: address comment

* build: upgrade to Go 1.15.6 (#21986)

* params: go-ethereum v1.9.25 stable

* update README.md

* update Makefile

* add mining node as bootnode

Co-authored-by: Péter Szilágyi <[email protected]>
Co-authored-by: Martin Holst Swende <[email protected]>
Co-authored-by: Marius van der Wijden <[email protected]>
Co-authored-by: Giuseppe Bertone <[email protected]>
Co-authored-by: gary rong <[email protected]>
Co-authored-by: timcooijmans <[email protected]>
Co-authored-by: Felix Lange <[email protected]>
Co-authored-by: Shude Li <[email protected]>
Co-authored-by: ucwong <[email protected]>
Co-authored-by: libotony <[email protected]>
Co-authored-by: Fuyang Deng <[email protected]>
Co-authored-by: Hanjiang Yu <[email protected]>
Co-authored-by: Osoro Bironga <[email protected]>
Co-authored-by: Osoro Bironga <[email protected]>
Co-authored-by: Guillaume Ballet <[email protected]>
Co-authored-by: Dan Sosedoff <[email protected]>
Co-authored-by: Felföldi Zsolt <[email protected]>
Co-authored-by: Julian Koh <[email protected]>
Co-authored-by: Kirill Elagin <[email protected]>
Co-authored-by: Mason Fischer <[email protected]>
Co-authored-by: Vinod Damle <[email protected]>
Co-authored-by: sarath <[email protected]>
Co-authored-by: rene <[email protected]>
Co-authored-by: Binacs <[email protected]>
Co-authored-by: aaronbuchwald <[email protected]>
Co-authored-by: mr_franklin <[email protected]>
Co-authored-by: shigeyuki azuchi <[email protected]>
Co-authored-by: Raw Pong Ghmoa <[email protected]>
Co-authored-by: meows <[email protected]>
Co-authored-by: hwanjo <[email protected]>
Co-authored-by: Kristofer Peterson <[email protected]>
Co-authored-by: James Prestwich <[email protected]>
Co-authored-by: Slava Karpenko <[email protected]>
Co-authored-by: Sergey Pavlov <[email protected]>
Co-authored-by: Nicolas Feignon <[email protected]>
Co-authored-by: Pascal Dierich <[email protected]>
Co-authored-by: Sad Pencil <[email protected]>
Co-authored-by: Preston Van Loon <[email protected]>
Co-authored-by: Abd ar-Rahman Hamidi <[email protected]>
Co-authored-by: wbt <[email protected]>
Co-authored-by: ligi <[email protected]>
Co-authored-by: LieutenantRoger <[email protected]>
Co-authored-by: roger <[email protected]>
Co-authored-by: Alex Prut <[email protected]>
Co-authored-by: Antoine Toulme <[email protected]>
Co-authored-by: Nishant Das <[email protected]>
Co-authored-by: Pascal Dierich <[email protected]>
Co-authored-by: Chris Ziogas <[email protected]>
Co-authored-by: Steve Ruckdashel <[email protected]>
Co-authored-by: Li, Cheng <[email protected]>
@jeongkyun-oh
Copy link
Contributor

jeongkyun-oh commented Jul 11, 2022

@rjl493456442 Hi, I couldn't find any reason why the contract codes were divided to be stored. Do you have any specific reason for this PR?

cc @holiman @karalabe

@karalabe
Copy link
Member

Mostly 2 reasons

  • Convoluting things leads to strange bug potentials. E.g. I can deploy a contract that ha the same code as an existing trie node. This can end up with weird bugs in sync (e.g. you think you have a subtrie, but in reality have a trie node with a subtrie root only) and in pruning (e.g. you delete an old trie node and it turns out to also be a contract that's dead now).
  • For pruning we don't want to duplicate contract code since there are hundreds of thousands of smart wallet contracts with the same code, so no need to store it that many times; however we do want to duplicate subtries with the same content (happens in contract storage) since pruning becomes very difficulty with deduplicated trie nodes.
  • Bonus: in general it's much harder to reason about available data when the same thing can mean multiple things. There's no real advantage to storing them separately, but a whole lot of disadvantage to storing them together.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants