Aere Network public source. Everything here can be checked against the live chain (chain id 2800, https://rpc.aere.network). Scope note, stated up front rather than buried: consensus on chain 2800 is classical secp256k1 ECDSA QBFT. The post-quantum work in this repository is at the signature, precompile, account and transport layers. Nothing here makes the consensus post-quantum, and no document in it should be read as claiming so.
241 lines
9.2 KiB
Java
241 lines
9.2 KiB
Java
/*
|
|
* Copyright contributors to Hyperledger 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.precompile;
|
|
|
|
import static org.hyperledger.besu.datatypes.Address.P256_VERIFY;
|
|
|
|
import org.hyperledger.besu.datatypes.Address;
|
|
import org.hyperledger.besu.evm.gascalculator.GasCalculator;
|
|
|
|
/** Provides the various precompiled contracts used on mainnet hard forks. */
|
|
public interface MainnetPrecompiledContracts {
|
|
|
|
/**
|
|
* Frontier precompile contract registry.
|
|
*
|
|
* @param gasCalculator the gas calculator
|
|
* @return the precompile contract registry
|
|
*/
|
|
static PrecompileContractRegistry frontier(final GasCalculator gasCalculator) {
|
|
PrecompileContractRegistry precompileContractRegistry = new PrecompileContractRegistry();
|
|
populateForFrontier(precompileContractRegistry, gasCalculator);
|
|
return precompileContractRegistry;
|
|
}
|
|
|
|
/**
|
|
* Populate registry for frontier.
|
|
*
|
|
* @param registry the registry
|
|
* @param gasCalculator the gas calculator
|
|
*/
|
|
static void populateForFrontier(
|
|
final PrecompileContractRegistry registry, final GasCalculator gasCalculator) {
|
|
registry.put(Address.ECREC, new ECRECPrecompiledContract(gasCalculator));
|
|
registry.put(Address.SHA256, new SHA256PrecompiledContract(gasCalculator));
|
|
registry.put(Address.RIPEMD160, new RIPEMD160PrecompiledContract(gasCalculator));
|
|
registry.put(Address.ID, new IDPrecompiledContract(gasCalculator));
|
|
}
|
|
|
|
/**
|
|
* Homestead precompile contract registry.
|
|
*
|
|
* @param gasCalculator the gas calculator
|
|
* @return the precompile contract registry
|
|
*/
|
|
static PrecompileContractRegistry homestead(final GasCalculator gasCalculator) {
|
|
return frontier(gasCalculator);
|
|
}
|
|
|
|
/**
|
|
* Byzantium precompile contract registry.
|
|
*
|
|
* @param gasCalculator the gas calculator
|
|
* @return the precompile contract registry
|
|
*/
|
|
static PrecompileContractRegistry byzantium(final GasCalculator gasCalculator) {
|
|
PrecompileContractRegistry precompileContractRegistry = new PrecompileContractRegistry();
|
|
populateForByzantium(precompileContractRegistry, gasCalculator);
|
|
return precompileContractRegistry;
|
|
}
|
|
|
|
/**
|
|
* Populate registry for byzantium.
|
|
*
|
|
* @param registry the registry
|
|
* @param gasCalculator the gas calculator
|
|
*/
|
|
static void populateForByzantium(
|
|
final PrecompileContractRegistry registry, final GasCalculator gasCalculator) {
|
|
populateForFrontier(registry, gasCalculator);
|
|
registry.put(
|
|
Address.MODEXP,
|
|
new BigIntegerModularExponentiationPrecompiledContract(gasCalculator, Long.MAX_VALUE));
|
|
registry.put(Address.ALTBN128_ADD, new AltBN128AddPrecompiledContract(gasCalculator, 500L));
|
|
registry.put(Address.ALTBN128_MUL, new AltBN128MulPrecompiledContract(gasCalculator, 40_000L));
|
|
registry.put(
|
|
Address.ALTBN128_PAIRING,
|
|
new AltBN128PairingPrecompiledContract(gasCalculator, 80_000L, 100_000L));
|
|
}
|
|
|
|
/**
|
|
* Istanbul precompile contract registry.
|
|
*
|
|
* @param gasCalculator the gas calculator
|
|
* @return the precompile contract registry
|
|
*/
|
|
static PrecompileContractRegistry istanbul(final GasCalculator gasCalculator) {
|
|
PrecompileContractRegistry precompileContractRegistry = new PrecompileContractRegistry();
|
|
populateForIstanbul(precompileContractRegistry, gasCalculator);
|
|
return precompileContractRegistry;
|
|
}
|
|
|
|
/**
|
|
* Populate registry for istanbul.
|
|
*
|
|
* @param registry the registry
|
|
* @param gasCalculator the gas calculator
|
|
*/
|
|
static void populateForIstanbul(
|
|
final PrecompileContractRegistry registry, final GasCalculator gasCalculator) {
|
|
populateForByzantium(registry, gasCalculator);
|
|
registry.put(Address.ALTBN128_ADD, new AltBN128AddPrecompiledContract(gasCalculator, 150L));
|
|
registry.put(Address.ALTBN128_MUL, new AltBN128MulPrecompiledContract(gasCalculator, 6_000L));
|
|
registry.put(
|
|
Address.ALTBN128_PAIRING,
|
|
new AltBN128PairingPrecompiledContract(gasCalculator, 34_000L, 45_000L));
|
|
registry.put(Address.BLAKE2B_F_COMPRESSION, new BLAKE2BFPrecompileContract(gasCalculator));
|
|
}
|
|
|
|
/**
|
|
* Cancun precompile contract registry.
|
|
*
|
|
* @param gasCalculator the gas calculator
|
|
* @return the precompile contract registry
|
|
*/
|
|
static PrecompileContractRegistry cancun(final GasCalculator gasCalculator) {
|
|
PrecompileContractRegistry precompileContractRegistry = new PrecompileContractRegistry();
|
|
populateForCancun(precompileContractRegistry, gasCalculator);
|
|
return precompileContractRegistry;
|
|
}
|
|
|
|
/**
|
|
* Populate registry for Cancun.
|
|
*
|
|
* @param registry the registry
|
|
* @param gasCalculator the gas calculator
|
|
*/
|
|
static void populateForCancun(
|
|
final PrecompileContractRegistry registry, final GasCalculator gasCalculator) {
|
|
populateForIstanbul(registry, gasCalculator);
|
|
|
|
// EIP-4844 - shard blob transactions
|
|
registry.put(Address.KZG_POINT_EVAL, new KZGPointEvalPrecompiledContract());
|
|
}
|
|
|
|
/**
|
|
* Prague precompile contract registry.
|
|
*
|
|
* @param gasCalculator the gas calculator
|
|
* @return the precompile contract registry
|
|
*/
|
|
static PrecompileContractRegistry prague(final GasCalculator gasCalculator) {
|
|
PrecompileContractRegistry precompileContractRegistry = new PrecompileContractRegistry();
|
|
populateForPrague(precompileContractRegistry, gasCalculator);
|
|
return precompileContractRegistry;
|
|
}
|
|
|
|
/**
|
|
* Populate registry for Prague.
|
|
*
|
|
* @param registry the registry
|
|
* @param gasCalculator the gas calculator
|
|
*/
|
|
static void populateForPrague(
|
|
final PrecompileContractRegistry registry, final GasCalculator gasCalculator) {
|
|
populateForCancun(registry, gasCalculator);
|
|
|
|
// EIP-2537 - BLS12-381 curve operations
|
|
registry.put(Address.BLS12_G1ADD, new BLS12G1AddPrecompiledContract());
|
|
registry.put(Address.BLS12_G1MULTIEXP, new BLS12G1MultiExpPrecompiledContract());
|
|
registry.put(Address.BLS12_G2ADD, new BLS12G2AddPrecompiledContract());
|
|
registry.put(Address.BLS12_G2MULTIEXP, new BLS12G2MultiExpPrecompiledContract());
|
|
registry.put(Address.BLS12_PAIRING, new BLS12PairingPrecompiledContract());
|
|
registry.put(Address.BLS12_MAP_FP_TO_G1, new BLS12MapFpToG1PrecompiledContract());
|
|
registry.put(Address.BLS12_MAP_FP2_TO_G2, new BLS12MapFp2ToG2PrecompiledContract());
|
|
}
|
|
|
|
/**
|
|
* Osaka precompile contract registry.
|
|
*
|
|
* @param gasCalculator the gas calculator
|
|
* @return the precompile contract registry
|
|
*/
|
|
static PrecompileContractRegistry osaka(final GasCalculator gasCalculator) {
|
|
PrecompileContractRegistry precompileContractRegistry = new PrecompileContractRegistry();
|
|
populateForOsaka(precompileContractRegistry, gasCalculator);
|
|
return precompileContractRegistry;
|
|
}
|
|
|
|
/**
|
|
* Populate registry for Osaka.
|
|
*
|
|
* @param registry the registry
|
|
* @param gasCalculator the gas calculator
|
|
*/
|
|
static void populateForOsaka(
|
|
final PrecompileContractRegistry registry, final GasCalculator gasCalculator) {
|
|
populateForPrague(registry, gasCalculator);
|
|
|
|
// EIP-7823 - Set upper bounds for MODEXP
|
|
registry.put(
|
|
Address.MODEXP,
|
|
new BigIntegerModularExponentiationPrecompiledContract(gasCalculator, 1024L));
|
|
// EIP-7951 - secp256r1 P256VERIFY
|
|
registry.put(P256_VERIFY, new P256VerifyPrecompiledContract(gasCalculator));
|
|
}
|
|
|
|
/**
|
|
* FutureEIPs precompile contract registry.
|
|
*
|
|
* @param gasCalculator the gas calculator
|
|
* @return the precompile contract registry
|
|
*/
|
|
static PrecompileContractRegistry futureEIPs(final GasCalculator gasCalculator) {
|
|
PrecompileContractRegistry precompileContractRegistry = new PrecompileContractRegistry();
|
|
populateForFutureEIPs(precompileContractRegistry, gasCalculator);
|
|
return precompileContractRegistry;
|
|
}
|
|
|
|
/**
|
|
* Populate registry for Future EIPs.
|
|
*
|
|
* @param registry the registry
|
|
* @param gasCalculator the gas calculator
|
|
*/
|
|
static void populateForFutureEIPs(
|
|
final PrecompileContractRegistry registry, final GasCalculator gasCalculator) {
|
|
// AERE "AerePQC" fork: full Osaka precompile set plus native post-quantum verifiers.
|
|
// Activated on a running chain via genesis config "futureEipsTime"; no re-genesis needed.
|
|
populateForOsaka(registry, gasCalculator);
|
|
|
|
// Native post-quantum precompiles (audited Bouncy Castle BCPQC verifiers).
|
|
registry.put(Address.AERE_FALCON512, new Falcon512PrecompiledContract(gasCalculator));
|
|
registry.put(Address.AERE_FALCON1024, new Falcon1024PrecompiledContract(gasCalculator));
|
|
registry.put(Address.AERE_MLDSA44, new MLDSA44PrecompiledContract(gasCalculator));
|
|
registry.put(Address.AERE_SLHDSA128S, new SLHDSA128sPrecompiledContract(gasCalculator));
|
|
registry.put(Address.AERE_SHAKE256, new SHAKE256PrecompiledContract(gasCalculator));
|
|
}
|
|
}
|