Search in sources :

Example 1 with BesuNode

use of org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode in project besu by hyperledger.

the class FlexibleMultiTenancyAcceptanceTest method removedMemberCannotGetFilterChanges.

@Test
public void removedMemberCannotGetFilterChanges() {
    final MultiTenancyPrivacyGroup allTenantsFromAlice = new MultiTenancyPrivacyGroup();
    final List<String> tenants = aliceMultiTenancyPrivacyNode.getTenants();
    allTenantsFromAlice.addNodeWithTenants(aliceMultiTenancyPrivacyNode, tenants);
    final String privacyGroupId = createFlexiblePrivacyGroup(allTenantsFromAlice);
    final MultiTenancyPrivacyNode multiTenancyPrivacyNode = allTenantsFromAlice.getPrivacyNodes().get(0);
    final String groupCreatingTenant = allTenantsFromAlice.getGroupCreatingTenant();
    final String tenantToBeRemoved = tenants.stream().filter(t -> !t.equals(groupCreatingTenant)).findFirst().orElseThrow();
    final PrivacyNode groupCreatingPrivacyNode = allTenantsFromAlice.getGroupCreatingPrivacyNode();
    final BesuNode groupCreatingPrivacyNodeBesu = groupCreatingPrivacyNode.getBesu();
    groupCreatingPrivacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(groupCreatingTenant));
    final EventEmitter eventEmitter = groupCreatingPrivacyNode.execute(privateContractTransactions.createSmartContractWithPrivacyGroupId(EventEmitter.class, groupCreatingPrivacyNode.getTransactionSigningKey(), groupCreatingTenant, privacyGroupId));
    final LogFilterJsonParameter filterParameter = new LogFilterJsonParameter("earliest", "latest", List.of(eventEmitter.getContractAddress()), Collections.emptyList(), null);
    final String filterId = groupCreatingPrivacyNode.execute(privacyTransactions.newFilter(privacyGroupId, filterParameter));
    final CallPrivateSmartContractFunction storeTransaction = privateContractTransactions.callSmartContractWithPrivacyGroupId(eventEmitter.getContractAddress(), eventEmitter.store(BigInteger.valueOf(VALUE_SET)).encodeFunctionCall(), groupCreatingPrivacyNode.getTransactionSigningKey(), Restriction.RESTRICTED, groupCreatingTenant, privacyGroupId);
    final String storeTransactionHash = groupCreatingPrivacyNode.execute(storeTransaction);
    groupCreatingPrivacyNode.execute(privacyTransactions.getPrivateTransactionReceipt(storeTransactionHash));
    // check that getting the filter changes works for a member
    groupCreatingPrivacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenantToBeRemoved));
    assertThat(groupCreatingPrivacyNode.execute(privacyTransactions.getFilterChanges(privacyGroupId, filterId))).hasSize(1);
    groupCreatingPrivacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(groupCreatingTenant));
    final CallPrivateSmartContractFunction store2Transaction = privateContractTransactions.callSmartContractWithPrivacyGroupId(eventEmitter.getContractAddress(), eventEmitter.store(BigInteger.valueOf(VALUE_SET)).encodeFunctionCall(), groupCreatingPrivacyNode.getTransactionSigningKey(), Restriction.RESTRICTED, groupCreatingTenant, privacyGroupId);
    final String store2TransactionHash = groupCreatingPrivacyNode.execute(store2Transaction);
    groupCreatingPrivacyNode.execute(privacyTransactions.getPrivateTransactionReceipt(store2TransactionHash));
    // now remove from privacy group
    final String removeTransactionHash = removeFromPrivacyGroup(privacyGroupId, groupCreatingPrivacyNode, groupCreatingTenant, Credentials.create(groupCreatingPrivacyNode.getTransactionSigningKey()), tenantToBeRemoved);
    groupCreatingPrivacyNode.execute(privacyTransactions.getPrivateTransactionReceipt(removeTransactionHash));
    // check that it does not work anymore when member has been removed
    groupCreatingPrivacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenantToBeRemoved));
    assertThatThrownBy(() -> groupCreatingPrivacyNode.execute(privacyTransactions.getFilterChanges(privacyGroupId, filterId))).hasMessageContaining("Unauthorized");
}
Also used : BesuNode(org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode) EventEmitter(org.hyperledger.besu.tests.web3j.generated.EventEmitter) PrivacyNode(org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode) LogFilterJsonParameter(org.hyperledger.besu.tests.acceptance.dsl.privacy.util.LogFilterJsonParameter) CallPrivateSmartContractFunction(org.hyperledger.besu.tests.acceptance.dsl.privacy.contract.CallPrivateSmartContractFunction) Base64String(org.web3j.utils.Base64String) Test(org.junit.Test)

