Skip to content

Commit e318e5f

Browse files
authored
Merge pull request #58 from QuorumEngineering/feature/addPrivacyMarkerTransactions
Feature/add privacy marker transactions
2 parents 91a2d72 + 0eeabda commit e318e5f

File tree

9 files changed

+558
-23
lines changed

9 files changed

+558
-23
lines changed

src/integration-test/java/org/web3j/quorum/TransactionRequestTest.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,74 @@ public void testSendTransactionAsync() throws Exception {
120120
verifyResult(
121121
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransactionAsync\",\"params\":[{\"from\":\"FROM\",\"to\":\"TO\",\"gas\":\"0xa\",\"value\":\"0xa\",\"data\":\"0xDATA\",\"nonce\":\"0x1\",\"privateFrom\":\"privateFrom\",\"privateFor\":[\"privateFor1\",\"privateFor2\"]}],\"id\":1}");
122122
}
123+
124+
@Test
125+
public void testGetQuorumTransactionReceipt() throws Exception {
126+
web3j.ethGetQuorumTransactionReceipt("0x").send();
127+
128+
verifyResult(
129+
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionReceipt\",\"params\":[\"0x\"],\"id\":1}");
130+
}
131+
132+
@Test
133+
public void testDistributePrivateTransactionWithMandatoryFor() throws Exception {
134+
String signedTransactionData = "SignedTxData";
135+
web3j.ethDistributePrivateTransaction(
136+
signedTransactionData,
137+
Arrays.asList("privateFor1", "privateFor2"),
138+
PrivacyFlag.MANDATORY_FOR,
139+
Arrays.asList("privateFor2"))
140+
.send();
141+
142+
verifyResult(
143+
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_distributePrivateTransaction\",\"params\":[\"SignedTxData\",{\"privateFor\":[\"privateFor1\",\"privateFor2\"],\"privacyFlag\":2,\"mandatoryFor\":[\"privateFor2\"]}],\"id\":1}");
144+
}
145+
146+
@Test
147+
public void testDistributePrivateTransactionWithPrivacyFlag() throws Exception {
148+
String signedTransactionData = "SignedTxData";
149+
web3j.ethDistributePrivateTransaction(
150+
signedTransactionData,
151+
Arrays.asList("privateFor1", "privateFor2"),
152+
PrivacyFlag.PARTY_PROTECTION)
153+
.send();
154+
155+
verifyResult(
156+
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_distributePrivateTransaction\",\"params\":[\"SignedTxData\",{\"privateFor\":[\"privateFor1\",\"privateFor2\"],\"privacyFlag\":1}],\"id\":1}");
157+
}
158+
159+
@Test
160+
public void testDistributePrivateTransaction() throws Exception {
161+
String signedTransactionData = "SignedTxData";
162+
web3j.ethDistributePrivateTransaction(
163+
signedTransactionData, Arrays.asList("privateFor1", "privateFor2"))
164+
.send();
165+
166+
verifyResult(
167+
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_distributePrivateTransaction\",\"params\":[\"SignedTxData\",{\"privateFor\":[\"privateFor1\",\"privateFor2\"]}],\"id\":1}");
168+
}
169+
170+
@Test
171+
public void testGetPrivacyPrecompileAddress() throws Exception {
172+
web3j.ethGetPrivacyPrecompileAddress().send();
173+
174+
verifyResult(
175+
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_getPrivacyPrecompileAddress\",\"params\":[],\"id\":1}");
176+
}
177+
178+
@Test
179+
public void testGetPrivateTransactionByHash() throws Exception {
180+
web3j.ethGetPrivateTransactionByHash("0x").send();
181+
182+
verifyResult(
183+
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_getPrivateTransactionByHash\",\"params\":[\"0x\"],\"id\":1}");
184+
}
185+
186+
@Test
187+
public void testGetPrivateTransactionReceipt() throws Exception {
188+
web3j.ethGetPrivateTransactionReceipt("0x").send();
189+
190+
verifyResult(
191+
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_getPrivateTransactionReceipt\",\"params\":[\"0x\"],\"id\":1}");
192+
}
123193
}

