Skip to content

Commit 71e7f2c

Browse files
authored
Merge pull request #1267 from tronprotocol/add_slot_verification_for_handling_block2
Add slot verification for handling block2
2 parents cc4848b + 69f4acc commit 71e7f2c

File tree

2 files changed

+46
-15
lines changed

2 files changed

+46
-15
lines changed

src/main/java/org/tron/core/witness/WitnessController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,14 @@ public boolean validateWitnessSchedule(BlockCapsule block) {
155155
if (manager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() == 0) {
156156
return true;
157157
}
158+
long blockAbSlot = getAbSlotAtTime(block.getTimeStamp());
159+
long headBlockAbSlot = getAbSlotAtTime(
160+
manager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp());
161+
if (blockAbSlot <= headBlockAbSlot) {
162+
logger.warn("blockAbSlot is equals with headBlockAbSlot[" + blockAbSlot + "]");
163+
return false;
164+
}
165+
158166
long slot = getSlotAtTime(block.getTimeStamp());
159167
final ByteString scheduledWitness = getScheduledWitness(slot);
160168
if (!scheduledWitness.equals(witnessAddress)) {

src/test/java/org/tron/core/db/ManagerTest.java

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -227,29 +227,34 @@ public void fork()
227227
byte[] address = ecKey.getAddress();
228228
WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address));
229229
dbManager.addWitness(ByteString.copyFrom(address));
230-
dbManager.generateBlock(witnessCapsule, System.currentTimeMillis(), privateKey);
230+
dbManager.generateBlock(witnessCapsule, 1533529947843L, privateKey);
231231

232232
Map<ByteString, String> addressToProvateKeys = addTestWitnessAndAccount();
233233

234+
234235
long num = dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber();
235236
BlockCapsule blockCapsule0 =
236237
createTestBlockCapsule(
238+
1533529947843L+3000,
237239
num + 1,
238240
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(),
239241
addressToProvateKeys);
240242

241243
BlockCapsule blockCapsule1 =
242244
createTestBlockCapsule(
245+
1533529947843L+3000,
243246
num + 1,
244247
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(),
245248
addressToProvateKeys);
246249

250+
dbManager.pushBlock(blockCapsule0);
251+
dbManager.pushBlock(blockCapsule1);
252+
247253
BlockCapsule blockCapsule2 =
248254
createTestBlockCapsule(
255+
1533529947843L +6000,
249256
num + 2, blockCapsule1.getBlockId().getByteString(), addressToProvateKeys);
250257

251-
dbManager.pushBlock(blockCapsule0);
252-
dbManager.pushBlock(blockCapsule1);
253258
dbManager.pushBlock(blockCapsule2);
254259

255260
Assert.assertNotNull(dbManager.getBlockStore().get(blockCapsule1.getBlockId().getBytes()));
@@ -291,35 +296,40 @@ public void doNotSwitch()
291296
byte[] address = ecKey.getAddress();
292297
WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address));
293298
dbManager.addWitness(ByteString.copyFrom(address));
294-
dbManager.generateBlock(witnessCapsule, System.currentTimeMillis(), privateKey);
299+
dbManager.generateBlock(witnessCapsule, 1533529947843L, privateKey);
295300

296301
Map<ByteString, String> addressToProvateKeys = addTestWitnessAndAccount();
297302

298303
long num = dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber();
299304
BlockCapsule blockCapsule0 =
300305
createTestBlockCapsule(
306+
1533529947843L + 3000,
301307
num + 1,
302308
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(),
303309
addressToProvateKeys);
304310

305311
BlockCapsule blockCapsule1 =
306312
createTestBlockCapsule(
313+
1533529947843L + 3001,
307314
num + 1,
308315
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(),
309316
addressToProvateKeys);
310317

311-
BlockCapsule blockCapsule2 =
312-
createTestBlockCapsule(
313-
num + 2, blockCapsule1.getBlockId().getByteString(), addressToProvateKeys);
318+
314319

315320
logger.info("******block0:" + blockCapsule0);
316321
logger.info("******block1:" + blockCapsule1);
317-
logger.info("******block2:" + blockCapsule2);
318322

319323
dbManager.pushBlock(blockCapsule0);
320324
dbManager.pushBlock(blockCapsule1);
321325
context.getBean(KhaosDatabase.class).removeBlk(dbManager.getBlockIdByNum(num));
322326
Exception exception = null;
327+
328+
BlockCapsule blockCapsule2 =
329+
createTestBlockCapsule(
330+
1533529947843L + 6000,
331+
num + 2, blockCapsule1.getBlockId().getByteString(), addressToProvateKeys);
332+
logger.info("******block2:" + blockCapsule2);
323333
try {
324334
dbManager.pushBlock(blockCapsule2);
325335
} catch (NonCommonBlockException e) {
@@ -337,7 +347,7 @@ public void doNotSwitch()
337347
}
338348

