Skip to content

Commit 2fd5fbe

Browse files
committed
feat(net): optimize sync block chain message check logic
1 parent 2b7588c commit 2fd5fbe

File tree

3 files changed

+71
-9
lines changed

3 files changed

+71
-9
lines changed

framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ public void processMessage(PeerConnection peer, TronMessage msg) throws P2pExcep
2929

3030
SyncBlockChainMessage syncBlockChainMessage = (SyncBlockChainMessage) msg;
3131

32-
check(peer, syncBlockChainMessage);
32+
if (!check(peer, syncBlockChainMessage)) {
33+
peer.disconnect(Protocol.ReasonCode.BAD_PROTOCOL);
34+
return;
35+
}
3336

3437
long remainNum = 0;
3538

@@ -53,15 +56,17 @@ public void processMessage(PeerConnection peer, TronMessage msg) throws P2pExcep
5356
peer.sendMessage(new ChainInventoryMessage(blockIds, remainNum));
5457
}
5558

56-
private void check(PeerConnection peer, SyncBlockChainMessage msg) throws P2pException {
59+
private boolean check(PeerConnection peer, SyncBlockChainMessage msg) throws P2pException {
5760
List<BlockId> blockIds = msg.getBlockIds();
5861
if (CollectionUtils.isEmpty(blockIds)) {
5962
throw new P2pException(TypeEnum.BAD_MESSAGE, "SyncBlockChain blockIds is empty");
6063
}
6164

6265
BlockId firstId = blockIds.get(0);
6366
if (!tronNetDelegate.containBlockInMainChain(firstId)) {
64-
throw new P2pException(TypeEnum.BAD_MESSAGE, "No first block:" + firstId.getString());
67+
logger.warn("Sync message from peer {} without the first block: {}",
68+
peer.getInetSocketAddress(), firstId.getString());
69+
return false;
6570
}
6671

6772
long headNum = tronNetDelegate.getHeadBlockId().getNum();
@@ -76,6 +81,8 @@ private void check(PeerConnection peer, SyncBlockChainMessage msg) throws P2pExc
7681
throw new P2pException(TypeEnum.BAD_MESSAGE,
7782
"lastSyncNum:" + lastSyncBlockId.getNum() + " gt lastNum:" + lastNum);
7883
}
84+
85+
return true;
7986
}
8087