src/integration-test/java/org/web3j/quorum/TransactionResponseTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
*/
1313
package org.web3j.quorum;
1414

15+
import java.math.BigInteger;
16+
1517
import org.junit.jupiter.api.Test;
1618

1719
import org.web3j.protocol.ResponseTester;
@@ -56,4 +58,35 @@ public void testPrivatePayload() {
5658
PrivatePayload privatePayload = deserialiseResponse(PrivatePayload.class);
5759
assertThat(privatePayload.getPrivatePayload(), is("0x"));
5860
}
61+
62+
@Test
63+
public void testGetQuorumTransactionReceipt() {
64+
buildResponse(
65+
"{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"transactionHash\":\"0x0d9e7e34fd4db216a3f66981a467d9d990954e6ed3128aff4ec51a50fa175663\",\"transactionIndex\":\"0x0\",\"blockHash\":\"0xee5b9e9030d308c77a2d4f975b7090a026ac2cdfe9669e2452cedb4c82e8285e\",\"blockNumber\":\"0xc9e\",\"cumulativeGasUsed\":\"0x0\",\"gasUsed\":\"0x21c687\",\"contractAddress\":\"0x1932c48b2bf8102ba33b4a6b545c32236e342f34\",\"status\":\"0x1\",\"from\":\"0x0718197b9ac69127381ed0c4b5d0f724f857c4d1\",\"to\":\"0x8a5E2a6343108bABEd07899510fb42297938D41F\",\"logs\":[],\"logsBloom\":\"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\"isPrivacyMarkerTransaction\":true}}");
66+
EthGetQuorumTransactionReceipt ethQuorumReceipt =
67+
(EthGetQuorumTransactionReceipt)
68+
this.deserialiseResponse(EthGetQuorumTransactionReceipt.class);
69+
70+
QuorumTransactionReceipt quorumReceipt = ethQuorumReceipt.getResult();
71+
assertThat(
72+
quorumReceipt.getTransactionHash(),
73+
is("0x0d9e7e34fd4db216a3f66981a467d9d990954e6ed3128aff4ec51a50fa175663"));
74+
assertThat(
75+
quorumReceipt.getBlockHash(),
76+
is("0xee5b9e9030d308c77a2d4f975b7090a026ac2cdfe9669e2452cedb4c82e8285e"));
77+
assertThat(quorumReceipt.getBlockNumber(), is(BigInteger.valueOf(0xc9e)));
78+
assertThat(quorumReceipt.getCumulativeGasUsed(), is(BigInteger.valueOf(0x0)));
79+
assertThat(quorumReceipt.getGasUsed(), is(BigInteger.valueOf(0x21c687)));
80+
assertThat(
81+
quorumReceipt.getContractAddress(),
82+
is("0x1932c48b2bf8102ba33b4a6b545c32236e342f34"));
83+
assertThat(quorumReceipt.getStatus(), is("0x1"));
84+
assertThat(quorumReceipt.getFrom(), is("0x0718197b9ac69127381ed0c4b5d0f724f857c4d1"));
85+
assertThat(quorumReceipt.getTo(), is("0x8a5E2a6343108bABEd07899510fb42297938D41F"));
86+
assertThat(
87+
quorumReceipt.getLogsBloom(),
88+
is(
89+
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"));
90+
assertThat(quorumReceipt.getIsPrivacyMarkerTransaction(), is(true));
91+
}
5992
}

src/main/java/org/web3j/quorum/JsonRpc2_0Quorum.java

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
import org.web3j.protocol.Web3jService;
2121
import org.web3j.protocol.core.JsonRpc2_0Web3j;
2222
import org.web3j.protocol.core.Request;
23+
import org.web3j.protocol.core.methods.response.EthGetTransactionReceipt;
2324
import org.web3j.protocol.core.methods.response.EthSendTransaction;
25+
import org.web3j.protocol.core.methods.response.EthTransaction;
2426
import org.web3j.quorum.methods.request.PrivateRawTransaction;
2527
import org.web3j.quorum.methods.request.PrivateTransaction;
26-
import org.web3j.quorum.methods.response.ConsensusNoResponse;
27-
import org.web3j.quorum.methods.response.ContractPrivacyMetadataInfo;
28-
import org.web3j.quorum.methods.response.PrivatePayload;
28+
import org.web3j.quorum.methods.response.*;
2929
import org.web3j.quorum.methods.response.istanbul.IstanbulBlockSigners;
3030
import org.web3j.quorum.methods.response.istanbul.IstanbulCandidates;
3131
import org.web3j.quorum.methods.response.istanbul.IstanbulNodeAddress;
@@ -129,6 +129,71 @@ public Request<?, EthSendTransaction> ethSendTransactionAsync(PrivateTransaction
129129
EthSendTransaction.class);
130130
}
131131

