Evmtool graalvm support (#5192)

Changes and config to support using GraalVM AOT to compile and
execute evmTool as an alternate configuration. 

While not as long-term performant the startup time
makes filling reference tests with Besu reasonable.

Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com>
pull/5252/head
Danno Ferrin 2 years ago committed by GitHub
parent 8ab19bfff8
commit 0f973373f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      CHANGELOG.md
  2. 10
      crypto/src/main/java/org/hyperledger/besu/crypto/AbstractSECP256.java
  3. 41
      ethereum/evmtool/build.gradle
  4. 104
      ethereum/evmtool/src/main/graal/reflection-config.json
  5. 4
      ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/B11rSubCommand.java
  6. 55
      ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CliqueGenesisFileModule.java
  7. 4
      ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmTool.java
  8. 19
      ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/GenesisFileModule.java
  9. 54
      ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/IBFTGenesisFileModule.java
  10. 53
      ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/QBFTGenesisFileModule.java
  11. 2
      evm/src/main/java/org/hyperledger/besu/evm/precompile/BigIntegerModularExponentiationPrecompiledContract.java
  12. 131
      gradle/verification-metadata.xml
  13. 1
      gradle/versions.gradle

@ -4,8 +4,13 @@
### Breaking Changes
- In `evmtool` (an offline EVM executor tool principally used for reference tests), the `--prestate` and `--genesis` options no longer parse genesis files containing IBFT, QBFT, and Clique network definitions. The same genesis files will work with those json entries removed. [#5192](https://github.com/hyperledger/besu/pull/5192)
### Additions and Improvements
- An alternate build target for the EVM using GraalVM AOT compilaiton was added. [#5192](https://github.com/hyperledger/besu/pull/5192)
- To generate the binary install and use GraalVM 23.3.r17 or higher and run `./gradlew naticeCompile`. The binary will be located in `ethereum/evmtool/build/native/nativeCompile`
### Bug Fixes
### Download Links

@ -37,6 +37,7 @@ import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.signers.DSAKCalculator;
import org.bouncycastle.crypto.signers.ECDSASigner;
import org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.math.ec.ECAlgorithms;
import org.bouncycastle.math.ec.ECPoint;
@ -44,13 +45,6 @@ import org.bouncycastle.math.ec.ECPoint;
/** The Abstract secp256. */
public abstract class AbstractSECP256 implements SignatureAlgorithm {
/** The constant PRIVATE_KEY_BYTE_LENGTH. */
protected static final int PRIVATE_KEY_BYTE_LENGTH = 32;
/** The constant PUBLIC_KEY_BYTE_LENGTH. */
protected static final int PUBLIC_KEY_BYTE_LENGTH = 64;
/** The constant SIGNATURE_BYTE_LENGTH. */
protected static final int SIGNATURE_BYTE_LENGTH = 65;
/** The constant PROVIDER. */
public static final String PROVIDER = "BC";
@ -82,7 +76,7 @@ public abstract class AbstractSECP256 implements SignatureAlgorithm {
curveOrder = curve.getN();
halfCurveOrder = curveOrder.shiftRight(1);
try {
keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM, PROVIDER);
keyPairGenerator = new KeyPairGeneratorSpi.ECDSA();
} catch (final Exception e) {
throw new RuntimeException(e);
}

@ -14,6 +14,10 @@
*
*/
plugins {
id 'org.graalvm.buildtools.native' version '0.9.17'
}
apply plugin: 'java-library'
apply plugin: 'application'
apply plugin: 'idea'
@ -36,10 +40,6 @@ dependencies {
implementation project(':config')
implementation project(':crypto')
implementation project(':datatypes')
implementation project(':consensus:clique')
implementation project(':consensus:common')
implementation project(':consensus:ibft')
implementation project(':consensus:qbft')
implementation project(':ethereum:api')
implementation project(':ethereum:core')
implementation project(':ethereum:referencetests')
@ -57,6 +57,7 @@ dependencies {
implementation 'io.vertx:vertx-core'
annotationProcessor 'com.google.dagger:dagger-compiler'
annotationProcessor 'info.picocli:picocli-codegen'
testImplementation 'junit:junit'
testImplementation 'org.assertj:assertj-core'
@ -64,6 +65,9 @@ dependencies {
testImplementation 'org.mockito:mockito-core'
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine'
// No logging in grallvm EvmTool
nativeImageClasspath 'org.slf4j:slf4j-nop'
}
mainClassName = 'org.hyperledger.besu.evmtool.EvmTool'
@ -143,3 +147,32 @@ task dockerUpload(type: Exec) {
executable "sh"
args "-c", cmd
}
graalvmNative {
binaries {
main {
sharedLibrary = false
buildArgs.addAll(
"-H:ReflectionConfigurationFiles=${projectDir}/src/main/graal/reflection-config.json",
"-H:AdditionalSecurityProviders=org.bouncycastle.jce.provider.BouncyCastleProvider",
'-H:+TraceSecurityServices'
)
// Netty drags in older versions of bouncy castle, exclude it so there are no conflicts
excludeConfig.put("io.netty:netty-buffer:4.1.74.Final", [".*"])
}
}
}
configurations.nativeImageClasspath {
// netty statically allocates some problematic classes
exclude group: 'io.netty', module: 'netty-buffer'
exclude group: 'io.netty', module: 'netty-transport'
// keep log4j from sneaking in. GraalVM has an aleric reaction if it sees even one class
exclude group: 'org.slf4j', module: 'log4j-over-slf4j:1.7.36'
exclude group: "log4j", module: "log4j"
exclude group: "org.apache.logging.log4j"
}

@ -0,0 +1,104 @@
[
{
"name": "com.github.benmanes.caffeine.cache.PSMW",
"allDeclaredConstructors": true
},
{
"name": "com.github.benmanes.caffeine.cache.PSW",
"allDeclaredConstructors": true
},
{
"name": "com.github.benmanes.caffeine.cache.PSWMS",
"allDeclaredConstructors": true
},
{
"name": "com.github.benmanes.caffeine.cache.SSLA",
"allDeclaredConstructors": true
},
{
"name": "com.github.benmanes.caffeine.cache.SSLMSW",
"allDeclaredConstructors": true
},
{
"name": "com.github.benmanes.caffeine.cache.SSMSW",
"allDeclaredConstructors": true
},
{
"name": "com.github.benmanes.caffeine.cache.SSMW",
"allDeclaredConstructors": true
},
{
"name": "org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi",
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi$ECDSA",
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi",
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi$ECDSA",
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.bouncycastle.jcajce.provider.digest.Keccak$Mappings",
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.bouncycastle.jcajce.provider.digest.Keccak$Digest256",
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.bouncycastle.jcajce.provider.digest.Keccak",
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.hyperledger.besu.ethereum.referencetests.ReferenceTestEnv",
"queryAllPublicConstructors" : true,
"queryAllPublicMethods" : true,
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.hyperledger.besu.ethereum.referencetests.ReferenceTestEnv$EnvWithdrawal",
"queryAllPublicConstructors" : true,
"queryAllPublicMethods" : true,
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.hyperledger.besu.ethereum.referencetests.ReferenceTestWorldState",
"queryAllPublicConstructors" : true,
"queryAllPublicMethods" : true,
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.hyperledger.besu.ethereum.referencetests.ReferenceTestWorldState$AccountMock",
"queryAllPublicConstructors" : true,
"queryAllPublicMethods" : true,
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.hyperledger.besu.ethereum.referencetests.BlockchainReferenceTestCaseSpec$ReferenceTestBlockHeader",
"queryAllPublicConstructors" : true,
"queryAllPublicMethods" : true,
"allDeclaredConstructors": true,
"allPublicMethods": true
},
{
"name": "org.hyperledger.besu.evm.internal.ReturnStack$ReturnStackItem[]",
"unsafeAllocated": true
}
]

@ -240,9 +240,11 @@ public class B11rSubCommand implements Runnable {
private ReferenceTestBlockHeader readHeader(final JsonNode jsonObject) {
ObjectNode objectNode = (ObjectNode) jsonObject;
maybeMoveField(objectNode, "logsBloom", "bloom");
maybeMoveField(objectNode, "sha3Uncles", "uncleHash");
maybeMoveField(objectNode, "miner", "coinbase");
maybeMoveField(objectNode, "transactionsRoot", "transactionsTrie");
maybeMoveField(objectNode, "receiptsRoot", "receiptTrie");
maybeMoveField(objectNode, "logsBloom", "bloom");
return objectMapper.convertValue(jsonObject, ReferenceTestBlockHeader.class);
}
}

@ -1,55 +0,0 @@
/*
* Copyright 2018 ConsenSys AG.
*
* 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.evmtool;
import org.hyperledger.besu.config.GenesisConfigOptions;
import org.hyperledger.besu.consensus.clique.CliqueBlockHeaderFunctions;
import org.hyperledger.besu.consensus.clique.CliqueProtocolSchedule;
import org.hyperledger.besu.crypto.KeyPairSecurityModule;
import org.hyperledger.besu.crypto.NodeKey;
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory;
import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions;
import org.hyperledger.besu.ethereum.mainnet.HeaderBasedProtocolSchedule;
import org.hyperledger.besu.evm.internal.EvmConfiguration;
import java.util.Optional;
import javax.inject.Named;
class CliqueGenesisFileModule extends GenesisFileModule {
private final NodeKey nodeKey =
new NodeKey(
new KeyPairSecurityModule(SignatureAlgorithmFactory.getInstance().generateKeyPair()));
CliqueGenesisFileModule(final String genesisConfig) {
super(genesisConfig);
}
@Override
HeaderBasedProtocolSchedule provideProtocolSchedule(
final GenesisConfigOptions configOptions,
@Named("Fork") final Optional<String> fork,
@Named("RevertReasonEnabled") final boolean revertReasonEnabled) {
// dagger can handle this magic one day
return CliqueProtocolSchedule.create(
configOptions, nodeKey, revertReasonEnabled, EvmConfiguration.DEFAULT);
}
@Override
BlockHeaderFunctions blockHashFunction() {
return new CliqueBlockHeaderFunctions();
}
}

@ -15,13 +15,9 @@
*/
package org.hyperledger.besu.evmtool;
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory;
public final class EvmTool {
public static void main(final String... args) {
SignatureAlgorithmFactory.setDefaultInstance();
final EvmToolCommand evmToolCommand = new EvmToolCommand();
evmToolCommand.execute(args);

@ -41,10 +41,6 @@ public class GenesisFileModule {
private final String genesisConfig;
protected GenesisFileModule(final File genesisFile) throws IOException {
this.genesisConfig = Files.readString(genesisFile.toPath(), Charset.defaultCharset());
}
protected GenesisFileModule(final String genesisConfig) {
this.genesisConfig = genesisConfig;
}
@ -101,20 +97,11 @@ public class GenesisFileModule {
}
private static GenesisFileModule createGenesisModule(final String genesisConfig) {
// duplicating work from JsonGenesisConfigOptions, but in a refactoring this goes away.
final JsonObject genesis = new JsonObject(genesisConfig);
final JsonObject config = genesis.getJsonObject("config");
if (config.containsKey("ethash")) {
return new MainnetGenesisFileModule(genesisConfig);
} else if (config.containsKey("ibft")) {
return new IBFTGenesisFileModule(genesisConfig);
} else if (config.containsKey("clique")) {
return new CliqueGenesisFileModule(genesisConfig);
} else if (config.containsKey("qbft")) {
return new QBFTGenesisFileModule(genesisConfig);
} else {
// default is mainnet
return new MainnetGenesisFileModule(genesisConfig);
if (config.containsKey("ibft") || config.containsKey("clique") || config.containsKey("qbft")) {
throw new RuntimeException("Only Ethash and Merge configs accepted as genesis files");
}
return new MainnetGenesisFileModule(genesisConfig);
}
}

@ -1,54 +0,0 @@
/*
* Copyright ConsenSys AG.
*
* 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.evmtool;
import org.hyperledger.besu.config.BftConfigOptions;
import org.hyperledger.besu.config.GenesisConfigOptions;
import org.hyperledger.besu.consensus.common.ForksSchedule;
import org.hyperledger.besu.consensus.common.bft.BftBlockHeaderFunctions;
import org.hyperledger.besu.consensus.ibft.IbftExtraDataCodec;
import org.hyperledger.besu.consensus.ibft.IbftForksSchedulesFactory;
import org.hyperledger.besu.consensus.ibft.IbftProtocolSchedule;
import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions;
import org.hyperledger.besu.ethereum.mainnet.HeaderBasedProtocolSchedule;
import org.hyperledger.besu.evm.internal.EvmConfiguration;
import java.util.Optional;
import javax.inject.Named;
class IBFTGenesisFileModule extends GenesisFileModule {
final IbftExtraDataCodec bftExtraDataEncoder = new IbftExtraDataCodec();
IBFTGenesisFileModule(final String genesisConfig) {
super(genesisConfig);
}
@Override
HeaderBasedProtocolSchedule provideProtocolSchedule(
final GenesisConfigOptions configOptions,
@Named("Fork") final Optional<String> fork,
@Named("RevertReasonEnabled") final boolean revertReasonEnabled) {
final ForksSchedule<BftConfigOptions> forksSchedule =
IbftForksSchedulesFactory.create(configOptions);
return IbftProtocolSchedule.create(
configOptions, forksSchedule, bftExtraDataEncoder, EvmConfiguration.DEFAULT);
}
@Override
BlockHeaderFunctions blockHashFunction() {
return BftBlockHeaderFunctions.forOnchainBlock(bftExtraDataEncoder);
}
}

@ -1,53 +0,0 @@
/*
* Copyright Hyperledger Besu Contributors.
*
* 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.evmtool;
import org.hyperledger.besu.config.GenesisConfigOptions;
import org.hyperledger.besu.config.QbftConfigOptions;
import org.hyperledger.besu.consensus.common.ForksSchedule;
import org.hyperledger.besu.consensus.common.bft.BftBlockHeaderFunctions;
import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec;
import org.hyperledger.besu.consensus.qbft.QbftForksSchedulesFactory;
import org.hyperledger.besu.consensus.qbft.QbftProtocolSchedule;
import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions;
import org.hyperledger.besu.ethereum.mainnet.HeaderBasedProtocolSchedule;
import java.util.Optional;
import javax.inject.Named;
class QBFTGenesisFileModule extends GenesisFileModule {
final QbftExtraDataCodec bftExtraDataEncoder;
QBFTGenesisFileModule(final String genesisConfig) {
super(genesisConfig);
bftExtraDataEncoder = new QbftExtraDataCodec();
}
@Override
HeaderBasedProtocolSchedule provideProtocolSchedule(
final GenesisConfigOptions configOptions,
@Named("Fork") final Optional<String> fork,
@Named("RevertReasonEnabled") final boolean revertReasonEnabled) {
final ForksSchedule<QbftConfigOptions> forksSchedule =
QbftForksSchedulesFactory.create(configOptions);
return QbftProtocolSchedule.create(
configOptions, forksSchedule, revertReasonEnabled, bftExtraDataEncoder);
}
@Override
BlockHeaderFunctions blockHashFunction() {
return BftBlockHeaderFunctions.forOnchainBlock(bftExtraDataEncoder);
}
}

@ -47,7 +47,7 @@ public class BigIntegerModularExponentiationPrecompiledContract
static {
try {
useNative = LibArithmetic.ENABLED;
} catch (UnsatisfiedLinkError ule) {
} catch (UnsatisfiedLinkError | NoClassDefFoundError ule) {
LOG.info("modexp native precompile not available: {}", ule.getMessage());
useNative = false;
}

@ -158,6 +158,11 @@
<sha256 value="32cfe9eb0c630db42822e567d9a36463edae3a6a4950b95d33b0ed31a68f19a6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson" name="jackson-base" version="2.13.3">
<artifact name="jackson-base-2.13.3.pom">
<sha256 value="72d67291876c63e1896bc7d8ff799033d3a4b9029020110488af9c97315ed939" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson" name="jackson-base" version="2.13.4">
<artifact name="jackson-base-2.13.4.pom">
<sha256 value="98b08346fa922deb37afb02713d50a6c56848250374c64198153a3f9dcb79879" origin="Generated by Gradle"/>
@ -198,6 +203,11 @@
<sha256 value="94c48fad49eff295752239f853d24c90e52065791df2839f5adf6b9ac2968f76" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson" name="jackson-bom" version="2.13.3">
<artifact name="jackson-bom-2.13.3.pom">
<sha256 value="df675b83b6caba7602fb47d75d4bb513c2af4c0a6155d7e397c0ec0f34112c75" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson" name="jackson-bom" version="2.13.4">
<artifact name="jackson-bom-2.13.4.pom">
<sha256 value="435e9493ddaa96e51995be83b31376ebffd2b37361d8567e1ea14e1c64c3f0d7" origin="Generated by Gradle"/>
@ -264,6 +274,17 @@
<sha256 value="c2fd4366b1647233c99c70c17a2e90c89bf1ea60843749cca99d794525df9cd2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson.core" name="jackson-annotations" version="2.13.3">
<artifact name="jackson-annotations-2.13.3.jar">
<sha256 value="5326a6fbcde7cf8817f36c254101cd45f6acea4258518cd3c80ee5b89f4e4b9b" origin="Generated by Gradle"/>
</artifact>
<artifact name="jackson-annotations-2.13.3.module">
<sha256 value="9cff35722597acaae21f8fe630317aced55855f92d3ba21bac4b3f90892ea00c" origin="Generated by Gradle"/>
</artifact>
<artifact name="jackson-annotations-2.13.3.pom">
<sha256 value="9da0776fe81f9feed8ec57dd8a375f2c486115d502a989117f55a77e1492f24c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson.core" name="jackson-annotations" version="2.13.4">
<artifact name="jackson-annotations-2.13.4.jar">
<sha256 value="ac5b27a634942391ca113850ee7db01df1499a240174021263501c05fc653b44" origin="Generated by Gradle"/>
@ -305,6 +326,17 @@
<sha256 value="7bdeb19b730522c1f0f651fe0d797b141c386a1e56feaae621f1955cf2faf021" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson.core" name="jackson-core" version="2.13.3">
<artifact name="jackson-core-2.13.3.jar">
<sha256 value="ab119a8ea3cc69472ebc0e870b849bfbbe536ad57d613dc38453ccd592ca6a3d" origin="Generated by Gradle"/>
</artifact>
<artifact name="jackson-core-2.13.3.module">
<sha256 value="eca2ac4d1d67ae89f43e6390fcbcbf1633fd8c3a1a4968d93214ebe5825f61e3" origin="Generated by Gradle"/>
</artifact>
<artifact name="jackson-core-2.13.3.pom">
<sha256 value="3d3c8e4439bf2db43760a61207dfc957ad99a59b752cc8476990b49de00cdefc" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson.core" name="jackson-core" version="2.13.4">
<artifact name="jackson-core-2.13.4.jar">
<sha256 value="4c2e043200edd9ee7ba6fc378bd5c17784a5bf2388e152d208068b51fd0839cf" origin="Generated by Gradle"/>
@ -348,6 +380,17 @@
<sha256 value="64eccb5e2ae32fa1e98449b229cc5c69c5b82ac6a044e50c259d84fda9aa42e8" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson.core" name="jackson-databind" version="2.13.3">
<artifact name="jackson-databind-2.13.3.jar">
<sha256 value="6444bf08d8cd4629740afc3db1276938f494728deb663ce585c4e91f6b45eb84" origin="Generated by Gradle"/>
</artifact>
<artifact name="jackson-databind-2.13.3.module">
<sha256 value="422d6822037d1a58b918dcebbb475082f07ca7cca7e4b582873c64c6cde4b887" origin="Generated by Gradle"/>
</artifact>
<artifact name="jackson-databind-2.13.3.pom">
<sha256 value="902602b56c19e7dd3a97c1d74840866cc328bee221e29b2bc7ede3bf3d753b0b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson.core" name="jackson-databind" version="2.13.4.2">
<artifact name="jackson-databind-2.13.4.2.jar">
<sha256 value="ba1a368137f9b92f48dd07f299ff7a782a69487b853ef5578215426fcde8f08b" origin="Generated by Gradle"/>
@ -1620,6 +1663,14 @@
<sha256 value="24150c7dbdc8a5bb987cbeb4898ee1515d2893d3f6224acfc563da1a7fd5c283" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="info.picocli" name="picocli-codegen" version="4.6.3">
<artifact name="picocli-codegen-4.6.3.jar">
<sha256 value="1a73aa038222f13835788ee834547bf33f12a93e480961df2bac68ad48982e38" origin="Generated by Gradle"/>
</artifact>
<artifact name="picocli-codegen-4.6.3.pom">
<sha256 value="7941d0503664481dffb63fc238e60f3f8647a85850534b9aa136c289e0341cdb" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="io.fabric8" name="kubernetes-client-bom" version="5.12.2">
<artifact name="kubernetes-client-bom-5.12.2.pom">
<sha256 value="eaa03c16956568d54a6ba437d49d40cbf0dd8e93977f984318242576b650bc3b" origin="Generated by Gradle"/>
@ -4301,6 +4352,46 @@
<sha256 value="6d7c68423115f921718d944f859924b4c685217ec03a49f70455a8b2caa972e6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.graalvm.buildtools" name="graalvm-reachability-metadata" version="0.9.17">
<artifact name="graalvm-reachability-metadata-0.9.17.jar">
<sha256 value="c0ad7687e316e2c8f0cffdba7103bc81e2d9ccfdc85142e0c7734ca818c87ad6" origin="Generated by Gradle"/>
</artifact>
<artifact name="graalvm-reachability-metadata-0.9.17.module">
<sha256 value="b2521200691da2bd1e360a9eb41181a07954a429f25bf8ef0697a681619ab3cb" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.graalvm.buildtools" name="junit-platform-native" version="0.9.17">
<artifact name="junit-platform-native-0.9.17.jar">
<sha256 value="55d184ad610167043258f4d46b804daf6a07f27f732cec6a9e35e6bc82338b3e" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-native-0.9.17.module">
<sha256 value="28a34d72595732a742c84d3f241e24458f38f11a51a3c490d8cb07957fe007d3" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-native-0.9.17.pom">
<sha256 value="10fe2963ef641900a2ab5cf33e44a5cac51908d62459a4e74966aa9a7729a190" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.graalvm.buildtools" name="native-gradle-plugin" version="0.9.17">
<artifact name="native-gradle-plugin-0.9.17.jar">
<sha256 value="9d01c387e7d401d63aabec07791cb2dd70d850f09849bc971d573cb3d040df9a" origin="Generated by Gradle"/>
</artifact>
<artifact name="native-gradle-plugin-0.9.17.module">
<sha256 value="dada488507f866daa79fb412192f06f7fc898c88fad9a8fda3ac437b0ef84313" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.graalvm.buildtools" name="utils" version="0.9.17">
<artifact name="utils-0.9.17.jar">
<sha256 value="9c1e47c72b5029df12fd790925c06ee1b29340a2a34079a80a4e41ed140bff1d" origin="Generated by Gradle"/>
</artifact>
<artifact name="utils-0.9.17.module">
<sha256 value="efba7a0c9fa77e28eff4d8b7c67cc8d40a673d08971f1c641bf887e03812e099" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.graalvm.buildtools.native" name="org.graalvm.buildtools.native.gradle.plugin" version="0.9.17">
<artifact name="org.graalvm.buildtools.native.gradle.plugin-0.9.17.pom">
<sha256 value="d3e1f08563a3d799c2d0f70842530431a5cce5cac13d5cf5a49637d0e3182401" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.hamcrest" name="hamcrest" version="2.1">
<artifact name="hamcrest-2.1.jar">
<sha256 value="ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050" origin="Generated by Gradle"/>
@ -4842,6 +4933,14 @@
<sha256 value="cd14aaa869991f82021c585d570d31ff342bcba58bb44233b70193771b96487b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit" name="junit-bom" version="5.8.1">
<artifact name="junit-bom-5.8.1.module">
<sha256 value="6b82cba52a134b13c1982f0cf9622c6d485371d40b989246f3124e3b0a5b1854" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-bom-5.8.1.pom">
<sha256 value="ef7dc47f8e4a16864f4779728e87ed78539819e4fb892768a9da6b8ef903f863" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit" name="junit-bom" version="5.8.2">
<artifact name="junit-bom-5.8.2.module">
<sha256 value="40cfad993fa70ecdf2af74d0c56da1484ee220964be8f932cfe632be9a2733fa" origin="Generated by Gradle"/>
@ -4945,6 +5044,22 @@
<sha256 value="ce852e34c6a184aa6c80ee8df0471713a7408134134f08e3c1c3dd87c6b59ab7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-console" version="1.8.1">
<artifact name="junit-platform-console-1.8.1.module">
<sha256 value="356d84afbf5c4b17dbccd3ea1bef527f9b43d598de67e15c4949d2b07e6b90cf" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-console" version="1.8.2">
<artifact name="junit-platform-console-1.8.2.jar">
<sha256 value="b4bc403e281f911620ef9f2b81ad029d51353bc0d77576281a38d3f5a62aff82" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-console-1.8.2.module">
<sha256 value="21a7d83969f81b7ba5f8dd6f0d2f4ca6b8e7d632172c4a05154e7b7f219345ee" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-console-1.8.2.pom">
<sha256 value="2cd604c0e09b3ee6e14bed368f65e9b3a7d1e9fb3b15e40c420df8288563e6bd" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-engine" version="1.5.2">
<artifact name="junit-platform-engine-1.5.2.jar">
<sha256 value="ff20ba4ad8c00ef17baef9c55512f9c02d9a68740f7f1ac01a9a6aa0239931f8" origin="Generated by Gradle"/>
@ -4972,6 +5087,11 @@
<sha256 value="25a42980af3a24685376633e511a928f8e83de736fbc6fd46eac2238d10a3631" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-launcher" version="1.8.1">
<artifact name="junit-platform-launcher-1.8.1.module">
<sha256 value="6108932af9febe85e8ab758dc02af1d3a931a972100dad460b10961cbe361763" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-launcher" version="1.8.2">
<artifact name="junit-platform-launcher-1.8.2.jar">
<sha256 value="822156409fd83e682e4c5199b3460054299b538a058c2c6d0f5c9b6a5bdb7594" origin="Generated by Gradle"/>
@ -4983,6 +5103,17 @@
<sha256 value="b5f6a771a6aeb73c89a6e77f56d729f4ba8eb5afdd0f10f44db44d6aadb95095" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-reporting" version="1.8.2">
<artifact name="junit-platform-reporting-1.8.2.jar">
<sha256 value="d28048333b378d166f9ad38c2a8e34ac0fa1a29cc016cb279df53c8b54628fc3" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-reporting-1.8.2.module">
<sha256 value="1814892307713bd93168a7824b74ea2b9f05cd5aa4d823c9c7cb15d6518a209f" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-reporting-1.8.2.pom">
<sha256 value="f8db7120d4c698d4fc06ca07376007ff179670973bba25d7a1007876fed4f025" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-runner" version="1.8.2">
<artifact name="junit-platform-runner-1.8.2.jar">
<sha256 value="ebcc0acf9c5380755f64691cb6e190e22d8583c65f17325f4989e920f2120832" origin="Generated by Gradle"/>

@ -63,6 +63,7 @@ dependencyManagement {
dependency 'dnsjava:dnsjava:3.5.1'
dependency 'info.picocli:picocli:4.6.3'
dependency 'info.picocli:picocli-codegen:4.6.3'
dependencySet(group: 'io.grpc', version: '1.47.0') {
entry 'grpc-all'

Loading…
Cancel
Save