Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,74 @@ public void testSendTransactionAsync() throws Exception {
verifyResult(
"{\"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}");
}

@Test
public void testGetQuorumTransactionReceipt() throws Exception {
web3j.ethGetQuorumTransactionReceipt("0x").send();

verifyResult(
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionReceipt\",\"params\":[\"0x\"],\"id\":1}");
}

@Test
public void testDistributePrivateTransactionWithMandatoryFor() throws Exception {
String signedTransactionData = "SignedTxData";
web3j.ethDistributePrivateTransaction(
signedTransactionData,
Arrays.asList("privateFor1", "privateFor2"),
PrivacyFlag.MANDATORY_FOR,
Arrays.asList("privateFor2"))
.send();

verifyResult(
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_distributePrivateTransaction\",\"params\":[\"SignedTxData\",{\"privateFor\":[\"privateFor1\",\"privateFor2\"],\"privacyFlag\":2,\"mandatoryFor\":[\"privateFor2\"]}],\"id\":1}");
}

@Test
public void testDistributePrivateTransactionWithPrivacyFlag() throws Exception {
String signedTransactionData = "SignedTxData";
web3j.ethDistributePrivateTransaction(
signedTransactionData,
Arrays.asList("privateFor1", "privateFor2"),
PrivacyFlag.PARTY_PROTECTION)
.send();

verifyResult(
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_distributePrivateTransaction\",\"params\":[\"SignedTxData\",{\"privateFor\":[\"privateFor1\",\"privateFor2\"],\"privacyFlag\":1}],\"id\":1}");
}

@Test
public void testDistributePrivateTransaction() throws Exception {
String signedTransactionData = "SignedTxData";
web3j.ethDistributePrivateTransaction(
signedTransactionData, Arrays.asList("privateFor1", "privateFor2"))
.send();

verifyResult(
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_distributePrivateTransaction\",\"params\":[\"SignedTxData\",{\"privateFor\":[\"privateFor1\",\"privateFor2\"]}],\"id\":1}");
}

@Test
public void testGetPrivacyPrecompileAddress() throws Exception {
web3j.ethGetPrivacyPrecompileAddress().send();

verifyResult(
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_getPrivacyPrecompileAddress\",\"params\":[],\"id\":1}");
}

@Test
public void testGetPrivateTransactionByHash() throws Exception {
web3j.ethGetPrivateTransactionByHash("0x").send();

verifyResult(
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_getPrivateTransactionByHash\",\"params\":[\"0x\"],\"id\":1}");
}