132+
@Override
133+
public Request<?, EthGetQuorumTransactionReceipt> ethGetQuorumTransactionReceipt(
134+
String transactionHash) {
135+
136+
return new Request<>(
137+
"eth_getTransactionReceipt",
138+
Arrays.asList(transactionHash),
139+
this.web3jService,
140+
EthGetQuorumTransactionReceipt.class);
141+
}
142+
143+
// privacy marker transactions
144+
145+
@Override
146+
public Request<?, EthSendTransaction> ethDistributePrivateTransaction(
147+
String signedTransactionData,
148+
List<String> privateFor,
149+
PrivacyFlag privacyFlag,
150+
List<String> mandatoryFor) {
151+
PrivateRawTransaction transaction =
152+
new PrivateRawTransaction(privateFor, privacyFlag, mandatoryFor);
153+
return new Request<>(
154+
"eth_distributePrivateTransaction",
155+
Arrays.asList(signedTransactionData, transaction),
156+
web3jService,
157+
EthSendTransaction.class);
158+
}
159+
160+
@Override
161+
public Request<?, EthSendTransaction> ethDistributePrivateTransaction(
162+
String signedTransactionData, List<String> privateFor, PrivacyFlag privacyFlag) {
163+
return ethDistributePrivateTransaction(
164+
signedTransactionData, privateFor, privacyFlag, null);
165+
}
166+
167+
@Override
168+
public Request<?, EthSendTransaction> ethDistributePrivateTransaction(
169+
String signedTransactionData, List<String> privateFor) {
170+
return ethDistributePrivateTransaction(signedTransactionData, privateFor, null, null);
171+
}
172+
173+
@Override
174+
public Request<?, EthAddress> ethGetPrivacyPrecompileAddress() {
175+
return new Request<>(
176+
"eth_getPrivacyPrecompileAddress", Arrays.asList(), web3jService, EthAddress.class);
177+
}
178+
179+
@Override
180+
public Request<?, EthTransaction> ethGetPrivateTransactionByHash(String hexDigest) {
181+
return new Request<>(
182+
"eth_getPrivateTransactionByHash",
183+
Collections.singletonList(hexDigest),
184+
web3jService,
185+
EthTransaction.class);
186+
}
187+
188+
@Override
189+
public Request<?, EthGetTransactionReceipt> ethGetPrivateTransactionReceipt(String hexDigest) {
190+
return new Request<>(
191+
"eth_getPrivateTransactionReceipt",
192+
Collections.singletonList(hexDigest),
193+
web3jService,
194+
EthGetTransactionReceipt.class);
195+
}
196+
132197
// raft consensus
133198

134199
@Override

