From 3181c8738c32e644fee2e96e71e249fe2c8d25ad Mon Sep 17 00:00:00 2001 From: Eduard S Date: Mon, 8 Feb 2021 17:23:49 +0100 Subject: [PATCH] Fix synchronizer, add verifier index config param - eth - In EventsByBlock calls ignore blockNum if blockHash != nil. This fixes the issue where a blockNumber and blockHash was being passed, which the eth events query function doesn't allow, causing the synchronizer to fail at every iteration. - Node/Config - Add Coordinator.Debug.RollupVerifierIndex to force choosing a particular verifier by index in the Rollup smart contract. --- cli/node/cfg.buidler.toml | 1 + config/config.go | 5 ++++- eth/auction.go | 4 ++-- eth/rollup.go | 4 ++-- eth/wdelayer.go | 4 ++-- node/node.go | 37 ++++++++++++++++++++++++++++++------- 6 files changed, 41 insertions(+), 14 deletions(-) diff --git a/cli/node/cfg.buidler.toml b/cli/node/cfg.buidler.toml index 805c409..8581d4a 100644 --- a/cli/node/cfg.buidler.toml +++ b/cli/node/cfg.buidler.toml @@ -96,3 +96,4 @@ Coordinator = true [Coordinator.Debug] BatchPath = "/tmp/iden3-test/hermez/batchesdebug" LightScrypt = true +# RollupVerifierIndex = 0 diff --git a/config/config.go b/config/config.go index 421d34e..9cf963a 100644 --- a/config/config.go +++ b/config/config.go @@ -90,7 +90,6 @@ type Coordinator struct { } `validate:"required"` ServerProofs []ServerProof `validate:"required"` Circuit struct { - // VerifierIdx uint8 `validate:"required"` // MaxTx is the maximum number of txs supported by the circuit MaxTx int64 `validate:"required"` // NLevels is the maximum number of merkle tree levels @@ -132,6 +131,10 @@ type Coordinator struct { // LightScrypt if set, uses light parameters for the ethereum // keystore encryption algorithm. LightScrypt bool + // RollupVerifierIndex is the index of the verifier to use in + // the Rollup smart contract. The verifier chosen by index + // must match with the Circuit parameters. + RollupVerifierIndex *int } } diff --git a/eth/auction.go b/eth/auction.go index eb8e2fc..2c884ec 100644 --- a/eth/auction.go +++ b/eth/auction.go @@ -799,14 +799,14 @@ func (c *AuctionClient) AuctionEventInit() (*AuctionEventInitialize, int64, erro // AuctionEventsByBlock returns the events in a block that happened in the // Auction Smart Contract. // To query by blockNum, set blockNum >= 0 and blockHash == nil. -// To query by blockHash, set blockNum == -1 and blockHash != nil. +// To query by blockHash set blockHash != nil, and blockNum will be ignored. // If there are no events in that block the result is nil. func (c *AuctionClient) AuctionEventsByBlock(blockNum int64, blockHash *ethCommon.Hash) (*AuctionEvents, error) { var auctionEvents AuctionEvents var blockNumBigInt *big.Int - if blockNum >= 0 { + if blockHash == nil { blockNumBigInt = big.NewInt(blockNum) } query := ethereum.FilterQuery{ diff --git a/eth/rollup.go b/eth/rollup.go index 0989086..fe32373 100644 --- a/eth/rollup.go +++ b/eth/rollup.go @@ -738,14 +738,14 @@ func (c *RollupClient) RollupEventInit() (*RollupEventInitialize, int64, error) // RollupEventsByBlock returns the events in a block that happened in the // Rollup Smart Contract. // To query by blockNum, set blockNum >= 0 and blockHash == nil. -// To query by blockHash, set blockNum == -1 and blockHash != nil. +// To query by blockHash set blockHash != nil, and blockNum will be ignored. // If there are no events in that block the result is nil. func (c *RollupClient) RollupEventsByBlock(blockNum int64, blockHash *ethCommon.Hash) (*RollupEvents, error) { var rollupEvents RollupEvents var blockNumBigInt *big.Int - if blockNum >= 0 { + if blockHash == nil { blockNumBigInt = big.NewInt(blockNum) } query := ethereum.FilterQuery{ diff --git a/eth/wdelayer.go b/eth/wdelayer.go index d7c3935..54bd0e9 100644 --- a/eth/wdelayer.go +++ b/eth/wdelayer.go @@ -426,14 +426,14 @@ func (c *WDelayerClient) WDelayerEventInit() (*WDelayerEventInitialize, int64, e // WDelayerEventsByBlock returns the events in a block that happened in the // WDelayer Smart Contract. // To query by blockNum, set blockNum >= 0 and blockHash == nil. -// To query by blockHash, set blockNum == -1 and blockHash != nil. +// To query by blockHash set blockHash != nil, and blockNum will be ignored. // If there are no events in that block the result is nil. func (c *WDelayerClient) WDelayerEventsByBlock(blockNum int64, blockHash *ethCommon.Hash) (*WDelayerEvents, error) { var wdelayerEvents WDelayerEvents var blockNumBigInt *big.Int - if blockNum >= 0 { + if blockHash == nil { blockNumBigInt = big.NewInt(blockNum) } query := ethereum.FilterQuery{ diff --git a/node/node.go b/node/node.go index 1978d49..eb04b48 100644 --- a/node/node.go +++ b/node/node.go @@ -252,14 +252,37 @@ func NewNode(mode Mode, cfg *config.Node) (*Node, error) { MaxFeeTx: common.RollupConstMaxFeeIdxCoordinator, MaxL1Tx: common.RollupConstMaxL1Tx, } - verifierIdx, err := scConsts.Rollup.FindVerifierIdx( - cfg.Coordinator.Circuit.MaxTx, - cfg.Coordinator.Circuit.NLevels, - ) - if err != nil { - return nil, tracerr.Wrap(err) + var verifierIdx int + if cfg.Coordinator.Debug.RollupVerifierIndex == nil { + verifierIdx, err = scConsts.Rollup.FindVerifierIdx( + cfg.Coordinator.Circuit.MaxTx, + cfg.Coordinator.Circuit.NLevels, + ) + if err != nil { + return nil, tracerr.Wrap(err) + } + log.Infow("Found verifier that matches circuit config", "verifierIdx", verifierIdx) + } else { + verifierIdx = *cfg.Coordinator.Debug.RollupVerifierIndex + log.Infow("Using debug verifier index from config", "verifierIdx", verifierIdx) + if verifierIdx >= len(scConsts.Rollup.Verifiers) { + return nil, tracerr.Wrap( + fmt.Errorf("verifierIdx (%v) >= "+ + "len(scConsts.Rollup.Verifiers) (%v)", + verifierIdx, len(scConsts.Rollup.Verifiers))) + } + verifier := scConsts.Rollup.Verifiers[verifierIdx] + if verifier.MaxTx != cfg.Coordinator.Circuit.MaxTx || + verifier.NLevels != cfg.Coordinator.Circuit.NLevels { + return nil, tracerr.Wrap( + fmt.Errorf("Circuit config and verifier params don't match. "+ + "circuit.MaxTx = %v, circuit.NLevels = %v, "+ + "verifier.MaxTx = %v, verifier.NLevels = %v", + cfg.Coordinator.Circuit.MaxTx, cfg.Coordinator.Circuit.NLevels, + verifier.MaxTx, verifier.NLevels, + )) + } } - log.Infow("Found verifier that matches circuit config", "verifierIdx", verifierIdx) coord, err = coordinator.NewCoordinator( coordinator.Config{