Example 2 with BesuNode

use of org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode in project besu by hyperledger.

the class FlexibleMultiTenancyAcceptanceTest method noAccessWhenNotAMember.

@Test
public void noAccessWhenNotAMember() {
    final MultiTenancyPrivacyGroup twoTenantsFromAlice = new MultiTenancyPrivacyGroup();
    final List<String> tenants = aliceMultiTenancyPrivacyNode.getTenants();
    final String removedTenant = tenants.remove(tenants.size() - 1);
    twoTenantsFromAlice.addNodeWithTenants(aliceMultiTenancyPrivacyNode, tenants);
    final String privacyGroupId = createFlexiblePrivacyGroup(twoTenantsFromAlice);
    final MultiTenancyPrivacyNode multiTenancyPrivacyNode = twoTenantsFromAlice.getPrivacyNodes().get(0);
    final String tenant = tenants.get(0);
    final PrivacyNode privacyNode = multiTenancyPrivacyNode.getPrivacyNode();
    final BesuNode privacyNodeBesu = privacyNode.getBesu();
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenant));
    final EventEmitter eventEmitter = privacyNode.execute(privateContractTransactions.createSmartContractWithPrivacyGroupId(EventEmitter.class, privacyNode.getTransactionSigningKey(), tenant, privacyGroupId));
    final String transactionHash = getContractDeploymentCommitmentHash(eventEmitter);
    // check that a member can get the transaction receipt
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenant));
    privacyNode.verify(privateTransactionVerifier.validPrivateTransactionReceipt(transactionHash, (PrivateTransactionReceipt) eventEmitter.getTransactionReceipt().get()));
    final String actual = privacyNode.execute(privacyTransactions.privGetCode(privacyGroupId, Address.fromHexString(eventEmitter.getContractAddress()), "latest")).toHexString();
    assertThat(EventEmitter.BINARY).contains(actual.substring(2));
    // check that getting the transaction receipt does not work if you are not a member
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(removedTenant));
    privacyNode.verify(privateTransactionVerifier.noPrivateTransactionReceipt(// returning null because the RPC is using the enclave key
    transactionHash));
    // check that getting the code of the event emitter does not work when you are not a member
    assertThatThrownBy(() -> privacyNode.execute(privacyTransactions.privGetCode(privacyGroupId, Address.fromHexString(eventEmitter.getContractAddress()), "latest"))).hasMessageContaining("Unauthorized");
    final LogFilterJsonParameter filterParameter = new LogFilterJsonParameter("earliest", "latest", List.of(eventEmitter.getContractAddress()), Collections.emptyList(), null);
    // create a valid filter
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenant));
    final String filterId = privacyNode.execute(privacyTransactions.newFilter(privacyGroupId, filterParameter));
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenant));
    final CallPrivateSmartContractFunction storeTransaction = privateContractTransactions.callSmartContractWithPrivacyGroupId(eventEmitter.getContractAddress(), eventEmitter.store(BigInteger.valueOf(VALUE_SET)).encodeFunctionCall(), privacyNode.getTransactionSigningKey(), Restriction.RESTRICTED, tenant, privacyGroupId);
    final String storeTransactionHash = privacyNode.execute(storeTransaction);
    privacyNode.execute(privacyTransactions.getPrivateTransactionReceipt(storeTransactionHash));
    // check that getting the filter changes works for a member
    assertThat(privacyNode.execute(privacyTransactions.getFilterChanges(privacyGroupId, filterId))).hasSize(1);
    // check that getting the filter changes does not work if you are not a member
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(removedTenant));
    assertThatThrownBy(() -> privacyNode.execute(privacyTransactions.getFilterChanges(privacyGroupId, filterId))).hasMessageContaining("Unauthorized");
    // check that getting the filter logs works for a member
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenant));
    assertThat(privacyNode.execute(privacyTransactions.getFilterLogs(privacyGroupId, filterId))).hasSize(// create privacy group, deploy event emitter, store on event emitter
    3);
    // check that getting the filter logs does not work if you are not a member
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(removedTenant));
    assertThatThrownBy(() -> privacyNode.execute(privacyTransactions.getFilterLogs(privacyGroupId, filterId))).hasMessageContaining("Unauthorized");
    // check that getting the logs works for a member
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenant));
    assertThat(privacyNode.execute(privacyTransactions.privGetLogs(privacyGroupId, filterParameter))).hasSize(// create privacy group, deploy event emitter, store on event emitter
    3);
    // check that getting the logs does not work if you are not a member
    privacyNodeBesu.useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(removedTenant));
    assertThatThrownBy(() -> privacyNode.execute(privacyTransactions.privGetLogs(privacyGroupId, filterParameter))).hasMessageContaining("Unauthorized");
    final List<Base64String> base64StringList = tenants.stream().map(Base64String::wrap).collect(Collectors.toList());
    // check that a member can find the on-chain privacy group
    privacyNode.getBesu().useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenant));
    final List<PrivacyRequestFactory.FlexiblePrivacyGroup> group = privacyNode.execute(privacyTransactions.findFlexiblePrivacyGroup(Base64String.unwrapList(base64StringList)));
    assertThat(group.size()).isEqualTo(1);
    assertThat(group.get(0).getMembers()).containsAll(base64StringList).hasSize(2);
    // check that when you are not a member you cannot find the privacy group
    privacyNode.getBesu().useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(removedTenant));
    assertThatThrownBy(() -> privacyNode.execute(privacyTransactions.findFlexiblePrivacyGroup(Base64String.unwrapList(base64StringList)))).hasMessageContaining("Error finding flexible privacy group");
    // check that a member can do a priv_call
    privacyNode.getBesu().useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenant));
    final EthCall readValue = privacyNode.execute(privacyTransactions.privCall(privacyGroupId, eventEmitter, eventEmitter.value().encodeFunctionCall()));
    assertThat(new BigInteger(readValue.getValue().substring(2), 16)).isEqualByComparingTo(BigInteger.valueOf(VALUE_SET));
    // check that when you are not a member you cannot do a priv_call
    privacyNode.getBesu().useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(removedTenant));
    assertThatThrownBy(() -> privacyNode.execute(privacyTransactions.privCall(privacyGroupId, eventEmitter, eventEmitter.value().encodeFunctionCall()))).hasMessageContaining("Unauthorized");
    // check that a member can do a priv_getTransaction
    privacyNode.getBesu().useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(tenant));
    final PrivacyRequestFactory.GetPrivateTransactionResponse privTransaction = privacyNode.execute(privacyTransactions.privGetTransaction(storeTransactionHash));
    assertThat(privTransaction.getResult().getPrivacyGroupId()).isEqualTo(privacyGroupId);
    // check that when you are not a member you cannot do a priv_getTransaction
    privacyNode.getBesu().useAuthenticationTokenInHeaderForJsonRpc(multiTenancyPrivacyNode.getTokenForTenant(removedTenant));
    assertThatThrownBy(() -> privacyNode.execute(privacyTransactions.privGetTransaction(storeTransactionHash))).hasMessageContaining(// TODO: returning null because the RPC is using the
    "Expecting actual not to be null");