8188
private LinkedList<BlockId> getLostBlockIds(List<BlockId> blockIds) throws P2pException {

framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.common.collect.ImmutableList;
44
import com.google.protobuf.ByteString;
5+
import java.io.File;
56
import java.lang.reflect.Field;
67
import java.net.InetSocketAddress;
78
import java.util.List;
@@ -10,6 +11,7 @@
1011
import org.junit.Before;
1112
import org.junit.Test;
1213
import org.tron.common.application.TronApplicationContext;
14+
import org.tron.common.utils.FileUtil;
1315
import org.tron.common.utils.Sha256Hash;
1416
import org.tron.core.Constant;
1517
import org.tron.core.capsule.BlockCapsule;
@@ -26,23 +28,24 @@
2628

2729
public class BlockMsgHandlerTest {
2830

29-
protected TronApplicationContext context;
31+
private TronApplicationContext context;
3032
private BlockMsgHandler handler;
3133
private PeerConnection peer;
34+
private String dbPath = "output-block-message-handler-test";
3235

3336
/**
3437
* init context.
3538
*/
3639
@Before
3740
public void init() throws Exception {
38-
Args.setParam(new String[]{"--output-directory", "output-directory", "--debug"},
41+
Args.setParam(new String[]{"--output-directory", dbPath, "--debug"},
3942
Constant.TEST_CONF);
4043
context = new TronApplicationContext(DefaultConfig.class);
4144
handler = context.getBean(BlockMsgHandler.class);
4245
peer = context.getBean(PeerConnection.class);
4346
Channel c1 = new Channel();
4447
InetSocketAddress a1 = new InetSocketAddress("100.1.1.1", 100);
45-
Field field = c1.getClass().getDeclaredField("inetAddress");
48+
Field field = c1.getClass().getDeclaredField("inetAddress");
4649
field.setAccessible(true);
4750
field.set(c1, a1.getAddress());
4851
peer.setChannel(c1);
@@ -120,5 +123,6 @@ public void testProcessMessage() {
120123
public void destroy() {
121124
Args.clearParam();
122125
context.destroy();
126+
FileUtil.deleteDir(new File(dbPath));
123127
}
124128
}
Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,75 @@
11
package org.tron.core.net.messagehandler;
22

3+
import java.io.File;
4+
import java.lang.reflect.Field;
5+
import java.lang.reflect.Method;
6+
import java.net.InetSocketAddress;
37
import java.util.ArrayList;
8+
import java.util.List;
9+
import org.junit.After;
410
import org.junit.Assert;
11+
import org.junit.Before;
512
import org.junit.Test;
13+
import org.tron.common.application.TronApplicationContext;
14+
import org.tron.common.utils.FileUtil;
15+
import org.tron.core.Constant;
16+
import org.tron.core.capsule.BlockCapsule;
17+
import org.tron.core.config.DefaultConfig;
18+
import org.tron.core.config.args.Args;
619
import org.tron.core.exception.P2pException;
720
import org.tron.core.net.message.sync.SyncBlockChainMessage;
821
import org.tron.core.net.peer.PeerConnection;
22+
import org.tron.p2p.connection.Channel;
923

1024
public class SyncBlockChainMsgHandlerTest {
1125

12-
private SyncBlockChainMsgHandler handler = new SyncBlockChainMsgHandler();
13-
private PeerConnection peer = new PeerConnection();
26+
private TronApplicationContext context;
27+
private SyncBlockChainMsgHandler handler;
28+
private PeerConnection peer;
29+
private String dbPath = "output-sync-chain-test";
30+
31+
@Before
32+
public void init() throws Exception {
33+
Args.setParam(new String[]{"--output-directory", dbPath, "--debug"},
34+
Constant.TEST_CONF);
35+
context = new TronApplicationContext(DefaultConfig.class);
36+
handler = context.getBean(SyncBlockChainMsgHandler.class);
37+
peer = context.getBean(PeerConnection.class);
38+
Channel c1 = new Channel();
39+
InetSocketAddress a1 = new InetSocketAddress("100.1.1.1", 100);
40+
Field field = c1.getClass().getDeclaredField("inetSocketAddress");
41+
field.setAccessible(true);
42+
field.set(c1, a1);
43+
44+
field = c1.getClass().getDeclaredField("inetAddress");
45+
field.setAccessible(true);
46+
field.set(c1, a1.getAddress());
47+
48+
peer.setChannel(c1);
49+
}
1450

1551
@Test
16-
public void testProcessMessage() {
52+
public void testProcessMessage() throws Exception {
1753
try {
1854
handler.processMessage(peer, new SyncBlockChainMessage(new ArrayList<>()));
1955
} catch (P2pException e) {
2056
Assert.assertTrue(e.getMessage().equals("SyncBlockChain blockIds is empty"));
2157
}
58+
59+
List<BlockCapsule.BlockId> blockIds = new ArrayList<>();
60+
blockIds.add(new BlockCapsule.BlockId());
61+
SyncBlockChainMessage message = new SyncBlockChainMessage(blockIds);
62+
Method method = handler.getClass().getDeclaredMethod(
63+
"check", PeerConnection.class, SyncBlockChainMessage.class);
64+
method.setAccessible(true);
65+
boolean f = (boolean)method.invoke(handler, peer, message);
66+
Assert.assertTrue(!f);
67+
}
68+
69+
@After
70+
public void destroy() {
71+
Args.clearParam();
72+
FileUtil.deleteDir(new File(dbPath));
2273
}
2374

2475
}

0 commit comments

Comments
 (0)