mirror of
https://github.com/vacp2p/status-linea-besu.git
synced 2026-01-09 23:38:08 -05:00
Add support for movePrecompileToAddress in State Overrides (eth_call) (#8115)
Signed-off-by: Gabriel-Trintinalia <gabriel.trintinalia@consensys.net>
This commit is contained in:
committed by
GitHub
parent
9c12ed19df
commit
5cc309a26e
@@ -16,8 +16,10 @@ package org.hyperledger.besu.evm.precompile;
|
||||
|
||||
import org.hyperledger.besu.datatypes.Address;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/** Encapsulates a group of {@link PrecompiledContract}s used together. */
|
||||
public class PrecompileContractRegistry {
|
||||
@@ -48,4 +50,13 @@ public class PrecompileContractRegistry {
|
||||
public void put(final Address address, final PrecompiledContract precompile) {
|
||||
precompiles.put(address, precompile);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the addresses of the precompiled contracts.
|
||||
*
|
||||
* @return the addresses
|
||||
*/
|
||||
public Set<Address> getPrecompileAddresses() {
|
||||
return Collections.unmodifiableSet(precompiles.keySet());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -37,7 +38,8 @@ import org.slf4j.LoggerFactory;
|
||||
public class MessageCallProcessor extends AbstractMessageProcessor {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(MessageCallProcessor.class);
|
||||
|
||||
private final PrecompileContractRegistry precompiles;
|
||||
/** The precompiles. */
|
||||
protected final PrecompileContractRegistry precompiles;
|
||||
|
||||
/**
|
||||
* Instantiates a new Message call processor.
|
||||
@@ -171,4 +173,14 @@ public class MessageCallProcessor extends AbstractMessageProcessor {
|
||||
frame.setExceptionalHaltReason(result.getHaltReason());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the precompile addresses.
|
||||
*
|
||||
* @return the precompile addresses
|
||||
*/
|
||||
@VisibleForTesting
|
||||
public Set<Address> getPrecompileAddresses() {
|
||||
return precompiles.getPrecompileAddresses();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright contributors to Besu.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
|
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
package org.hyperledger.besu.evm.processor;
|
||||
|
||||
import org.hyperledger.besu.datatypes.Address;
|
||||
import org.hyperledger.besu.evm.precompile.PrecompileContractRegistry;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* A message call processor designed specifically for simulation purposes that allows for overriding
|
||||
* precompile addresses.
|
||||
*/
|
||||
public class OverriddenPrecompilesMessageCallProcessor extends MessageCallProcessor {
|
||||
|
||||
/**
|
||||
* Instantiates a new Modifiable precompiles message call processor for simulation.
|
||||
*
|
||||
* @param originalProcessor the original processor
|
||||
* @param precompileOverrides the address overrides
|
||||
*/
|
||||
public OverriddenPrecompilesMessageCallProcessor(
|
||||
final MessageCallProcessor originalProcessor,
|
||||
final Map<Address, Address> precompileOverrides) {
|
||||
super(
|
||||
originalProcessor.evm,
|
||||
createRegistryWithPrecompileOverrides(originalProcessor.precompiles, precompileOverrides));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new PrecompileContractRegistry with the specified address overrides.
|
||||
*
|
||||
* @param originalRegistry the original precompile contract registry
|
||||
* @param precompileOverrides the address overrides
|
||||
* @return a new PrecompileContractRegistry with the overrides applied
|
||||
*/
|
||||
private static PrecompileContractRegistry createRegistryWithPrecompileOverrides(
|
||||
final PrecompileContractRegistry originalRegistry,
|
||||
final Map<Address, Address> precompileOverrides) {
|
||||
PrecompileContractRegistry newRegistry = new PrecompileContractRegistry();
|
||||
for (Address originalAddress : originalRegistry.getPrecompileAddresses()) {
|
||||
Address effectiveAddress = precompileOverrides.getOrDefault(originalAddress, originalAddress);
|
||||
newRegistry.put(effectiveAddress, originalRegistry.get(originalAddress));
|
||||
}
|
||||
return newRegistry;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user