use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class OrphanBlockProcess method checkHasExist.
/*
* Check the existence of this block from the forked chain and the isolated chain
* 从分叉链和孤立链中检查,是否存在该区块
*/
private boolean checkHasExist(NulsDigestData blockHash) {
for (Iterator<ChainContainer> it = chainManager.getOrphanChains().iterator(); it.hasNext(); ) {
ChainContainer chainContainer = it.next();
for (BlockHeader header : chainContainer.getChain().getAllBlockHeaderList()) {
if (header.getHash().equals(blockHash)) {
return true;
}
}
}
for (Iterator<ChainContainer> it = chainManager.getChains().iterator(); it.hasNext(); ) {
ChainContainer chainContainer = it.next();
for (BlockHeader header : chainContainer.getChain().getAllBlockHeaderList()) {
if (header.getHash().equals(blockHash)) {
return true;
}
}
}
List<BlockHeader> masterChainBlockHeaderList = chainManager.getMasterChain().getChain().getAllBlockHeaderList();
int size = (int) (masterChainBlockHeaderList.size() - PocConsensusConstant.MAX_ISOLATED_BLOCK_COUNT * 1.05);
if (size < 0) {
size = 0;
}
for (int i = masterChainBlockHeaderList.size() - 1; i >= size; i--) {
if (blockHash.equals(masterChainBlockHeaderList.get(i).getHash())) {
return true;
}
}
return false;
}
use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class ConsensusScheduler method initNulsProtocol.
private void initNulsProtocol() {
try {
// 针对第一版本升级时的特殊处理
NulsVersionManager.init();
BlockService blockService = NulsContext.getServiceBean(BlockService.class);
// 获取最新的记录版本信息的高度
Long consensusVersionHeight = getVersionManagerStorageService().getConsensusVersionHeight();
if (consensusVersionHeight == null) {
// todo 正式上线这里会改成1200000L
consensusVersionHeight = ProtocolConstant.START_CHECK_PROTOCOL_HEIGHT;
}
NulsVersionManager.loadVersionByHeight(consensusVersionHeight);
ProtocolContainer container = NulsVersionManager.getProtocolContainer(NulsContext.MAIN_NET_VERSION);
if (container != null) {
NulsContext.MAIN_NET_VERSION_HEIGHT = container.getEffectiveHeight();
}
// 获取最新的区块高度
long bestHeight = blockService.getBestBlockHeader().getData().getHeight();
// 检查记录的版本最新高度和区块的最新高度是否一致,如果不一致,找出中间相差的块,再做统计
if (consensusVersionHeight < bestHeight) {
for (long i = consensusVersionHeight; i <= bestHeight; i++) {
Result<BlockHeader> result = blockService.getBlockHeader(i);
if (result.isSuccess()) {
NulsProtocolProcess.getInstance().processProtocolUpGrade(result.getData());
}
}
}
} catch (Exception e) {
Log.error(e);
System.exit(-1);
}
}
use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class NulsProtocolProcess method calculateTempProtocols.
private void calculateTempProtocols(BlockExtendsData extendsData, BlockHeader header, Set<String> memberAddressSet) {
for (ProtocolTempInfoPo tempInfoPo : NulsVersionManager.getTempProtocolContainers().values()) {
// 如果容器的轮次小于当前出块节点的轮次,说明是新的一轮开始
if (tempInfoPo.getStatus() != ProtocolContainer.VALID && tempInfoPo.getRoundIndex() < extendsData.getRoundIndex()) {
// 获取上一个块,得到上一轮的共识节点数量
Result<BlockHeader> result = getBlockService().getBlockHeader(header.getPreHash());
BlockHeader preHeader = result.getData();
BlockExtendsData preExtendsData = new BlockExtendsData(preHeader.getExtend());
// 计算上一轮的覆盖率
int rate = calcRate(tempInfoPo, preExtendsData);
tempInfoPo.setCurrentPercent(rate);
if (rate < tempInfoPo.getPercent()) {
tempInfoPo.setStatus(ProtocolContainer.INVALID);
tempInfoPo.setCurrentDelay(0);
} else {
tempInfoPo.setStatus(ProtocolContainer.DELAY_LOCK);
}
// 新的轮次开始时,也许会有节点时上一轮已经退出的,因此在这一轮里要去掉
Iterator<String> iterator = tempInfoPo.getAddressSet().iterator();
while (iterator.hasNext()) {
String address = iterator.next();
if (!memberAddressSet.contains(address)) {
iterator.remove();
}
}
}
}
}
use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class NulsProtocolProcess method calculateProtocols.
private void calculateProtocols(BlockExtendsData extendsData, BlockHeader header, Set<String> memberAddressSet) {
for (ProtocolContainer container : NulsVersionManager.getAllProtocolContainers().values()) {
// 如果容器的轮次小于当前出块节点的轮次,说明是新的一轮开始
if (container.getStatus() != ProtocolContainer.VALID && container.getRoundIndex() < extendsData.getRoundIndex()) {
// 获取上一个块,得到上一轮的共识节点数量
Result<BlockHeader> result = getBlockService().getBlockHeader(header.getPreHash());
BlockHeader preHeader = result.getData();
BlockExtendsData preExtendsData = new BlockExtendsData(preHeader.getExtend());
// 计算上一轮的覆盖率
int rate = calcRate(container, preExtendsData);
container.setCurrentPercent(rate);
if (rate < container.getPercent()) {
container.setStatus(ProtocolContainer.INVALID);
container.setCurrentDelay(0);
} else {
container.setStatus(ProtocolContainer.DELAY_LOCK);
}
// 新的轮次开始时,也许会有节点时上一轮已经退出的,因此在这一轮里要去掉
Iterator<String> iterator = container.getAddressSet().iterator();
if (iterator != null) {
while (iterator.hasNext()) {
String address = iterator.next();
if (!memberAddressSet.contains(address)) {
iterator.remove();
}
}
}
}
}
}
use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.
the class BifurcationUtil method validate.
public ValidateResult validate(BlockHeader header) {
ValidateResult result = ValidateResult.getSuccessResult();
if (NulsContext.MAIN_NET_VERSION <= 1) {
return result;
}
if (ConsensusConfig.getSeedNodeStringList().indexOf(AddressTool.getStringAddressByBytes(header.getPackingAddress())) >= 0) {
return result;
}
if (header.getHeight() == 0L) {
return result;
}
if (header.getHeight() > NulsContext.getInstance().getBestHeight()) {
return result;
}
BlockHeader otherBlockHeader = blockService.getBlockHeader(header.getHeight()).getData();
if (null != otherBlockHeader && !otherBlockHeader.getHash().equals(header.getHash()) && Arrays.equals(otherBlockHeader.getPackingAddress(), header.getPackingAddress())) {
Log.info("-+-+-+-+-+-+-+-+- Received block with the same height and different hashes as the latest local block -+-+-+-+-+-+-+-+- ");
Log.info("-+-+-+-+-+-+-+-+- height:" + header.getHeight() + ", hash of received block:" + header.getHash().getDigestHex() + ", hash of local latest block:" + otherBlockHeader.getHash().getDigestHex());
Log.info("-+-+-+-+-+-+-+-+- Packing address of received block:" + AddressTool.getStringAddressByBytes(header.getPackingAddress()) + ", Packing address of local latest block:" + AddressTool.getStringAddressByBytes(otherBlockHeader.getPackingAddress()));
List<Agent> agentList = PocConsensusContext.getChainManager().getMasterChain().getChain().getAgentList();
Agent agent = null;
for (Agent a : agentList) {
if (a.getDelHeight() > 0) {
continue;
}
if (Arrays.equals(a.getPackingAddress(), header.getPackingAddress())) {
agent = a;
break;
}
}
if (null == agent) {
return result;
}
recordEvidence(agent, header, otherBlockHeader);
if (!isRedPunish(agent)) {
return result;
}
RedPunishTransaction redPunishTransaction = new RedPunishTransaction();
RedPunishData redPunishData = new RedPunishData();
redPunishData.setAddress(agent.getAgentAddress());
long txTime = 0;
try {
// 连续3轮 每一轮两个区块头作为证据 一共 3 * 2 个区块头作为证据
byte[][] headers = new byte[NulsContext.REDPUNISH_BIFURCATION * 2][];
List<Evidence> list = bifurcationEvidenceMap.get(AddressTool.getStringAddressByBytes(agent.getPackingAddress()));
for (int i = 0; i < list.size() && i < NulsContext.REDPUNISH_BIFURCATION; i++) {
Evidence evidence = list.get(i);
int s = i * 2;
headers[s] = evidence.getBlockHeader1().serialize();
headers[++s] = evidence.getBlockHeader2().serialize();
txTime = (evidence.getBlockHeader1().getTime() + evidence.getBlockHeader2().getTime()) / 2;
}
redPunishData.setEvidence(ArraysTool.concatenate(headers));
} catch (Exception e) {
Log.error(e);
return result;
}
redPunishData.setReasonCode(PunishReasonEnum.BIFURCATION.getCode());
redPunishTransaction.setTxData(redPunishData);
redPunishTransaction.setTime(txTime);
CoinData coinData = null;
try {
coinData = ConsensusTool.getStopAgentCoinData(agent, redPunishTransaction.getTime() + PocConsensusConstant.RED_PUNISH_LOCK_TIME);
} catch (IOException e) {
Log.error(e);
return result;
}
redPunishTransaction.setCoinData(coinData);
try {
redPunishTransaction.setHash(NulsDigestData.calcDigestData(redPunishTransaction.serializeForHash()));
} catch (IOException e) {
Log.error(e);
return result;
}
TxMemoryPool.getInstance().add(redPunishTransaction, false);
return result;
}
return result;
}
Aggregations