use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class VMHelper method invokeViewMethod.
public ProgramResult invokeViewMethod(byte[] contractAddressBytes, String methodName, String methodDesc, String[][] args) {
// 当前区块高度
BlockHeader blockHeader = NulsContext.getInstance().getBestBlock().getHeader();
long blockHeight = blockHeader.getHeight();
// 当前区块状态根
byte[] currentStateRoot = ContractUtil.getStateRoot(blockHeader);
return this.invokeViewMethod(null, false, currentStateRoot, blockHeight, contractAddressBytes, methodName, methodDesc, args);
}
use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class CreateAgentTxProcessor method onCommit.
@Override
public Result onCommit(CreateAgentTransaction tx, Object secondaryData) {
Agent agent = tx.getTxData();
BlockHeader header = (BlockHeader) secondaryData;
agent.setTxHash(tx.getHash());
agent.setBlockHeight(header.getHeight());
agent.setTime(tx.getTime());
AgentPo agentPo = PoConvertUtil.agentToPo(agent);
boolean success = agentStorageService.save(agentPo);
return new Result(success, null);
}
use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class RedPunishTxProcessor method onCommit.
@Override
public Result onCommit(RedPunishTransaction tx, Object secondaryData) {
RedPunishData punishData = tx.getTxData();
BlockHeader header = (BlockHeader) secondaryData;
BlockExtendsData roundData = new BlockExtendsData(header.getExtend());
PunishLogPo punishLogPo = new PunishLogPo();
punishLogPo.setAddress(punishData.getAddress());
punishLogPo.setHeight(tx.getBlockHeight());
punishLogPo.setRoundIndex(roundData.getRoundIndex());
punishLogPo.setTime(tx.getTime());
punishLogPo.setType(PunishType.RED.getCode());
punishLogPo.setEvidence(punishData.getEvidence());
punishLogPo.setReasonCode(punishData.getReasonCode());
List<AgentPo> agentList = agentStorageService.getList();
AgentPo agent = null;
for (AgentPo agentPo : agentList) {
if (agentPo.getDelHeight() > 0) {
continue;
}
if (Arrays.equals(agentPo.getAgentAddress(), punishLogPo.getAddress())) {
agent = agentPo;
break;
}
}
if (null == agent) {
Log.error("There is no agent can be punished.");
return Result.getSuccess();
}
List<DepositPo> depositPoList = depositStorageService.getList();
List<DepositPo> updatedList = new ArrayList<>();
for (DepositPo po : depositPoList) {
if (po.getDelHeight() >= 0) {
continue;
}
if (!po.getAgentHash().equals(agent.getHash())) {
continue;
}
po.setDelHeight(tx.getBlockHeight());
boolean b = depositStorageService.save(po);
if (!b) {
for (DepositPo po2 : updatedList) {
po2.setDelHeight(-1);
this.depositStorageService.save(po2);
}
return ValidateResult.getFailedResult(this.getClass().getName(), PocConsensusErrorCode.UPDATE_DEPOSIT_FAILED);
}
updatedList.add(po);
}
boolean success = storageService.save(punishLogPo);
if (!success) {
for (DepositPo po2 : updatedList) {
po2.setDelHeight(-1);
this.depositStorageService.save(po2);
}
throw new NulsRuntimeException(TransactionErrorCode.ROLLBACK_TRANSACTION_FAILED);
}
AgentPo agentPo = agent;
agentPo.setDelHeight(tx.getBlockHeight());
success = agentStorageService.save(agentPo);
if (!success) {
for (DepositPo po2 : updatedList) {
po2.setDelHeight(-1);
this.depositStorageService.save(po2);
}
this.storageService.delete(punishLogPo.getKey());
return Result.getFailed(PocConsensusErrorCode.UPDATE_AGENT_FAILED);
}
return Result.getSuccess();
}
use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class OrphanBlockProcess method foundAndProcessPreviousBlock.
private void foundAndProcessPreviousBlock(BlockContainer blockContainer) {
BlockHeader blockHeader = blockContainer.getBlock().getHeader();
// Determine whether the previous block already exists. If it already exists, it will not be downloaded.
// 判断上一区块是否已经存在,如果已经存在则不下载
boolean hasExist = checkHasExist(blockHeader.getPreHash());
if (hasExist) {
return;
}
Block preBlock = downloadService.downloadBlock(blockHeader.getPreHash(), blockContainer.getNode()).getData();
if (preBlock != null) {
ChainLog.debug("get pre block success {} - {}", preBlock.getHeader().getHeight(), preBlock.getHeader().getHash());
orphanBlockProvider.addBlock(new BlockContainer(preBlock, blockContainer.getNode(), BlockContainerStatus.DOWNLOADING));
} else {
ChainLog.debug("get pre block fail {} - {}", blockHeader.getHeight() - 1, blockHeader.getPreHash());
// 失败情况的处理,从其它所有可用的节点去获取,如果都不成功,那么就失败,包括本次失败的节点,再次获取一次
for (Node node : networkService.getAvailableNodes()) {
preBlock = downloadService.downloadBlock(blockHeader.getPreHash(), node).getData();
if (preBlock != null) {
orphanBlockProvider.addBlock(new BlockContainer(preBlock, node, BlockContainerStatus.DOWNLOADING));
ChainLog.debug("get pre block retry success {} - {}", preBlock.getHeader().getHeight() - 1, preBlock.getHeader().getPreHash());
return;
}
}
ChainLog.debug("get pre block complete failure {} - {}", blockHeader.getHeight() - 1, blockHeader.getPreHash());
}
}
use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class ConsensusBlockServiceImpl method getBlock.
@Override
public Result<Block> getBlock(NulsDigestData hash) {
Result result = new Result(true, null);
Block block = new Block();
BlockHeader blockHeader = new BlockHeader();
blockHeader.setHash(hash);
block.setHeader(blockHeader);
block.setTxs(new ArrayList<>());
result.setData(block);
return result;
}
Aggregations