From 352f4c35e1b1fa9018dd40adeff9de65ffb53e5a Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Wed, 9 May 2018 11:11:23 +0800 Subject: [PATCH 01/25] mdy --- .../java/org/tron/common/overlay/discover/NodeStatistics.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java index 9dae871591b..34bf22451d1 100644 --- a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java +++ b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java @@ -21,7 +21,6 @@ import static java.lang.Math.min; import java.util.concurrent.atomic.AtomicLong; - import org.tron.common.overlay.message.ReasonCode; public class NodeStatistics { @@ -177,12 +176,14 @@ public void nodeDisconnectedRemote(ReasonCode reason) { lastDisconnectedTime = System.currentTimeMillis(); tronLastRemoteDisconnectReason = reason; disconnectTimes++; + persistedReputation = persistedReputation / 2; } public void nodeDisconnectedLocal(ReasonCode reason) { lastDisconnectedTime = System.currentTimeMillis(); tronLastLocalDisconnectReason = reason; disconnectTimes++; + persistedReputation = persistedReputation / 2; } public boolean wasDisconnected() { From f1d3c47ce6875b17f3310207bf5d78ffad9689ba Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Wed, 9 May 2018 11:57:36 +0800 Subject: [PATCH 02/25] mdy --- .../overlay/discover/NodeStatistics.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java index 34bf22451d1..5a9632c3d5b 100644 --- a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java +++ b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java @@ -27,6 +27,7 @@ public class NodeStatistics { public final static int REPUTATION_PREDEFINED = 100000; public final static long TOO_MANY_PEERS_PENALIZE_TIMEOUT = 60 * 1000; + private static final long CLEAR_CYCLE_TIME = 60 * 60 * 1000; public class StatHandler { @@ -91,7 +92,7 @@ private int getSessionFairReputation() { int discoverReput = 0; discoverReput += - min(discoverInPong.get(), 1) * (discoverOutPing.get() == discoverInPong.get() ? 50 : 1); + min(discoverInPong.get(), 1) * (discoverOutPing.get() == discoverInPong.get() ? 101 : 1); discoverReput += min(discoverInNeighbours.get(), 10) * 10; discoverReput += min(discoverInFind.get(), 50); @@ -116,7 +117,8 @@ private int getSessionFairReputation() { } } } - return discoverReput + 10 * reput; + int score = discoverReput + 10 * reput - disconnectTimes * 20; + return score > 0 ? score : 0; } public int getReputation() { @@ -145,7 +147,14 @@ public boolean isReputationPenalized() { return true; } - return tronLastLocalDisconnectReason == ReasonCode.NULL_IDENTITY || + if (lastDisconnectedTime > 0 + && (System.currentTimeMillis() - lastDisconnectedTime) > CLEAR_CYCLE_TIME) { + tronLastLocalDisconnectReason = null; + tronLastRemoteDisconnectReason = null; + persistedReputation = 0; + } + + if (tronLastLocalDisconnectReason == ReasonCode.NULL_IDENTITY || tronLastRemoteDisconnectReason == ReasonCode.NULL_IDENTITY || tronLastLocalDisconnectReason == ReasonCode.INCOMPATIBLE_PROTOCOL || tronLastRemoteDisconnectReason == ReasonCode.INCOMPATIBLE_PROTOCOL || @@ -162,7 +171,13 @@ public boolean isReputationPenalized() { tronLastLocalDisconnectReason == ReasonCode.INCOMPATIBLE_VERSION || tronLastRemoteDisconnectReason == ReasonCode.INCOMPATIBLE_VERSION || tronLastLocalDisconnectReason == ReasonCode.INCOMPATIBLE_CHAIN || - tronLastRemoteDisconnectReason == ReasonCode.INCOMPATIBLE_CHAIN; + tronLastRemoteDisconnectReason == ReasonCode.INCOMPATIBLE_CHAIN || + tronLastRemoteDisconnectReason == ReasonCode.SYNC_FAIL || + tronLastLocalDisconnectReason == ReasonCode.SYNC_FAIL) { + persistedReputation = 0; + return true; + } + return false; } public boolean isPenalized() { From 64b19ec46eaf75bb1746417ed4e779ed8db1df73 Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Wed, 9 May 2018 12:14:40 +0800 Subject: [PATCH 03/25] mdy --- .../org/tron/common/overlay/discover/NodeStatistics.java | 8 +++++--- .../java/org/tron/common/overlay/server/SyncPool.java | 4 ++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java index 5a9632c3d5b..ad56082a0aa 100644 --- a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java +++ b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java @@ -182,9 +182,11 @@ public boolean isReputationPenalized() { public boolean isPenalized() { return tronLastLocalDisconnectReason == ReasonCode.NULL_IDENTITY || - tronLastRemoteDisconnectReason == ReasonCode.NULL_IDENTITY || - tronLastLocalDisconnectReason == ReasonCode.BAD_PROTOCOL || - tronLastRemoteDisconnectReason == ReasonCode.BAD_PROTOCOL; + tronLastRemoteDisconnectReason == ReasonCode.NULL_IDENTITY || + tronLastLocalDisconnectReason == ReasonCode.BAD_PROTOCOL || + tronLastRemoteDisconnectReason == ReasonCode.BAD_PROTOCOL || + tronLastLocalDisconnectReason == ReasonCode.SYNC_FAIL || + tronLastRemoteDisconnectReason == ReasonCode.SYNC_FAIL; } public void nodeDisconnectedRemote(ReasonCode reason) { diff --git a/src/main/java/org/tron/common/overlay/server/SyncPool.java b/src/main/java/org/tron/common/overlay/server/SyncPool.java index a284ba8f6ea..331e802f6af 100644 --- a/src/main/java/org/tron/common/overlay/server/SyncPool.java +++ b/src/main/java/org/tron/common/overlay/server/SyncPool.java @@ -207,6 +207,10 @@ public boolean test(NodeHandler handler) { if (handler.getNodeStatistics().getReputation() < 100) { return false; } + + if (handler.getNodeStatistics().isPenalized()) { + return false; + } return true; } From 064cdaed192fe3dc55c75ef61f80ab78306ea567 Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Wed, 9 May 2018 16:36:43 +0800 Subject: [PATCH 04/25] mdy --- .../common/overlay/client/PeerClient.java | 23 +++++++++++++++---- .../overlay/discover/NodeStatistics.java | 3 ++- .../tron/common/overlay/server/SyncPool.java | 3 +-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/tron/common/overlay/client/PeerClient.java b/src/main/java/org/tron/common/overlay/client/PeerClient.java index 747b2fd24c6..a86972a5c0f 100644 --- a/src/main/java/org/tron/common/overlay/client/PeerClient.java +++ b/src/main/java/org/tron/common/overlay/client/PeerClient.java @@ -2,25 +2,27 @@ import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelOption; import io.netty.channel.DefaultMessageSizeEstimator; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; +import org.tron.common.overlay.discover.Node; +import org.tron.common.overlay.discover.NodeHandler; +import org.tron.common.overlay.message.ReasonCode; import org.tron.common.overlay.server.TronChannelInitializer; import org.tron.core.config.args.Args; import org.tron.core.net.node.NodeImpl; -import java.io.IOException; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicInteger; - @Component public class PeerClient { @@ -54,6 +56,19 @@ public void connect(String host, int port, String remoteId) { } } + public ChannelFuture connectAsync(NodeHandler nodeHandler, boolean discoveryMode) { + Node node = nodeHandler.getNode(); + return connectAsync(node.getHost(), node.getPort(), node.getHexId(), discoveryMode) + .addListener((ChannelFutureListener) future -> { + if (!future.isSuccess()) { + logger.error("connect to {}:{} fail,cause:{}", node.getHost(), node.getPort(), + future.cause().getMessage()); + nodeHandler.getNodeStatistics().nodeDisconnectedLocal(ReasonCode.TIME_OUT); + future.channel().close(); + } + }); + } + public ChannelFuture connectAsync(String host, int port, String remoteId, boolean discoveryMode) { logger.info("connect peer {} {} {}", host, port, remoteId); diff --git a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java index ad56082a0aa..ca2cfbb384a 100644 --- a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java +++ b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java @@ -92,7 +92,7 @@ private int getSessionFairReputation() { int discoverReput = 0; discoverReput += - min(discoverInPong.get(), 1) * (discoverOutPing.get() == discoverInPong.get() ? 101 : 1); + min(discoverInPong.get(), 1) * (discoverOutPing.get() == discoverInPong.get() ? 51 : 1); discoverReput += min(discoverInNeighbours.get(), 10) * 10; discoverReput += min(discoverInFind.get(), 50); @@ -151,6 +151,7 @@ public boolean isReputationPenalized() { && (System.currentTimeMillis() - lastDisconnectedTime) > CLEAR_CYCLE_TIME) { tronLastLocalDisconnectReason = null; tronLastRemoteDisconnectReason = null; + disconnectTimes = 0; persistedReputation = 0; } diff --git a/src/main/java/org/tron/common/overlay/server/SyncPool.java b/src/main/java/org/tron/common/overlay/server/SyncPool.java index 331e802f6af..b074138e854 100644 --- a/src/main/java/org/tron/common/overlay/server/SyncPool.java +++ b/src/main/java/org/tron/common/overlay/server/SyncPool.java @@ -102,8 +102,7 @@ private void fillUp() { nodesInUse.add(nodeManager.getPublicHomeNode().getHexId()); List newNodes = nodeManager.getNodes(new NodeSelector(nodesInUse), lackSize); - newNodes.forEach(n -> peerClient.connectAsync(n.getNode().getHost(), n.getNode().getPort(), - n.getNode().getHexId(), false)); + newNodes.forEach(n -> peerClient.connectAsync(n, false)); } // for test only From fb840b3fc44dcb46dfec92077efafa898bbb61db Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Wed, 9 May 2018 17:21:35 +0800 Subject: [PATCH 05/25] modify the reason code --- src/main/java/org/tron/common/overlay/client/PeerClient.java | 2 +- src/main/java/org/tron/common/overlay/message/ReasonCode.java | 2 ++ src/main/protos/core/Tron.proto | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/overlay/client/PeerClient.java b/src/main/java/org/tron/common/overlay/client/PeerClient.java index a86972a5c0f..ad9e5578c67 100644 --- a/src/main/java/org/tron/common/overlay/client/PeerClient.java +++ b/src/main/java/org/tron/common/overlay/client/PeerClient.java @@ -63,7 +63,7 @@ public ChannelFuture connectAsync(NodeHandler nodeHandler, boolean discoveryMode if (!future.isSuccess()) { logger.error("connect to {}:{} fail,cause:{}", node.getHost(), node.getPort(), future.cause().getMessage()); - nodeHandler.getNodeStatistics().nodeDisconnectedLocal(ReasonCode.TIME_OUT); + nodeHandler.getNodeStatistics().nodeDisconnectedLocal(ReasonCode.CONNECT_FAIL); future.channel().close(); } }); diff --git a/src/main/java/org/tron/common/overlay/message/ReasonCode.java b/src/main/java/org/tron/common/overlay/message/ReasonCode.java index 2d79a754e76..c35de758a2b 100644 --- a/src/main/java/org/tron/common/overlay/message/ReasonCode.java +++ b/src/main/java/org/tron/common/overlay/message/ReasonCode.java @@ -89,6 +89,8 @@ public enum ReasonCode { TIME_OUT(0x20), + CONNECT_FAIL(0x21), + /** * [0xFF] Reason not specified */ diff --git a/src/main/protos/core/Tron.proto b/src/main/protos/core/Tron.proto index 3f032cb7339..a72460a27ed 100644 --- a/src/main/protos/core/Tron.proto +++ b/src/main/protos/core/Tron.proto @@ -262,6 +262,7 @@ enum ReasonCode { INCOMPATIBLE_VERSION = 0x18; INCOMPATIBLE_CHAIN = 0x19; TIME_OUT = 0x20; + CONNECT_FAIL = 0x21; UNKNOWN = 0xFF; } From 86e6f76ab4ee0ecd57bfcbcc0eb0f7c52b900edb Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Wed, 9 May 2018 18:52:43 +0800 Subject: [PATCH 06/25] modify the version --- src/main/resources/config.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/config.conf b/src/main/resources/config.conf index 1816ed057b4..2130bf066b2 100644 --- a/src/main/resources/config.conf +++ b/src/main/resources/config.conf @@ -41,7 +41,7 @@ node { minParticipationRate = 33 p2p { - version = 63 # 63: testnet; 101: debug + version = 64 # 64: testnet; 101: debug } } From 2c3a06f75114aff650304d4f0c9f9160611fcf1a Mon Sep 17 00:00:00 2001 From: zergweak Date: Wed, 9 May 2018 20:49:49 +0800 Subject: [PATCH 07/25] add validUrl, url need 1 to 256 bytes --- .../core/actuator/WitnessCreateActuator.java | 10 ++- .../core/capsule/utils/TransactionUtil.java | 11 +++ .../actuator/WitnessCreateActuatorTest.java | 90 +++++++++++++++++-- 3 files changed, 99 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java b/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java index 36ff8e60969..65951f5ff7b 100755 --- a/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java +++ b/src/main/java/org/tron/core/actuator/WitnessCreateActuator.java @@ -10,6 +10,7 @@ import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; +import org.tron.core.capsule.utils.TransactionUtil; import org.tron.core.db.Manager; import org.tron.core.exception.BalanceInsufficientException; import org.tron.core.exception.ContractExeException; @@ -55,6 +56,11 @@ public boolean validate() throws ContractValidateException { if (!Wallet.addressValid(contract.getOwnerAddress().toByteArray())) { throw new ContractValidateException("Invalidate address"); } + + if (!TransactionUtil.validUrl(contract.getUrl().toByteArray())) { + throw new ContractValidateException("Invalidate url"); + } + Preconditions.checkArgument( this.dbManager.getAccountStore().has(contract.getOwnerAddress().toByteArray()), "account[" + readableOwnerAddress + "] not exists"); @@ -70,7 +76,6 @@ public boolean validate() throws ContractValidateException { accountCapsule.getBalance() >= dbManager.getDynamicPropertiesStore() .getAccountUpgradeCost(), "balance < AccountUpgradeCost"); - } catch (final Exception ex) { ex.printStackTrace(); throw new ContractValidateException(ex.getMessage()); @@ -106,8 +111,5 @@ private void createWitness(final WitnessCreateContract witnessCreateContract) { } catch (BalanceInsufficientException e) { throw new RuntimeException(e); } - - } - } diff --git a/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java b/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java index 9e954d6bb74..486b54bc4ac 100644 --- a/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java +++ b/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java @@ -17,6 +17,7 @@ import com.google.protobuf.ByteString; import lombok.extern.slf4j.Slf4j; +import org.tron.common.utils.ByteUtil; import org.tron.core.Wallet; import org.tron.core.capsule.TransactionCapsule; import org.tron.protos.Contract.TransferContract; @@ -49,6 +50,16 @@ private static boolean checkBalance(long totalBalance, long totalSpent) { return totalBalance == totalSpent; } + public static boolean validUrl(byte[] url) { + if (ByteUtil.isNullOrZeroArray(url)) { + return false; + } + if (url.length > 256) { + return false; + } + // other rules. + return true; + } /** * Get sender. */ diff --git a/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java b/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java index 0904c7ca1c3..c161cea8bf7 100644 --- a/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java +++ b/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java @@ -104,6 +104,14 @@ private Any getContract(String address, String url) { .build()); } + private Any getContract(String address, ByteString url) { + return Any.pack( + Contract.WitnessCreateContract.newBuilder() + .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(address))) + .setUrl(url) + .build()); + } + /** * first createWitness,result is success. */ @@ -142,11 +150,10 @@ public void secondCreateAccount() { try { actuator.validate(); actuator.execute(ret); - + Assert.assertFalse(true); } catch (ContractValidateException e) { Assert.assertTrue(e instanceof ContractValidateException); Assert.assertEquals("Witness[" + OWNER_ADDRESS_SECOND + "] has existed", e.getMessage()); - } catch (ContractExeException e) { Assert.assertFalse(e instanceof ContractExeException); } @@ -164,16 +171,86 @@ public void invalidateAddress() { actuator.validate(); actuator.execute(ret); fail("Invalidate address"); + } catch (ContractValidateException e) { + Assert.assertTrue(e instanceof ContractValidateException); + Assert.assertEquals("Invalidate address", e.getMessage()); + } catch (ContractExeException e) { + Assert.assertFalse(e instanceof ContractExeException); + } + } + /** + * use Invalidate url createWitness,result is failed,exception is "Invalidate url". + */ + @Test + public void invalidateUrlTest() { + TransactionResultCapsule ret = new TransactionResultCapsule(); + //Url cannot empty + try { + WitnessCreateActuator actuator = new WitnessCreateActuator( + getContract(OWNER_ADDRESS_FRIST, ByteString.EMPTY), dbManager); + actuator.validate(); + actuator.execute(ret); + fail("Invalidate url"); } catch (ContractValidateException e) { Assert.assertTrue(e instanceof ContractValidateException); + Assert.assertEquals("Invalidate url", e.getMessage()); + } catch (ContractExeException e) { + Assert.assertFalse(e instanceof ContractExeException); + } - Assert.assertEquals("Invalidate address", e.getMessage()); + //256 bytes + String url256Bytes = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; + //Url length can not greater than 256 + try { + WitnessCreateActuator actuator = new WitnessCreateActuator( + getContract(OWNER_ADDRESS_FRIST, ByteString.copyFromUtf8(url256Bytes + "0")), dbManager); + actuator.validate(); + actuator.execute(ret); + fail("Invalidate url"); + } catch (ContractValidateException e) { + Assert.assertTrue(e instanceof ContractValidateException); + Assert.assertEquals("Invalidate url", e.getMessage()); + } catch (ContractExeException e) { + Assert.assertFalse(e instanceof ContractExeException); + } + // 1 byte url is ok. + try { + WitnessCreateActuator actuator = new WitnessCreateActuator( + getContract(OWNER_ADDRESS_FRIST, "0"), dbManager); + actuator.validate(); + actuator.execute(ret); + Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); + WitnessCapsule witnessCapsule = + dbManager.getWitnessStore().get(ByteArray.fromHexString(OWNER_ADDRESS_FRIST)); + Assert.assertNotNull(witnessCapsule); + Assert.assertEquals(witnessCapsule.getInstance().getUrl(), "0"); + Assert.assertTrue(true); + } catch (ContractValidateException e) { + Assert.assertFalse(e instanceof ContractValidateException); } catch (ContractExeException e) { Assert.assertFalse(e instanceof ContractExeException); } + dbManager.getWitnessStore().delete(ByteArray.fromHexString(OWNER_ADDRESS_FRIST)); + // 256 bytes url is ok. + try { + WitnessCreateActuator actuator = new WitnessCreateActuator( + getContract(OWNER_ADDRESS_FRIST, url256Bytes), dbManager); + actuator.validate(); + actuator.execute(ret); + Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); + WitnessCapsule witnessCapsule = + dbManager.getWitnessStore().get(ByteArray.fromHexString(OWNER_ADDRESS_FRIST)); + Assert.assertNotNull(witnessCapsule); + Assert.assertEquals(witnessCapsule.getInstance().getUrl(), url256Bytes); + Assert.assertTrue(true); + } catch (ContractValidateException e) { + Assert.assertFalse(e instanceof ContractValidateException); + } catch (ContractExeException e) { + Assert.assertFalse(e instanceof ContractExeException); + } } /** @@ -189,7 +266,6 @@ public void noAccount() { actuator.validate(); actuator.execute(ret); fail("account[+OWNER_ADDRESS_NOACCOUNT+] not exists"); - } catch (ContractValidateException e) { Assert.assertTrue(e instanceof ContractValidateException); Assert.assertEquals("account[" + OWNER_ADDRESS_NOACCOUNT + "] not exists", e.getMessage()); @@ -202,7 +278,7 @@ public void noAccount() { /** * use Account ,result is failed,exception is "account not exists". */ -// @Test + @Test public void balanceNotSufficient() { AccountCapsule balanceNotSufficientCapsule = new AccountCapsule( @@ -221,11 +297,9 @@ public void balanceNotSufficient() { actuator.execute(ret); fail("witnessAccount has balance[" + balanceNotSufficientCapsule.getBalance() + "] < MIN_BALANCE[100]"); - } catch (ContractValidateException e) { Assert.assertTrue(e instanceof ContractValidateException); - Assert.assertEquals("witnessAccount has balance[" + balanceNotSufficientCapsule.getBalance() - + "] < MIN_BALANCE[100]", e.getMessage()); + Assert.assertEquals("balance < AccountUpgradeCost", e.getMessage()); } catch (ContractExeException e) { Assert.assertFalse(e instanceof ContractExeException); } From 10198bbccebe961edf07a73626f1beb7b1233e4e Mon Sep 17 00:00:00 2001 From: zergweak Date: Wed, 9 May 2018 21:59:35 +0800 Subject: [PATCH 08/25] modify addressValid validAccountName validUrl --- src/main/java/org/tron/common/utils/ByteUtil.java | 4 ---- src/main/java/org/tron/core/Wallet.java | 4 ++-- .../java/org/tron/core/capsule/utils/TransactionUtil.java | 6 +++--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ByteUtil.java b/src/main/java/org/tron/common/utils/ByteUtil.java index 54409846778..255ecf85c1f 100644 --- a/src/main/java/org/tron/common/utils/ByteUtil.java +++ b/src/main/java/org/tron/common/utils/ByteUtil.java @@ -155,10 +155,6 @@ public static int byteArrayToInt(byte[] b) { return new BigInteger(1, b).intValue(); } - public static boolean isNullOrZeroArray(byte[] array) { - return (array == null) || (array.length == 0); - } - public static boolean isSingleZero(byte[] array) { return (array.length == 1 && array[0] == 0); } diff --git a/src/main/java/org/tron/core/Wallet.java b/src/main/java/org/tron/core/Wallet.java index be38e5cfcdc..f45b43c0e2b 100755 --- a/src/main/java/org/tron/core/Wallet.java +++ b/src/main/java/org/tron/core/Wallet.java @@ -23,6 +23,7 @@ import java.util.Objects; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -38,7 +39,6 @@ import org.tron.common.overlay.message.Message; import org.tron.common.utils.Base58; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Utils; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; @@ -112,7 +112,7 @@ public static void setAddressPreFixByte(byte addressPreFixByte) { } public static boolean addressValid(byte[] address) { - if (ByteUtil.isNullOrZeroArray(address)) { + if (ArrayUtils.isEmpty(address)) { logger.warn("Warning: Address is empty !!"); return false; } diff --git a/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java b/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java index 88f2a08fb43..5f6a903ed82 100644 --- a/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java +++ b/src/main/java/org/tron/core/capsule/utils/TransactionUtil.java @@ -17,7 +17,7 @@ import com.google.protobuf.ByteString; import lombok.extern.slf4j.Slf4j; -import org.tron.common.utils.ByteUtil; +import org.apache.commons.lang3.ArrayUtils; import org.tron.core.Wallet; import org.tron.core.capsule.TransactionCapsule; import org.tron.protos.Contract.TransferContract; @@ -51,7 +51,7 @@ private static boolean checkBalance(long totalBalance, long totalSpent) { } public static boolean validAccountName(byte[] accountName) { - if (ByteUtil.isNullOrZeroArray(accountName)) { + if (ArrayUtils.isEmpty(accountName)) { return false; } if (accountName.length > 32) { @@ -70,7 +70,7 @@ public static boolean validAccountName(byte[] accountName) { } public static boolean validUrl(byte[] url) { - if (ByteUtil.isNullOrZeroArray(url)) { + if (ArrayUtils.isEmpty(url)) { return false; } if (url.length > 256) { From adfe1b7c239489eb99761d25cfdea5572b4f4e75 Mon Sep 17 00:00:00 2001 From: sean-liu55 Date: Thu, 10 May 2018 11:03:22 +0800 Subject: [PATCH 09/25] revert config --- src/main/resources/config.conf | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/resources/config.conf b/src/main/resources/config.conf index d529301a5ac..2130bf066b2 100644 --- a/src/main/resources/config.conf +++ b/src/main/resources/config.conf @@ -108,57 +108,57 @@ genesis.block = { { address: 27cEZa99jVaDkujPwzZuHYgkYNqv6zzYLSP url = "http://Mercury.org", - voteCount = 0 + voteCount = 105 }, { address: 27anh4TDZJGYpsn4BjXzb7uEArNALxwiZZW url = "http://Venus.org", - voteCount = 0 + voteCount = 104 }, { address: 27Wkfa5iEJtsKAKdDzSmF1b2gDm5s49kvdZ url = "http://Earth.org", - voteCount = 0 + voteCount = 103 }, { address: 27bqKYX9Bgv7dgTY7xBw5SUHZ8EGaPSikjx url = "http://Mars.org", - voteCount = 0 + voteCount = 102 }, { address: 27fASUY6qKtsaAEPz6QxhZac2KYVz2ZRTXW url = "http://Jupiter.org", - voteCount = 0 + voteCount = 101 }, { address: 27Q3RSbiqm59VXcF8shQWHKbyztfso5FwvP url = "http://Saturn.org", - voteCount = 0 + voteCount = 100 }, { address: 27YkUVSuvCK3K84DbnFnxYUxozpi793PTqZ url = "http://Uranus.org", - voteCount = 0 + voteCount = 99 }, { address: 27kdTBTDJ16hK3Xqr8PpCuQJmje1b94CDJU url = "http://Neptune.org", - voteCount = 0 + voteCount = 98 }, { address: 27mw9UpRy7inTMQ5kUzsdTc2QZ6KvtCX4uB url = "http://Pluto.org", - voteCount = 0 + voteCount = 97 }, { address: 27QzC4PeQZJ2kFMUXiCo4S8dx3VWN5U9xcg url = "http://Altair.org", - voteCount = 0 + voteCount = 96 }, { address: 27VZHn9PFZwNh7o2EporxmLkpe157iWZVkh url = "http://AlphaLyrae.org", - voteCount = 0 + voteCount = 95 } ] From 4784f694054d3fce2c37d55f1bc6e23b6bd00787 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 10 May 2018 11:06:25 +0800 Subject: [PATCH 10/25] add trxs msg --- .../tron/common/overlay/message/Message.java | 28 ++++----- .../core/net/message/TransactionsMessage.java | 60 ++++++------------- .../java/org/tron/core/net/node/NodeImpl.java | 2 - src/main/protos/core/Tron.proto | 4 ++ 4 files changed, 36 insertions(+), 58 deletions(-) diff --git a/src/main/java/org/tron/common/overlay/message/Message.java b/src/main/java/org/tron/common/overlay/message/Message.java index e3a6b50ae55..b1417ad4fa5 100644 --- a/src/main/java/org/tron/common/overlay/message/Message.java +++ b/src/main/java/org/tron/common/overlay/message/Message.java @@ -9,11 +9,8 @@ import org.tron.common.utils.Sha256Hash; import org.tron.core.net.message.MessageTypes; - public abstract class Message { - protected static final Logger logger = LoggerFactory.getLogger("Net"); - protected boolean unpacked; protected byte[] data; protected byte type; @@ -32,7 +29,6 @@ public Message(byte type, byte[] packed) { unpacked = false; } - public ByteBuf getSendData(){ return Unpooled.wrappedBuffer(ArrayUtils.add(this.getData(), 0 ,type)); } @@ -41,13 +37,25 @@ public Sha256Hash getMessageId() { return Sha256Hash.of(getData()); } - public abstract byte[] getData(); + public byte[] getData(){ + return this.data; + } + + public MessageTypes getType(){ + return MessageTypes.fromByte(this.type); + } + public abstract Class getAnswerMessage(); + + @Override public String toString() { return "[Message Type: " + getType() + ", Message Hash: " + getMessageId() + "]"; } - public abstract Class getAnswerMessage(); + @Override + public int hashCode() { + return Arrays.hashCode(data); + } @Override public boolean equals(Object o) { @@ -60,12 +68,4 @@ public boolean equals(Object o) { Message message = (Message) o; return Arrays.equals(data, message.data); } - - @Override - public int hashCode() { - return Arrays.hashCode(data); - } - - public abstract MessageTypes getType(); - } \ No newline at end of file diff --git a/src/main/java/org/tron/core/net/message/TransactionsMessage.java b/src/main/java/org/tron/core/net/message/TransactionsMessage.java index 690b7de9dba..947608f77b9 100644 --- a/src/main/java/org/tron/core/net/message/TransactionsMessage.java +++ b/src/main/java/org/tron/core/net/message/TransactionsMessage.java @@ -1,35 +1,39 @@ package org.tron.core.net.message; -import com.google.protobuf.InvalidProtocolBufferException; -import java.util.ArrayList; import java.util.List; -import org.tron.protos.Protocol.Items; + +import org.tron.core.exception.P2pException; +import org.tron.protos.Protocol; import org.tron.protos.Protocol.Transaction; public class TransactionsMessage extends TronMessage { - private List trxs = new ArrayList(); + private Protocol.Transactions transactions; public TransactionsMessage(List trxs) { - this.trxs = trxs; - unpacked = true; + Protocol.Transactions.Builder builder = Protocol.Transactions.newBuilder(); + trxs.forEach(trx -> builder.addTransactions(trx)); + this.transactions = builder.build(); this.type = MessageTypes.TRXS.asByte(); + this.data = this.transactions.toByteArray(); } - public TransactionsMessage(byte[] packed) { - super(packed); - this.type = MessageTypes.TRXS.asByte(); + public TransactionsMessage(byte[] data) throws Exception{ + try { + this.type = MessageTypes.TRXS.asByte(); + this.data = data; + this.transactions = Protocol.Transactions.parseFrom(data); + }catch (Exception e){ + throw new P2pException(P2pException.TypeEnum.PARSE_MESSAGE_FAILED); + } } - public TransactionsMessage() { - this.type = MessageTypes.TRXS.asByte(); + public Protocol.Transactions getTransactions() { + return transactions; } @Override public byte[] getData() { - if (data == null) { - pack(); - } return data; } @@ -47,32 +51,4 @@ public Class getAnswerMessage() { public MessageTypes getType() { return MessageTypes.fromByte(this.type); } - - public List getTransactions() { - unPack(); - return trxs; - } - - private void pack() { - Items.Builder itemsBuilder = Items.newBuilder(); - itemsBuilder.setType(Items.ItemType.TRX); - itemsBuilder.addAllTransactions(this.trxs); - this.data = itemsBuilder.build().toByteArray(); - } - - private synchronized void unPack() { - if (unpacked) { - return; - } - try { - Items items = Items.parseFrom(data); - if (items.getType() == Items.ItemType.TRX) { - trxs = items.getTransactionsList(); - } - } catch (InvalidProtocolBufferException e) { - logger.debug(e.getMessage()); - } - - unpacked = true; - } } diff --git a/src/main/java/org/tron/core/net/node/NodeImpl.java b/src/main/java/org/tron/core/net/node/NodeImpl.java index 9162af06788..4090dabfc35 100644 --- a/src/main/java/org/tron/core/net/node/NodeImpl.java +++ b/src/main/java/org/tron/core/net/node/NodeImpl.java @@ -118,8 +118,6 @@ void sendFetch() { } } - - private ScheduledExecutorService logExecutor = Executors.newSingleThreadScheduledExecutor(); //public diff --git a/src/main/protos/core/Tron.proto b/src/main/protos/core/Tron.proto index 3f032cb7339..2fe64478dbf 100644 --- a/src/main/protos/core/Tron.proto +++ b/src/main/protos/core/Tron.proto @@ -166,6 +166,10 @@ message Transaction { repeated Result ret = 5; } +message Transactions { + repeated Transaction transactions = 1; +} + message BlockHeader { message raw { int64 timestamp = 1; From 7d7781244aa70f5070e6d9226715e5ecca9af9f6 Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Thu, 10 May 2018 11:11:12 +0800 Subject: [PATCH 11/25] add the disconnect notice --- .../java/org/tron/common/overlay/server/ChannelManager.java | 1 + src/main/java/org/tron/common/overlay/server/SyncPool.java | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/org/tron/common/overlay/server/ChannelManager.java b/src/main/java/org/tron/common/overlay/server/ChannelManager.java index 6ee3b78f323..fc741f5d356 100644 --- a/src/main/java/org/tron/common/overlay/server/ChannelManager.java +++ b/src/main/java/org/tron/common/overlay/server/ChannelManager.java @@ -150,6 +150,7 @@ public void notifyDisconnect(Channel channel) { || channel.getChannelHandlerContext().channel() == null) { return; } + channel.getNodeStatistics().nodeDisconnectedLocal(ReasonCode.UNKNOWN); InetSocketAddress socketAddress = (InetSocketAddress) channel.getChannelHandlerContext() .channel().remoteAddress(); recentlyDisconnected.put(socketAddress.getAddress(), new Date()); diff --git a/src/main/java/org/tron/common/overlay/server/SyncPool.java b/src/main/java/org/tron/common/overlay/server/SyncPool.java index b074138e854..404ad071fdd 100644 --- a/src/main/java/org/tron/common/overlay/server/SyncPool.java +++ b/src/main/java/org/tron/common/overlay/server/SyncPool.java @@ -206,10 +206,6 @@ public boolean test(NodeHandler handler) { if (handler.getNodeStatistics().getReputation() < 100) { return false; } - - if (handler.getNodeStatistics().isPenalized()) { - return false; - } return true; } From be9415795f81a20fbfa887df553eebcbf1263685 Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Thu, 10 May 2018 11:27:07 +0800 Subject: [PATCH 12/25] modify the score compute way --- .../java/org/tron/common/overlay/discover/NodeStatistics.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java index ca2cfbb384a..884491f686e 100644 --- a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java +++ b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java @@ -117,7 +117,9 @@ private int getSessionFairReputation() { } } } - int score = discoverReput + 10 * reput - disconnectTimes * 20; + int score = + discoverReput + 10 * reput - (int) Math.pow(2, disconnectTimes) * (disconnectTimes > 0 ? 10 + : 0); return score > 0 ? score : 0; } From ed1ad2de4e43a17d05016e49a6fc5239812a5a70 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 10 May 2018 12:07:20 +0800 Subject: [PATCH 13/25] add trx msg handle --- .../tron/common/overlay/message/Message.java | 2 + .../java/org/tron/core/net/node/NodeImpl.java | 59 +++++++++++++------ 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/tron/common/overlay/message/Message.java b/src/main/java/org/tron/common/overlay/message/Message.java index b1417ad4fa5..33c20bad39e 100644 --- a/src/main/java/org/tron/common/overlay/message/Message.java +++ b/src/main/java/org/tron/common/overlay/message/Message.java @@ -11,6 +11,8 @@ public abstract class Message { + protected static final Logger logger = LoggerFactory.getLogger("Message"); + protected boolean unpacked; protected byte[] data; protected byte type; diff --git a/src/main/java/org/tron/core/net/node/NodeImpl.java b/src/main/java/org/tron/core/net/node/NodeImpl.java index 4090dabfc35..263113bd0a4 100644 --- a/src/main/java/org/tron/core/net/node/NodeImpl.java +++ b/src/main/java/org/tron/core/net/node/NodeImpl.java @@ -8,6 +8,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import io.netty.util.internal.ConcurrentSet; import java.util.*; @@ -40,24 +41,17 @@ import org.tron.core.config.Parameter.ChainConstant; import org.tron.core.config.Parameter.NetConstants; import org.tron.core.config.Parameter.NodeConstant; +import org.tron.core.db.api.pojo.Transaction; import org.tron.core.exception.BadBlockException; import org.tron.core.exception.BadTransactionException; import org.tron.core.exception.StoreException; import org.tron.core.exception.TraitorPeerException; import org.tron.core.exception.TronException; import org.tron.core.exception.UnLinkedBlockException; -import org.tron.core.net.message.BlockInventoryMessage; -import org.tron.core.net.message.BlockMessage; -import org.tron.core.net.message.ChainInventoryMessage; -import org.tron.core.net.message.FetchInvDataMessage; -import org.tron.core.net.message.InventoryMessage; -import org.tron.core.net.message.ItemNotFound; -import org.tron.core.net.message.MessageTypes; -import org.tron.core.net.message.SyncBlockChainMessage; -import org.tron.core.net.message.TransactionMessage; -import org.tron.core.net.message.TronMessage; +import org.tron.core.net.message.*; import org.tron.core.net.peer.PeerConnection; import org.tron.core.net.peer.PeerConnectionDelegate; +import org.tron.protos.Protocol; import org.tron.protos.Protocol.Inventory.InventoryType; @Slf4j @@ -67,14 +61,18 @@ public class NodeImpl extends PeerConnectionDelegate implements Node { @Autowired private SyncPool pool; - Cache TrxCache = CacheBuilder.newBuilder() + private Cache TrxCache = CacheBuilder.newBuilder() .maximumSize(10000).expireAfterWrite(600, TimeUnit.SECONDS) .recordStats().build(); - Cache BlockCache = CacheBuilder.newBuilder() + private Cache BlockCache = CacheBuilder.newBuilder() .maximumSize(10).expireAfterWrite(60, TimeUnit.SECONDS) .recordStats().build(); + private int maxTrxsSize = 1_000_000; + + private int maxTrxsCnt = 100; + class InvToSend { private HashMap>> send @@ -211,6 +209,8 @@ public void onMessage(PeerConnection peer, TronMessage msg) { break; case TRX: onHandleTransactionMessage(peer, (TransactionMessage) msg); + case TRXS: + onHandleTransactionsMessage(peer, (TransactionsMessage) msg); break; case SYNC_BLOCK_CHAIN: onHandleSyncBlockChainMessage(peer, (SyncBlockChainMessage) msg); @@ -766,6 +766,13 @@ private void onHandleTransactionMessage(PeerConnection peer, TransactionMessage } } + private void onHandleTransactionsMessage(PeerConnection peer, TransactionsMessage msg){ + logger.info("onHandleTransactionsMessage, size = {}, peer {}", + msg.getTransactions().getTransactionsList().size(), peer.getNode().getHost()); + msg.getTransactions().getTransactionsList().forEach(transaction -> + onHandleTransactionMessage(peer, new TransactionMessage(transaction))); + } + private void onHandleSyncBlockChainMessage(PeerConnection peer, SyncBlockChainMessage syncMsg) { //logger.info("on handle sync block chain message"); peer.setTronState(TronState.SYNCING); @@ -816,6 +823,10 @@ private void onHandleFetchDataMessage(PeerConnection peer, FetchInvDataMessage f BlockCapsule block = null; + List transactions = Lists.newArrayList(); + + int size = 0; + for (Sha256Hash hash : fetchInvDataMsg.getHashList()) { Message msg; @@ -830,20 +841,32 @@ private void onHandleFetchDataMessage(PeerConnection peer, FetchInvDataMessage f msg = del.getData(hash, type); } - if (msg != null) { - if (type.equals(MessageTypes.BLOCK)) { - block = ((BlockMessage) msg).getBlockCapsule(); - } - peer.sendMessage(msg); - } else { + if (msg == null){ logger.error("fetch message {} {} failed.", type, hash); peer.sendMessage(new ItemNotFound()); + return; + } + + if (type.equals(MessageTypes.BLOCK)) { + block = ((BlockMessage) msg).getBlockCapsule(); + peer.sendMessage(msg); + }else { + transactions.add(((TransactionMessage)msg).getTransaction()); + size += ((TransactionMessage)msg).getTransaction().getSerializedSize(); + if (transactions.size() % maxTrxsCnt == 0 || size > maxTrxsSize) { + peer.sendMessage(new TransactionsMessage(transactions)); + transactions = Lists.newArrayList(); + size = 0; + } } } if (block != null) { updateBlockWeBothHave(peer, block); } + if (transactions.size() > 0){ + peer.sendMessage(new TransactionsMessage(transactions)); + } } private void banTraitorPeer(PeerConnection peer, ReasonCode reason) { From c865d723f396be810b029bfeadff7cc568ca9a33 Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Thu, 10 May 2018 12:09:51 +0800 Subject: [PATCH 14/25] modify the disconnect times count way --- .../org/tron/common/overlay/discover/NodeStatistics.java | 6 ++++-- .../java/org/tron/common/overlay/server/ChannelManager.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java index 884491f686e..294003c7aae 100644 --- a/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java +++ b/src/main/java/org/tron/common/overlay/discover/NodeStatistics.java @@ -195,13 +195,15 @@ public boolean isPenalized() { public void nodeDisconnectedRemote(ReasonCode reason) { lastDisconnectedTime = System.currentTimeMillis(); tronLastRemoteDisconnectReason = reason; - disconnectTimes++; - persistedReputation = persistedReputation / 2; } public void nodeDisconnectedLocal(ReasonCode reason) { lastDisconnectedTime = System.currentTimeMillis(); tronLastLocalDisconnectReason = reason; + } + + public void notifyDisconnect() { + lastDisconnectedTime = System.currentTimeMillis(); disconnectTimes++; persistedReputation = persistedReputation / 2; } diff --git a/src/main/java/org/tron/common/overlay/server/ChannelManager.java b/src/main/java/org/tron/common/overlay/server/ChannelManager.java index fc741f5d356..04805421cc9 100644 --- a/src/main/java/org/tron/common/overlay/server/ChannelManager.java +++ b/src/main/java/org/tron/common/overlay/server/ChannelManager.java @@ -150,7 +150,7 @@ public void notifyDisconnect(Channel channel) { || channel.getChannelHandlerContext().channel() == null) { return; } - channel.getNodeStatistics().nodeDisconnectedLocal(ReasonCode.UNKNOWN); + channel.getNodeStatistics().notifyDisconnect(); InetSocketAddress socketAddress = (InetSocketAddress) channel.getChannelHandlerContext() .channel().remoteAddress(); recentlyDisconnected.put(socketAddress.getAddress(), new Date()); From 03d3e3c290774069364bd1e72c28ccb10fa7a091 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 10 May 2018 12:29:52 +0800 Subject: [PATCH 15/25] mdf TransactionsMessage --- .../tron/core/net/message/TransactionsMessage.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/org/tron/core/net/message/TransactionsMessage.java b/src/main/java/org/tron/core/net/message/TransactionsMessage.java index 947608f77b9..9ea8aac50ad 100644 --- a/src/main/java/org/tron/core/net/message/TransactionsMessage.java +++ b/src/main/java/org/tron/core/net/message/TransactionsMessage.java @@ -32,14 +32,9 @@ public Protocol.Transactions getTransactions() { return transactions; } - @Override - public byte[] getData() { - return data; - } - @Override public String toString() { - return null; + return "trx_size:" + this.transactions.getTransactionsList().size(); } @Override @@ -47,8 +42,4 @@ public Class getAnswerMessage() { return null; } - @Override - public MessageTypes getType() { - return MessageTypes.fromByte(this.type); - } } From c178db41ee82fa46ff9801a2b4d7a06034675536 Mon Sep 17 00:00:00 2001 From: sean-liu55 Date: Thu, 10 May 2018 14:33:15 +0800 Subject: [PATCH 16/25] fix createTime error --- .../java/org/tron/core/actuator/TransferActuator.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/tron/core/actuator/TransferActuator.java b/src/main/java/org/tron/core/actuator/TransferActuator.java index f79351f02e3..3ebefb9d5f4 100755 --- a/src/main/java/org/tron/core/actuator/TransferActuator.java +++ b/src/main/java/org/tron/core/actuator/TransferActuator.java @@ -44,6 +44,14 @@ public boolean execute(TransactionResultCapsule ret) throws ContractExeException long fee = calcFee(); try { + // if account with to_address is not existed, create it. + AccountCapsule toAccount = dbManager.getAccountStore() + .get(transferContract.getToAddress().toByteArray()); + if (toAccount == null) { + toAccount = new AccountCapsule(ByteString.copyFrom(toAddress), AccountType.Normal, + dbManager.getHeadBlockTimeStamp()); + dbManager.getAccountStore().put(toAddress, toAccount); + } dbManager.adjustBalance(transferContract.getOwnerAddress().toByteArray(), -calcFee()); ret.setStatus(fee, code.SUCESS); dbManager.adjustBalance(transferContract.getOwnerAddress().toByteArray(), @@ -113,9 +121,6 @@ public boolean validate() throws ContractValidateException { throw new ContractValidateException( "For a non-existent account transfer, the minimum amount is 1 TRX"); } - toAccount = new AccountCapsule(ByteString.copyFrom(toAddress), AccountType.Normal, - dbManager.getHeadBlockTimeStamp()); - dbManager.getAccountStore().put(toAddress, toAccount); } else { //check to account balance if overflow balance = Math.addExact(toAccount.getBalance(), amount); From 1e21b3fecd9e1bd5ad36bad0fbaf7b15a61465f6 Mon Sep 17 00:00:00 2001 From: sean-liu55 Date: Thu, 10 May 2018 14:44:58 +0800 Subject: [PATCH 17/25] fix test conflict --- src/test/java/org/tron/core/actuator/TransferActuatorTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/org/tron/core/actuator/TransferActuatorTest.java b/src/test/java/org/tron/core/actuator/TransferActuatorTest.java index 16761c70eb0..b88d3aabd9d 100755 --- a/src/test/java/org/tron/core/actuator/TransferActuatorTest.java +++ b/src/test/java/org/tron/core/actuator/TransferActuatorTest.java @@ -311,11 +311,10 @@ public void noExitToAccount() { .get(ByteArray.fromHexString(To_ACCOUNT_INVALIATE)); Assert.assertTrue(null == noExitAccount); actuator.validate(); + actuator.execute(ret); noExitAccount = dbManager.getAccountStore() .get(ByteArray.fromHexString(To_ACCOUNT_INVALIATE)); Assert.assertFalse(null == noExitAccount); //Had created. - Assert.assertEquals(noExitAccount.getBalance(), 0); - actuator.execute(ret); AccountCapsule owner = dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)); AccountCapsule toAccount = dbManager.getAccountStore() From 617aa845ec592e3a1ad6d59ed95bb80131abd48d Mon Sep 17 00:00:00 2001 From: liangzhiyan Date: Thu, 10 May 2018 14:51:25 +0800 Subject: [PATCH 18/25] fix count disconnect times --- src/main/java/org/tron/common/overlay/client/PeerClient.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/tron/common/overlay/client/PeerClient.java b/src/main/java/org/tron/common/overlay/client/PeerClient.java index ad9e5578c67..ef9d9400729 100644 --- a/src/main/java/org/tron/common/overlay/client/PeerClient.java +++ b/src/main/java/org/tron/common/overlay/client/PeerClient.java @@ -64,6 +64,7 @@ public ChannelFuture connectAsync(NodeHandler nodeHandler, boolean discoveryMode logger.error("connect to {}:{} fail,cause:{}", node.getHost(), node.getPort(), future.cause().getMessage()); nodeHandler.getNodeStatistics().nodeDisconnectedLocal(ReasonCode.CONNECT_FAIL); + nodeHandler.getNodeStatistics().notifyDisconnect(); future.channel().close(); } }); From 227e894fec2ee09b768c804a8d6484ccdd8c546b Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 10 May 2018 14:54:15 +0800 Subject: [PATCH 19/25] mdf tron msg --- .../tron/common/overlay/message/MessageFactory.java | 3 --- .../org/tron/core/net/message/TransactionsMessage.java | 10 +++------- .../org/tron/core/net/message/TronMessageFactory.java | 2 +- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/tron/common/overlay/message/MessageFactory.java b/src/main/java/org/tron/common/overlay/message/MessageFactory.java index 431d227ce65..bb02f375980 100644 --- a/src/main/java/org/tron/common/overlay/message/MessageFactory.java +++ b/src/main/java/org/tron/common/overlay/message/MessageFactory.java @@ -16,9 +16,6 @@ public abstract class MessageFactory { - public static String ERR_NO_SUCH_MSG = "No such message"; - public static String ERR_PARSE_FAILED = "parse message failed"; - protected abstract Message create(byte[] data) throws Exception; } diff --git a/src/main/java/org/tron/core/net/message/TransactionsMessage.java b/src/main/java/org/tron/core/net/message/TransactionsMessage.java index 9ea8aac50ad..5e7417c9fb4 100644 --- a/src/main/java/org/tron/core/net/message/TransactionsMessage.java +++ b/src/main/java/org/tron/core/net/message/TransactionsMessage.java @@ -19,13 +19,9 @@ public TransactionsMessage(List trxs) { } public TransactionsMessage(byte[] data) throws Exception{ - try { - this.type = MessageTypes.TRXS.asByte(); - this.data = data; - this.transactions = Protocol.Transactions.parseFrom(data); - }catch (Exception e){ - throw new P2pException(P2pException.TypeEnum.PARSE_MESSAGE_FAILED); - } + this.type = MessageTypes.TRXS.asByte(); + this.data = data; + this.transactions = Protocol.Transactions.parseFrom(data); } public Protocol.Transactions getTransactions() { diff --git a/src/main/java/org/tron/core/net/message/TronMessageFactory.java b/src/main/java/org/tron/core/net/message/TronMessageFactory.java index 38bf1737f59..4d9aba5ec80 100644 --- a/src/main/java/org/tron/core/net/message/TronMessageFactory.java +++ b/src/main/java/org/tron/core/net/message/TronMessageFactory.java @@ -27,7 +27,7 @@ public TronMessage create(byte[] data) throws Exception{ private TronMessage create(byte type, byte[] packed) throws Exception{ MessageTypes receivedTypes = MessageTypes.fromByte(type); if (receivedTypes == null){ - throw new RuntimeException(MessageFactory.ERR_NO_SUCH_MSG + ", type=" + type); + throw new P2pException(P2pException.TypeEnum.NO_SUCH_MESSAGE, "type=" + type); } switch (receivedTypes) { case TRX: From 0c926e51e52d9be547cb699dcbd63dc9da14ccd5 Mon Sep 17 00:00:00 2001 From: nanfengpo Date: Thu, 10 May 2018 15:48:26 +0800 Subject: [PATCH 20/25] modify_transfer_asset_bandwidth --- .../core/actuator/TransferAssetActuator.java | 6 ++-- src/main/java/org/tron/core/db/Manager.java | 34 ++++++++++++++++--- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/tron/core/actuator/TransferAssetActuator.java b/src/main/java/org/tron/core/actuator/TransferAssetActuator.java index fb89f6d09d1..bc67702fb3d 100644 --- a/src/main/java/org/tron/core/actuator/TransferAssetActuator.java +++ b/src/main/java/org/tron/core/actuator/TransferAssetActuator.java @@ -54,17 +54,17 @@ public boolean execute(TransactionResultCapsule ret) throws ContractExeException AccountStore accountStore = this.dbManager.getAccountStore(); byte[] ownerKey = transferAssetContract.getOwnerAddress().toByteArray(); byte[] toKey = transferAssetContract.getToAddress().toByteArray(); - ByteString assertName = transferAssetContract.getAssetName(); + ByteString assetName = transferAssetContract.getAssetName(); long amount = transferAssetContract.getAmount(); AccountCapsule ownerAccountCapsule = accountStore.get(ownerKey); - if (!ownerAccountCapsule.reduceAssetAmount(assertName, amount)) { + if (!ownerAccountCapsule.reduceAssetAmount(assetName, amount)) { throw new ContractExeException("reduceAssetAmount failed !"); } accountStore.put(ownerKey, ownerAccountCapsule); AccountCapsule toAccountCapsule = accountStore.get(toKey); - toAccountCapsule.addAssetAmount(assertName, amount); + toAccountCapsule.addAssetAmount(assetName, amount); accountStore.put(toKey, toAccountCapsule); ret.setStatus(fee, code.SUCESS); diff --git a/src/main/java/org/tron/core/db/Manager.java b/src/main/java/org/tron/core/db/Manager.java index edd66853075..ec8913fad55 100644 --- a/src/main/java/org/tron/core/db/Manager.java +++ b/src/main/java/org/tron/core/db/Manager.java @@ -33,6 +33,7 @@ import org.tron.core.actuator.Actuator; import org.tron.core.actuator.ActuatorFactory; import org.tron.core.capsule.AccountCapsule; +import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.BlockCapsule.BlockId; import org.tron.core.capsule.BytesCapsule; @@ -59,6 +60,8 @@ import org.tron.core.exception.ValidateScheduleException; import org.tron.core.exception.ValidateSignatureException; import org.tron.core.witness.WitnessController; +import org.tron.protos.Contract; +import org.tron.protos.Contract.TransferAssetContract; import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Transaction; @@ -449,7 +452,7 @@ public boolean pushTransactions(final TransactionCapsule trx) } - public void consumeBandwidth(TransactionCapsule trx) throws ValidateBandwidthException { + private void consumeBandwidth(TransactionCapsule trx) throws ValidateBandwidthException { List contracts = trx.getInstance().getRawData().getContractList(); for (Transaction.Contract contract : contracts) { @@ -458,7 +461,6 @@ public void consumeBandwidth(TransactionCapsule trx) throws ValidateBandwidthExc if (accountCapsule == null) { throw new ValidateBandwidthException("account not exists"); } - long bandwidth = accountCapsule.getBandwidth(); long now = getHeadBlockTimeStamp(); long latestOperationTime = accountCapsule.getLatestOperationTime(); //10 * 1000 @@ -468,10 +470,32 @@ public void consumeBandwidth(TransactionCapsule trx) throws ValidateBandwidthExc return; } long bandwidthPerTransaction = getDynamicPropertiesStore().getBandwidthPerTransaction(); - if (bandwidth < bandwidthPerTransaction) { - throw new ValidateBandwidthException("bandwidth is not enough"); + long bandwidth; + if (contract.getType() == TransferAssetContract) { + AccountCapsule issuerAccountCapsule; + try { + ByteString assetName + = contract.getParameter().unpack(TransferAssetContract.class).getAssetName(); + AssetIssueCapsule assetIssueCapsule + = this.getAssetIssueStore().get(assetName.toByteArray()); + issuerAccountCapsule = this.getAccountStore() + .get(assetIssueCapsule.getOwnerAddress().toByteArray()); + bandwidth = issuerAccountCapsule.getBandwidth(); + } catch (Exception ex) { + throw new ValidateBandwidthException(ex.getMessage()); + } + if (bandwidth < bandwidthPerTransaction) { + throw new ValidateBandwidthException("bandwidth is not enough"); + } + issuerAccountCapsule.setBandwidth(bandwidth - bandwidthPerTransaction); + this.getAccountStore().put(issuerAccountCapsule.createDbKey(), issuerAccountCapsule); + } else { + bandwidth = accountCapsule.getBandwidth(); + if (bandwidth < bandwidthPerTransaction) { + throw new ValidateBandwidthException("bandwidth is not enough"); + } + accountCapsule.setBandwidth(bandwidth - bandwidthPerTransaction); } - accountCapsule.setBandwidth(bandwidth - bandwidthPerTransaction); accountCapsule.setLatestOperationTime(now); this.getAccountStore().put(accountCapsule.createDbKey(), accountCapsule); } From 1ebb7e8f6ab56de9d28645e77dd2d8ee29d158cb Mon Sep 17 00:00:00 2001 From: nanfengpo Date: Thu, 10 May 2018 15:49:22 +0800 Subject: [PATCH 21/25] modify_transfer_asset_bandwidth --- src/main/java/org/tron/core/db/Manager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/tron/core/db/Manager.java b/src/main/java/org/tron/core/db/Manager.java index ec8913fad55..93325faa083 100644 --- a/src/main/java/org/tron/core/db/Manager.java +++ b/src/main/java/org/tron/core/db/Manager.java @@ -60,7 +60,6 @@ import org.tron.core.exception.ValidateScheduleException; import org.tron.core.exception.ValidateSignatureException; import org.tron.core.witness.WitnessController; -import org.tron.protos.Contract; import org.tron.protos.Contract.TransferAssetContract; import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Transaction; From c1d92f2b71ce45f4ed3f541ac533bb8b4377118b Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 10 May 2018 16:08:25 +0800 Subject: [PATCH 22/25] mdf msg queue --- .../tron/common/overlay/server/MessageQueue.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/overlay/server/MessageQueue.java b/src/main/java/org/tron/common/overlay/server/MessageQueue.java index de25643a107..43b317c7d21 100644 --- a/src/main/java/org/tron/common/overlay/server/MessageQueue.java +++ b/src/main/java/org/tron/common/overlay/server/MessageQueue.java @@ -69,8 +69,11 @@ public void activate(ChannelHandlerContext ctx) { } Message msg = msgQueue.take(); ctx.writeAndFlush(msg.getSendData()).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE); + }catch (InterruptedException e){ + logger.info("Close send thread, peer {}", ctx.channel().remoteAddress()); + break; }catch (Exception e) { - logger.error("send message failed, {}, error info: {}", ctx.channel().remoteAddress(), e.getMessage()); + logger.error("Send message failed, {}, error info: {}", ctx.channel().remoteAddress(), e.getMessage()); } } }); @@ -102,6 +105,16 @@ public void close() { sendMsgFlag = false; if(sendTask != null && !sendTask.isCancelled()){ sendTask.cancel(false); + sendTask = null; + } + if (sendMsgThread != null){ + try{ + sendMsgThread.interrupt(); + sendMsgThread.join(100); + sendMsgThread = null; + }catch (Exception e){ + logger.warn("Join send thread failed, peer {}", ctx.channel().remoteAddress()); + } } } From ceeebfda147a4e95badfba420ce940dcb02a0f86 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 10 May 2018 16:17:58 +0800 Subject: [PATCH 23/25] mdf msg queue --- .../java/org/tron/common/overlay/server/MessageQueue.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/tron/common/overlay/server/MessageQueue.java b/src/main/java/org/tron/common/overlay/server/MessageQueue.java index 43b317c7d21..bcae990f558 100644 --- a/src/main/java/org/tron/common/overlay/server/MessageQueue.java +++ b/src/main/java/org/tron/common/overlay/server/MessageQueue.java @@ -26,7 +26,7 @@ public class MessageQueue { private static final Logger logger = LoggerFactory.getLogger("MessageQueue"); - private boolean sendMsgFlag = false; + private volatile boolean sendMsgFlag = false; private Thread sendMsgThread; @@ -69,9 +69,6 @@ public void activate(ChannelHandlerContext ctx) { } Message msg = msgQueue.take(); ctx.writeAndFlush(msg.getSendData()).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE); - }catch (InterruptedException e){ - logger.info("Close send thread, peer {}", ctx.channel().remoteAddress()); - break; }catch (Exception e) { logger.error("Send message failed, {}, error info: {}", ctx.channel().remoteAddress(), e.getMessage()); } @@ -109,8 +106,7 @@ public void close() { } if (sendMsgThread != null){ try{ - sendMsgThread.interrupt(); - sendMsgThread.join(100); + sendMsgThread.join(20); sendMsgThread = null; }catch (Exception e){ logger.warn("Join send thread failed, peer {}", ctx.channel().remoteAddress()); From 0e841b48c9aae6feae8f239d3b2af835d286b326 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 10 May 2018 16:37:12 +0800 Subject: [PATCH 24/25] mdf channel exception process --- src/main/java/org/tron/common/overlay/server/Channel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/overlay/server/Channel.java b/src/main/java/org/tron/common/overlay/server/Channel.java index 70f15f52a40..32b421be8cc 100644 --- a/src/main/java/org/tron/common/overlay/server/Channel.java +++ b/src/main/java/org/tron/common/overlay/server/Channel.java @@ -162,7 +162,7 @@ public void processException(Throwable throwable){ if (throwable instanceof ReadTimeoutException){ logger.error("Read timeout, {}", address); }else if(baseThrowable instanceof P2pException){ - logger.error("type: {}, info: {}, {}", ((P2pException) throwable).getType(), errMsg, address); + logger.error("type: {}, info: {}, {}", ((P2pException) baseThrowable).getType(), errMsg, address); }else if (errMsg != null && errMsg.contains("Connection reset by peer")){ logger.error("{}, {}", errMsg, address); }else { From 47f63fe774edd05faacb2c20dfc8fb495ab1e18f Mon Sep 17 00:00:00 2001 From: sean-liu55 Date: Thu, 10 May 2018 17:44:29 +0800 Subject: [PATCH 25/25] add OPERATING_TIME_INTERVAL parameter --- .../tron/core/db/DynamicPropertiesStore.java | 26 +++++++++++++++++++ src/main/java/org/tron/core/db/Manager.java | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java index de194d08cfb..6ab364438a0 100755 --- a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java +++ b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java @@ -61,6 +61,8 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking private static final byte[] NON_EXISTENT_ACCOUNT_TRANSFER_MIN = "NON_EXISTENT_ACCOUNT_TRANSFER_MIN" .getBytes(); + private static final byte[] OPERATING_TIME_INTERVAL = "OPERATING_TIME_INTERVAL".getBytes(); + @Autowired private DynamicPropertiesStore(@Qualifier("properties") String dbName) { super(dbName); @@ -172,6 +174,14 @@ private DynamicPropertiesStore(@Qualifier("properties") String dbName) { this.saveNonExistentAccountTransferLimit(1_000_000L); } + + try { + this.getOperatingTimeInterval(); + } catch (IllegalArgumentException e) { + this.saveOperatingTimeInterval(10_000L); + } + + try { this.getBlockFilledSlotsNumber(); } catch (IllegalArgumentException e) { @@ -402,6 +412,22 @@ public long getNonExistentAccountTransferMin() { () -> new IllegalArgumentException("not found NON_EXISTENT_ACCOUNT_TRANSFER_MIN")); } + + public void saveOperatingTimeInterval(long time) { + logger.debug("NON_EXISTENT_ACCOUNT_TRANSFER_MIN:" + time); + this.put(OPERATING_TIME_INTERVAL, + new BytesCapsule(ByteArray.fromLong(time))); + } + + public long getOperatingTimeInterval() { + return Optional.ofNullable(this.dbSource.getData(OPERATING_TIME_INTERVAL)) + .map(ByteArray::toLong) + .orElseThrow( + () -> new IllegalArgumentException("not found OPERATING_TIME_INTERVAL")); + } + + + public void saveBlockFilledSlots(int[] blockFilledSlots) { logger.debug("blockFilledSlots:" + intArrayToString(blockFilledSlots)); this.put(BLOCK_FILLED_SLOTS, diff --git a/src/main/java/org/tron/core/db/Manager.java b/src/main/java/org/tron/core/db/Manager.java index ebba1637dcd..f2f73df2663 100644 --- a/src/main/java/org/tron/core/db/Manager.java +++ b/src/main/java/org/tron/core/db/Manager.java @@ -467,7 +467,7 @@ private void consumeBandwidth(TransactionCapsule trx) throws ValidateBandwidthEx long now = getHeadBlockTimeStamp(); long latestOperationTime = accountCapsule.getLatestOperationTime(); //10 * 1000 - if (now - latestOperationTime >= 10_000L) { + if (now - latestOperationTime >= dynamicPropertiesStore.getOperatingTimeInterval()) { accountCapsule.setLatestOperationTime(now); this.getAccountStore().put(accountCapsule.createDbKey(), accountCapsule); return;