Search in sources :

Example 1 with LocalCacheBlockBalance

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;
}
Also used : UtxoAccountsBalancePo(io.nuls.utxo.accounts.storage.po.UtxoAccountsBalancePo) NulsException(io.nuls.kernel.exception.NulsException) Block(io.nuls.kernel.model.Block) LocalCacheBlockBalance(io.nuls.utxo.accounts.storage.po.LocalCacheBlockBalance)

Example 2 with LocalCacheBlockBalance

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;
}
Also used : UtxoAccountsBalancePo(io.nuls.utxo.accounts.storage.po.UtxoAccountsBalancePo) LocalCacheBlockBalance(io.nuls.utxo.accounts.storage.po.LocalCacheBlockBalance)

Example 3 with LocalCacheBlockBalance

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);
}
Also used : UtxoAccountsBalancePo(io.nuls.utxo.accounts.storage.po.UtxoAccountsBalancePo) NulsException(io.nuls.kernel.exception.NulsException) LocalCacheBlockBalance(io.nuls.utxo.accounts.storage.po.LocalCacheBlockBalance)

Example 4 with LocalCacheBlockBalance

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);
}
Also used : LocalCacheBlockBalance(io.nuls.utxo.accounts.storage.po.LocalCacheBlockBalance)

Aggregations

LocalCacheBlockBalance (io.nuls.utxo.accounts.storage.po.LocalCacheBlockBalance)4 UtxoAccountsBalancePo (io.nuls.utxo.accounts.storage.po.UtxoAccountsBalancePo)3 NulsException (io.nuls.kernel.exception.NulsException)2 Block (io.nuls.kernel.model.Block)1