diff --git a/cli/node/cfg.buidler.toml b/cli/node/cfg.buidler.toml index 113d305..70ea109 100644 --- a/cli/node/cfg.buidler.toml +++ b/cli/node/cfg.buidler.toml @@ -104,6 +104,12 @@ GasPriceIncPerc = 10 Path = "/tmp/iden3-test/hermez/ethkeystore" Password = "yourpasswordhere" +[Coordinator.EthClient.ForgeBatchGasCost] +Fixed = 500000 +L1UserTx = 8000 +L1CoordTx = 9000 +L2Tx = 1 + [Coordinator.API] Coordinator = true diff --git a/config/config.go b/config/config.go index bc4ba21..4e2f184 100644 --- a/config/config.go +++ b/config/config.go @@ -35,6 +35,15 @@ type ServerProof struct { 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 @@ type Coordinator struct { // 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 diff --git a/coordinator/coordinator.go b/coordinator/coordinator.go index 845354f..5f8870d 100644 --- a/coordinator/coordinator.go +++ b/coordinator/coordinator.go @@ -11,6 +11,7 @@ import ( 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 @@ type Config struct { 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 } diff --git a/coordinator/txmanager.go b/coordinator/txmanager.go index 3d753d6..1ac43db 100644 --- a/coordinator/txmanager.go +++ b/coordinator/txmanager.go @@ -123,7 +123,7 @@ func (t *TxManager) syncSCVars(vars synchronizer.SCVariablesPtr) { } // 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 @@ func (t *TxManager) NewAuth(ctx context.Context) (*bind.TransactOpts, error) { 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 addPerc(v *big.Int, p int64) *big.Int { 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) } diff --git a/node/node.go b/node/node.go index cc9069e..774d31b 100644 --- a/node/node.go +++ b/node/node.go @@ -336,6 +336,7 @@ func NewNode(mode Mode, cfg *config.Node) (*Node, error) { PurgeBlockDelay: cfg.Coordinator.L2DB.PurgeBlockDelay, InvalidateBlockDelay: cfg.Coordinator.L2DB.InvalidateBlockDelay, }, + ForgeBatchGasCost: cfg.Coordinator.EthClient.ForgeBatchGasCost, VerifierIdx: uint8(verifierIdx), TxProcessorConfig: txProcessorCfg, },