mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-06-26 08:26:20 +00:00
core: implement EIP-8282: Builder Execution Requests (#35175)
implements https://github.com/ethereum/EIPs/pull/11760/changes#diff-0c9428673c7c725120dae93fda8a181c38bcfb1759d45e8accaf73b14e1f35cb --------- Co-authored-by: Gary Rong <garyrong0905@gmail.com>
This commit is contained in:
parent
a63e2f1247
commit
4387f433c9
6 changed files with 49 additions and 6 deletions
|
|
@ -70,6 +70,8 @@ func newBALTestEnv(extra types.GenesisAlloc) *balTestEnv {
|
|||
params.HistoryStorageAddress: {Nonce: 1, Code: params.HistoryStorageCode, Balance: common.Big0},
|
||||
params.WithdrawalQueueAddress: {Nonce: 1, Code: params.WithdrawalQueueCode, Balance: common.Big0},
|
||||
params.ConsolidationQueueAddress: {Nonce: 1, Code: params.ConsolidationQueueCode, Balance: common.Big0},
|
||||
params.BuilderDepositAddress: {Nonce: 1, Code: params.BuilderDepositCode, Balance: common.Big0},
|
||||
params.BuilderExitAddress: {Nonce: 1, Code: params.BuilderExitCode, Balance: common.Big0},
|
||||
}
|
||||
maps.Copy(alloc, extra)
|
||||
return &balTestEnv{
|
||||
|
|
@ -992,10 +994,12 @@ func TestBALMidTxBalanceRoundTrip(t *testing.T) {
|
|||
// means all four of the post-merge system contracts touched by every
|
||||
// Amsterdam block:
|
||||
//
|
||||
// - EIP-4788 beacon roots (pre-execution, when ParentBeaconRoot is set)
|
||||
// - EIP-2935 history storage (pre-execution)
|
||||
// - EIP-7002 withdrawal queue (post-execution)
|
||||
// - EIP-7251 consolidation queue (post-execution)
|
||||
// - EIP-4788 beacon roots (pre-execution, when ParentBeaconRoot is set)
|
||||
// - EIP-2935 history storage (pre-execution)
|
||||
// - EIP-7002 withdrawal queue (post-execution)
|
||||
// - EIP-7251 consolidation queue (post-execution)
|
||||
// - EIP-8282 builder-deposit queue (post-execution)
|
||||
// - EIP-8282 builder-exit queue (post-execution)
|
||||
func TestBALSystemContractsPresent(t *testing.T) {
|
||||
env := newBALTestEnv(nil)
|
||||
|
||||
|
|
@ -1013,6 +1017,8 @@ func TestBALSystemContractsPresent(t *testing.T) {
|
|||
{"HistoryStorage (2935)", params.HistoryStorageAddress},
|
||||
{"WithdrawalQueue (7002)", params.WithdrawalQueueAddress},
|
||||
{"ConsolidationQueue (7251)", params.ConsolidationQueueAddress},
|
||||
{"BuilderDepositQueue (8282)", params.BuilderDepositAddress},
|
||||
{"BuilderExitQueue (8282)", params.BuilderExitAddress},
|
||||
} {
|
||||
if findAccount(b, sys.addr) == nil {
|
||||
t.Errorf("%s (%x) MUST appear in BAL but is missing\n%s", sys.name, sys.addr, b.PrettyPrint())
|
||||
|
|
|
|||
|
|
@ -85,6 +85,8 @@ func TestProcessUBT(t *testing.T) {
|
|||
params.HistoryStorageAddress: {Nonce: 1, Code: params.HistoryStorageCode, Balance: common.Big0},
|
||||
params.WithdrawalQueueAddress: {Nonce: 1, Code: params.WithdrawalQueueCode, Balance: common.Big0},
|
||||
params.ConsolidationQueueAddress: {Nonce: 1, Code: params.ConsolidationQueueCode, Balance: common.Big0},
|
||||
params.BuilderDepositAddress: {Nonce: 1, Code: params.BuilderDepositCode, Balance: common.Big0},
|
||||
params.BuilderExitAddress: {Nonce: 1, Code: params.BuilderExitCode, Balance: common.Big0},
|
||||
},
|
||||
}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -718,6 +718,9 @@ func DeveloperGenesisBlock(gasLimit uint64, faucet *common.Address) *Genesis {
|
|||
params.HistoryStorageAddress: {Nonce: 1, Code: params.HistoryStorageCode, Balance: common.Big0},
|
||||
params.WithdrawalQueueAddress: {Nonce: 1, Code: params.WithdrawalQueueCode, Balance: common.Big0},
|
||||
params.ConsolidationQueueAddress: {Nonce: 1, Code: params.ConsolidationQueueCode, Balance: common.Big0},
|
||||
// EIP-8282 - Builder Execution Requests
|
||||
params.BuilderDepositAddress: {Nonce: 1, Code: params.BuilderDepositCode, Balance: common.Big0},
|
||||
params.BuilderExitAddress: {Nonce: 1, Code: params.BuilderExitCode, Balance: common.Big0},
|
||||
},
|
||||
}
|
||||
if faucet != nil {
|
||||
|
|
|
|||
|
|
@ -167,10 +167,9 @@ func PostExecution(ctx context.Context, config *params.ChainConfig, number *big.
|
|||
if config.IsAmsterdam(number, time) {
|
||||
blockAccessList = bal.NewConstructionBlockAccessList()
|
||||
}
|
||||
rules := config.Rules(number, true, time) // IsMerge is always true
|
||||
// Read requests if Prague is enabled.
|
||||
if config.IsPrague(number, time) {
|
||||
rules := config.Rules(number, true, time) // IsMerge is always true
|
||||
|
||||
requests = [][]byte{}
|
||||
// EIP-6110
|
||||
if err := ParseDepositLogs(&requests, allLogs, config); err != nil {
|
||||
|
|
@ -185,6 +184,16 @@ func PostExecution(ctx context.Context, config *params.ChainConfig, number *big.
|
|||
return nil, nil, fmt.Errorf("failed to process consolidation queue: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if config.IsAmsterdam(number, time) {
|
||||
// EIP-8282
|
||||
if err := ProcessBuilderDepositQueue(&requests, rules, evm, blockAccessIndex, blockAccessList); err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to process builder deposit queue: %w", err)
|
||||
}
|
||||
if err := ProcessBuilderExitQueue(&requests, rules, evm, blockAccessIndex, blockAccessList); err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to process builder exit queue: %w", err)
|
||||
}
|
||||
}
|
||||
return requests, blockAccessList, nil
|
||||
}
|
||||
|
||||
|
|
@ -361,6 +370,18 @@ func ProcessConsolidationQueue(requests *[][]byte, rules params.Rules, evm *vm.E
|
|||
return processRequestsSystemCall(requests, rules, evm, 0x02, params.ConsolidationQueueAddress, blockAccessIndex, blockAccessList)
|
||||
}
|
||||
|
||||
// ProcessBuilderDepositQueue calls the EIP-8282 builder deposit contract.
|
||||
// It returns the opaque request data returned by the contract.
|
||||
func ProcessBuilderDepositQueue(requests *[][]byte, rules params.Rules, evm *vm.EVM, blockAccessIndex uint32, blockAccessList *bal.ConstructionBlockAccessList) error {
|
||||
return processRequestsSystemCall(requests, rules, evm, 0x03, params.BuilderDepositAddress, blockAccessIndex, blockAccessList)
|
||||
}
|
||||
|
||||
// ProcessBuilderExitQueue calls the EIP-8282 builder exit contract.
|
||||
// It returns the opaque request data returned by the contract.
|
||||
func ProcessBuilderExitQueue(requests *[][]byte, rules params.Rules, evm *vm.EVM, blockAccessIndex uint32, blockAccessList *bal.ConstructionBlockAccessList) error {
|
||||
return processRequestsSystemCall(requests, rules, evm, 0x04, params.BuilderExitAddress, blockAccessIndex, blockAccessList)
|
||||
}
|
||||
|
||||
func processRequestsSystemCall(requests *[][]byte, rules params.Rules, evm *vm.EVM, requestType byte, addr common.Address, blockAccessIndex uint32, blockAccessList *bal.ConstructionBlockAccessList) error {
|
||||
if tracer := evm.Config.Tracer; tracer != nil {
|
||||
onSystemCallStart(tracer, evm.GetVMContext())
|
||||
|
|
|
|||
|
|
@ -1198,6 +1198,11 @@ func (c *ChainConfig) BlobConfig(fork forks.Fork) *BlobConfig {
|
|||
func (c *ChainConfig) ActiveSystemContracts(time uint64) map[string]common.Address {
|
||||
fork := c.LatestFork(time)
|
||||
active := make(map[string]common.Address)
|
||||
if fork >= forks.Amsterdam {
|
||||
// EIP-8282 - Builder Execution Requests
|
||||
active["BUILDER_DEPOSIT_CONTRACT_ADDRESS"] = BuilderDepositAddress
|
||||
active["BUILDER_EXIT_CONTRACT_ADDRESS"] = BuilderExitAddress
|
||||
}
|
||||
if fork >= forks.Osaka {
|
||||
// no new system contracts
|
||||
}
|
||||
|
|
|
|||
|
|
@ -240,6 +240,12 @@ var (
|
|||
// EIP-7251 - Increase the MAX_EFFECTIVE_BALANCE
|
||||
ConsolidationQueueAddress = common.HexToAddress("0x0000BBdDc7CE488642fb579F8B00f3a590007251")
|
||||
ConsolidationQueueCode = common.FromHex("3373fffffffffffffffffffffffffffffffffffffffe1460d35760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461019a57600182026001905f5b5f82111560685781019083028483029004916001019190604d565b9093900492505050366060146088573661019a573461019a575f5260205ff35b341061019a57600154600101600155600354806004026004013381556001015f358155600101602035815560010160403590553360601b5f5260605f60143760745fa0600101600355005b6003546002548082038060021160e7575060025b5f5b8181146101295782810160040260040181607402815460601b815260140181600101548152602001816002015481526020019060030154905260010160e9565b910180921461013b5790600255610146565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff141561017357505f5b6001546001828201116101885750505f61018e565b01600190035b5f555f6001556074025ff35b5f5ffd")
|
||||
|
||||
// EIP-8282 - Builder Execution Requests
|
||||
BuilderDepositAddress = common.HexToAddress("0x0000884d2AA32eAa155F59A2f24eFa73D9008282")
|
||||
BuilderDepositCode = common.FromHex("0x3373fffffffffffffffffffffffffffffffffffffffe146101065760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461023457600182026001905f5b5f82111560695781019083028483029004916001019190604e565b90939004925050503660b814608957366102345734610234575f5260205ff35b8034106102345760383567ffffffffffffffff1680633b9aca001161023457633b9aca00029034031061023457600154600101600155600354806006026004015f358155600101602035815560010160403581556001016060358155600101608035815560010160a035905560b85f5f3760b85fa0600101600355005b600354600254808203806101001161011d57506101005b5f5b8181146101c3578281016006026004018160b8028154815260200181600101548152602001816002015480825260401c67ffffffffffffffff16816010018160381c81600701538160301c81600601538160281c81600501538160201c81600401538160181c81600301538160101c81600201538160081c81600101535360200181600301548152602001816004015481526020019060050154905260010161011f565b91018092146101d557906002556101e0565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff141561020d57505f5b6001546020828201116102225750505f610228565b01602090035b5f555f60015560b8025ff35b5f5ffd")
|
||||
BuilderExitAddress = common.HexToAddress("0x000014574A74c805590AFF9499fc7A690f008282")
|
||||
BuilderExitCode = common.FromHex("0x3373fffffffffffffffffffffffffffffffffffffffe1460cb5760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461018857600182026001905f5b5f82111560685781019083028483029004916001019190604d565b909390049250505036603014608857366101885734610188575f5260205ff35b341061018857600154600101600155600354806003026004013381556001015f35815560010160203590553360601b5f5260305f60143760445fa0600101600355005b6003546002548082038060101160df575060105b5f5b8181146101175782810160030260040181604402815460601b8152601401816001015481526020019060020154905260010160e1565b91018092146101295790600255610134565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff141561016157505f5b6001546002828201116101765750505f61017c565b01600290035b5f555f6001556044025ff35b5f5ffd")
|
||||
)
|
||||
|
||||
// System log events.
|
||||
|
|
|
|||
Loading…
Reference in a new issue