Skip to content

Commit

Permalink
Merge branch 'main' of github.com:hyperledger/besu into codeql-v3
Browse files Browse the repository at this point in the history
  • Loading branch information
macfarla committed Feb 23, 2025
2 parents a134a8b + 9131b9f commit 90c8944
Show file tree
Hide file tree
Showing 81 changed files with 12,848 additions and 15,351 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
## Unreleased
### Breaking Changes
- k8s (KUBERNETES) Nat method is removed. Use docker or none instead. [#8289](https://github.com/hyperledger/besu/pull/8289)
- Change "Invalid block, unable to parse RLP" RPC error message to "Invalid block param (block not found)" [#8328](https://github.com/hyperledger/besu/pull/8328)

### Upcoming Breaking Changes
- `MetricSystem::createLabelledGauge` is deprecated and will be removed in a future release, replace it with `MetricSystem::createLabelledSuppliedGauge`
Expand All @@ -18,10 +19,12 @@
- Transaction indexing will be disabled by default in a future release for snap sync and checkpoint sync modes. This will break RPCs that use transaction hash for historical queries.
- Support for block creation on networks running a pre-Byzantium fork is deprecated for removal in a future release, after that in order to update Besu on nodes that build blocks, your network needs to be upgraded at least to the Byzantium fork. The main reason is to simplify world state management during block creation, since before Byzantium for each selected transaction, the receipt must contain the root hash of the modified world state, and this does not play well with the new plugin features and future work on parallelism.
### Additions and Improvements
- Update the jc-kzg-4844 dependency from 1.0.0 to 2.0.0, which is now available on Maven Central [#7849](https://github.com/hyperledger/besu/pull/7849)
- Add TLS/mTLS options and configure the GraphQL HTTP service[#7910](https://github.com/hyperledger/besu/pull/7910)
- Allow plugins to propose transactions during block creation [#8268](https://github.com/hyperledger/besu/pull/8268)
- Update `eth_getLogs` to return a `Block not found` error when the requested block is not found. [#8290](https://github.com/hyperledger/besu/pull/8290)
- Improve Conflict Detection in Parallelization by Considering Slots to Reduce False Positives. [#7923](https://github.com/hyperledger/besu/pull/7923)
- Change "Invalid block, unable to parse RLP" RPC error message to "Invalid block param (block not found)" [#8328](https://github.com/hyperledger/besu/pull/8328)
### Bug fixes
- Upgrade Netty to version 4.1.118 to fix CVE-2025-24970 [#8275](https://github.com/hyperledger/besu/pull/8275)
- Add missing RPC method `debug_accountRange` to `RpcMethod.java` and implemented its handler. [#8153](https://github.com/hyperledger/besu/issues/8153)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import org.hyperledger.besu.crypto.KeyPairUtil;
import org.hyperledger.besu.cryptoservices.KeyPairSecurityModule;
import org.hyperledger.besu.cryptoservices.NodeKey;
import org.hyperledger.besu.ethereum.GasLimitCalculator;
import org.hyperledger.besu.ethereum.api.ApiConfiguration;
import org.hyperledger.besu.ethereum.api.graphql.GraphQLConfiguration;
import org.hyperledger.besu.ethereum.api.jsonrpc.InProcessRpcConfiguration;
Expand Down Expand Up @@ -480,7 +479,6 @@ public BesuController provideBesuController(
.ethProtocolConfiguration(EthProtocolConfiguration.defaultConfig())
.clock(Clock.systemUTC())
.storageProvider(storageProvider)
.gasLimitCalculator(GasLimitCalculator.constant())
.evmConfiguration(EvmConfiguration.DEFAULT)
.maxPeers(25)
.maxRemotelyInitiatedPeers(15)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,12 @@ public BesuNode createExecutionEngineGenesisNode(final String name, final String

public BesuNode createCliqueNodeWithValidators(final String name, final String... validators)
throws IOException {
return createCliqueNodeWithValidators(name, CliqueOptions.DEFAULT, validators);
}

public BesuNode createCliqueNodeWithValidators(
final String name, final CliqueOptions cliqueOptions, final String... validators)
throws IOException {

return create(
new BesuNodeConfigurationBuilder()
Expand All @@ -553,7 +559,9 @@ public BesuNode createCliqueNodeWithValidators(final String name, final String..
node.createGenesisConfigForValidators(
asList(validators),
nodes,
GenesisConfigurationFactory::createCliqueGenesisConfig))
vs ->
GenesisConfigurationFactory.createCliqueGenesisConfig(
vs, cliqueOptions)))
.build());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ protected static void extract(final Path path, final String destDirectory) throw
new TarArchiveInputStream(
new GzipCompressorInputStream(new FileInputStream(path.toAbsolutePath().toString())))) {
TarArchiveEntry entry;
while ((entry = fin.getNextTarEntry()) != null) {
while ((entry = fin.getNextEntry()) != null) {
if (entry.isDirectory()) {
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,114 +18,134 @@
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition;
import org.hyperledger.besu.tests.acceptance.dsl.condition.clique.ExpectNonceVote.CLIQUE_NONCE_VOTE;
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode;
import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.genesis.GenesisConfigurationFactory;

import java.io.IOException;
import java.util.Arrays;

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

@Disabled("flaky see https://github.com/hyperledger/besu/issues/7973")
public class CliqueProposeRpcAcceptanceTest extends AcceptanceTestBase {
private static final GenesisConfigurationFactory.CliqueOptions CLIQUE_OPTIONS =
new GenesisConfigurationFactory.CliqueOptions(5, 30000, true);

@Test
public void shouldAddValidators() throws IOException {
final String[] initialValidators = {"miner1", "miner2"};
final BesuNode minerNode1 = besu.createCliqueNodeWithValidators("miner1", initialValidators);
final BesuNode minerNode2 = besu.createCliqueNodeWithValidators("miner2", initialValidators);
final BesuNode minerNode3 = besu.createCliqueNodeWithValidators("miner3", initialValidators);
public void shouldAddAndRemoveValidators() throws IOException {
final String[] initialValidators = {"miner1"};
final BesuNode minerNode1 =
besu.createCliqueNodeWithValidators("miner1", CLIQUE_OPTIONS, initialValidators);
final BesuNode minerNode2 =
besu.createCliqueNodeWithValidators("miner2", CLIQUE_OPTIONS, initialValidators);
final BesuNode minerNode3 =
besu.createCliqueNodeWithValidators("miner3", CLIQUE_OPTIONS, initialValidators);
cluster.start(minerNode1, minerNode2, minerNode3);

waitForNodesConnectedAndInSync(minerNode1, minerNode2, minerNode3);

minerNode1.execute(cliqueTransactions.createAddProposal(minerNode2));
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2));

minerNode1.execute(cliqueTransactions.createAddProposal(minerNode3));
minerNode2.execute(cliqueTransactions.createAddProposal(minerNode3));
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2, minerNode3));
}

@Test
public void shouldRemoveValidators() throws IOException {
final String[] initialValidators = {"miner1", "miner2", "miner3"};
final BesuNode minerNode1 = besu.createCliqueNodeWithValidators("miner1", initialValidators);
final BesuNode minerNode2 = besu.createCliqueNodeWithValidators("miner2", initialValidators);
final BesuNode minerNode3 = besu.createCliqueNodeWithValidators("miner3", initialValidators);
cluster.start(minerNode1, minerNode2, minerNode3);

waitForNodesConnectedAndInSync(minerNode1, minerNode2, minerNode3);

cluster.verify(clique.validatorsEqual(minerNode1, minerNode2, minerNode3));
final Condition cliqueValidatorsChanged = clique.awaitSignerSetChange(minerNode1);
minerNode1.execute(cliqueTransactions.createRemoveProposal(minerNode3));
minerNode2.execute(cliqueTransactions.createRemoveProposal(minerNode3));
final Condition cliqueValidatorsChanged = clique.awaitSignerSetChange(minerNode2);
minerNode2.execute(cliqueTransactions.createRemoveProposal(minerNode1));
minerNode3.execute(cliqueTransactions.createRemoveProposal(minerNode1));
cluster.verify(clique.validatorsEqual(minerNode2, minerNode3));
cluster.verify(cliqueValidatorsChanged);
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2));
}

@Disabled
@Test
public void shouldNotAddValidatorWhenInsufficientVotes() throws IOException {
final String[] initialValidators = {"miner1", "miner2"};
final BesuNode minerNode1 = besu.createCliqueNodeWithValidators("miner1", initialValidators);
final BesuNode minerNode2 = besu.createCliqueNodeWithValidators("miner2", initialValidators);
final BesuNode minerNode3 = besu.createCliqueNodeWithValidators("miner3", initialValidators);
final String[] initialValidators = {"miner1"};
final BesuNode minerNode1 =
besu.createCliqueNodeWithValidators("miner1", CLIQUE_OPTIONS, initialValidators);
final BesuNode minerNode2 =
besu.createCliqueNodeWithValidators("miner2", CLIQUE_OPTIONS, initialValidators);
final BesuNode minerNode3 =
besu.createCliqueNodeWithValidators("miner3", CLIQUE_OPTIONS, initialValidators);
cluster.start(minerNode1, minerNode2, minerNode3);

waitForNodesConnectedAndInSync(minerNode1, minerNode2, minerNode3);

minerNode1.execute(cliqueTransactions.createAddProposal(minerNode2));
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2));

minerNode1.execute(cliqueTransactions.createAddProposal(minerNode3));
minerNode1.verify(blockchain.reachesHeight(minerNode1, 1));
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2));
}

@Test
public void shouldNotRemoveValidatorWhenInsufficientVotes() throws IOException {
final BesuNode minerNode1 = besu.createCliqueNode("miner1");
final BesuNode minerNode2 = besu.createCliqueNode("miner2");
final BesuNode minerNode3 = besu.createCliqueNode("miner3");
final String[] initialValidators = {"miner1"};
final BesuNode minerNode1 =
besu.createCliqueNodeWithValidators("miner1", CLIQUE_OPTIONS, initialValidators);
final BesuNode minerNode2 =
besu.createCliqueNodeWithValidators("miner2", CLIQUE_OPTIONS, initialValidators);
final BesuNode minerNode3 =
besu.createCliqueNodeWithValidators("miner3", CLIQUE_OPTIONS, initialValidators);
cluster.start(minerNode1, minerNode2, minerNode3);

waitForNodesConnectedAndInSync(minerNode1, minerNode2, minerNode3);

minerNode1.execute(cliqueTransactions.createAddProposal(minerNode2));
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2));

minerNode1.execute(cliqueTransactions.createAddProposal(minerNode3));
minerNode2.execute(cliqueTransactions.createAddProposal(minerNode3));
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2, minerNode3));

minerNode1.execute(cliqueTransactions.createRemoveProposal(minerNode3));
minerNode1.verify(blockchain.reachesHeight(minerNode1, 1));
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2, minerNode3));
}

