all: simplify requests

This commit is contained in:
Felix Lange 2024-10-24 22:40:22 +02:00
parent fdaa7015ef
commit 9fb1a781ee
4 changed files with 43 additions and 69 deletions

View file

@ -367,28 +367,18 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
var requests [][]byte var requests [][]byte
if chainConfig.IsPrague(vmContext.BlockNumber, vmContext.Time) { if chainConfig.IsPrague(vmContext.BlockNumber, vmContext.Time) {
requests = [][]byte{} requests = [][]byte{}
// EIP-6110 deposits // EIP-6110
var allLogs []*types.Log var allLogs []*types.Log
for _, receipt := range receipts { for _, receipt := range receipts {
allLogs = append(allLogs, receipt.Logs...) allLogs = append(allLogs, receipt.Logs...)
} }
depositRequests, err := core.ParseDepositLogs(allLogs, chainConfig) if err := ParseDepositLogs(&requests, allLogs, p.config); err != nil {
if err != nil {
return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("could not parse requests logs: %v", err)) return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("could not parse requests logs: %v", err))
} }
if depositRequests != nil { // EIP-7002
requests = append(requests, depositRequests) core.ProcessWithdrawalQueue(&requests, evm)
} // EIP-7251
// EIP-7002 withdrawals core.ProcessConsolidationQueue(&requests, evm)
withdrawalRequests := core.ProcessWithdrawalQueue(evm)
if withdrawalRequests != nil {
requests = append(requests, withdrawalRequests)
}
// EIP-7251 consolidations
consolidationRequests := core.ProcessConsolidationQueue(evm)
if consolidationRequests != nil {
requests = append(requests, consolidationRequests)
}
} }
// Commit block // Commit block

View file