// enclave key
}
Also used : PrivateTransactionReceipt(org.web3j.protocol.besu.response.privacy.PrivateTransactionReceipt) PrivacyNode(org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode) PrivacyRequestFactory(org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivacyRequestFactory) Base64String(org.web3j.utils.Base64String) EthCall(org.web3j.protocol.core.methods.response.EthCall) Base64String(org.web3j.utils.Base64String) BesuNode(org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode) EventEmitter(org.hyperledger.besu.tests.web3j.generated.EventEmitter) LogFilterJsonParameter(org.hyperledger.besu.tests.acceptance.dsl.privacy.util.LogFilterJsonParameter) CallPrivateSmartContractFunction(org.hyperledger.besu.tests.acceptance.dsl.privacy.contract.CallPrivateSmartContractFunction) BigInteger(java.math.BigInteger) Test(org.junit.Test)

Example 3 with BesuNode

use of org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode in project besu by hyperledger.

the class RunHelpTest method testShowsHelpAndExits.

@Test
public void testShowsHelpAndExits() throws IOException {
    final BesuNode node = besu.runCommand("--help");
    cluster.startConsoleCapture();
    cluster.runNodeStart(node);
    WaitUtils.waitFor(5000, () -> node.verify(exitedSuccessfully));
    // assert that no random startup or ending logging appears.
    // if the help text changes then updates are appropriate.
    final String consoleContents = cluster.getConsoleContents();
    assertThat(consoleContents).startsWith("Usage:\n\nbesu [OPTIONS] [COMMAND]\n\nDescription:\n\n");
}
Also used : BesuNode(org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode) Test(org.junit.Test)

