-
Notifications
You must be signed in to change notification settings - Fork 39
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Gas Mechanics] Implement Gas history; Migrate to Arbitrum Gas model #1714
Changes from all commits
5c99fe1
dcfae70
18b5ebd
3b57b36
d260860
f39a41d
0796abe
2c5d732
51830c7
9610077
6aaa044
d6859a0
4328651
4fa9570
1603add
8e3258f
6328ef1
5af1c41
18f5af0
040433e
4424153
a0f632c
b952cdf
32314bb
b9cb6e6
d4dcd1c
c08dccc
55f68ae
3949823
50bdd25
36c95bb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -67,12 +67,12 @@ func NewBatchExecutor( | |
} | ||
} | ||
|
||
// payL1Fees - this function modifies the state db according to the transactions contained within the batch context | ||
// in order to subtract gas fees from the balance. It returns a list of the transactions that have prepaid for their L1 | ||
// publishing costs. | ||
func (executor *batchExecutor) payL1Fees(stateDB *state.StateDB, context *BatchExecutionContext) (common.L2Transactions, common.L2Transactions) { | ||
transactions := make(common.L2Transactions, 0) | ||
freeTransactions := make(common.L2Transactions, 0) | ||
// filterTransactionsWithSufficientFunds - this function estimates hte l1 fees for the transaction in a given batch execution context. It does so by taking the price of the | ||
// pinned L1 block and using it as the cost per gas for the estimated gas of the calldata encoding of a transaction. It filters out any transactions that cannot afford to pay for their L1 | ||
// publishing cost. | ||
func (executor *batchExecutor) filterTransactionsWithSufficientFunds(stateDB *state.StateDB, context *BatchExecutionContext) (common.L2PricedTransactions, common.L2PricedTransactions) { | ||
transactions := make(common.L2PricedTransactions, 0) | ||
freeTransactions := make(common.L2PricedTransactions, 0) | ||
block, _ := executor.storage.FetchBlock(context.BlockPtr) | ||
|
||
for _, tx := range context.Transactions { | ||
|
@@ -97,43 +97,25 @@ func (executor *batchExecutor) payL1Fees(stateDB *state.StateDB, context *BatchE | |
isFreeTransaction = isFreeTransaction && tx.GasPrice().Cmp(gethcommon.Big0) == 0 | ||
|
||
if isFreeTransaction { | ||
freeTransactions = append(freeTransactions, tx) | ||
freeTransactions = append(freeTransactions, common.L2PricedTransaction{ | ||
Tx: tx, | ||
PublishingCost: big.NewInt(0), | ||
}) | ||
continue | ||
} | ||
if accBalance.Cmp(cost) == -1 { | ||
executor.logger.Info(fmt.Sprintf("insufficient account balance for tx - want: %d have: %d", cost, accBalance), log.TxKey, tx.Hash(), "addr", sender.Hex()) | ||
continue | ||
} | ||
stateDB.SubBalance(*sender, cost) | ||
stateDB.AddBalance(context.Creator, cost) | ||
// todo - add refund logic. | ||
|
||
transactions = append(transactions, tx) | ||
transactions = append(transactions, common.L2PricedTransaction{ | ||
Tx: tx, | ||
PublishingCost: big.NewInt(0).Set(cost), | ||
}) | ||
} | ||
return transactions, freeTransactions | ||
} | ||
|
||
func (executor *batchExecutor) refundL1Fees(stateDB *state.StateDB, context *BatchExecutionContext, transactions []*common.L2Tx) { | ||
block, _ := executor.storage.FetchBlock(context.BlockPtr) | ||
for _, tx := range transactions { | ||
cost, err := executor.gasOracle.EstimateL1StorageGasCost(tx, block) | ||
if err != nil { | ||
executor.logger.Warn("Unable to get gas cost for tx", log.TxKey, tx.Hash(), log.ErrKey, err) | ||
continue | ||
} | ||
|
||
sender, err := core.GetAuthenticatedSender(context.ChainConfig.ChainID.Int64(), tx) | ||
if err != nil { | ||
// todo @siliev - is this critical? Potential desync spot | ||
executor.logger.Warn("Unable to extract sender for tx", log.TxKey, tx.Hash()) | ||
continue | ||
} | ||
|
||
stateDB.AddBalance(*sender, cost) | ||
stateDB.SubBalance(context.Creator, cost) | ||
} | ||
} | ||
|
||
func (executor *batchExecutor) ComputeBatch(context *BatchExecutionContext, failForEmptyBatch bool) (*ComputedBatch, error) { //nolint:gocognit | ||
defer core.LogMethodDuration(executor.logger, measure.NewStopwatch(), "Batch context processed") | ||
|
||
|
@@ -183,23 +165,29 @@ func (executor *batchExecutor) ComputeBatch(context *BatchExecutionContext, fail | |
crossChainTransactions := executor.crossChainProcessors.Local.CreateSyntheticTransactions(messages, stateDB) | ||
executor.crossChainProcessors.Local.ExecuteValueTransfers(transfers, stateDB) | ||
|
||
transactionsToProcess, freeTransactions := executor.payL1Fees(stateDB, context) | ||
transactionsToProcess, freeTransactions := executor.filterTransactionsWithSufficientFunds(stateDB, context) | ||
|
||
xchainTxs := make(common.L2PricedTransactions, 0) | ||
for _, xTx := range crossChainTransactions { | ||
xchainTxs = append(xchainTxs, common.L2PricedTransaction{ | ||
Tx: xTx, | ||
PublishingCost: big.NewInt(0), | ||
}) | ||
} | ||
|
||
crossChainTransactions = append(crossChainTransactions, freeTransactions...) | ||
syntheticTransactions := append(xchainTxs, freeTransactions...) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. much clearer |
||
|
||
successfulTxs, excludedTxs, txReceipts, err := executor.processTransactions(batch, 0, transactionsToProcess, stateDB, context.ChainConfig, false) | ||
if err != nil { | ||
return nil, fmt.Errorf("could not process transactions. Cause: %w", err) | ||
} | ||
|
||
executor.refundL1Fees(stateDB, context, excludedTxs) | ||
|
||
ccSuccessfulTxs, _, ccReceipts, err := executor.processTransactions(batch, len(successfulTxs), crossChainTransactions, stateDB, context.ChainConfig, true) | ||
ccSuccessfulTxs, _, ccReceipts, err := executor.processTransactions(batch, len(successfulTxs), syntheticTransactions, stateDB, context.ChainConfig, true) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
if err = executor.verifyInboundCrossChainTransactions(crossChainTransactions, ccSuccessfulTxs, ccReceipts); err != nil { | ||
if err = executor.verifyInboundCrossChainTransactions(syntheticTransactions, ccSuccessfulTxs, ccReceipts); err != nil { | ||
return nil, fmt.Errorf("batch computation failed due to cross chain messages. Cause: %w", err) | ||
} | ||
|
||
|
@@ -220,7 +208,7 @@ func (executor *batchExecutor) ComputeBatch(context *BatchExecutionContext, fail | |
// we need to copy the batch to reset the internal hash cache | ||
copyBatch := *batch | ||
copyBatch.Header.Root = stateDB.IntermediateRoot(false) | ||
copyBatch.Transactions = append(successfulTxs, freeTransactions...) | ||
copyBatch.Transactions = append(successfulTxs, freeTransactions.ToTransactions()...) | ||
copyBatch.ResetHash() | ||
|
||
if err = executor.populateOutboundCrossChainData(©Batch, block, txReceipts); err != nil { | ||
|
@@ -387,8 +375,8 @@ func (executor *batchExecutor) populateHeader(batch *core.Batch, receipts types. | |
} | ||
} | ||
|
||
func (executor *batchExecutor) verifyInboundCrossChainTransactions(transactions types.Transactions, executedTxs types.Transactions, receipts types.Receipts) error { | ||
if transactions.Len() != executedTxs.Len() { | ||
func (executor *batchExecutor) verifyInboundCrossChainTransactions(transactions common.L2PricedTransactions, executedTxs types.Transactions, receipts types.Receipts) error { | ||
if len(transactions) != executedTxs.Len() { | ||
return fmt.Errorf("some synthetic transactions have not been executed") | ||
} | ||
|
||
|
@@ -404,7 +392,7 @@ func (executor *batchExecutor) verifyInboundCrossChainTransactions(transactions | |
func (executor *batchExecutor) processTransactions( | ||
batch *core.Batch, | ||
tCount int, | ||
txs []*common.L2Tx, | ||
txs common.L2PricedTransactions, | ||
stateDB *state.StateDB, | ||
cc *params.ChainConfig, | ||
noBaseFee bool, | ||
|
@@ -424,18 +412,18 @@ func (executor *batchExecutor) processTransactions( | |
executor.logger, | ||
) | ||
for _, tx := range txs { | ||
result, f := txResults[tx.Hash()] | ||
result, f := txResults[tx.Tx.Hash()] | ||
if !f { | ||
return nil, nil, nil, fmt.Errorf("there should be an entry for each transaction") | ||
} | ||
rec, foundReceipt := result.(*types.Receipt) | ||
if foundReceipt { | ||
executedTransactions = append(executedTransactions, tx) | ||
executedTransactions = append(executedTransactions, tx.Tx) | ||
txReceipts = append(txReceipts, rec) | ||
} else { | ||
// Exclude all errors | ||
excludedTransactions = append(excludedTransactions, tx) | ||
executor.logger.Info("Excluding transaction from batch", log.TxKey, tx.Hash(), log.BatchHashKey, batch.Hash(), "cause", result) | ||
excludedTransactions = append(excludedTransactions, tx.Tx) | ||
executor.logger.Info("Excluding transaction from batch", log.TxKey, tx.Tx.Hash(), log.BatchHashKey, batch.Hash(), "cause", result) | ||
} | ||
} | ||
sort.Sort(sortByTxIndex(txReceipts)) | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -77,9 +77,10 @@ type enclaveImpl struct { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
crossChainProcessors *crosschain.Processors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sharedSecretProcessor *components.SharedSecretProcessor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chain l2chain.ObscuroChain | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
service nodetype.NodeType | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
registry components.BatchRegistry | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chain l2chain.ObscuroChain | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
service nodetype.NodeType | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
registry components.BatchRegistry | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gasOracle gas.Oracle | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mgmtContractLib mgmtcontractlib.MgmtContractLib | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
attestationProvider components.AttestationProvider // interface for producing attestation reports and verifying them | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -268,9 +269,10 @@ func NewEnclave( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
debugger: debug, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stopControl: stopcontrol.New(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chain: chain, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
registry: registry, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
service: service, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chain: chain, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
registry: registry, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
service: service, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gasOracle: gasOracle, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mainMutex: sync.Mutex{}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -678,25 +680,36 @@ func (e *enclaveImpl) GetTransactionCount(encryptedParams common.EncryptedParams | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address := gethcommon.HexToAddress(addressStr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
seqNo := e.registry.HeadBatchSeq().Uint64() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(paramList) == 3 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tag, err := gethencoding.ExtractBlockNumber(paramList[2]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsPlaintextError(fmt.Errorf("unexpected tag parameter. Cause: %w", err)), nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
b, err := e.registry.GetBatchAtHeight(*tag) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsPlaintextError(fmt.Errorf("cant retrieve batch for tag. Cause: %w", err)), nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
seqNo = b.SeqNo().Uint64() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+683
to
+695
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The update to the - return responses.AsPlaintextError(fmt.Errorf("unexpected tag parameter. Cause: %w", err)), nil
+ return responses.AsPlaintextError(fmt.Errorf("unexpected tag parameter '%v'. Cause: %w", tag, err)), nil Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// extract, create and validate the VK encryption handler | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vkHandler, err := createVKHandler(&address, paramList[0], e.config.ObscuroChainID) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsPlaintextError(fmt.Errorf("unable to create VK encryptor - %w", err)), nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var nonce uint64 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
headBatch := e.registry.HeadBatchSeq() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if headBatch != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
l2Head, err := e.storage.FetchBatchBySeqNo(headBatch.Uint64()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err == nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// todo - we should return an error when head state is not available, but for current test situations with race | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// conditions we allow it to return zero while head state is uninitialized | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
s, err := e.storage.CreateStateDB(l2Head.Hash()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, responses.ToInternalError(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
nonce = s.GetNonce(address) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
l2Head, err := e.storage.FetchBatchBySeqNo(seqNo) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
StefanIliev545 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err == nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// todo - we should return an error when head state is not available, but for current test situations with race | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// conditions we allow it to return zero while head state is uninitialized | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
s, err := e.storage.CreateStateDB(l2Head.Hash()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, responses.ToInternalError(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
nonce = s.GetNonce(address) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+704
to
+712
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The logic in the |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
encoded := hexutil.EncodeUint64(nonce) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -1025,6 +1038,32 @@ func (e *enclaveImpl) EstimateGas(encryptedParams common.EncryptedParamsEstimate | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsEncryptedError(err, vkHandler), nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
block, err := e.blockResolver.FetchHeadBlock() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsPlaintextError(fmt.Errorf("internal server error")), err | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// The message is ran through the l1 publishing cost estimation for the current | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// known head block. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
l1Cost, err := e.gasOracle.EstimateL1CostForMsg(callMsg, block) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsPlaintextError(fmt.Errorf("internal server error")), err | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+1041
to
+1051
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The - return responses.AsPlaintextError(fmt.Errorf("internal server error")), err
+ return responses.AsPlaintextError(fmt.Errorf("failed to fetch head block for gas estimation: %w", err)), nil Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
batch, err := e.storage.FetchHeadBatch() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsPlaintextError(fmt.Errorf("internal server error")), err | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// We divide the total estimated l1 cost by the l2 fee per gas in order to convert | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// the expected cost into l2 gas based on current pricing. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// todo @siliev - add overhead when the base fee becomes dynamic. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
publishingGas := big.NewInt(0).Div(l1Cost, batch.Header.BaseFee) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// The one additional gas captures the modulo leftover in some edge cases | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// where BaseFee is bigger than the l1cost. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
publishingGas = big.NewInt(0).Add(publishingGas, gethcommon.Big1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+1041
to
+1065
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The - return responses.AsPlaintextError(fmt.Errorf("internal server error")), err
+ return responses.AsPlaintextError(fmt.Errorf("failed to fetch head block for gas estimation: %w", err)), nil Committable suggestion
Suggested change
Comment on lines
+1061
to
+1065
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The logic for converting L1 cost to L2 gas seems to be implemented correctly. However, the comment on line 1060 mentions adding overhead when the base fee becomes dynamic. This should be tracked as a TODO to ensure that the dynamic base fee is handled correctly in the future. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
executionGasEstimate, err := e.DoEstimateGas(callMsg, blockNumber, e.config.GasLocalExecutionCapFlag) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
err = fmt.Errorf("unable to estimate transaction - %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -1042,7 +1081,9 @@ func (e *enclaveImpl) EstimateGas(encryptedParams common.EncryptedParamsEstimate | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsEncryptedError(err, vkHandler), nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsEncryptedResponse(&executionGasEstimate, vkHandler), nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
totalGasEstimate := hexutil.Uint64(publishingGas.Uint64() + uint64(executionGasEstimate)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return responses.AsEncryptedResponse(&totalGasEstimate, vkHandler), nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (e *enclaveImpl) GetLogs(encryptedParams common.EncryptedParamsGetLogs) (*responses.Logs, common.SystemError) { //nolint | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not quite clear what prevents a user from setting the "GasFeeCap=0", and become a "free transaction"?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The mempool would reject such a transaction. The only way to get it in is bypass the mempool.