@ -355,26 +355,16 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse
for _, r := range b.receipts { for _, r := range b.receipts {
blockLogs = append(blockLogs, r.Logs...) blockLogs = append(blockLogs, r.Logs...)
} }
depositRequests, err := ParseDepositLogs(blockLogs, config) if err := ParseDepositLogs(&requests, blockLogs, config); err != nil {
if err != nil {
panic(fmt.Sprintf("failed to parse deposit log: %v", err)) panic(fmt.Sprintf("failed to parse deposit log: %v", err))
} }
if depositRequests != nil {
requests = append(requests, depositRequests)
}
// create EVM for system calls // create EVM for system calls
blockContext := NewEVMBlockContext(b.header, cm, &b.header.Coinbase) blockContext := NewEVMBlockContext(b.header, cm, &b.header.Coinbase)
evm := vm.NewEVM(blockContext, statedb, cm.config, vm.Config{}) evm := vm.NewEVM(blockContext, statedb, cm.config, vm.Config{})
// EIP-7002 withdrawals // EIP-7002
withdrawalRequests := ProcessWithdrawalQueue(evm) ProcessWithdrawalQueue(&requests, evm)
if withdrawalRequests != nil { // EIP-7251
requests = append(requests, withdrawalRequests) ProcessConsolidationQueue(&requests, evm)
}
// EIP-7251 consolidations
consolidationRequests := ProcessConsolidationQueue(evm)
if consolidationRequests != nil {
requests = append(requests, consolidationRequests)
}
} }
if requests != nil { if requests != nil {
reqHash := types.CalcRequestsHash(requests) reqHash := types.CalcRequestsHash(requests)

View file

@ -107,24 +107,14 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
var requests [][]byte var requests [][]byte
if p.config.IsPrague(block.Number(), block.Time()) { if p.config.IsPrague(block.Number(), block.Time()) {
requests = [][]byte{} requests = [][]byte{}
// EIP-6110 deposits // EIP-6110
depositRequests, err := ParseDepositLogs(allLogs, p.config) if err := ParseDepositLogs(&requests, allLogs, p.config); err != nil {
if err != nil {
return nil, err return nil, err
} }
if depositRequests != nil { // EIP-7002
requests = append(requests, depositRequests) ProcessWithdrawalQueue(&requests, evm)
} // EIP-7251
// EIP-7002 withdrawals ProcessConsolidationQueue(&requests, evm)
withdrawalRequests := ProcessWithdrawalQueue(evm)
if withdrawalRequests != nil {
requests = append(requests, withdrawalRequests)
}
// EIP-7251 consolidations
consolidationRequests := ProcessConsolidationQueue(evm)
if consolidationRequests != nil {
requests = append(requests, consolidationRequests)
}
} }
// Finalize the block, applying any consensus engine specific extras (e.g. block rewards) // Finalize the block, applying any consensus engine specific extras (e.g. block rewards)
@ -278,18 +268,32 @@ func ProcessParentBlockHash(prevHash common.Hash, evm *vm.EVM) {
// ProcessWithdrawalQueue calls the EIP-7002 withdrawal queue contract. // ProcessWithdrawalQueue calls the EIP-7002 withdrawal queue contract.
// It returns the opaque request data returned by the contract. // It returns the opaque request data returned by the contract.
<<<<<<< HEAD
func ProcessWithdrawalQueue(evm *vm.EVM) []byte { func ProcessWithdrawalQueue(evm *vm.EVM) []byte {
return processRequestsSystemCall(evm, 0x01, params.WithdrawalQueueAddress) return processRequestsSystemCall(evm, 0x01, params.WithdrawalQueueAddress)
=======
func ProcessWithdrawalQueue(requests *[][]byte, vmenv *vm.EVM, statedb vm.StateDB) {
processRequestsSystemCall(requests, vmenv, statedb, 0x01, params.WithdrawalQueueAddress)
>>>>>>> 7481705901 (all: simplify requests)
} }
// ProcessConsolidationQueue calls the EIP-7251 consolidation queue contract. // ProcessConsolidationQueue calls the EIP-7251 consolidation queue contract.
// It returns the opaque request data returned by the contract. // It returns the opaque request data returned by the contract.
<<<<<<< HEAD
func ProcessConsolidationQueue(evm *vm.EVM) []byte { func ProcessConsolidationQueue(evm *vm.EVM) []byte {
return processRequestsSystemCall(evm, 0x02, params.ConsolidationQueueAddress) return processRequestsSystemCall(evm, 0x02, params.ConsolidationQueueAddress)
} }
func processRequestsSystemCall(evm *vm.EVM, requestType byte, addr common.Address) []byte { func processRequestsSystemCall(evm *vm.EVM, requestType byte, addr common.Address) []byte {
if tracer := evm.Config.Tracer; tracer != nil { if tracer := evm.Config.Tracer; tracer != nil {
=======
func ProcessConsolidationQueue(requests *[][]byte, vmenv *vm.EVM, statedb vm.StateDB) {
processRequestsSystemCall(requests, vmenv, statedb, 0x02, params.ConsolidationQueueAddress)
}
func processRequestsSystemCall(requests *[][]byte, vmenv *vm.EVM, statedb vm.StateDB, requestType byte, addr common.Address) {
if tracer := vmenv.Config.Tracer; tracer != nil {
>>>>>>> 7481705901 (all: simplify requests)
if tracer.OnSystemCallStart != nil { if tracer.OnSystemCallStart != nil {
tracer.OnSystemCallStart() tracer.OnSystemCallStart()
} }
@ -310,31 +314,31 @@ func processRequestsSystemCall(evm *vm.EVM, requestType byte, addr common.Addres
ret, _, _ := evm.Call(vm.AccountRef(msg.From), *msg.To, msg.Data, 30_000_000, common.U2560) ret, _, _ := evm.Call(vm.AccountRef(msg.From), *msg.To, msg.Data, 30_000_000, common.U2560)
evm.StateDB.Finalise(true) evm.StateDB.Finalise(true)
if len(ret) == 0 { if len(ret) == 0 {
return nil return // skip empty output
} }
// Create withdrawals requestsData with prefix 0x01 // Append prefixed requestsData to the requests list.
requestsData := make([]byte, len(ret)+1) requestsData := make([]byte, len(ret)+1)
requestsData[0] = requestType requestsData[0] = requestType
copy(requestsData[1:], ret) copy(requestsData[1:], ret)
return requestsData *requests = append(*requests, requestsData)
} }
// ParseDepositLogs extracts the EIP-6110 deposit values from logs emitted by // ParseDepositLogs extracts the EIP-6110 deposit values from logs emitted by
// BeaconDepositContract. // BeaconDepositContract.
func ParseDepositLogs(logs []*types.Log, config *params.ChainConfig) ([]byte, error) { func ParseDepositLogs(requests *[][]byte, logs []*types.Log, config *params.ChainConfig) error {
deposits := make([]byte, 1) // note: first byte is 0x00 (== deposit request type) deposits := make([]byte, 1) // note: first byte is 0x00 (== deposit request type)
for _, log := range logs { for _, log := range logs {
if log.Address == config.DepositContractAddress { if log.Address == config.DepositContractAddress {
request, err := types.DepositLogToRequest(log.Data) request, err := types.DepositLogToRequest(log.Data)
if err != nil { if err != nil {
return nil, fmt.Errorf("unable to parse deposit data: %v", err) return fmt.Errorf("unable to parse deposit data: %v", err)
} }
deposits = append(deposits, request...) deposits = append(deposits, request...)
} }
} }
if len(deposits) == 1 { if len(deposits) > 1 {
deposits = nil *requests = append(*requests, deposits)
} }
return deposits, nil return nil
} }

View file

@ -123,23 +123,13 @@ func (miner *Miner) generateWork(params *generateParams, witness bool) *newPaylo
if miner.chainConfig.IsPrague(work.header.Number, work.header.Time) { if miner.chainConfig.IsPrague(work.header.Number, work.header.Time) {
requests = [][]byte{} requests = [][]byte{}
// EIP-6110 deposits // EIP-6110 deposits
depositRequests, err := core.ParseDepositLogs(allLogs, miner.chainConfig) if err := core.ParseDepositLogs(&requests, allLogs, miner.chainConfig); err != nil {
if err != nil {
return &newPayloadResult{err: err} return &newPayloadResult{err: err}
} }
if depositRequests != nil { // EIP-7002
requests = append(requests, depositRequests) core.ProcessWithdrawalQueue(&requests, work.evm)
}
// EIP-7002 withdrawals
withdrawalRequests := core.ProcessWithdrawalQueue(work.evm)
if withdrawalRequests != nil {
requests = append(requests, withdrawalRequests)
}
// EIP-7251 consolidations // EIP-7251 consolidations
consolidationRequests := core.ProcessConsolidationQueue(work.evm) core.ProcessConsolidationQueue(&requests, work.evm)
if consolidationRequests != nil {
requests = append(requests, consolidationRequests)
}
} }
if requests != nil { if requests != nil {
reqHash := types.CalcRequestsHash(requests) reqHash := types.CalcRequestsHash(requests)