Eduard S 6260dfedad Fix eth events query and sync inconsistent state
- kvdb
	- Fix path in Last when doing `setNew`
	- Only close if db != nil, and after closing, always set db to nil
		- This will avoid a panic in the case where the db is closed but
		  there's an error soon after, and a future call tries to close
		  again.  This is because pebble.Close() will panic if the db is
		  already closed.
	- Avoid calling pebble methods when a the Storage interface already
	  implements that method (like Close).
- statedb
	- In test, avoid calling KVDB method if the same method is available for
	  the StateDB (like MakeCheckpoint, CurrentBatch).
- eth
	- In *EventByBlock methods, take blockHash as input argument and use it
	  when querying the event logs.  Previously the blockHash was only taken
	  from the logs results *only if* there was any log.  This caused the
	  following issue: if there was no logs, it was not possible to know if
	  the result was from the expected block or an uncle block!  By querying
	  logs by blockHash we make sure that even if there are no logs, they
	  are from the right block.
	  	- Note that now the function can either be called with a
		  blockNum or blockHash, but not both at the same time.
- sync
	- If there's an error during call to Sync call resetState, which
	  internally resets the stateDB to avoid stale checkpoints (and a
	  corresponding invalid increase in the StateDB batchNum).
	- During a Sync, after very batch processed, make sure that the StateDB
	  currentBatch corresponds to the batchNum in the smart contract
	  log/event.
2021-02-05 16:06:17 +01:00
2021-02-04 18:02:53 +01:00
2021-02-01 17:40:50 +01:00
2021-01-11 16:16:05 +01:00
2021-02-01 16:59:12 +01:00
2020-09-10 11:36:58 +02:00
2021-02-01 17:40:50 +01:00
2021-02-01 17:40:50 +01:00
2021-02-01 12:24:24 +01:00

hermez-node Go Report Card Test Status Lint Status GoDoc

Go implementation of the Hermez node.

Developing

Unit testing

Running the unit tests requires a connection to a PostgreSQL database. You can start PostgreSQL with docker easily this way (where yourpasswordhere should be your password):

POSTGRES_PASS=yourpasswordhere sudo docker run --rm --name hermez-db-test -p 5432:5432 -e POSTGRES_DB=hermez -e POSTGRES_USER=hermez -e POSTGRES_PASSWORD="$POSTGRES_PASS" -d postgres

Afterwards, run the tests with the password as env var:

POSTGRES_PASS=yourpasswordhere go test -p 1 ./...

NOTE: -p 1 forces execution of package test in serial. Otherwise they may be executed in paralel and the test may find unexpected entries in the SQL databse because it's shared among all tests.

There is an extra temporary option that allows you to run the API server using the Go tests. This will be removed once the API can be properly initialized, with data from the synchronizer and so on. To use this, run:

FAKE_SERVER=yes POSTGRES_PASS=yourpasswordhere go test -timeout 0  ./api -p 1 -count 1 -v`

Lint

All Pull Requests need to pass the configured linter.

To run the linter locally, first install golangci-lint. Afterwards you can check the lints with this command:

golangci-lint run --timeout=5m -E whitespace -E gosec -E gci -E misspell -E gomnd -E gofmt -E goimports -E golint --exclude-use-default=false --max-same-issues 0

Usage

Node

See cli/node/README.md

Proof Server

The node in mode coordinator requires a proof server (a server that is capable of calculating proofs from the zkInputs). For testing purposes there is a mock proof server cli at test/proofserver/cli.

Usage of test/proofserver/cli:

USAGE:
    go run ./test/proofserver/cli OPTIONS

OPTIONS:
  -a string
        listen address (default "localhost:3000")
  -d duration
        proving time duration (default 2s)

/tmp as tmpfs

For every processed batch, the node builds a temporary exit tree in a key-value DB stored in /tmp. It is highly recommended that /tmp is mounted as a RAM file system in production to avoid unecessary reads an writes to disk. This can be done by mounting /tmp as tmpfs; for example, by having this line in /etc/fstab:

tmpfs			/tmp		tmpfs		defaults,noatime,mode=1777	0 0
Description
No description provided
Readme AGPL-3.0 2.8 MiB
Languages
Go 98.6%
PLpgSQL 1.1%
Makefile 0.2%