@Test
public void testGetPrivateTransactionReceipt() throws Exception {
web3j.ethGetPrivateTransactionReceipt("0x").send();

verifyResult(
"{\"jsonrpc\":\"2.0\",\"method\":\"eth_getPrivateTransactionReceipt\",\"params\":[\"0x\"],\"id\":1}");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
*/
package org.web3j.quorum;

import java.math.BigInteger;

import org.junit.jupiter.api.Test;

import org.web3j.protocol.ResponseTester;
Expand Down Expand Up @@ -56,4 +58,35 @@ public void testPrivatePayload() {
PrivatePayload privatePayload = deserialiseResponse(PrivatePayload.class);
assertThat(privatePayload.getPrivatePayload(), is("0x"));
}

@Test
public void testGetQuorumTransactionReceipt() {
buildResponse(
"{\"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}}");
EthGetQuorumTransactionReceipt ethQuorumReceipt =
(EthGetQuorumTransactionReceipt)
this.deserialiseResponse(EthGetQuorumTransactionReceipt.class);

QuorumTransactionReceipt quorumReceipt = ethQuorumReceipt.getResult();
assertThat(
quorumReceipt.getTransactionHash(),
is("0x0d9e7e34fd4db216a3f66981a467d9d990954e6ed3128aff4ec51a50fa175663"));
assertThat(
quorumReceipt.getBlockHash(),
is("0xee5b9e9030d308c77a2d4f975b7090a026ac2cdfe9669e2452cedb4c82e8285e"));
assertThat(quorumReceipt.getBlockNumber(), is(BigInteger.valueOf(0xc9e)));
assertThat(quorumReceipt.getCumulativeGasUsed(), is(BigInteger.valueOf(0x0)));
assertThat(quorumReceipt.getGasUsed(), is(BigInteger.valueOf(0x21c687)));
assertThat(
quorumReceipt.getContractAddress(),
is("0x1932c48b2bf8102ba33b4a6b545c32236e342f34"));
assertThat(quorumReceipt.getStatus(), is("0x1"));
assertThat(quorumReceipt.getFrom(), is("0x0718197b9ac69127381ed0c4b5d0f724f857c4d1"));
assertThat(quorumReceipt.getTo(), is("0x8a5E2a6343108bABEd07899510fb42297938D41F"));
assertThat(
quorumReceipt.getLogsBloom(),
is(
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"));
assertThat(quorumReceipt.getIsPrivacyMarkerTransaction(), is(true));
}
}
71 changes: 68 additions & 3 deletions src/main/java/org/web3j/quorum/JsonRpc2_0Quorum.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@
import org.web3j.protocol.Web3jService;
import org.web3j.protocol.core.JsonRpc2_0Web3j;
import org.web3j.protocol.core.Request;
import org.web3j.protocol.core.methods.response.EthGetTransactionReceipt;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.protocol.core.methods.response.EthTransaction;
import org.web3j.quorum.methods.request.PrivateRawTransaction;
import org.web3j.quorum.methods.request.PrivateTransaction;
import org.web3j.quorum.methods.response.ConsensusNoResponse;
import org.web3j.quorum.methods.response.ContractPrivacyMetadataInfo;
import org.web3j.quorum.methods.response.PrivatePayload;
import org.web3j.quorum.methods.response.*;
import org.web3j.quorum.methods.response.istanbul.IstanbulBlockSigners;
import org.web3j.quorum.methods.response.istanbul.IstanbulCandidates;
import org.web3j.quorum.methods.response.istanbul.IstanbulNodeAddress;
Expand Down Expand Up @@ -129,6 +129,71 @@ public Request<?, EthSendTransaction> ethSendTransactionAsync(PrivateTransaction
EthSendTransaction.class);
}

@Override
public Request<?, EthGetQuorumTransactionReceipt> ethGetQuorumTransactionReceipt(
String transactionHash) {

return new Request<>(
"eth_getTransactionReceipt",
Arrays.asList(transactionHash),
this.web3jService,
EthGetQuorumTransactionReceipt.class);
}

// privacy marker transactions

@Override
public Request<?, EthSendTransaction> ethDistributePrivateTransaction(
String signedTransactionData,
List<String> privateFor,
PrivacyFlag privacyFlag,
List<String> mandatoryFor) {
PrivateRawTransaction transaction =
new PrivateRawTransaction(privateFor, privacyFlag, mandatoryFor);
return new Request<>(
"eth_distributePrivateTransaction",
Arrays.asList(signedTransactionData, transaction),
web3jService,
EthSendTransaction.class);
}

@Override
public Request<?, EthSendTransaction> ethDistributePrivateTransaction(
String signedTransactionData, List<String> privateFor, PrivacyFlag privacyFlag) {
return ethDistributePrivateTransaction(
signedTransactionData, privateFor, privacyFlag, null);
}

@Override
public Request<?, EthSendTransaction> ethDistributePrivateTransaction(
String signedTransactionData, List<String> privateFor) {
return ethDistributePrivateTransaction(signedTransactionData, privateFor, null, null);
}

@Override
public Request<?, EthAddress> ethGetPrivacyPrecompileAddress() {
return new Request<>(
"eth_getPrivacyPrecompileAddress", Arrays.asList(), web3jService, EthAddress.class);
}

@Override
public Request<?, EthTransaction> ethGetPrivateTransactionByHash(String hexDigest) {
return new Request<>(
"eth_getPrivateTransactionByHash",
Collections.singletonList(hexDigest),
web3jService,
EthTransaction.class);
}

@Override
public Request<?, EthGetTransactionReceipt> ethGetPrivateTransactionReceipt(String hexDigest) {
return new Request<>(
"eth_getPrivateTransactionReceipt",
Collections.singletonList(hexDigest),
web3jService,
EthGetTransactionReceipt.class);
}

// raft consensus

@Override
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/org/web3j/quorum/Quorum.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
import org.web3j.protocol.Web3j;
import org.web3j.protocol.Web3jService;
import org.web3j.protocol.core.Request;
import org.web3j.protocol.core.methods.response.EthGetTransactionReceipt;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.protocol.core.methods.response.EthTransaction;
import org.web3j.quorum.methods.request.*;
import org.web3j.quorum.methods.response.*;
import org.web3j.quorum.methods.response.istanbul.IstanbulBlockSigners;
Expand Down Expand Up @@ -67,6 +69,28 @@ Request<?, EthSendTransaction> ethSendRawPrivateTransaction(

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

Request<?, EthGetQuorumTransactionReceipt> ethGetQuorumTransactionReceipt(String hexDigest);

// privacy marker transactions

Request<?, EthSendTransaction> ethDistributePrivateTransaction(
String signedTransactionData, List<String> privateFor);

Request<?, EthSendTransaction> ethDistributePrivateTransaction(
String signedTransactionData, List<String> privateFor, PrivacyFlag privacyFlag);

Request<?, EthSendTransaction> ethDistributePrivateTransaction(
String signedTransactionData,
List<String> privateFor,
PrivacyFlag privacyFlag,
List<String> mandatoryFor);

Request<?, EthAddress> ethGetPrivacyPrecompileAddress();

Request<?, EthTransaction> ethGetPrivateTransactionByHash(String hexDigest);

Request<?, EthGetTransactionReceipt> ethGetPrivateTransactionReceipt(String hexDigest);

// raft consensus

Request<?, RaftLeader> raftGetLeader();
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/org/web3j/quorum/methods/response/EthAddress.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright 2019 Web3 Labs Ltd.
*
* 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.
*/
package org.web3j.quorum.methods.response;

import org.web3j.protocol.core.Response;

/** quorum_canonicalHash */
public class EthAddress extends Response<String> {
public String getAddress() {
return getResult();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Copyright 2019 Web3 Labs Ltd.
*
* 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.
*/
package org.web3j.quorum.methods.response;

import java.io.IOException;
import java.util.Optional;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectReader;

import org.web3j.protocol.ObjectMapperFactory;
import org.web3j.protocol.core.Response;

/** eth_getTransactionReceipt. */
public class EthGetQuorumTransactionReceipt extends Response<QuorumTransactionReceipt> {

public Optional<QuorumTransactionReceipt> getTransactionReceipt() {
return Optional.ofNullable(getResult());
}

public static class ResponseDeserialiser extends JsonDeserializer<QuorumTransactionReceipt> {

private ObjectReader objectReader = ObjectMapperFactory.getObjectReader();

@Override
public QuorumTransactionReceipt deserialize(
JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException {
if (jsonParser.getCurrentToken() != JsonToken.VALUE_NULL) {
return objectReader.readValue(jsonParser, QuorumTransactionReceipt.class);
} else {
return null; // null is wrapped by Optional in above getter
}
}
}
}
Loading