src/main/java/org/web3j/quorum/Quorum.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
import org.web3j.protocol.Web3j;
1818
import org.web3j.protocol.Web3jService;
1919
import org.web3j.protocol.core.Request;
20+
import org.web3j.protocol.core.methods.response.EthGetTransactionReceipt;
2021
import org.web3j.protocol.core.methods.response.EthSendTransaction;
22+
import org.web3j.protocol.core.methods.response.EthTransaction;
2123
import org.web3j.quorum.methods.request.*;
2224
import org.web3j.quorum.methods.response.*;
2325
import org.web3j.quorum.methods.response.istanbul.IstanbulBlockSigners;
@@ -67,6 +69,28 @@ Request<?, EthSendTransaction> ethSendRawPrivateTransaction(
6769

6870
Request<?, EthSendTransaction> ethSendTransactionAsync(PrivateTransaction transaction);
6971

72+
Request<?, EthGetQuorumTransactionReceipt> ethGetQuorumTransactionReceipt(String hexDigest);
73+
74+
// privacy marker transactions
75+
76+
Request<?, EthSendTransaction> ethDistributePrivateTransaction(
77+
String signedTransactionData, List<String> privateFor);
78+
79+
Request<?, EthSendTransaction> ethDistributePrivateTransaction(
80+
String signedTransactionData, List<String> privateFor, PrivacyFlag privacyFlag);
81+
82+
Request<?, EthSendTransaction> ethDistributePrivateTransaction(
83+
String signedTransactionData,
84+
List<String> privateFor,
85+
PrivacyFlag privacyFlag,
86+
List<String> mandatoryFor);
87+
88+
Request<?, EthAddress> ethGetPrivacyPrecompileAddress();
89+
90+
Request<?, EthTransaction> ethGetPrivateTransactionByHash(String hexDigest);
91+
92+
Request<?, EthGetTransactionReceipt> ethGetPrivateTransactionReceipt(String hexDigest);
93+
7094
// raft consensus
7195

7296
Request<?, RaftLeader> raftGetLeader();
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright 2019 Web3 Labs Ltd.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
5+
* the License. You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
10+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
11+
* specific language governing permissions and limitations under the License.
12+
*/
13+
package org.web3j.quorum.methods.response;
14+
15+
import org.web3j.protocol.core.Response;
16+
17+
/** quorum_canonicalHash */
18+
public class EthAddress extends Response<String> {
19+
public String getAddress() {
20+
return getResult();
21+
}
22+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright 2019 Web3 Labs Ltd.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
5+
* the License. You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
10+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
11+
* specific language governing permissions and limitations under the License.
12+
*/
13+
package org.web3j.quorum.methods.response;
14+
15+
import java.io.IOException;
16+
import java.util.Optional;
17+
18+
import com.fasterxml.jackson.core.JsonParser;
19+
import com.fasterxml.jackson.core.JsonToken;
20+
import com.fasterxml.jackson.databind.DeserializationContext;
21+
import com.fasterxml.jackson.databind.JsonDeserializer;
22+
import com.fasterxml.jackson.databind.ObjectReader;
23+
24+
import org.web3j.protocol.ObjectMapperFactory;
25+
import org.web3j.protocol.core.Response;
26+
27+
/** eth_getTransactionReceipt. */
28+
public class EthGetQuorumTransactionReceipt extends Response<QuorumTransactionReceipt> {
29+
30+
public Optional<QuorumTransactionReceipt> getTransactionReceipt() {
31+
return Optional.ofNullable(getResult());
32+
}
33+
34+
public static class ResponseDeserialiser extends JsonDeserializer<QuorumTransactionReceipt> {
35+
36+
private ObjectReader objectReader = ObjectMapperFactory.getObjectReader();
37+
38+
@Override
39+
public QuorumTransactionReceipt deserialize(
40+
JsonParser jsonParser, DeserializationContext deserializationContext)
41+
throws IOException {
42+
if (jsonParser.getCurrentToken() != JsonToken.VALUE_NULL) {
43+
return objectReader.readValue(jsonParser, QuorumTransactionReceipt.class);
44+
} else {
45+
return null; // null is wrapped by Optional in above getter
46+
}
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)