From e01a0f26195b276385a716863fd607a16285e24b Mon Sep 17 00:00:00 2001 From: Ferran Date: Mon, 9 May 2022 17:39:07 +0400 Subject: [PATCH 1/7] Limit state sync by gas --- consensus/bor/bor.go | 22 +++++++++++++++++----- consensus/bor/genesis_contracts_client.go | 13 +++++++------ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 2623011d79..70e45bab22 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1144,7 +1144,8 @@ func (c *Bor) fetchAndCommitSpan( msg := getSystemMessage(common.HexToAddress(c.config.ValidatorContract), data) // apply message - return applyMessage(msg, state, header, c.chainConfig, chain) + _, err = applyMessage(msg, state, header, c.chainConfig, chain) + return err } // CommitStates commit states @@ -1173,6 +1174,8 @@ func (c *Bor) CommitStates( } } + totalGas := 10000000 /// limit on gas for state sync per block + chainID := c.chainConfig.ChainID.String() for _, eventRecord := range eventRecords { if eventRecord.ID <= lastStateID { @@ -1191,9 +1194,15 @@ func (c *Bor) CommitStates( } stateSyncs = append(stateSyncs, &stateData) - if err := c.GenesisContractsClient.CommitState(eventRecord, state, header, chain); err != nil { + gasUsed, err := c.GenesisContractsClient.CommitState(eventRecord, state, header, chain) + if err != nil { return nil, err } + totalGas -= int(gasUsed) + if totalGas < 0 { + break + } + lastStateID++ } return stateSyncs, nil @@ -1311,14 +1320,16 @@ func applyMessage( header *types.Header, chainConfig *params.ChainConfig, chainContext core.ChainContext, -) error { +) (uint64, error) { + initialGas := msg.Gas() + // Create a new context to be used in the EVM environment blockContext := core.NewEVMBlockContext(header, chainContext, &header.Coinbase) // Create a new environment which holds all relevant information // about the transaction and calling mechanisms. vmenv := vm.NewEVM(blockContext, vm.TxContext{}, state, chainConfig, vm.Config{}) // Apply the transaction to the current state (included in the env) - _, _, err := vmenv.Call( + _, gasLeft, err := vmenv.Call( vm.AccountRef(msg.From()), *msg.To(), msg.Data(), @@ -1330,7 +1341,8 @@ func applyMessage( state.Finalise(true) } - return nil + gasUsed := initialGas - gasLeft + return gasUsed, nil } func validatorContains(a []*Validator, x *Validator) (*Validator, bool) { diff --git a/consensus/bor/genesis_contracts_client.go b/consensus/bor/genesis_contracts_client.go index 582358e0cb..456e3fe2e5 100644 --- a/consensus/bor/genesis_contracts_client.go +++ b/consensus/bor/genesis_contracts_client.go @@ -53,25 +53,26 @@ func (gc *GenesisContractsClient) CommitState( state *state.StateDB, header *types.Header, chCtx chainContext, -) error { +) (uint64, error) { eventRecord := event.BuildEventRecord() recordBytes, err := rlp.EncodeToBytes(eventRecord) if err != nil { - return err + return 0, err } method := "commitState" t := event.Time.Unix() data, err := gc.stateReceiverABI.Pack(method, big.NewInt(0).SetInt64(t), recordBytes) if err != nil { log.Error("Unable to pack tx for commitState", "error", err) - return err + return 0, err } log.Info("→ committing new state", "eventRecord", event.String()) msg := getSystemMessage(common.HexToAddress(gc.StateReceiverContract), data) - if err := applyMessage(msg, state, header, gc.chainConfig, chCtx); err != nil { - return err + gasUsed, err := applyMessage(msg, state, header, gc.chainConfig, chCtx) + if err != nil { + return 0, err } - return nil + return gasUsed, nil } func (gc *GenesisContractsClient) LastStateId(snapshotNumber uint64) (*big.Int, error) { From c8f8465edb87ac64472576b62d42f1548dac08db Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Tue, 10 May 2022 14:59:44 +0530 Subject: [PATCH 2/7] Added logging for state-sync total gas usage --- consensus/bor/bor.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 70e45bab22..091192a491 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1174,7 +1174,7 @@ func (c *Bor) CommitStates( } } - totalGas := 10000000 /// limit on gas for state sync per block + totalGas := 0 /// limit on gas for state sync per block chainID := c.chainConfig.ChainID.String() for _, eventRecord := range eventRecords { @@ -1198,13 +1198,14 @@ func (c *Bor) CommitStates( if err != nil { return nil, err } - totalGas -= int(gasUsed) - if totalGas < 0 { - break - } + totalGas += int(gasUsed) + // if totalGas < 0 { + // break + // } lastStateID++ } + log.Info("StateSyncGas", "gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1) return stateSyncs, nil } From 8b8395870c6d0a4b06a84f8e650d63238ffe0ee7 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Tue, 10 May 2022 15:06:19 +0530 Subject: [PATCH 3/7] Added number of event-records in log --- consensus/bor/bor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 091192a491..5b52edbf74 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1205,7 +1205,7 @@ func (c *Bor) CommitStates( lastStateID++ } - log.Info("StateSyncGas", "gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1) + log.Info("StateSyncGas", "gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1, "TotalRecords", len(eventRecords)) return stateSyncs, nil } From dba374026f365505da843d1b3cc38690807c0789 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 20 May 2022 12:32:37 +0530 Subject: [PATCH 4/7] Minor Changes --- consensus/bor/bor.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 5b52edbf74..db50f958b0 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1199,13 +1199,10 @@ func (c *Bor) CommitStates( return nil, err } totalGas += int(gasUsed) - // if totalGas < 0 { - // break - // } lastStateID++ } - log.Info("StateSyncGas", "gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1, "TotalRecords", len(eventRecords)) + log.Info("StateSyncData", "Gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1, "TotalRecords", len(eventRecords)) return stateSyncs, nil } From b88353c27d967ccc8b3b655ce684ed63643ae5f4 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 20 May 2022 14:20:59 +0530 Subject: [PATCH 5/7] Minor Fix --- consensus/bor/bor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index db50f958b0..2eb2645f18 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1202,7 +1202,7 @@ func (c *Bor) CommitStates( lastStateID++ } - log.Info("StateSyncData", "Gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1, "TotalRecords", len(eventRecords)) + log.Info("StateSyncData", "Gas", totalGas, "Block-number", number, "LastStateID", lastStateID, "TotalRecords", len(eventRecords)) return stateSyncs, nil } From 20d99d94dfcb760cc969ac6b593427d9c2c1afce Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 20 May 2022 15:57:08 +0530 Subject: [PATCH 6/7] Adding individual gasUsed --- consensus/bor/clerk.go | 7 ++++--- consensus/bor/genesis_contracts_client.go | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/consensus/bor/clerk.go b/consensus/bor/clerk.go index d7e6982873..5524e249f2 100644 --- a/consensus/bor/clerk.go +++ b/consensus/bor/clerk.go @@ -23,10 +23,10 @@ type EventRecordWithTime struct { Time time.Time `json:"record_time" yaml:"record_time"` } -// String returns the string representatin of span -func (e *EventRecordWithTime) String() string { +// String returns the string representation of EventRecord +func (e *EventRecordWithTime) String(gasUsed uint64) string { return fmt.Sprintf( - "id %v, contract %v, data: %v, txHash: %v, logIndex: %v, chainId: %v, time %s", + "id %v, contract %v, data: %v, txHash: %v, logIndex: %v, chainId: %v, time %s, gasUsed %d", e.ID, e.Contract.String(), e.Data.String(), @@ -34,6 +34,7 @@ func (e *EventRecordWithTime) String() string { e.LogIndex, e.ChainID, e.Time.Format(time.RFC3339), + gasUsed, ) } diff --git a/consensus/bor/genesis_contracts_client.go b/consensus/bor/genesis_contracts_client.go index 456e3fe2e5..79a2a254c4 100644 --- a/consensus/bor/genesis_contracts_client.go +++ b/consensus/bor/genesis_contracts_client.go @@ -66,9 +66,10 @@ func (gc *GenesisContractsClient) CommitState( log.Error("Unable to pack tx for commitState", "error", err) return 0, err } - log.Info("→ committing new state", "eventRecord", event.String()) msg := getSystemMessage(common.HexToAddress(gc.StateReceiverContract), data) gasUsed, err := applyMessage(msg, state, header, gc.chainConfig, chCtx) + // Logging event log with time and individual gasUsed + log.Info("→ committing new state", "eventRecord", event.String(gasUsed)) if err != nil { return 0, err } From 59337a7a07bb6eba8dbead9f5e862d37946da367 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 20 May 2022 17:32:49 +0530 Subject: [PATCH 7/7] Minor Fix --- consensus/bor/errors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/bor/errors.go b/consensus/bor/errors.go index a1e60d1e21..df01b405b6 100644 --- a/consensus/bor/errors.go +++ b/consensus/bor/errors.go @@ -134,7 +134,7 @@ type InvalidStateReceivedError struct { func (e *InvalidStateReceivedError) Error() string { return fmt.Sprintf( - "Received invalid event %s at block %d. Requested events until %s. Last state id was %d", + "Received invalid event %v at block %d. Requested events until %s. Last state id was %d", e.Event, e.Number, e.To.Format(time.RFC3339),