339349
BlockCapsule blockCapsule3 =
340-
createTestBlockCapsule(
350+
createTestBlockCapsule(1533529947843L + 9000,
341351
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1,
342352
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(), addressToProvateKeys);
343353
logger.info("******block3:" + blockCapsule3);
@@ -349,7 +359,7 @@ public void doNotSwitch()
349359
dbManager.getBlockStore().get(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getBytes()).getBlockId());
350360

351361
BlockCapsule blockCapsule4 =
352-
createTestBlockCapsule(
362+
createTestBlockCapsule(1533529947843L + 12000,
353363
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1,
354364
blockCapsule3.getBlockId().getByteString(), addressToProvateKeys);
355365
logger.info("******block4:" + blockCapsule4);
@@ -378,30 +388,34 @@ public void switchBack()
378388
byte[] address = ecKey.getAddress();
379389
WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address));
380390
dbManager.addWitness(ByteString.copyFrom(address));
381-
dbManager.generateBlock(witnessCapsule, System.currentTimeMillis(), privateKey);
391+
dbManager.generateBlock(witnessCapsule, 1533529947843L, privateKey);
382392

383393
Map<ByteString, String> addressToProvateKeys = addTestWitnessAndAccount();
384394

385395
long num = dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber();
386396
BlockCapsule blockCapsule0 =
387397
createTestBlockCapsule(
398+
1533529947843L +3000,
388399
num + 1,
389400
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(),
390401
addressToProvateKeys);
391402

392403
BlockCapsule blockCapsule1 =
393404
createTestBlockCapsule(
405+
1533529947843L +3000,
394406
num + 1,
395407
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(),
396408
addressToProvateKeys);
397409

398-
BlockCapsule blockCapsule2 =
399-
createTestBlockCapsuleError(
400-
num + 2, blockCapsule1.getBlockId().getByteString(), addressToProvateKeys);
401410

402411
dbManager.pushBlock(blockCapsule0);
403412
dbManager.pushBlock(blockCapsule1);
404413
try {
414+
BlockCapsule blockCapsule2 =
415+
createTestBlockCapsuleError(
416+
1533529947843L +6000,
417+
num + 2, blockCapsule1.getBlockId().getByteString(), addressToProvateKeys);
418+
405419
dbManager.pushBlock(blockCapsule2);
406420
} catch (ValidateScheduleException e) {
407421
logger.info("the fork chain has error block");
@@ -413,6 +427,7 @@ public void switchBack()
413427

414428
BlockCapsule blockCapsule3 =
415429
createTestBlockCapsule(
430+
1533529947843L +9000,
416431
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1,
417432
blockCapsule0.getBlockId().getByteString(), addressToProvateKeys);
418433
dbManager.pushBlock(blockCapsule3);
@@ -424,6 +439,7 @@ public void switchBack()
424439

425440
BlockCapsule blockCapsule4 =
426441
createTestBlockCapsule(
442+
1533529947843L +12000,
427443
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1,
428444
blockCapsule3.getBlockId().getByteString(), addressToProvateKeys);
429445
dbManager.pushBlock(blockCapsule4);
@@ -455,10 +471,13 @@ private Map<ByteString, String> addTestWitnessAndAccount() {
455471
})
456472
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
457473
}
458-
459474
private BlockCapsule createTestBlockCapsule(
460475
long number, ByteString hash, Map<ByteString, String> addressToProvateKeys) {
461476
long time = System.currentTimeMillis();
477+
return createTestBlockCapsule(time,number,hash,addressToProvateKeys);
478+
}
479+
private BlockCapsule createTestBlockCapsule(long time ,
480+
long number, ByteString hash, Map<ByteString, String> addressToProvateKeys) {
462481
WitnessController witnessController = dbManager.getWitnessController();
463482
ByteString witnessAddress =
464483
witnessController.getScheduledWitness(witnessController.getSlotAtTime(time));
@@ -472,6 +491,10 @@ private BlockCapsule createTestBlockCapsule(
472491
private BlockCapsule createTestBlockCapsuleError(
473492
long number, ByteString hash, Map<ByteString, String> addressToProvateKeys) {
474493
long time = System.currentTimeMillis();
494+
return createTestBlockCapsuleError(time,number,hash,addressToProvateKeys);
495+
}
496+
private BlockCapsule createTestBlockCapsuleError(long time ,
497+
long number, ByteString hash, Map<ByteString, String> addressToProvateKeys) {
475498
WitnessController witnessController = dbManager.getWitnessController();
476499
ByteString witnessAddress =
477500
witnessController.getScheduledWitness(witnessController.getSlotAtTime(time));

0 commit comments

Comments
 (0)