use of io.nuls.utxo.accounts.storage.po.LocalCacheBlockBalance in project nuls by nuls-io.
the class UtxoAccountsServiceImpl method synBlock.
/**
* @param blockHeight
* @return
*/
@Override
public boolean synBlock(long blockHeight) {
Log.debug("synBlock begin===blockHeight:" + blockHeight);
Block nodeBlock = utxoAccountsStorageService.getBlock(blockHeight).getData();
if (nodeBlock == null) {
Log.error("utxoAccounts getBlock faile,blockHeight:" + blockHeight);
return false;
}
boolean hadRoll = false;
try {
// get local pre block info /从本地取上一个已同步的区块
LocalCacheBlockBalance localLatestCacheBlock = utxoAccountsStorageService.getLocalCacheBlock(blockHeight - 1).getData();
// rollback judge /判断回滚
while (localLatestCacheBlock != null && !nodeBlock.getHeader().getPreHash().equals(localLatestCacheBlock.getHash())) {
// roll back info /进行数据回滚
rollbackBlock(localLatestCacheBlock);
blockHeight--;
// get pre block
localLatestCacheBlock = utxoAccountsStorageService.getLocalCacheBlock(blockHeight - 1).getData();
nodeBlock = utxoAccountsStorageService.getBlock(blockHeight).getData();
hadRoll = true;
}
if (hadRoll) {
return false;
}
} catch (NulsException e) {
Log.error(e);
Log.error("block syn error======blockHeight:" + blockHeight);
return false;
}
// begin syn block/开始同步区块
// analysis block/解析区块
Map<String, UtxoAccountsBalancePo> utxoAccountsMap = new HashMap<>();
if (!buildUtxoAccountsMap(utxoAccountsMap, nodeBlock)) {
return false;
}
List<UtxoAccountsBalancePo> list = new ArrayList<>();
LocalCacheBlockBalance localCacheBlockBalance = new LocalCacheBlockBalance();
// LocalCacheBlockBalance preSnapshot=new LocalCacheBlockBalance();
try {
list = utxoAccountsMapToList(utxoAccountsMap, localCacheBlockBalance);
} catch (NulsException e) {
Log.info("utxoAccountsMapToList error======blockHeight:" + blockHeight);
return false;
}
localCacheBlockBalance.setHash(nodeBlock.getHeader().getHash());
localCacheBlockBalance.setPreHash(nodeBlock.getHeader().getPreHash());
// localCacheBlockBalance.setBalanceList(list);
localCacheBlockBalance.setBlockHeight(blockHeight);
// save cache block info/缓存最近解析信息
utxoAccountsStorageService.saveLocalCacheBlock(blockHeight, localCacheBlockBalance);
// utxoAccountsStorageService.saveLocalCacheChangeSnapshot(blockHeight,localCacheBlockBalance);
utxoAccountsStorageService.batchSaveByteUtxoAcountsInfo(list);
// update latest block height/更新最近高度
utxoAccountsStorageService.saveHadSynBlockHeight(blockHeight);
// delete overdue cache data/删除过期缓存数据
if (blockHeight > UtxoAccountsStorageConstant.MAX_CACHE_BLOCK_NUM) {
utxoAccountsStorageService.deleteLocalCacheBlock(blockHeight - UtxoAccountsStorageConstant.MAX_CACHE_BLOCK_NUM);
}
Log.debug("utxoAccounts synBlock success==blockHeight:" + blockHeight);
return true;
}
use of io.nuls.utxo.accounts.storage.po.LocalCacheBlockBalance in project nuls by nuls-io.
the class UtxoAccountsServiceImpl method rollbackBlock.
public boolean rollbackBlock(LocalCacheBlockBalance block) throws NulsException {
Log.info("rollbackBlock:" + block.getBlockHeight());
if (block.getBlockHeight() == 0) {
utxoAccountsStorageService.deleteLocalCacheBlock(block.getBlockHeight());
return true;
}
// 更新最新高度
utxoAccountsStorageService.saveHadSynBlockHeight(block.getBlockHeight() - 1);
LocalCacheBlockBalance localPreBlock = utxoAccountsStorageService.getLocalCacheBlock(block.getBlockHeight()).getData();
// 批量更新上一区块数据
List<UtxoAccountsBalancePo> list = localPreBlock.getBalanceList();
if (list.size() > 0) {
utxoAccountsStorageService.batchSaveByteUtxoAcountsInfo(list);
}
// 删除本地缓存区块
utxoAccountsStorageService.deleteLocalCacheBlock(block.getBlockHeight());
return true;
}
use of io.nuls.utxo.accounts.storage.po.LocalCacheBlockBalance in project nuls by nuls-io.
the class UtxoAccountsServiceImpl method validateIntegrityBootstrap.
@Override
public boolean validateIntegrityBootstrap(long hadSynBlockHeight) throws NulsException {
Log.info("utxoAccountsModule validateIntegrityBootstrap hadSynBlockHeight:" + hadSynBlockHeight);
LocalCacheBlockBalance localCacheNextBlock = null;
try {
localCacheNextBlock = utxoAccountsStorageService.getLocalCacheBlock(hadSynBlockHeight + 1).getData();
} catch (NulsException e) {
Log.error(e);
return false;
}
if (localCacheNextBlock == null) {
// 无不一致数据
return true;
}
List<UtxoAccountsBalancePo> utxoAccountsBalances = localCacheNextBlock.getBalanceList();
if (utxoAccountsBalances == null) {
// 无交易数据
return true;
}
return rollbackBlock(localCacheNextBlock);
}
use of io.nuls.utxo.accounts.storage.po.LocalCacheBlockBalance in project nuls by nuls-io.
the class UtxoAccountsStorageServiceImpl method getLocalCacheBlock.
@Override
public Result<LocalCacheBlockBalance> getLocalCacheBlock(long height) throws NulsException {
// LocalCacheBlockBalance balance=dbService.getModel(UtxoAccountsStorageConstant.DB_NAME_UTXO_ACCOUNTS_BLOCK_CACHE,String.valueOf(height).getBytes(),LocalCacheBlockBalance.class);
byte[] block = dbService.get(UtxoAccountsStorageConstant.DB_NAME_UTXO_ACCOUNTS_BLOCK_CACHE, String.valueOf(height).getBytes());
LocalCacheBlockBalance localCacheBlockBalance = new LocalCacheBlockBalance();
localCacheBlockBalance.parse(block, 0);
if (localCacheBlockBalance.getHash() == null) {
return Result.getSuccess().setData(null);
}
return Result.getSuccess().setData(localCacheBlockBalance);
}
Aggregations