Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 46 additions & 12 deletions chainbase/src/main/java/org/tron/common/utils/ForkController.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.tron.core.capsule.BlockCapsule;
import org.tron.core.config.Parameter.ForkBlockVersionConsts;
import org.tron.core.config.Parameter.ForkBlockVersionEnum;
import org.tron.core.store.DynamicPropertiesStore;

@Slf4j(topic = "utils")
public class ForkController {
Expand Down Expand Up @@ -87,7 +88,7 @@ private boolean passNew(int version) {
}
}
return count >= Math
.ceil((double) versionEnum.getHardForkRate() * manager.getWitnesses().size() / 100);
.ceil((double) versionEnum.getHardForkRate() * stats.length / 100);
}


Expand Down Expand Up @@ -116,9 +117,9 @@ private boolean check(byte[] stats) {
private void downgrade(int version, int slot) {
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
int versionValue = versionEnum.getValue();
if (versionValue > version) {
if (versionValue > version && !pass(versionValue)) {
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionValue);
if (!check(stats) && Objects.nonNull(stats)) {
if (Objects.nonNull(stats)) {
stats[slot] = VERSION_DOWNGRADE;
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
}
Expand All @@ -129,15 +130,13 @@ private void downgrade(int version, int slot) {
private void upgrade(int version, int slotSize) {
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
int versionValue = versionEnum.getValue();
if (versionValue < version) {
if (versionValue < version && !pass(versionValue)) {
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionValue);
if (!check(stats)) {
if (stats == null || stats.length == 0) {
stats = new byte[slotSize];
}
Arrays.fill(stats, VERSION_UPGRADE);
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
if (stats == null || stats.length == 0) {
stats = new byte[slotSize];
}
Arrays.fill(stats, VERSION_UPGRADE);
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
}
}
}
Expand All @@ -155,15 +154,20 @@ public synchronized void update(BlockCapsule blockCapsule) {
return;
}

if (manager.getDynamicPropertiesStore().getLatestVersion() >= version) {
return;
}

downgrade(version, slot);

byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(version);
if (Objects.isNull(stats) || stats.length != witnesses.size()) {
stats = new byte[witnesses.size()];
}

if (check(stats)) {
if (pass(version)) {
upgrade(version, stats.length);
manager.getDynamicPropertiesStore().saveLatestVersion(version);
return;
}

Expand All @@ -185,11 +189,12 @@ public synchronized void update(BlockCapsule blockCapsule) {
}

public synchronized void reset() {
int size = manager.getWitnessScheduleStore().getActiveWitnesses().size();
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
int versionValue = versionEnum.getValue();
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionValue);
if (Objects.nonNull(stats) && !pass(versionValue)) {
Arrays.fill(stats, VERSION_DOWNGRADE);
stats = new byte[size];
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
}
}
Expand All @@ -212,4 +217,33 @@ private ForkController getInstance() {
return instance;
}
}

public void checkLocalVersion() {
DynamicPropertiesStore store = manager.getDynamicPropertiesStore();
int latestVersion = store.getLatestVersion();
if (latestVersion == 0) {
for (ForkBlockVersionEnum version : ForkBlockVersionEnum.values()) {
int v = version.getValue();
if (pass(v) && latestVersion < v) {
latestVersion = v;
}
}
store.saveLatestVersion(latestVersion);
return;
}

if (!CommonParameter.getInstance().isVersionCheckEnable()) {
return;
}

int systemVersion = 0;
for (ForkBlockVersionEnum version : ForkBlockVersionEnum.values()) {
if (version.getValue() > systemVersion) {
systemVersion = version.getValue();
}
}
if (latestVersion > systemVersion) {
throw new RuntimeException("Version check failed, please upgrade to the latest version");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking<BytesCapsule>
private static final byte[] STORAGE_EXCHANGE_TAX_RATE = "STORAGE_EXCHANGE_TAX_RATE".getBytes();
private static final String FORK_CONTROLLER = "FORK_CONTROLLER";
private static final String FORK_PREFIX = "FORK_VERSION_";
private static final byte[] VERSION_NUMBER = "VERSION_NUMBER".getBytes();
//This value is only allowed to be 0, 1, -1
private static final byte[] REMOVE_THE_POWER_OF_THE_GR = "REMOVE_THE_POWER_OF_THE_GR".getBytes();
//This value is only allowed to be 0, 1, -1
Expand Down Expand Up @@ -2282,6 +2283,19 @@ public Boolean getForked(int version) {
return value == null ? null : Boolean.valueOf(new String(value));
}

public void saveLatestVersion(int version) {
this.put(VERSION_NUMBER, new BytesCapsule(ByteArray.fromInt(version)));
}

public int getLatestVersion() {
BytesCapsule data = getUnchecked(VERSION_NUMBER);
if (data == null) {
saveLatestVersion(0);
return 0;
}
return ByteArray.toInt(data.getData());
}

/**
* get allow protobuf number.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,9 @@ public class CommonParameter {
public boolean version;
@Getter
@Setter
public boolean versionCheckEnable;
@Getter
@Setter
public String zenTokenId;
@Getter
@Setter
Expand Down
2 changes: 2 additions & 0 deletions common/src/main/java/org/tron/core/Constant.java
Original file line number Diff line number Diff line change
Expand Up @@ -372,5 +372,7 @@ public class Constant {
public static final String DYNAMIC_CONFIG_ENABLE = "node.dynamicConfig.enable";
public static final String DYNAMIC_CONFIG_CHECK_INTERVAL = "node.dynamicConfig.checkInterval";

public static final String NODE_VERSION_CHECK_ENABLE = "node.versionCheckEnable";

public static final String COMMITTEE_ALLOW_TVM_SHANGHAI = "committee.allowTvmShangHai";
}
4 changes: 4 additions & 0 deletions framework/src/main/java/org/tron/core/config/args/Args.java
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ public static void clearParam() {
PARAMETER.p2pDisable = false;
PARAMETER.dynamicConfigEnable = false;
PARAMETER.dynamicConfigCheckInterval = 600;
PARAMETER.versionCheckEnable = true;
PARAMETER.allowTvmShangHai = 0;
}

Expand Down Expand Up @@ -1179,6 +1180,9 @@ public static void setParam(final String[] args, final String confFileName) {
PARAMETER.dynamicConfigCheckInterval = 600;
}

PARAMETER.versionCheckEnable = !config.hasPath(Constant.NODE_VERSION_CHECK_ENABLE)
|| config.getBoolean(Constant.NODE_VERSION_CHECK_ENABLE);

PARAMETER.allowTvmShangHai =
config.hasPath(Constant.COMMITTEE_ALLOW_TVM_SHANGHAI) ? config
.getInt(Constant.COMMITTEE_ALLOW_TVM_SHANGHAI) : 0;
Expand Down
16 changes: 13 additions & 3 deletions framework/src/main/java/org/tron/core/db/Manager.java
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,12 @@ public void init() {
System.exit(1);
}
getChainBaseManager().getForkController().init(this.chainBaseManager);
try {
getChainBaseManager().getForkController().checkLocalVersion();
} catch (RuntimeException r) {
logger.error("{}", r.getMessage());
System.exit(1);
}

if (Args.getInstance().isNeedToUpdateAsset() && needToUpdateAsset()) {
new AssetUpdateHelper(chainBaseManager).doWork();
Expand Down Expand Up @@ -1746,16 +1752,20 @@ private void processBlock(BlockCapsule block, List<TransactionCapsule> txs)

payReward(block);

if (chainBaseManager.getDynamicPropertiesStore().getNextMaintenanceTime()
<= block.getTimeStamp()) {
boolean flag = chainBaseManager.getDynamicPropertiesStore().getNextMaintenanceTime()
<= block.getTimeStamp();
if (flag) {
proposalController.processProposals();
chainBaseManager.getForkController().reset();
}

if (!consensus.applyBlock(block)) {
throw new BadBlockException("consensus apply block failed");
}

if (flag) {
chainBaseManager.getForkController().reset();
}

updateTransHashCache(block);
updateRecentBlock(block);
updateRecentTransaction(block);
Expand Down
Loading