Example 4 with BesuNode

use of org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode in project besu by hyperledger.

the class CliqueProposalRpcAcceptanceTest method shouldReturnProposals.

@Test
public void shouldReturnProposals() 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);
    cluster.start(minerNode1, minerNode2, minerNode3);
    cluster.verify(clique.noProposals());
    minerNode1.execute(cliqueTransactions.createAddProposal(minerNode3));
    minerNode1.execute(cliqueTransactions.createRemoveProposal(minerNode2));
    minerNode2.execute(cliqueTransactions.createRemoveProposal(minerNode3));
    minerNode1.verify(clique.proposalsEqual().addProposal(minerNode3).removeProposal(minerNode2).build());
    minerNode2.verify(clique.proposalsEqual().removeProposal(minerNode3).build());
    minerNode3.verify(clique.noProposals());
}
Also used : BesuNode(org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode) Test(org.junit.Test)

Example 5 with BesuNode

use of org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode in project besu by hyperledger.

the class CliqueProposeRpcAcceptanceTest method shouldRemoveValidators.

@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);
    cluster.verify(clique.validatorsEqual(minerNode1, minerNode2, minerNode3));
    final Condition cliqueValidatorsChanged = clique.awaitSignerSetChange(minerNode1);
    minerNode1.execute(cliqueTransactions.createRemoveProposal(minerNode3));
    minerNode2.execute(cliqueTransactions.createRemoveProposal(minerNode3));
    cluster.verify(cliqueValidatorsChanged);
    cluster.verify(clique.validatorsEqual(minerNode1, minerNode2));
}
Also used : Condition(org.hyperledger.besu.tests.acceptance.dsl.condition.Condition) BesuNode(org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode) Test(org.junit.Test)

Aggregations

BesuNode (org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode)36 Test (org.junit.Test)32 Account (org.hyperledger.besu.tests.acceptance.dsl.account.Account)13 File (java.io.File)2 Optional (java.util.Optional)2 PermissioningConfiguration (org.hyperledger.besu.ethereum.permissioning.PermissioningConfiguration)2 Condition (org.hyperledger.besu.tests.acceptance.dsl.condition.Condition)2 PrivacyNode (org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode)2 CallPrivateSmartContractFunction (org.hyperledger.besu.tests.acceptance.dsl.privacy.contract.CallPrivateSmartContractFunction)2 LogFilterJsonParameter (org.hyperledger.besu.tests.acceptance.dsl.privacy.util.LogFilterJsonParameter)2 EventEmitter (org.hyperledger.besu.tests.web3j.generated.EventEmitter)2 Before (org.junit.Before)2 Base64String (org.web3j.utils.Base64String)2 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 Vertx (io.vertx.core.Vertx)1 IOException (java.io.IOException)1 BigInteger (java.math.BigInteger)1 URI (java.net.URI)1 URISyntaxException (java.net.URISyntaxException)1 Paths (java.nio.file.Paths)1