@Disabled
@Test
public void shouldIncludeVoteInBlockHeader() throws IOException {
final String[] initialValidators = {"miner1", "miner2"};
final BesuNode minerNode1 = besu.createCliqueNodeWithValidators("miner1", initialValidators);
final BesuNode minerNode2 = besu.createCliqueNodeWithValidators("miner2", initialValidators);
final BesuNode minerNode3 = besu.createCliqueNodeWithValidators("miner3", initialValidators);
final String[] initialValidators = {"miner1"};
final BesuNode minerNode1 =
besu.createCliqueNodeWithValidators("miner1", CLIQUE_OPTIONS, initialValidators);
final BesuNode minerNode2 =
besu.createCliqueNodeWithValidators("miner2", CLIQUE_OPTIONS, initialValidators);
final BesuNode minerNode3 =
besu.createCliqueNodeWithValidators("miner3", CLIQUE_OPTIONS, initialValidators);
cluster.start(minerNode1, minerNode2, minerNode3);

waitForNodesConnectedAndInSync(minerNode1, minerNode2, minerNode3);

minerNode1.execute(cliqueTransactions.createAddProposal(minerNode2));
minerNode1.verify(blockchain.reachesHeight(minerNode1, 1));
minerNode1.verify(blockchain.beneficiaryEquals(minerNode2));
minerNode1.verify(clique.nonceVoteEquals(CLIQUE_NONCE_VOTE.AUTH));
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2));

