use of io.nuls.protocol.base.version.ProtocolContainer 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.protocol.base.version.ProtocolContainer in project nuls by nuls-io.
the class NulsProtocolProcess method saveContainerList.
private void saveContainerList(long versionHeight) {
List<ProtocolInfoPo> infoPoList = new ArrayList<>();
for (ProtocolContainer container : NulsVersionManager.getAllProtocolContainers().values()) {
ProtocolInfoPo infoPo = ProtocolTransferTool.toProtocolInfoPo(container);
infoPoList.add(infoPo);
}
getVersionManagerStorageService().saveProtocolInfoList(versionHeight, infoPoList);
}
use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.
the class NulsProtocolProcess method calcDelay.
private void calcDelay(BlockHeader blockHeader, BlockExtendsData extendsData) {
for (ProtocolContainer container : NulsVersionManager.getAllProtocolContainers().values()) {
if (container.getStatus() != ProtocolContainer.DELAY_LOCK || container.getVersion() < NulsContext.MAIN_NET_VERSION) {
continue;
}
container.setRoundIndex(extendsData.getRoundIndex());
container.setCurrentDelay(container.getCurrentDelay() + 1);
// 当延迟块数达到升级条件时,改变协议状态为生效
if (container.getCurrentDelay() >= container.getDelay()) {
upgradeProtocol(container, blockHeader);
Log.info("********** 协议生效了!!!!!!!!! **********");
Log.info("********** 协议生效了!!!!!!!!! **********");
Log.info("********** 协议生效了!!!!!!!!! **********");
Log.info("********** 当前协议生效下一块开始执行新协议 **********");
Log.info("********** 生效协议version:" + container.getVersion());
Log.info("********** 生效协议高度:" + container.getEffectiveHeight());
}
}
}
use of io.nuls.protocol.base.version.ProtocolContainer 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.protocol.base.version.ProtocolContainer in project nuls by nuls-io.
the class NulsProtocolProcess method containerRollBack.
private void containerRollBack(long versionHeight) {
List<ProtocolInfoPo> infoPoList = getVersionManagerStorageService().getProtocolInfoList(versionHeight);
// 用数据库已保存的每个区块统计的协议信息覆盖容器
if (infoPoList != null && !infoPoList.isEmpty()) {
for (ProtocolInfoPo infoPo : infoPoList) {
ProtocolContainer container = NulsVersionManager.getProtocolContainer(infoPo.getVersion());
copyProtocolFromInfoPo(container, infoPo);
}
}
ProtocolContainer container = NulsVersionManager.getProtocolContainer(NulsContext.MAIN_NET_VERSION);
if (container.getStatus() != ProtocolContainer.VALID) {
int version = NulsContext.MAIN_NET_VERSION;
while (true) {
version--;
container = NulsVersionManager.getProtocolContainer(version);
if (container.getStatus() == ProtocolContainer.VALID) {
break;
}
}
NulsContext.MAIN_NET_VERSION = version;
NulsContext.MAIN_NET_VERSION_HEIGHT = container.getEffectiveHeight();
getVersionManagerStorageService().saveMainVersion(version);
if (version == 1) {
getVersionManagerStorageService().deleteChangeTxHashBlockHeight();
}
}
}
Aggregations