[NC-1778] Added Clique JSON RPC method clique_proposals (#123)

Roberto Saltini 6 years ago committed by GitHub
parent 302fd41b42
commit f4b9b56354
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      consensus/clique/src/main/java/tech/pegasys/pantheon/consensus/clique/jsonrpc/CliqueJsonRpcMethodsFactory.java
  2. 52
      consensus/clique/src/main/java/tech/pegasys/pantheon/consensus/clique/jsonrpc/methods/CliqueProposals.java
  3. 73
      consensus/clique/src/test/java/tech/pegasys/pantheon/consensus/clique/jsonrpc/methods/CliqueProposalsTest.java
  4. 4
      consensus/common/src/main/java/tech/pegasys/pantheon/consensus/common/VoteProposer.java

@ -17,6 +17,7 @@ import tech.pegasys.pantheon.consensus.clique.CliqueVoteTallyUpdater;
import tech.pegasys.pantheon.consensus.clique.VoteTallyCache; import tech.pegasys.pantheon.consensus.clique.VoteTallyCache;
import tech.pegasys.pantheon.consensus.clique.jsonrpc.methods.CliqueGetSigners; import tech.pegasys.pantheon.consensus.clique.jsonrpc.methods.CliqueGetSigners;
import tech.pegasys.pantheon.consensus.clique.jsonrpc.methods.CliqueGetSignersAtHash; import tech.pegasys.pantheon.consensus.clique.jsonrpc.methods.CliqueGetSignersAtHash;
import tech.pegasys.pantheon.consensus.clique.jsonrpc.methods.CliqueProposals;
import tech.pegasys.pantheon.consensus.clique.jsonrpc.methods.Discard; import tech.pegasys.pantheon.consensus.clique.jsonrpc.methods.Discard;
import tech.pegasys.pantheon.consensus.clique.jsonrpc.methods.Propose; import tech.pegasys.pantheon.consensus.clique.jsonrpc.methods.Propose;
import tech.pegasys.pantheon.consensus.common.EpochManager; import tech.pegasys.pantheon.consensus.common.EpochManager;
@ -56,11 +57,13 @@ public class CliqueJsonRpcMethodsFactory {
new CliqueGetSignersAtHash(blockchainQueries, voteTallyCache, jsonRpcParameter); new CliqueGetSignersAtHash(blockchainQueries, voteTallyCache, jsonRpcParameter);
final Propose proposeRpc = new Propose(voteProposer, jsonRpcParameter); final Propose proposeRpc = new Propose(voteProposer, jsonRpcParameter);
final Discard discardRpc = new Discard(voteProposer, jsonRpcParameter); final Discard discardRpc = new Discard(voteProposer, jsonRpcParameter);
final CliqueProposals cliqueProposals = new CliqueProposals(voteProposer);
rpcMethods.put(cliqueGetSigners.getName(), cliqueGetSigners); rpcMethods.put(cliqueGetSigners.getName(), cliqueGetSigners);
rpcMethods.put(cliqueGetSignersAtHash.getName(), cliqueGetSignersAtHash); rpcMethods.put(cliqueGetSignersAtHash.getName(), cliqueGetSignersAtHash);
rpcMethods.put(proposeRpc.getName(), proposeRpc); rpcMethods.put(proposeRpc.getName(), proposeRpc);
rpcMethods.put(discardRpc.getName(), discardRpc); rpcMethods.put(discardRpc.getName(), discardRpc);
rpcMethods.put(cliqueProposals.getName(), cliqueProposals);
return rpcMethods; return rpcMethods;
} }

@ -0,0 +1,52 @@
/*
* Copyright 2018 ConsenSys AG.
*
* 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 tech.pegasys.pantheon.consensus.clique.jsonrpc.methods;
import tech.pegasys.pantheon.consensus.common.VoteProposer;
import tech.pegasys.pantheon.consensus.common.VoteType;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.JsonRpcRequest;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.methods.JsonRpcMethod;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.response.JsonRpcResponse;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.response.JsonRpcSuccessResponse;
import java.util.Map;
import java.util.stream.Collectors;
public class CliqueProposals implements JsonRpcMethod {
public static final String CLIQUE_PROPOSALS = "clique_proposals";
private final VoteProposer voteProposer;
public CliqueProposals(final VoteProposer voteProposer) {
this.voteProposer = voteProposer;
}
@Override
public String getName() {
return CLIQUE_PROPOSALS;
}
@Override
public JsonRpcResponse response(final JsonRpcRequest request) {
Map<String, Boolean> proposals =
voteProposer
.getProposals()
.entrySet()
.stream()
.collect(
Collectors.toMap(
proposal -> proposal.getKey().toString(),
proposal -> proposal.getValue() == VoteType.ADD));
return new JsonRpcSuccessResponse(request.getId(), proposals);
}
}

@ -0,0 +1,73 @@
/*
* Copyright 2018 ConsenSys AG.
*
* 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 tech.pegasys.pantheon.consensus.clique.jsonrpc.methods;
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import tech.pegasys.pantheon.consensus.common.VoteProposer;
import tech.pegasys.pantheon.consensus.common.VoteType;
import tech.pegasys.pantheon.ethereum.core.Address;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.JsonRpcRequest;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.response.JsonRpcResponse;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.response.JsonRpcSuccessResponse;
import com.google.common.collect.ImmutableMap;
import org.junit.Before;
import org.junit.Test;
public class CliqueProposalsTest {
private final VoteProposer voteProposer = mock(VoteProposer.class);
private final String METHOD_NAME = "clique_proposals";
private final String JSON_RPC_VERSION = "2.0";
private CliqueProposals method;
@Before
public void setup() {
method = new CliqueProposals(voteProposer);
}
@Test
public void returnsCorrectMethodName() {
assertThat(method.getName()).isEqualTo(METHOD_NAME);
}
@Test
public void testConversionFromVoteTypeToBoolean() {
final JsonRpcRequest request =
new JsonRpcRequest(JSON_RPC_VERSION, METHOD_NAME, new Object[] {});
when(voteProposer.getProposals())
.thenReturn(
ImmutableMap.of(
Address.fromHexString("1"),
VoteType.ADD,
Address.fromHexString("2"),
VoteType.DROP));
JsonRpcResponse expectedResponse =
new JsonRpcSuccessResponse(
request.getId(),
ImmutableMap.of(
"0x0000000000000000000000000000000000000001",
true,
"0x0000000000000000000000000000000000000002",
false));
JsonRpcResponse response = method.response(request);
assertThat(response).isEqualToComparingFieldByField(expectedResponse);
}
}

@ -60,6 +60,10 @@ public class VoteProposer {
proposals.clear(); proposals.clear();
} }
public Map<Address, VoteType> getProposals() {
return proposals;
}
public Optional<VoteType> get(final Address address) { public Optional<VoteType> get(final Address address) {
return Optional.ofNullable(proposals.get(address)); return Optional.ofNullable(proposals.get(address));
} }

Loading…
Cancel
Save