minerNode1.execute(cliqueTransactions.createAddProposal(minerNode3));
minerNode2.execute(cliqueTransactions.createAddProposal(minerNode3));
minerNode1.verify(blockchain.reachesHeight(minerNode1, 1));
minerNode2.verify(blockchain.reachesHeight(minerNode1, 1));
minerNode1.verify(blockchain.beneficiaryEquals(minerNode3));
minerNode2.verify(blockchain.beneficiaryEquals(minerNode3));
minerNode1.verify(clique.nonceVoteEquals(CLIQUE_NONCE_VOTE.AUTH));
minerNode2.verify(clique.nonceVoteEquals(CLIQUE_NONCE_VOTE.AUTH));
cluster.verify(clique.validatorsEqual(minerNode1, minerNode2, minerNode3));

minerNode1.execute(cliqueTransactions.createRemoveProposal(minerNode2));
minerNode1.verify(blockchain.reachesHeight(minerNode1, 1));
minerNode1.verify(blockchain.beneficiaryEquals(minerNode2));
minerNode1.verify(clique.nonceVoteEquals(CLIQUE_NONCE_VOTE.DROP));
}

private void waitForNodesConnectedAndInSync(
final BesuNode minerNode1, final BesuNode minerNode2, final BesuNode minerNode3) {
private void waitForNodesConnectedAndInSync(final BesuNode... nodes) {
// verify nodes are fully connected otherwise blocks could not be propagated
minerNode1.verify(net.awaitPeerCount(2));
minerNode2.verify(net.awaitPeerCount(2));
minerNode3.verify(net.awaitPeerCount(2));
Arrays.stream(nodes).forEach(node -> node.verify(net.awaitPeerCount(nodes.length - 1)));

// verify that the miner started producing blocks and all other nodes are syncing from it
waitForBlockHeight(minerNode1, 1);
final var minerChainHead = minerNode1.execute(ethTransactions.block());
minerNode2.verify(blockchain.minimumHeight(minerChainHead.getNumber().longValue()));
minerNode3.verify(blockchain.minimumHeight(minerChainHead.getNumber().longValue()));
waitForBlockHeight(nodes[0], 1);
final var firstNodeChainHead = nodes[0].execute(ethTransactions.block());
Arrays.stream(nodes)
.skip(1)
.forEach(node -> waitForBlockHeight(node, firstNodeChainHead.getNumber().longValue()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
"blockNumber": "0x1",
"gasLimit": "0x1c9c380",
"gasLimit": "0x1ca35ef",
"gasUsed": "0x0",
"timestamp": "0x5",
"extraData": "0x",
"baseFeePerGas": "0x7",
"blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858",
"blockHash": "0x48513c8021d27d6555aacf2a3a124952c5514f80ab280de32da330f528ad1a11",
"transactions": []
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
"blockNumber": "0x1",
"gasLimit": "0x1c9c380",
"gasLimit": "0x1ca35ef",
"gasUsed": "0x0",
"timestamp": "0x5",
"extraData": "0x",
"baseFeePerGas": "0x7",
"blockHash": "0xf4a1d287dd3bb7e877c57476912e6a6052bc4eed8ea70d032b55d77f26ee985f",
"blockHash": "0xcdda91dbfe90c051ab1bdb703c9996fdb8cebaa7b9e7bc9e430e7e743e1b9682",
"transactions": []
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"stateRoot": "0xa61c2a422a4f7d7d7f456c1a83d5484eaf0d49e2b6b6d5716f875e782c66a9f0",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x1c9c380",
"gasLimit": "0x1ca35ef",
"gasUsed": "0x0",
"timestamp": "0x10",
"extraData": "0x",
Expand All @@ -38,7 +38,7 @@
}
],
"blockNumber": "0x2",
"blockHash": "0x612abd8615f544759d4aeb3dbab32f5f198a8b818e9c5436e9f7a674ef3b0f20",
"blockHash": "0xc7f79c3547adc7886a1607bfd1efb9de3d277991037dba01cffdd67e298aa2bf",
"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"
},
"blockValue": "0x0"
Expand Down
2 changes: 1 addition & 1 deletion besu/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ dependencies {
implementation 'org.rocksdb:rocksdbjni'
implementation 'org.springframework.security:spring-security-crypto'
implementation 'org.xerial.snappy:snappy-java'
implementation 'tech.pegasys:jc-kzg-4844'
implementation 'io.consensys.protocols:jc-kzg-4844'

runtimeOnly 'org.apache.logging.log4j:log4j-jul'
runtimeOnly 'com.splunk.logging:splunk-library-javalogging'
Expand Down
Loading

0 comments on commit 90c8944

Please sign in to comment.