Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AKI-326: Remove external module dependencies from p2p #966

Merged
merged 5 commits into from
Aug 23, 2019
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
30 changes: 29 additions & 1 deletion modAionImpl/src/org/aion/zero/impl/AionHub.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.ServiceLoader;
import java.util.concurrent.atomic.AtomicBoolean;
Expand All @@ -22,6 +24,7 @@
import org.aion.mcf.db.IBlockStorePow;
import org.aion.mcf.db.Repository;
import org.aion.p2p.Handler;
import org.aion.p2p.INode;
import org.aion.p2p.IP2pMgr;
import org.aion.p2p.impl1.P2pMgr;
import org.aion.util.bytes.ByteUtil;
Expand All @@ -32,6 +35,7 @@
import org.aion.zero.impl.db.AionRepositoryImpl;
import org.aion.zero.impl.db.DBUtils;
import org.aion.zero.impl.pow.AionPoW;
import org.aion.zero.impl.sync.NodeWrapper;
import org.aion.zero.impl.sync.SyncMgr;
import org.aion.zero.impl.sync.handler.BlockPropagationHandler;
import org.aion.zero.impl.sync.handler.BroadcastNewBlockHandler;
Expand All @@ -51,6 +55,7 @@ public class AionHub {
private static final Logger syncLOG = AionLoggerFactory.getLogger(LogEnum.SYNC.name());

private IP2pMgr p2pMgr;
private int chainId; // TODO: can be made final upon constructor refactoring

private CfgAion cfg;

Expand Down Expand Up @@ -149,11 +154,13 @@ private void initializeHub(
* method
*/
CfgNetP2p cfgNetP2p = this.cfg.getNet().getP2p();
this.chainId = this.cfg.getNet().getId();

// there are two p2p implementation , now just point to impl1.
this.p2pMgr =
new P2pMgr(
this.cfg.getNet().getId(),
AionLoggerFactory.getLogger(LogEnum.P2P.name()),
this.chainId,
Version.KERNEL_VERSION,
this.cfg.getId(),
cfgNetP2p.getIp(),
Expand Down Expand Up @@ -526,10 +533,31 @@ public SyncMgr getSyncMgr() {
return this.syncMgr;
}

/** Note: method used only by AionImpl and tests. Please avoid further use. */
public IP2pMgr getP2pMgr() {
return this.p2pMgr;
}

public int getActiveNodesCount() {
return this.p2pMgr.getActiveNodes().size();
}

public List<Short> getP2pVersions() {
return this.p2pMgr.versions();
}

public int getChainId() {
return this.chainId;
}

public Map<Integer, NodeWrapper> getActiveNodes() {
Map<Integer, NodeWrapper> active = new HashMap<>();
for (Map.Entry<Integer, INode> entry : this.p2pMgr.getActiveNodes().entrySet()) {
active.put(entry.getKey(), new NodeWrapper(entry.getValue()));
}
return active;
}

public static String getRepoVersion() {
return Version.REPO_VERSION;
}
Expand Down
53 changes: 53 additions & 0 deletions modAionImpl/src/org/aion/zero/impl/sync/NodeWrapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package org.aion.zero.impl.sync;

import java.math.BigInteger;
import org.aion.p2p.INode;

/** Facilitates passing peer information to the API without relying on the p2p module interfaces. */
public class NodeWrapper {
INode peer;

public NodeWrapper(INode peer) {
this.peer = peer;
}

public String getIdShort() {
return peer.getIdShort();
}

public byte[] getId() {
return peer.getId();
}

public int getIdHash() {
return peer.getIdHash();
}

public String getBinaryVersion() {
return peer.getBinaryVersion();
}

public long getBestBlockNumber() {
return peer.getBestBlockNumber();
}

public BigInteger getTotalDifficulty() {
return peer.getTotalDifficulty();
}

public byte[] getIp() {
return peer.getIp();
}

public String getIpStr() {
return peer.getIpStr();
}

public int getPort() {
return peer.getPort();
}

public long getTimestamp() {
return peer.getTimestamp();
}
}
19 changes: 7 additions & 12 deletions modAionImpl/test/org/aion/zero/impl/sync/BlockPropagationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -215,11 +215,6 @@ public List<Short> versions() {
return new ArrayList<>();
}

@Override
public int chainId() {
return 0;
}

@Override
public void errCheck(int nodeIdHashcode, String _displayId) {}

Expand All @@ -240,11 +235,6 @@ public void closeSocket(SocketChannel _sc, String _reason) {}
@Override
public void closeSocket(SocketChannel _sc, String _reason, Exception e) {}

@Override
public int getSelfIdHash() {
return 0;
}

@Override
public void dropActive(int _nodeIdHash, String _reason) {
throw new IllegalStateException("not implemented.");
Expand Down Expand Up @@ -276,8 +266,13 @@ public boolean validateNode(INode _node) {
}

@Override
public int getSelfNetId() {
throw new IllegalStateException("not implemented.");
public boolean isCorrectNetwork(int netId){
return netId == 0;
}

@Override
public boolean isSelf(INode node) {
return false;
}

@Override
Expand Down
1 change: 0 additions & 1 deletion modApiServer/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ dependencies {
compile project(':modAionImpl')
compile files("${rootProject.projectDir}/lib/fastvm-f2a39b8.jar")
compile project(':modMcf')
compile project(':modP2p')
compile project(':modEvtMgr')
compile project(':modEvtMgrImpl')
compile project(':3rdParty.libnzmq')
Expand Down
1 change: 0 additions & 1 deletion modApiServer/src/module-info.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
module aion.apiserver {
requires aion.zero.impl;
requires aion.log;
requires aion.p2p;
requires aion.mcf;
requires aion.crypto;
requires slf4j.api;
Expand Down
6 changes: 3 additions & 3 deletions modApiServer/src/org/aion/api/server/ApiAion.java
Original file line number Diff line number Diff line change
Expand Up @@ -692,7 +692,7 @@ public boolean isMining() {
}

protected int peerCount() {
return this.ac.getAionHub().getP2pMgr().getActiveNodes().size();
return this.ac.getAionHub().getActiveNodesCount();
}

// follows the ethereum standard for web3 compliance. DO NOT DEPEND ON IT.
Expand All @@ -717,7 +717,7 @@ private String computeClientVersion() {
// mainly to keep compatibility with eth_protocolVersion which returns a String
protected String p2pProtocolVersion() {
try {
List<Short> p2pVersions = this.ac.getAionHub().getP2pMgr().versions();
List<Short> p2pVersions = this.ac.getAionHub().getP2pVersions();
int i = 0;
StringBuilder b = new StringBuilder();
for (Short v : p2pVersions) {
Expand All @@ -735,7 +735,7 @@ protected String p2pProtocolVersion() {
}

protected String chainId() {
return (this.ac.getAionHub().getP2pMgr().chainId() + "");
return (this.ac.getAionHub().getChainId() + "");
}

public String getHashrate() {
Expand Down
8 changes: 4 additions & 4 deletions modApiServer/src/org/aion/api/server/pb/ApiAion0.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
import org.aion.mcf.account.Keystore;
import org.aion.mcf.blockchain.Block;
import org.aion.mcf.tx.TxReceipt;
import org.aion.p2p.INode;
import org.aion.types.AionAddress;
import org.aion.types.Log;
import org.aion.util.bytes.ByteUtil;
Expand All @@ -65,6 +64,7 @@
import org.aion.zero.impl.Version;
import org.aion.zero.impl.blockchain.IAionChain;
import org.aion.zero.impl.config.CfgAion;
import org.aion.zero.impl.sync.NodeWrapper;
import org.aion.zero.impl.types.AionBlock;
import org.aion.zero.impl.types.AionBlockSummary;
import org.aion.zero.impl.types.AionTxInfo;
Expand Down Expand Up @@ -1304,12 +1304,12 @@ public byte[] process(byte[] request, byte[] socketId) {
getApiVersion(), Retcode.r_fail_service_call_VALUE);
}

List<INode> nodes =
List<NodeWrapper> nodes =
new ArrayList<>(
this.ac.getAionHub().getP2pMgr().getActiveNodes().values());
this.ac.getAionHub().getActiveNodes().values());
List<Message.t_Node> pl = new ArrayList<>();
try {
for (INode n : nodes) {
for (NodeWrapper n : nodes) {
Message.t_Node node =
Message.t_Node
.newBuilder()
Expand Down
16 changes: 8 additions & 8 deletions modApiServer/src/org/aion/api/server/rpc/ApiWeb3Aion.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@
import org.aion.mcf.db.Repository;
import org.aion.mcf.tx.TxReceipt;
import org.aion.mcf.vm.types.DataWordImpl;
import org.aion.p2p.INode;
import org.aion.types.AionAddress;
import org.aion.types.Log;
import org.aion.util.bytes.ByteUtil;
Expand All @@ -84,6 +83,7 @@
import org.aion.zero.impl.config.CfgEnergyStrategy;
import org.aion.zero.impl.db.AionBlockStore;
import org.aion.zero.impl.db.AionRepositoryImpl;
import org.aion.zero.impl.sync.NodeWrapper;
import org.aion.zero.impl.sync.PeerState;
import org.aion.zero.impl.types.AionBlock;
import org.aion.zero.impl.types.AionBlockSummary;
Expand Down Expand Up @@ -1453,11 +1453,11 @@ public RpcMsg debug_getBlocksByNumber(Object _params) {
* we can freely change the responses without breaking compatibility
*/
public RpcMsg priv_peers() {
Map<Integer, INode> activeNodes = this.ac.getAionHub().getP2pMgr().getActiveNodes();
Map<Integer, NodeWrapper> activeNodes = this.ac.getAionHub().getActiveNodes();

JSONArray peerList = new JSONArray();

for (INode node : activeNodes.values()) {
for (NodeWrapper node : activeNodes.values()) {
JSONObject n = new JSONObject();
n.put("idShort", node.getIdShort());
n.put("id", new String(node.getId()));
Expand Down Expand Up @@ -1613,11 +1613,11 @@ private static JSONObject dumpBlock(Block block, BigInteger totalDiff, boolean f
// TODO
public RpcMsg priv_shortStats() {
Block block = this.ac.getBlockchain().getBestBlock();
Map<Integer, INode> peer = this.ac.getAionHub().getP2pMgr().getActiveNodes();
Map<Integer, NodeWrapper> peer = this.ac.getAionHub().getActiveNodes();

// this could be optimized (cached)
INode maxPeer = null;
for (INode p : peer.values()) {
NodeWrapper maxPeer = null;
for (NodeWrapper p : peer.values()) {
if (maxPeer == null) {
maxPeer = p;
continue;
Expand Down Expand Up @@ -1687,13 +1687,13 @@ public RpcMsg priv_syncPeers() {
Map<Integer, PeerState> peerStates = this.ac.getAionHub().getSyncMgr().getPeerStates();

// also retrieve nodes from p2p to see if we can piece together a full state
Map<Integer, INode> nodeState = this.ac.getAionHub().getP2pMgr().getActiveNodes();
Map<Integer, NodeWrapper> nodeState = this.ac.getAionHub().getActiveNodes();

JSONArray array = new JSONArray();
for (Map.Entry<Integer, PeerState> peerState : peerStates.entrySet()) {
// begin []
JSONObject peerObj = new JSONObject();
INode node;
NodeWrapper node;
if ((node = nodeState.get(peerState.getKey())) != null) {
// base[].node
JSONObject nodeObj = new JSONObject();
Expand Down
2 changes: 1 addition & 1 deletion modApiServer/test/org/aion/api/server/ApiAionTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ public void testSimpleGetters() {
assertEquals(impl.getAionHub().getP2pMgr().getActiveNodes().size(), api.peerCount());
assertNotNull(api.p2pProtocolVersion());
assertNotEquals(0, api.getRecommendedNrgPrice());
assertEquals(impl.getAionHub().getP2pMgr().chainId(), Integer.parseInt(api.chainId()));
assertEquals(impl.getAionHub().getChainId(), Integer.parseInt(api.chainId()));
}

@Test
Expand Down
24 changes: 18 additions & 6 deletions modP2p/src/org/aion/p2p/IP2pMgr.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,6 @@ public interface IP2pMgr {

List<Short> versions();

int chainId();

int getSelfIdHash();

void closeSocket(final SocketChannel _sc, String _reason);

void closeSocket(final SocketChannel _sc, String _reason, Exception e);
Expand All @@ -53,7 +49,23 @@ public interface IP2pMgr {

boolean validateNode(INode _node);

int getSelfNetId();

int getAvgLatency();

/**
* Compares the given network identifier to the one recorded in the p2p manager.
*
* @param netId network identifier for attempted connection
* @return {@code true} if the network is compatible according to the p2p manager's definition
* of correctness, {@code false} otherwise
*/
boolean isCorrectNetwork(int netId);

/**
* Compares the given node to the one recorded as the running node.
*
* @param node a node for which a connection is attempted
* @return {@code true} if the given node is the same as the running node according to the p2p
* manager's definition of node equality, {@code false} otherwise
*/
boolean isSelf(INode node);
}
5 changes: 0 additions & 5 deletions modP2pImpl/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,6 @@ sourceSets {
}

dependencies {
//compile 'network.aion:util4j:0.4.0'
//compile 'network.aion:log4j:0.4.0'
compile project(':modUtil')
compile project(':modLogger')

compile project(':modP2p')
compile files('../lib/miniupnpc_linux.jar')
compile 'org.apache.commons:commons-collections4:4.0'
Expand Down
2 changes: 0 additions & 2 deletions modP2pImpl/src/module-info.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
module aion.p2p.impl {
requires aion.p2p;
requires aion.util;
requires aion.log;
requires miniupnpc.linux;
requires slf4j.api;
requires jsr305;
Expand Down
Loading