use of org.tron.core.capsule.BlockCapsule in project java-tron by tronprotocol.
the class ManagerTest method fork.
@Test
public void fork() {
Args.setParam(new String[] { "--witness" }, Configuration.getByPath(Constant.NORMAL_CONF));
long size = dbManager.getBlockStore().dbSource.allKeys().size();
String key = "00f31db24bfbd1a2ef19beddca0a0fa37632eded9ac666a05d3bd925f01dde1f62";
byte[] privateKey = ByteArray.fromHexString(key);
final ECKey ecKey = ECKey.fromPrivate(privateKey);
byte[] address = ecKey.getAddress();
WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address));
dbManager.addWitness(witnessCapsule);
dbManager.addWitness(witnessCapsule);
dbManager.addWitness(witnessCapsule);
IntStream.range(0, 5).forEach(i -> {
try {
dbManager.generateBlock(witnessCapsule, System.currentTimeMillis(), privateKey);
} catch (ValidateSignatureException | ContractValidateException | ContractExeException | UnLinkedBlockException e) {
logger.debug(e.getMessage(), e);
}
});
try {
long num = dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber();
BlockCapsule blockCapsule1 = new BlockCapsule(num, dbManager.getHead().getParentHash().getByteString(), System.currentTimeMillis(), witnessCapsule.getAddress());
blockCapsule1.generatedByMyself = true;
BlockCapsule blockCapsule2 = new BlockCapsule(num + 1, blockCapsule1.getBlockId().getByteString(), System.currentTimeMillis(), witnessCapsule.getAddress());
blockCapsule2.generatedByMyself = true;
logger.error("******1*******" + "block1 id:" + blockCapsule1.getBlockId());
logger.error("******2*******" + "block2 id:" + blockCapsule2.getBlockId());
dbManager.pushBlock(blockCapsule1);
dbManager.pushBlock(blockCapsule2);
logger.error("******in blockStore block size:" + dbManager.getBlockStore().dbSource.allKeys().size());
logger.error("******in blockStore block:" + dbManager.getBlockStore().dbSource.allKeys().stream().map(ByteArray::toHexString).collect(Collectors.toList()));
Assert.assertNotNull(dbManager.getBlockStore().get(blockCapsule1.getBlockId().getBytes()));
Assert.assertNotNull(dbManager.getBlockStore().get(blockCapsule2.getBlockId().getBytes()));
Assert.assertEquals(dbManager.getBlockStore().get(blockCapsule2.getBlockId().getBytes()).getParentHash(), blockCapsule1.getBlockId());
Assert.assertEquals(dbManager.getBlockStore().dbSource.allKeys().size(), size + 6);
Assert.assertEquals(dbManager.getBlockIdByNum(dbManager.getHead().getNum() - 1), blockCapsule1.getBlockId());
Assert.assertEquals(dbManager.getBlockIdByNum(dbManager.getHead().getNum() - 2), blockCapsule1.getParentHash());
Assert.assertEquals(blockCapsule2.getBlockId().getByteString(), dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
Assert.assertEquals(dbManager.getHead().getBlockId().getByteString(), dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
} catch (ValidateSignatureException | ContractValidateException | ContractExeException | UnLinkedBlockException e) {
logger.debug(e.getMessage(), e);
}
dbManager.getWitnesses().clear();
}
use of org.tron.core.capsule.BlockCapsule in project java-tron by tronprotocol.
the class NodeImpl method processAdvBlock.
private void processAdvBlock(PeerConnection peer, BlockCapsule block) {
// TODO: lack the complete flow.
if (!freshBlockId.contains(block.getBlockId())) {
try {
LinkedList<Sha256Hash> trxIds = del.handleBlock(block, false);
freshBlockId.offer(block.getBlockId());
trxIds.forEach(trxId -> advObjToFetch.remove(trxId));
// TODO:save message cache again.
getActivePeer().stream().filter(p -> p.getAdvObjSpreadToUs().containsKey(block.getBlockId())).forEach(p -> {
p.setHeadBlockWeBothHave(block.getBlockId());
p.setHeadBlockTimeWeBothHave(block.getTimeStamp());
});
getActivePeer().forEach(p -> p.cleanInvGarbage());
// rebroadcast
broadcast(new BlockMessage(block));
} catch (BadBlockException e) {
badAdvObj.put(block.getBlockId(), System.currentTimeMillis());
} catch (UnLinkedBlockException e) {
// reSync
startSyncWithPeer(peer);
}
}
}
use of org.tron.core.capsule.BlockCapsule in project java-tron by tronprotocol.
the class NodeImpl method onHandleFetchDataMessage.
private void onHandleFetchDataMessage(PeerConnection peer, FetchInvDataMessage fetchInvDataMsg) {
logger.info("on handle fetch block message");
MessageTypes type = fetchInvDataMsg.getInvMessageType();
// TODO:maybe can use message cache here
final BlockCapsule[] blocks = { del.getGenesisBlock() };
// get data and send it one by one
fetchInvDataMsg.getHashList().forEach(hash -> {
if (del.contain(hash, type)) {
Message msg = del.getData(hash, type);
if (type.equals(MessageTypes.BLOCK)) {
blocks[0] = ((BlockMessage) msg).getBlockCapsule();
}
peer.sendMessage(msg);
} else {
peer.sendMessage(new ItemNotFound());
}
});
if (blocks[0] != null) {
peer.setHeadBlockWeBothHave(blocks[0].getBlockId());
peer.setHeadBlockTimeWeBothHave(blocks[0].getTimeStamp());
}
}
use of org.tron.core.capsule.BlockCapsule in project java-tron by tronprotocol.
the class BlockUtilTest method testBlockUtil.
@Test
public void testBlockUtil() {
// test create GenesisBlockCapsule
BlockCapsule blockCapsule1 = BlockUtil.newGenesisBlockCapsule();
Sha256Hash sha256Hash = Sha256Hash.wrap(ByteArray.fromHexString("0x0000000000000000000000000000000000000000000000000000000000000000"));
Assert.assertEquals(0, blockCapsule1.getTimeStamp());
Assert.assertEquals(sha256Hash, blockCapsule1.getParentHash());
Assert.assertEquals(0, blockCapsule1.getNum());
// test isParentOf method: create blockCapsule2 and blockCapsule3
// blockCapsule3.setParentHash() equals blockCapsule2.getBlockId
BlockCapsule blockCapsule2 = new BlockCapsule(Block.newBuilder().setBlockHeader(BlockHeader.newBuilder().setRawData(raw.newBuilder().setParentHash(ByteString.copyFrom(ByteArray.fromHexString("0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b81"))))).build());
BlockCapsule blockCapsule3 = new BlockCapsule(Block.newBuilder().setBlockHeader(BlockHeader.newBuilder().setRawData(raw.newBuilder().setParentHash(ByteString.copyFrom(ByteArray.fromHexString(blockCapsule2.getBlockId().toString()))))).build());
Assert.assertEquals(false, BlockUtil.isParentOf(blockCapsule1, blockCapsule2));
Assert.assertFalse(BlockUtil.isParentOf(blockCapsule1, blockCapsule2));
Assert.assertEquals(true, BlockUtil.isParentOf(blockCapsule2, blockCapsule3));
Assert.assertTrue(BlockUtil.isParentOf(blockCapsule2, blockCapsule3));
}
use of org.tron.core.capsule.BlockCapsule in project java-tron by tronprotocol.
the class KhaosDatabaseTest method testStartBlock.
@Test
public void testStartBlock() {
BlockCapsule blockCapsule = new BlockCapsule(Block.newBuilder().setBlockHeader(BlockHeader.newBuilder().setRawData(raw.newBuilder().setParentHash(ByteString.copyFrom(ByteArray.fromHexString("0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b81"))))).build());
khaosDatabase.start(blockCapsule);
Assert.assertEquals(blockCapsule, khaosDatabase.getBlock(blockCapsule.getBlockId()));
}
Aggregations