arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
Merge pull request #614 from hermeznetwork/feature/forger-config-options

Add the option to forge batch at the slot deadline
arnau 17317030+arnaucube@users.noreply.github.com
Mon, 15 Mar 2021 11:29:27 +0100
commit

84b84ecc17765445ae37b9ecb37e96b2ff577f60

parent

a5dcc67a08fa4c01029cd72bc63b771169b03d07

M cli/node/cfg.buidler.toml → cli/node/cfg.buidler.toml

@@ -86,6 +86,8 @@ SyncRetryInterval = "1s"

ForgeDelay = "10s" ForgeNoTxsDelay = "0s" PurgeByExtDelInterval = "1m" +MustForgeAtSlotDeadline = true +IgnoreSlotCommitment = false [Coordinator.FeeAccount] Address = "0x56232B1c5B10038125Bc7345664B4AFD745bcF8E"
M config/config.go → config/config.go

@@ -102,6 +102,14 @@ // there are no txs to forge if the slot is already committed. If set

// to 0s, the coordinator will continuously forge even if the batches // are empty. ForgeNoTxsDelay Duration `validate:"-"` + // MustForgeAtSlotDeadline enables the coordinator to forge slots if + // the empty slots reach the slot deadline. + MustForgeAtSlotDeadline bool + // IgnoreSlotCommitment IgnoreSlotCommitment disables forcing the + // coordinator to forge a slot immediately when the slot is not + // committed. If set to false, the coordinator will immediately forge + // a batch at the beginning of a slot if it's the slot winner. + IgnoreSlotCommitment bool // SyncRetryInterval is the waiting interval between calls to the main // handler of a synced block after an error SyncRetryInterval Duration `validate:"required"`
M coordinator/coordinator.go → coordinator/coordinator.go

@@ -84,6 +84,14 @@ // there are no txs to forge if the slot is already committed. If set

// to 0s, the coordinator will continuously forge even if the batches // are empty. ForgeNoTxsDelay time.Duration + // MustForgeAtSlotDeadline enables the coordinator to forge slots if + // the empty slots reach the slot deadline. + MustForgeAtSlotDeadline bool + // IgnoreSlotCommitment disables forcing the coordinator to forge a + // slot immediately when the slot is not committed. If set to false, + // the coordinator will immediately forge a batch at the beginning of + // a slot if it's the slot winner. + IgnoreSlotCommitment bool // SyncRetryInterval is the waiting interval between calls to the main // handler of a synced block after an error SyncRetryInterval time.Duration

