internal/ethapi: don't estimate gas if no limit provided in eth_createAccessList (#25467)
Because the goal of eth_createAccessList is providing the caller with the largest-possible access list, it's generally not important that the gas limit used by the tracer will match the usage of the call exactly. Avoiding the gas estimation step is a performance improvement. As long as the call does not branch based on gas limit, the returned access list will be accurate.
This commit is contained in:
parent
5fb463dddc
commit
948e08d55b
@ -1392,9 +1392,11 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH
|
|||||||
if db == nil || err != nil {
|
if db == nil || err != nil {
|
||||||
return nil, 0, nil, err
|
return nil, 0, nil, err
|
||||||
}
|
}
|
||||||
// If the gas amount is not set, extract this as it will depend on access
|
// If the gas amount is not set, default to RPC gas cap.
|
||||||
// lists and we'll need to reestimate every time
|
if args.Gas == nil {
|
||||||
nogas := args.Gas == nil
|
tmp := hexutil.Uint64(b.RPCGasCap())
|
||||||
|
args.Gas = &tmp
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure any missing fields are filled, extract the recipient and input data
|
// Ensure any missing fields are filled, extract the recipient and input data
|
||||||
if err := args.setDefaults(ctx, b); err != nil {
|
if err := args.setDefaults(ctx, b); err != nil {
|
||||||
@ -1420,15 +1422,6 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH
|
|||||||
accessList := prevTracer.AccessList()
|
accessList := prevTracer.AccessList()
|
||||||
log.Trace("Creating access list", "input", accessList)
|
log.Trace("Creating access list", "input", accessList)
|
||||||
|
|
||||||
// If no gas amount was specified, each unique access list needs it's own
|
|
||||||
// gas calculation. This is quite expensive, but we need to be accurate
|
|
||||||
// and it's convered by the sender only anyway.
|
|
||||||
if nogas {
|
|
||||||
args.Gas = nil
|
|
||||||
if err := args.setDefaults(ctx, b); err != nil {
|
|
||||||
return nil, 0, nil, err // shouldn't happen, just in case
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Copy the original db so we don't modify it
|
// Copy the original db so we don't modify it
|
||||||
statedb := db.Copy()
|
statedb := db.Copy()
|
||||||
// Set the accesslist to the last al
|
// Set the accesslist to the last al
|
||||||
|
Loading…
Reference in New Issue
Block a user