mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-06 19:06:42 +01:00
Document synchronizer, node and coordinator
This commit is contained in:
@@ -68,6 +68,9 @@ when running the coordinator in sync mode
|
|||||||
monitor the size of the folder to avoid running out of space.
|
monitor the size of the folder to avoid running out of space.
|
||||||
- The node requires a PostgreSQL database. The parameters of the server and
|
- The node requires a PostgreSQL database. The parameters of the server and
|
||||||
database must be set in the `PostgreSQL` section.
|
database must be set in the `PostgreSQL` section.
|
||||||
|
- The node requires a web3 RPC server to work. The node has only been tested
|
||||||
|
with geth and may not work correctly with other ethereum nodes
|
||||||
|
implementations.
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
|
|||||||
@@ -299,7 +299,8 @@ type Node struct {
|
|||||||
} `validate:"required"`
|
} `validate:"required"`
|
||||||
PostgreSQL PostgreSQL `validate:"required"`
|
PostgreSQL PostgreSQL `validate:"required"`
|
||||||
Web3 struct {
|
Web3 struct {
|
||||||
// URL is the URL of the web3 ethereum-node RPC server
|
// URL is the URL of the web3 ethereum-node RPC server. Only
|
||||||
|
// geth is officially supported.
|
||||||
URL string `validate:"required"`
|
URL string `validate:"required"`
|
||||||
} `validate:"required"`
|
} `validate:"required"`
|
||||||
Synchronizer struct {
|
Synchronizer struct {
|
||||||
|
|||||||
@@ -1,3 +1,43 @@
|
|||||||
|
/*
|
||||||
|
Package coordinator handles all the logic related to forging batches as a
|
||||||
|
coordinator in the hermez network.
|
||||||
|
|
||||||
|
The forging of batches is done with a pipeline in order to allow multiple
|
||||||
|
batches being forged in parallel. The maximum number of batches that can be
|
||||||
|
forged in parallel is determined by the number of available proof servers.
|
||||||
|
|
||||||
|
The Coordinator begins with the pipeline stopped. The main Coordinator
|
||||||
|
goroutine keeps listening for synchronizer events sent by the node package,
|
||||||
|
which allow the coordinator to determine if the configured forger address is
|
||||||
|
allowed to forge at the current block or not. When the forger address becomes
|
||||||
|
allowed to forge, the pipeline is started, and when it terminates being allowed
|
||||||
|
to forge, the pipeline is stopped.
|
||||||
|
|
||||||
|
The Pipeline consists of two goroutines. The first one is in charge of
|
||||||
|
preparing a batch internally, which involves making a selection of transactions
|
||||||
|
and calculating the ZKInputs for the batch proof, and sending these ZKInputs to
|
||||||
|
an idle proof server. This goroutine will keep preparing batches while there
|
||||||
|
are idle proof servers, if the forging policy determines that a batch should be
|
||||||
|
forged in the current state. The second goroutine is in charge of waiting for
|
||||||
|
the proof server to finish computing the proof, retreiving it, prepare the
|
||||||
|
arguments for the `forgeBatch` Rollup transaction, and sending the result to
|
||||||
|
the TxManager. All the batch information moves between functions and
|
||||||
|
goroutines via the BatchInfo struct.
|
||||||
|
|
||||||
|
Finally, the TxManager contains a single goroutine that makes forgeBatch
|
||||||
|
ethereum transactions for the batches sent by the Pipeline, and keeps them in a
|
||||||
|
list to check them periodically. In the periodic checks, the ethereum
|
||||||
|
transaction is checked for successfulness, and it's only forgotten after a
|
||||||
|
number of confirmation blocks have passed after being successfully mined. At
|
||||||
|
any point if a transaction failure is detected, the TxManager can signal the
|
||||||
|
Coordinator to reset the Pipeline in order to reforge the failed batches.
|
||||||
|
|
||||||
|
The Coordinator goroutine acts as a manager. The synchronizer events (which
|
||||||
|
notify about new blocks and associated new state) that it receives are
|
||||||
|
broadcasted to the Pipeline and the TxManager. This allows the Coordinator,
|
||||||
|
Pipeline and TxManager to have a copy of the current hermez network state
|
||||||
|
required to perform their duties.
|
||||||
|
*/
|
||||||
package coordinator
|
package coordinator
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
15
node/node.go
15
node/node.go
@@ -1,3 +1,18 @@
|
|||||||
|
/*
|
||||||
|
Package node does the initialization of all the required objects to either run
|
||||||
|
as a synchronizer or as a coordinator.
|
||||||
|
|
||||||
|
The Node contains several goroutines that run in the background or that
|
||||||
|
periodically perform tasks. One of this goroutines periodically calls the
|
||||||
|
`Synchronizer.Sync` function, allowing the synchronization of one block at a
|
||||||
|
time. After every call to `Synchronizer.Sync`, the Node sends a message to the
|
||||||
|
Coordinator to notify it about the new synced block (and associated state) or
|
||||||
|
reorg (and resetted state) in case one happens.
|
||||||
|
|
||||||
|
Other goroutines perform tasks such as: updating the token prices, update
|
||||||
|
metrics stored in the historyDB, update recommended fee stored in the
|
||||||
|
historyDB, run the http API server, run the debug http API server, etc.
|
||||||
|
*/
|
||||||
package node
|
package node
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,35 @@
|
|||||||
|
/*
|
||||||
|
Package synchronizer synchronizes the hermez network state by querying events
|
||||||
|
emitted by the three smart contracts: `Hermez.sol` (referred as Rollup here),
|
||||||
|
`HermezAuctionProtocol.sol` (referred as Auction here) and
|
||||||
|
`WithdrawalDelayer.sol` (referred as WDelayer here).
|
||||||
|
|
||||||
|
The main entry point for synchronization is the `Sync` function, which at most
|
||||||
|
will synchronize one ethereum block, and all the hermez events that happened in
|
||||||
|
that block. During a `Sync` call, a reorg can be detected; in such case, uncle
|
||||||
|
blocks will be discarded, and only in a future `Sync` call correct blocks will
|
||||||
|
be synced.
|
||||||
|
|
||||||
|
The synchronization of the events in each smart contracts are done
|
||||||
|
in the methods `rollupSync`, `auctionSync` and `wdelayerSync`, which in turn
|
||||||
|
use the interface code to read each smart contract state and events found in
|
||||||
|
"github.com/hermeznetwork/hermez-node/eth". After these three methods are
|
||||||
|
called, an object of type `common.BlockData` is built containing all the
|
||||||
|
updates and events that happened in that block, and it is inserted in the
|
||||||
|
HistoryDB in a single SQL transaction.
|
||||||
|
|
||||||
|
`rollupSync` is the method that synchronizes batches sent via the `forgeBatch`
|
||||||
|
transaction in `Hermez.sol`. In `rollupSync`, for every batch, the accounts
|
||||||
|
state is updated in the StateDB by processing all transactions that have been
|
||||||
|
forged in that batch.
|
||||||
|
|
||||||
|
The consistency of the stored data is guaranteed by the HistoryDB: All the
|
||||||
|
block information is inserted in a single SQL transaction at the end of the
|
||||||
|
`Sync` method, once the StateDB has been updated. And every time the
|
||||||
|
Synchronizer starts, it continues from the last block in the HistoryDB. The
|
||||||
|
StateDB stores updates organized by checkpoints for every batch, and each batch
|
||||||
|
is only accessed if it appears in the HistoryDB.
|
||||||
|
*/
|
||||||
package synchronizer
|
package synchronizer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
Reference in New Issue
Block a user