@@ -318,7 +326,8 @@ updateSCVars(&c.vars, vars)

} func canForge(auctionConstants *common.AuctionConstants, auctionVars *common.AuctionVariables, - currentSlot *common.Slot, nextSlot *common.Slot, addr ethCommon.Address, blockNum int64) bool { + currentSlot *common.Slot, nextSlot *common.Slot, addr ethCommon.Address, blockNum int64, + mustForgeAtDeadline bool) bool { if blockNum < auctionConstants.GenesisBlockNum { log.Infow("canForge: requested blockNum is < genesis", "blockNum", blockNum, "genesis", auctionConstants.GenesisBlockNum)

@@ -343,7 +352,7 @@ log.Debugw("canForge: anyone can forge in the current slot (slotDeadline passed)",

"block", blockNum) anyoneForge = true } - if slot.Forger == addr || anyoneForge { + if slot.Forger == addr || (anyoneForge && mustForgeAtDeadline) { return true } log.Debugw("canForge: can't forge", "slot.Forger", slot.Forger)

@@ -353,14 +362,14 @@

func (c *Coordinator) canForgeAt(blockNum int64) bool { return canForge(&c.consts.Auction, &c.vars.Auction, &c.stats.Sync.Auction.CurrentSlot, &c.stats.Sync.Auction.NextSlot, - c.cfg.ForgerAddress, blockNum) + c.cfg.ForgerAddress, blockNum, c.cfg.MustForgeAtSlotDeadline) } func (c *Coordinator) canForge() bool { blockNum := c.stats.Eth.LastBlock.Num + 1 return canForge(&c.consts.Auction, &c.vars.Auction, &c.stats.Sync.Auction.CurrentSlot, &c.stats.Sync.Auction.NextSlot, - c.cfg.ForgerAddress, blockNum) + c.cfg.ForgerAddress, blockNum, c.cfg.MustForgeAtSlotDeadline) } func (c *Coordinator) syncStats(ctx context.Context, stats *synchronizer.Stats) error {
M coordinator/coordinator_test.go → coordinator/coordinator_test.go

@@ -159,14 +159,15 @@ require.NoError(t, err)

deleteme = append(deleteme, debugBatchPath) conf := Config{ - ForgerAddress: forgerAddr, - ConfirmBlocks: 5, - L1BatchTimeoutPerc: 0.5, - EthClientAttempts: 5, - SyncRetryInterval: 400 * time.Microsecond, - EthClientAttemptsDelay: 100 * time.Millisecond, - TxManagerCheckInterval: 300 * time.Millisecond, - DebugBatchPath: debugBatchPath, + ForgerAddress: forgerAddr, + ConfirmBlocks: 5, + L1BatchTimeoutPerc: 0.5, + EthClientAttempts: 5, + SyncRetryInterval: 400 * time.Microsecond, + EthClientAttemptsDelay: 100 * time.Millisecond, + TxManagerCheckInterval: 300 * time.Millisecond, + DebugBatchPath: debugBatchPath, + MustForgeAtSlotDeadline: true, Purger: PurgerCfg{ PurgeBatchDelay: 10, PurgeBlockDelay: 10,

@@ -390,6 +391,10 @@ coord.stats = stats

bootCoord.stats = stats assert.Equal(t, true, coord.canForge()) assert.Equal(t, true, bootCoord.canForge()) + + // Anyone can forge but the node MustForgeAtSlotDeadline as set as false + coord.cfg.MustForgeAtSlotDeadline = false + assert.Equal(t, false, coord.canForge()) // Slot 3. coordinator bid, so the winner is the coordinator stats.Eth.LastBlock.Num = ethClientSetup.AuctionConstants.GenesisBlockNum +
M coordinator/pipeline.go → coordinator/pipeline.go

@@ -414,7 +414,7 @@ var auths [][]byte

var coordIdxs []common.Idx // Check if the slot is not yet fulfilled - slotCommitted := false + slotCommitted := p.cfg.IgnoreSlotCommitment if p.stats.Sync.Auction.CurrentSlot.ForgerCommitment || p.stats.Sync.Auction.CurrentSlot.SlotNum == p.state.lastSlotForged { slotCommitted = true
M coordinator/txmanager.go → coordinator/txmanager.go

@@ -608,7 +608,7 @@

func (t *TxManager) canForgeAt(blockNum int64) bool { return canForge(&t.consts.Auction, &t.vars.Auction, &t.stats.Sync.Auction.CurrentSlot, &t.stats.Sync.Auction.NextSlot, - t.cfg.ForgerAddress, blockNum) + t.cfg.ForgerAddress, blockNum, t.cfg.MustForgeAtSlotDeadline) } func (t *TxManager) mustL1L2Batch(blockNum int64) bool {
M node/node.go → node/node.go

@@ -334,22 +334,24 @@ }

coord, err = coordinator.NewCoordinator( coordinator.Config{ - ForgerAddress: cfg.Coordinator.ForgerAddress, - ConfirmBlocks: cfg.Coordinator.ConfirmBlocks, - L1BatchTimeoutPerc: cfg.Coordinator.L1BatchTimeoutPerc, - ForgeRetryInterval: cfg.Coordinator.ForgeRetryInterval.Duration, - ForgeDelay: cfg.Coordinator.ForgeDelay.Duration, - ForgeNoTxsDelay: cfg.Coordinator.ForgeNoTxsDelay.Duration, - SyncRetryInterval: cfg.Coordinator.SyncRetryInterval.Duration, - PurgeByExtDelInterval: cfg.Coordinator.PurgeByExtDelInterval.Duration, - EthClientAttempts: cfg.Coordinator.EthClient.Attempts, - EthClientAttemptsDelay: cfg.Coordinator.EthClient.AttemptsDelay.Duration, - EthNoReuseNonce: cfg.Coordinator.EthClient.NoReuseNonce, - EthTxResendTimeout: cfg.Coordinator.EthClient.TxResendTimeout.Duration, - MaxGasPrice: cfg.Coordinator.EthClient.MaxGasPrice, - GasPriceIncPerc: cfg.Coordinator.EthClient.GasPriceIncPerc, - TxManagerCheckInterval: cfg.Coordinator.EthClient.CheckLoopInterval.Duration, - DebugBatchPath: cfg.Coordinator.Debug.BatchPath, + ForgerAddress: cfg.Coordinator.ForgerAddress, + ConfirmBlocks: cfg.Coordinator.ConfirmBlocks, + L1BatchTimeoutPerc: cfg.Coordinator.L1BatchTimeoutPerc, + ForgeRetryInterval: cfg.Coordinator.ForgeRetryInterval.Duration, + ForgeDelay: cfg.Coordinator.ForgeDelay.Duration, + MustForgeAtSlotDeadline: cfg.Coordinator.MustForgeAtSlotDeadline, + IgnoreSlotCommitment: cfg.Coordinator.IgnoreSlotCommitment, + ForgeNoTxsDelay: cfg.Coordinator.ForgeNoTxsDelay.Duration, + SyncRetryInterval: cfg.Coordinator.SyncRetryInterval.Duration, + PurgeByExtDelInterval: cfg.Coordinator.PurgeByExtDelInterval.Duration, + EthClientAttempts: cfg.Coordinator.EthClient.Attempts, + EthClientAttemptsDelay: cfg.Coordinator.EthClient.AttemptsDelay.Duration, + EthNoReuseNonce: cfg.Coordinator.EthClient.NoReuseNonce, + EthTxResendTimeout: cfg.Coordinator.EthClient.TxResendTimeout.Duration, + MaxGasPrice: cfg.Coordinator.EthClient.MaxGasPrice, + GasPriceIncPerc: cfg.Coordinator.EthClient.GasPriceIncPerc, + TxManagerCheckInterval: cfg.Coordinator.EthClient.CheckLoopInterval.Duration, + DebugBatchPath: cfg.Coordinator.Debug.BatchPath, Purger: coordinator.PurgerCfg{ PurgeBatchDelay: cfg.Coordinator.L2DB.PurgeBatchDelay, InvalidateBatchDelay: cfg.Coordinator.L2DB.InvalidateBatchDelay,