diff --git a/src/integration-test/java/org/web3j/quorum/PermissionRequestTest.java b/src/integration-test/java/org/web3j/quorum/PermissionRequestTest.java index 0794f7b..ced3a13 100644 --- a/src/integration-test/java/org/web3j/quorum/PermissionRequestTest.java +++ b/src/integration-test/java/org/web3j/quorum/PermissionRequestTest.java @@ -400,4 +400,44 @@ public void testPermissionApproveBlackListedNodeRecover() throws Exception { verifyResult( "{\"jsonrpc\":\"2.0\",\"method\":\"quorumPermission_approveBlackListedNodeRecovery\",\"params\":[\"orgId\",\"enodeId\",{\"from\":\"FROM\",\"to\":\"TO\",\"gas\":\"0xa\",\"value\":\"0xa\",\"data\":\"0xDATA\",\"nonce\":\"0x1\",\"privateFrom\":\"privateFrom\",\"privateFor\":[\"privateFor1\",\"privateFor2\"]}],\"id\":1}"); } + + @Test + public void testPermissionRecoverBlackListedAccount() throws Exception { + web3j.quorumPermissionRecoverBlackListedAccount( + "orgId", + "address", + new PrivateTransaction( + "FROM", + BigInteger.ONE, + BigInteger.TEN, + "TO", + BigInteger.TEN, + "DATA", + "privateFrom", + Arrays.asList("privateFor1", "privateFor2"))) + .send(); + + verifyResult( + "{\"jsonrpc\":\"2.0\",\"method\":\"quorumPermission_recoverBlackListedAccount\",\"params\":[\"orgId\",\"address\",{\"from\":\"FROM\",\"to\":\"TO\",\"gas\":\"0xa\",\"value\":\"0xa\",\"data\":\"0xDATA\",\"nonce\":\"0x1\",\"privateFrom\":\"privateFrom\",\"privateFor\":[\"privateFor1\",\"privateFor2\"]}],\"id\":1}"); + } + + @Test + public void testPermissionApproveBlackListedAccountRecover() throws Exception { + web3j.quorumPermissionApproveBlackListedAccountRecovery( + "orgId", + "address", + new PrivateTransaction( + "FROM", + BigInteger.ONE, + BigInteger.TEN, + "TO", + BigInteger.TEN, + "DATA", + "privateFrom", + Arrays.asList("privateFor1", "privateFor2"))) + .send(); + + verifyResult( + "{\"jsonrpc\":\"2.0\",\"method\":\"quorumPermission_approveBlackListedAccountRecovery\",\"params\":[\"orgId\",\"address\",{\"from\":\"FROM\",\"to\":\"TO\",\"gas\":\"0xa\",\"value\":\"0xa\",\"data\":\"0xDATA\",\"nonce\":\"0x1\",\"privateFrom\":\"privateFrom\",\"privateFor\":[\"privateFor1\",\"privateFor2\"]}],\"id\":1}"); + } } diff --git a/src/integration-test/java/org/web3j/quorum/RaftRequestTest.java b/src/integration-test/java/org/web3j/quorum/RaftRequestTest.java index 9716d5b..da0ac6d 100644 --- a/src/integration-test/java/org/web3j/quorum/RaftRequestTest.java +++ b/src/integration-test/java/org/web3j/quorum/RaftRequestTest.java @@ -62,4 +62,20 @@ public void testRaftAddPeer() throws Exception { verifyResult( "{\"jsonrpc\":\"2.0\",\"method\":\"raft_addPeer\",\"params\":[\"enode\"],\"id\":1}"); } + + @Test + public void testRaftAddLearner() throws Exception { + web3j.raftAddLearner("enode").send(); + + verifyResult( + "{\"jsonrpc\":\"2.0\",\"method\":\"raft_addLearner\",\"params\":[\"enode\"],\"id\":1}"); + } + + @Test + public void testRaftPromoteToPeer() throws Exception { + web3j.raftPromoteToPeer(1).send(); + + verifyResult( + "{\"jsonrpc\":\"2.0\",\"method\":\"raft_promoteToPeer\",\"params\":[1],\"id\":1}"); + } } diff --git a/src/integration-test/java/org/web3j/quorum/RaftResponseTest.java b/src/integration-test/java/org/web3j/quorum/RaftResponseTest.java index f20c2cf..3bc4194 100644 --- a/src/integration-test/java/org/web3j/quorum/RaftResponseTest.java +++ b/src/integration-test/java/org/web3j/quorum/RaftResponseTest.java @@ -21,6 +21,7 @@ import org.web3j.quorum.methods.response.raft.RaftCluster; import org.web3j.quorum.methods.response.raft.RaftLeader; import org.web3j.quorum.methods.response.raft.RaftPeerId; +import org.web3j.quorum.methods.response.raft.RaftPromote; import org.web3j.quorum.methods.response.raft.RaftRole; import static org.hamcrest.MatcherAssert.assertThat; @@ -51,13 +52,13 @@ public void testRaftLeader() { @Test public void testRaftCluster() { buildResponse( - "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":[{\"ip\":\"127.0.0.1\", \"nodeId\":\"3d9ca5956b38557aba991e31cf510d4df641dce9cc26bfeb7de082f0c07abb6ede3a58410c8f249dabeecee4ad3979929ac4c7c496ad20b8cfdd061b7401b4f5\",\"p2pPort\":\"21003\", \"raftId\":\"4\", \"raftPort\":\"50404\"}]}"); + "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":[{\"hostname\":\"127.0.0.1\", \"nodeActive\":\"true\", \"nodeId\":\"3d9ca5956b38557aba991e31cf510d4df641dce9cc26bfeb7de082f0c07abb6ede3a58410c8f249dabeecee4ad3979929ac4c7c496ad20b8cfdd061b7401b4f5\",\"p2pPort\":\"21003\", \"raftId\":\"4\", \"raftPort\":\"50404\", \"role\":\"verifier\"}]}"); RaftCluster raftCluster = deserialiseResponse(RaftCluster.class); assertThat( raftCluster.getCluster().get().toString(), is( - "[RaftPeer(ip=127.0.0.1, nodeId=3d9ca5956b38557aba991e31cf510d4df641dce9cc26bfeb7de082f0c07abb6ede3a58410c8f249dabeecee4ad3979929ac4c7c496ad20b8cfdd061b7401b4f5, p2pPort=21003, raftId=4, raftPort=50404)]")); + "[RaftPeer(hostname=127.0.0.1, nodeActive=true, nodeId=3d9ca5956b38557aba991e31cf510d4df641dce9cc26bfeb7de082f0c07abb6ede3a58410c8f249dabeecee4ad3979929ac4c7c496ad20b8cfdd061b7401b4f5, p2pPort=21003, raftId=4, raftPort=50404, role=verifier)]")); } @Test @@ -75,4 +76,12 @@ public void testRaftAddPeer() { RaftPeerId raftPeerId = deserialiseResponse(RaftPeerId.class); assertThat(raftPeerId.getAddedPeer(), is(BigInteger.ONE)); } + + @Test + public void testRaftPromoteToPeer() { + buildResponse("{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"true\"}"); + + RaftPromote raftPromote = deserialiseResponse(RaftPromote.class); + assertThat(raftPromote.getPromotionStatus(), is(true)); + } } diff --git a/src/main/java/org/web3j/quorum/JsonRpc2_0Quorum.java b/src/main/java/org/web3j/quorum/JsonRpc2_0Quorum.java index f16f0d1..2d6e89b 100644 --- a/src/main/java/org/web3j/quorum/JsonRpc2_0Quorum.java +++ b/src/main/java/org/web3j/quorum/JsonRpc2_0Quorum.java @@ -39,6 +39,7 @@ import org.web3j.quorum.methods.response.raft.RaftCluster; import org.web3j.quorum.methods.response.raft.RaftLeader; import org.web3j.quorum.methods.response.raft.RaftPeerId; +import org.web3j.quorum.methods.response.raft.RaftPromote; import org.web3j.quorum.methods.response.raft.RaftRole; /** Quorum JSON-RPC API implementation. */ @@ -136,6 +137,24 @@ public Request raftGetCluster() { "raft_cluster", Collections.emptyList(), web3jService, RaftCluster.class); } + @Override + public Request raftAddLearner(String enode) { + return new Request<>( + "raft_addLearner", + Collections.singletonList(enode), + web3jService, + RaftPeerId.class); + } + + @Override + public Request raftPromoteToPeer(int raftId) { + return new Request<>( + "raft_promoteToPeer", + Collections.singletonList(raftId), + web3jService, + RaftPromote.class); + } + // istanbul consensus @Override @@ -439,4 +458,24 @@ public Request quorumPermissionApproveBlackListedNodeRecovery web3jService, ExecStatusInfo.class); } + + @Override + public Request quorumPermissionRecoverBlackListedAccount( + String orgId, String address, PrivateTransaction transaction) { + return new Request<>( + "quorumPermission_recoverBlackListedAccount", + Arrays.asList(orgId, address, transaction), + web3jService, + ExecStatusInfo.class); + } + + @Override + public Request quorumPermissionApproveBlackListedAccountRecovery( + String orgId, String address, PrivateTransaction transaction) { + return new Request<>( + "quorumPermission_approveBlackListedAccountRecovery", + Arrays.asList(orgId, address, transaction), + web3jService, + ExecStatusInfo.class); + } } diff --git a/src/main/java/org/web3j/quorum/Quorum.java b/src/main/java/org/web3j/quorum/Quorum.java index 2efb356..5642c56 100644 --- a/src/main/java/org/web3j/quorum/Quorum.java +++ b/src/main/java/org/web3j/quorum/Quorum.java @@ -34,6 +34,7 @@ import org.web3j.quorum.methods.response.raft.RaftCluster; import org.web3j.quorum.methods.response.raft.RaftLeader; import org.web3j.quorum.methods.response.raft.RaftPeerId; +import org.web3j.quorum.methods.response.raft.RaftPromote; import org.web3j.quorum.methods.response.raft.RaftRole; /** JSON-RPC Request object building factory for Quorum. */ @@ -65,6 +66,10 @@ Request ethSendRawPrivateTransaction( Request raftGetCluster(); + Request raftAddLearner(String enode); + + Request raftPromoteToPeer(int raftId); + // istanbul consensus Request istanbulGetSnapshot(String blockNum); @@ -151,4 +156,10 @@ Request quorumPermissionRecoverBlackListedNode( Request quorumPermissionApproveBlackListedNodeRecovery( String orgId, String enodeId, PrivateTransaction transaction); + + Request quorumPermissionRecoverBlackListedAccount( + String orgId, String address, PrivateTransaction transaction); + + Request quorumPermissionApproveBlackListedAccountRecovery( + String orgId, String address, PrivateTransaction transaction); } diff --git a/src/main/java/org/web3j/quorum/methods/response/raft/RaftPromote.java b/src/main/java/org/web3j/quorum/methods/response/raft/RaftPromote.java new file mode 100644 index 0000000..8a7dc6f --- /dev/null +++ b/src/main/java/org/web3j/quorum/methods/response/raft/RaftPromote.java @@ -0,0 +1,22 @@ +/* + * Copyright 2020 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.raft; + +import org.web3j.protocol.core.Response; + +public class RaftPromote extends Response { + + public Boolean getPromotionStatus() { + return getResult(); + } +}