arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
Calculate ForgeBatch gasLimit with parametrized formula

Add the following config parameters at
`Coordinator.EthClient.ForgeBatchGasCost`:
- `Fixed`
- `L1UserTx`
- `L1CoordTx`
- `L2Tx`
Which are the costs associated to a ForgeBatch transaction, split
into different parts to be used in the formula to compute the gasLimit.
Eduard S eduard@iden3.io
Thu, 25 Feb 2021 15:25:55 +0100
commit

c771bdf94e0d098f8572a529aa84c6aaf31bde91

parent

706e4c7a3d4d896bde998d725612ca73ad45092a

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

@@ -104,6 +104,12 @@ [Coordinator.EthClient.Keystore]

Path = "/tmp/iden3-test/hermez/ethkeystore" Password = "yourpasswordhere" +[Coordinator.EthClient.ForgeBatchGasCost] +Fixed = 500000 +L1UserTx = 8000 +L1CoordTx = 9000 +L2Tx = 1 + [Coordinator.API] Coordinator = true
M config/config.go → config/config.go

@@ -35,6 +35,15 @@ // URL is the server proof API URL

URL string `validate:"required"` } +// ForgeBatchGasCost is the costs associated to a ForgeBatch transaction, split +// into different parts to be used in a formula. +type ForgeBatchGasCost struct { + Fixed uint64 `validate:"required"` + L1UserTx uint64 `validate:"required"` + L1CoordTx uint64 `validate:"required"` + L2Tx uint64 `validate:"required"` +} + // Coordinator is the coordinator specific configuration. type Coordinator struct { // ForgerAddress is the address under which this coordinator is forging

@@ -180,6 +189,9 @@ Path string `validate:"required"`

// Password used to decrypt the keys in the keystore Password string `validate:"required"` } `validate:"required"` + // ForgeBatchGasCost contains the cost of each action in the + // ForgeBatch transaction. + ForgeBatchGasCost ForgeBatchGasCost `validate:"required"` } `validate:"required"` API struct { // Coordinator enables the coordinator API endpoints
M coordinator/coordinator.go → coordinator/coordinator.go

@@ -11,6 +11,7 @@

ethCommon "github.com/ethereum/go-ethereum/common" "github.com/hermeznetwork/hermez-node/batchbuilder" "github.com/hermeznetwork/hermez-node/common" + "github.com/hermeznetwork/hermez-node/config" "github.com/hermeznetwork/hermez-node/db/historydb" "github.com/hermeznetwork/hermez-node/db/l2db" "github.com/hermeznetwork/hermez-node/eth"

@@ -115,7 +116,10 @@ DebugBatchPath string

Purger PurgerCfg // VerifierIdx is the index of the verifier contract registered in the // smart contract - VerifierIdx uint8 + VerifierIdx uint8 + // ForgeBatchGasCost contains the cost of each action in the + // ForgeBatch transaction. + ForgeBatchGasCost config.ForgeBatchGasCost TxProcessorConfig txprocessor.Config }
M coordinator/txmanager.go → coordinator/txmanager.go

@@ -123,7 +123,7 @@ updateSCVars(&t.vars, vars)

} // NewAuth generates a new auth object for an ethereum transaction -func (t *TxManager) NewAuth(ctx context.Context) (*bind.TransactOpts, error) { +func (t *TxManager) NewAuth(ctx context.Context, batchInfo *BatchInfo) (*bind.TransactOpts, error) { gasPrice, err := t.ethClient.EthSuggestGasPrice(ctx) if err != nil { return nil, tracerr.Wrap(err)

@@ -143,15 +143,12 @@ if err != nil {

return nil, tracerr.Wrap(err) } auth.Value = big.NewInt(0) // in wei - // TODO: Calculate GasLimit based on the contents of the ForgeBatchArgs - // This requires a function that estimates the gas usage of the - // forgeBatch call based on the contents of the ForgeBatch args: - // - length of l2txs - // - length of l1Usertxs - // - length of l1CoordTxs with authorization signature - // - length of l1CoordTxs without authoriation signature - // - etc. - auth.GasLimit = 1000000 + + gasLimit := t.cfg.ForgeBatchGasCost.Fixed + + uint64(len(batchInfo.L1UserTxsExtra))*t.cfg.ForgeBatchGasCost.L1UserTx + + uint64(len(batchInfo.L1CoordTxs))*t.cfg.ForgeBatchGasCost.L1CoordTx + + uint64(len(batchInfo.L2Txs))*t.cfg.ForgeBatchGasCost.L2Tx + auth.GasLimit = gasLimit auth.GasPrice = gasPrice auth.Nonce = nil

@@ -191,7 +188,7 @@

func (t *TxManager) sendRollupForgeBatch(ctx context.Context, batchInfo *BatchInfo, resend bool) error { var ethTx *types.Transaction var err error - auth, err := t.NewAuth(ctx) + auth, err := t.NewAuth(ctx, batchInfo) if err != nil { return tracerr.Wrap(err) }
M node/node.go → node/node.go

@@ -336,6 +336,7 @@ InvalidateBatchDelay: cfg.Coordinator.L2DB.InvalidateBatchDelay,

PurgeBlockDelay: cfg.Coordinator.L2DB.PurgeBlockDelay, InvalidateBlockDelay: cfg.Coordinator.L2DB.InvalidateBlockDelay, }, + ForgeBatchGasCost: cfg.Coordinator.EthClient.ForgeBatchGasCost, VerifierIdx: uint8(verifierIdx), TxProcessorConfig: txProcessorCfg, },