From 5bdd65945e0cb876fdbfa0b5815bc83959d112d6 Mon Sep 17 00:00:00 2001 From: ivaylo Date: Mon, 29 Apr 2019 13:52:14 +0100 Subject: [PATCH 1/2] Fix eea transaction count if account is null in privacy group state --- .../privacy/PrivacyClusterAcceptanceTest.java | 171 +++++++++++++++++- .../privacy/EeaGetTransactionCount.java | 7 +- 2 files changed, 170 insertions(+), 8 deletions(-) diff --git a/acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/web3j/privacy/PrivacyClusterAcceptanceTest.java b/acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/web3j/privacy/PrivacyClusterAcceptanceTest.java index d1bb8a71ea..a6559eef3b 100644 --- a/acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/web3j/privacy/PrivacyClusterAcceptanceTest.java +++ b/acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/web3j/privacy/PrivacyClusterAcceptanceTest.java @@ -232,16 +232,103 @@ public void node2ExpectError() { node2.execute(privateTransactions.createPrivateRawTransaction(invalidStoreValueFromNode2)); } + @Test + public void node1CanDeployMultipleTimes() { + final String privacyGroup12 = + "0x4479414f69462f796e70632b4a586132594147423062436974536c4f4d4e6d2b53686d422f374d364334773d"; + + long nextNonce = getNonce(node1, privacyGroup12); + + final Address contractFor12 = + generateContractAddress(node1.getAddress(), nextNonce, privacyGroup12); + + final String deployContractFor12 = + PrivateTransactionBuilder.builder() + .nonce(nextNonce) + .from(node1.getAddress()) + .to(null) + .privateFrom(BytesValue.wrap(PUBLIC_KEY_1.getBytes(UTF_8))) + .privateFor(Lists.newArrayList(BytesValue.wrap(PUBLIC_KEY_2.getBytes(UTF_8)))) + .keyPair(keypair1) + .build(TransactionType.CREATE_CONTRACT); + + String transactionHash = + node1.execute(privateTransactions.deployPrivateSmartContract(deployContractFor12)); + + privateTransactionVerifier + .validPrivateContractDeployed(contractFor12.toString()) + .verify(node1, transactionHash); + + nextNonce = getNonce(node2, privacyGroup12); + + final String storeValueFor12 = + PrivateTransactionBuilder.builder() + .nonce(nextNonce) + .from(node2.getAddress()) + .to(contractFor12) + .privateFrom(BytesValue.wrap(PUBLIC_KEY_2.getBytes(UTF_8))) + .privateFor(Lists.newArrayList(BytesValue.wrap(PUBLIC_KEY_1.getBytes(UTF_8)))) + .keyPair(keypair2) + .build(TransactionType.STORE); + + transactionHash = + node2.execute(privateTransactions.createPrivateRawTransaction(storeValueFor12)); + + privateTransactionVerifier.validEventReturned("1000").verify(node1, transactionHash); + + nextNonce = getNonce(node1, privacyGroup12); + + final Address contractFor12Again = + Address.privateContractAddress( + node1.getAddress(), nextNonce, BytesValue.fromHexString(privacyGroup12)); + + final String deployContractFor12Again = + PrivateTransactionBuilder.builder() + .nonce(nextNonce) + .from(node1.getAddress()) + .to(null) + .privateFrom(BytesValue.wrap(PUBLIC_KEY_1.getBytes(UTF_8))) + .privateFor(Lists.newArrayList(BytesValue.wrap(PUBLIC_KEY_2.getBytes(UTF_8)))) + .keyPair(keypair1) + .build(TransactionType.CREATE_CONTRACT); + + transactionHash = + node1.execute(privateTransactions.deployPrivateSmartContract(deployContractFor12Again)); + + privateTransactionVerifier + .validPrivateContractDeployed(contractFor12Again.toString()) + .verify(node1, transactionHash); + + nextNonce = getNonce(node1, privacyGroup12); + + final String storeValueFor12Again = + PrivateTransactionBuilder.builder() + .nonce(nextNonce) + .from(node1.getAddress()) + .to(contractFor12) + .privateFrom(BytesValue.wrap(PUBLIC_KEY_1.getBytes(UTF_8))) + .privateFor(Lists.newArrayList(BytesValue.wrap(PUBLIC_KEY_2.getBytes(UTF_8)))) + .keyPair(keypair1) + .build(TransactionType.STORE); + + transactionHash = + node1.execute(privateTransactions.createPrivateRawTransaction(storeValueFor12Again)); + + privateTransactionVerifier.validEventReturned("1000").verify(node1, transactionHash); + } + @Test public void node1CanInteractWithMultiplePrivacyGroups() { final String privacyGroup123 = "0x393579496e2f4f59545a31784e3753694258314d64424a763942716b364f713766792b37585361496e79593d"; final String privacyGroup12 = "0x4479414f69462f796e70632b4a586132594147423062436974536c4f4d4e6d2b53686d422f374d364334773d"; - final String contractForABC = "0x1efee0ab2c1ec40c4b48410e5832d254c2eda0b0"; long nextNonce = getNonce(node1, privacyGroup123); + final Address contractForABC = + generateContractAddress(node1.getAddress(), nextNonce, privacyGroup123); + final String deployContractFor123 = PrivateTransactionBuilder.builder() .nonce(nextNonce) @@ -259,7 +346,7 @@ public void node1CanInteractWithMultiplePrivacyGroups() { node1.execute(privateTransactions.deployPrivateSmartContract(deployContractFor123)); privateTransactionVerifier - .validPrivateContractDeployed(contractForABC) + .validPrivateContractDeployed(contractForABC.toString()) .verify(node1, transactionHash); nextNonce = getNonce(node1, privacyGroup123); @@ -268,7 +355,7 @@ public void node1CanInteractWithMultiplePrivacyGroups() { PrivateTransactionBuilder.builder() .nonce(nextNonce) .from(node1.getAddress()) - .to(Address.fromHexString(contractForABC)) + .to(contractForABC) .privateFrom(BytesValue.wrap(PUBLIC_KEY_1.getBytes(UTF_8))) .privateFor( Lists.newArrayList( @@ -288,7 +375,7 @@ public void node1CanInteractWithMultiplePrivacyGroups() { PrivateTransactionBuilder.builder() .nonce(nextNonce) .from(node1.getAddress()) - .to(Address.fromHexString(contractForABC)) + .to(contractForABC) .privateFrom(BytesValue.wrap(PUBLIC_KEY_1.getBytes(UTF_8))) .privateFor(Lists.newArrayList(BytesValue.wrap(PUBLIC_KEY_2.getBytes(UTF_8)))) .keyPair(keypair1) @@ -304,8 +391,7 @@ public void node1CanInteractWithMultiplePrivacyGroups() { nextNonce = getNonce(node1, privacyGroup12); final Address contractFor12 = - Address.privateContractAddress( - node1.getAddress(), nextNonce, BytesValue.fromHexString(privacyGroup12)); + generateContractAddress(node1.getAddress(), nextNonce, privacyGroup123); final String deployContractFor12 = PrivateTransactionBuilder.builder() @@ -342,6 +428,79 @@ public void node1CanInteractWithMultiplePrivacyGroups() { privateTransactionVerifier.validEventReturned("1000").verify(node1, transactionHash); } + @Test + public void node1AndNode2CanInteractInAPrivacyGroup() { + final String privacyGroup12 = + "0x4479414f69462f796e70632b4a586132594147423062436974536c4f4d4e6d2b53686d422f374d364334773d"; + + long nextNonce = getNonce(node1, privacyGroup12); + + final Address contractFor12 = + generateContractAddress(node1.getAddress(), nextNonce, privacyGroup12); + + final String deployContractFor12 = + PrivateTransactionBuilder.builder() + .nonce(nextNonce) + .from(node1.getAddress()) + .to(null) + .privateFrom(BytesValue.wrap(PUBLIC_KEY_1.getBytes(UTF_8))) + .privateFor(Lists.newArrayList(BytesValue.wrap(PUBLIC_KEY_2.getBytes(UTF_8)))) + .keyPair(keypair1) + .build(TransactionType.CREATE_CONTRACT); + + String transactionHash = + node1.execute(privateTransactions.deployPrivateSmartContract(deployContractFor12)); + + privateTransactionVerifier + .validPrivateContractDeployed(contractFor12.toString()) + .verify(node1, transactionHash); + + nextNonce = getNonce(node2, privacyGroup12); + + final String storeValueFor12 = + PrivateTransactionBuilder.builder() + .nonce(nextNonce) + .from(node2.getAddress()) + .to(contractFor12) + .privateFrom(BytesValue.wrap(PUBLIC_KEY_2.getBytes(UTF_8))) + .privateFor(Lists.newArrayList(BytesValue.wrap(PUBLIC_KEY_1.getBytes(UTF_8)))) + .keyPair(keypair2) + .build(TransactionType.STORE); + + transactionHash = + node2.execute(privateTransactions.createPrivateRawTransaction(storeValueFor12)); + + privateTransactionVerifier.validEventReturned("1000").verify(node1, transactionHash); + + nextNonce = getNonce(node1, privacyGroup12); + + final Address contractFor12Again = + Address.privateContractAddress( + node1.getAddress(), nextNonce, BytesValue.fromHexString(privacyGroup12)); + + final String deployContractFor12Again = + PrivateTransactionBuilder.builder() + .nonce(nextNonce) + .from(node1.getAddress()) + .to(null) + .privateFrom(BytesValue.wrap(PUBLIC_KEY_1.getBytes(UTF_8))) + .privateFor(Lists.newArrayList(BytesValue.wrap(PUBLIC_KEY_2.getBytes(UTF_8)))) + .keyPair(keypair1) + .build(TransactionType.CREATE_CONTRACT); + + transactionHash = + node1.execute(privateTransactions.deployPrivateSmartContract(deployContractFor12Again)); + + privateTransactionVerifier + .validPrivateContractDeployed(contractFor12Again.toString()) + .verify(node1, transactionHash); + } + + private Address generateContractAddress( + final Address address, final long nonce, final String privacyGroup) { + return Address.privateContractAddress(address, nonce, BytesValue.fromHexString(privacyGroup)); + } + private long getNonce(final PantheonNode node, final String privacyGroupId) { return node.execute( privateTransactions.getTransactionCount(node.getAddress().toString(), privacyGroupId)) diff --git a/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/internal/methods/privacy/EeaGetTransactionCount.java b/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/internal/methods/privacy/EeaGetTransactionCount.java index 5b1fa05065..f3b12991c4 100644 --- a/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/internal/methods/privacy/EeaGetTransactionCount.java +++ b/ethereum/jsonrpc/src/main/java/tech/pegasys/pantheon/ethereum/jsonrpc/internal/methods/privacy/EeaGetTransactionCount.java @@ -64,8 +64,11 @@ public JsonRpcResponse response(final JsonRpcRequest request) { final Account maybePrivateSender = privateWorldState.get(address); - return new JsonRpcSuccessResponse( - request.getId(), Quantity.create(maybePrivateSender.getNonce())); + if (maybePrivateSender != null) { + return new JsonRpcSuccessResponse( + request.getId(), Quantity.create(maybePrivateSender.getNonce())); + } + return new JsonRpcSuccessResponse(request.getId(), Quantity.create(0)); }) .orElse(new JsonRpcSuccessResponse(request.getId(), Quantity.create(0))); } From 06667d9e6633ce522bda036a49b9a0f1298ed78d Mon Sep 17 00:00:00 2001 From: ivaylo Date: Mon, 29 Apr 2019 14:31:00 +0100 Subject: [PATCH 2/2] Fix failing acceptance test - expected value was generated with the wrong privacy group --- .../tests/web3j/privacy/PrivacyClusterAcceptanceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/web3j/privacy/PrivacyClusterAcceptanceTest.java b/acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/web3j/privacy/PrivacyClusterAcceptanceTest.java index a6559eef3b..02ed139bdf 100644 --- a/acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/web3j/privacy/PrivacyClusterAcceptanceTest.java +++ b/acceptance-tests/src/test/java/tech/pegasys/pantheon/tests/web3j/privacy/PrivacyClusterAcceptanceTest.java @@ -391,7 +391,7 @@ public void node1CanInteractWithMultiplePrivacyGroups() { nextNonce = getNonce(node1, privacyGroup12); final Address contractFor12 = - generateContractAddress(node1.getAddress(), nextNonce, privacyGroup123); + generateContractAddress(node1.getAddress(), nextNonce, privacyGroup12); final String deployContractFor12 = PrivateTransactionBuilder.builder()