Skip to content

Commit c49aadc

Browse files
sashabetonsashabeton
andauthored
internal/ethapi: exclude 7702 authorities from result in eth_createAccessList (#31336)
closes #31335 --------- Co-authored-by: sashabeton <sashabeton2007@gmail.com>
1 parent 4dfec7e commit c49aadc

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

eth/tracers/logger/access_list_tracer.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,24 +103,18 @@ type AccessListTracer struct {
103103
// NewAccessListTracer creates a new tracer that can generate AccessLists.
104104
// An optional AccessList can be specified to occupy slots and addresses in
105105
// the resulting accesslist.
106-
func NewAccessListTracer(acl types.AccessList, from, to common.Address, precompiles []common.Address) *AccessListTracer {
107-
excl := map[common.Address]struct{}{
108-
from: {}, to: {},
109-
}
110-
for _, addr := range precompiles {
111-
excl[addr] = struct{}{}
112-
}
106+
func NewAccessListTracer(acl types.AccessList, addressesToExclude map[common.Address]struct{}) *AccessListTracer {
113107
list := newAccessList()
114108
for _, al := range acl {
115-
if _, ok := excl[al.Address]; !ok {
109+
if _, ok := addressesToExclude[al.Address]; !ok {
116110
list.addAddress(al.Address)
117111
}
118112
for _, slot := range al.StorageKeys {
119113
list.addSlot(al.Address, slot)
120114
}
121115
}
122116
return &AccessListTracer{
123-
excl: excl,
117+
excl: addressesToExclude,
124118
list: list,
125119
}
126120
}

internal/ethapi/api.go

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,10 +1166,33 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH
11661166
// Retrieve the precompiles since they don't need to be added to the access list
11671167
precompiles := vm.ActivePrecompiles(b.ChainConfig().Rules(header.Number, isPostMerge, header.Time))
11681168

1169+
// addressesToExclude contains sender, receiver, precompiles and valid authorizations
1170+
addressesToExclude := map[common.Address]struct{}{args.from(): {}, to: {}}
1171+
for _, addr := range precompiles {
1172+
addressesToExclude[addr] = struct{}{}
1173+
}
1174+
1175+
// Prevent redundant operations if args contain more authorizations than EVM may handle
1176+
maxAuthorizations := uint64(*args.Gas) / params.CallNewAccountGas
1177+
if uint64(len(args.AuthorizationList)) > maxAuthorizations {
1178+
return nil, 0, nil, errors.New("insufficient gas to process all authorizations")
1179+
}
1180+
1181+
for _, auth := range args.AuthorizationList {
1182+
// Duplicating stateTransition.validateAuthorization() logic
1183+
if (!auth.ChainID.IsZero() && auth.ChainID.CmpBig(b.ChainConfig().ChainID) != 0) || auth.Nonce+1 < auth.Nonce {
1184+
continue
1185+
}
1186+
1187+
if authority, err := auth.Authority(); err == nil {
1188+
addressesToExclude[authority] = struct{}{}
1189+
}
1190+
}
1191+
11691192
// Create an initial tracer
1170-
prevTracer := logger.NewAccessListTracer(nil, args.from(), to, precompiles)
1193+
prevTracer := logger.NewAccessListTracer(nil, addressesToExclude)
11711194
if args.AccessList != nil {
1172-
prevTracer = logger.NewAccessListTracer(*args.AccessList, args.from(), to, precompiles)
1195+
prevTracer = logger.NewAccessListTracer(*args.AccessList, addressesToExclude)
11731196
}
11741197
for {
11751198
if err := ctx.Err(); err != nil {
@@ -1186,7 +1209,7 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH
11861209
msg := args.ToMessage(header.BaseFee, true, true)
11871210

11881211
// Apply the transaction with the access list tracer
1189-
tracer := logger.NewAccessListTracer(accessList, args.from(), to, precompiles)
1212+
tracer := logger.NewAccessListTracer(accessList, addressesToExclude)
11901213
config := vm.Config{Tracer: tracer.Hooks(), NoBaseFee: true}
11911214
evm := b.GetEVM(ctx, statedb, header, &config, nil)
11921215

0 commit comments

Comments
 (0)