EIP-2930: Access Lists
EIP-2930 adds an optional accessList field to transactions: a pre-declared list of (address, storageKeys[]) tuples that the transaction will touch. Pre-declared state access gets a gas discount; non-declared access costs more. The goal: enable parallel transaction execution by letting nodes know in advance what state each tx needs.
Format
accessList = [
(address_1, [storageKey_1a, storageKey_1b, ...]),
(address_2, [storageKey_2a, ...]),
...
]Neo Equivalent: Witness Scopes
Neo's WitnessScope.CustomContracts already serves the same role for the authorisation surface — declaring "this signature authorises calls only into these contracts". Combined with Signer.AllowedContracts and Signer.AllowedGroups, the protocol knows ahead of time which contracts a transaction can touch.
For the parallel-execution use case (knowing storage keys ahead of time), Neo's storage prefix model makes static analysis tractable — the contract bytecode declares its storage prefixes via Storage.Get/Put/Delete call sites.
Live on Neo TestNet
Both implementations are deployed on Neo N3 TestNet (network magic 894710606).
| Implementation | Contract Hash | Deploy Tx |
|---|---|---|
Solidity (neo-solc) | 0x02a174b4080c57d8ceb2c66b223799a79d09a2c3 | 0x17844b4b…d94112 |
Neo C# (nccs) | 0x3570e80f52a9329b604d5d18fb94de3133b0a6ad | 0xb1bfb7d4…136169 |
Cross-implementation invocations match on scopeCalledByEntry, scopeGlobal. Source pairs under docs/standards-mirror/deployments/eip-2930/.
