Skip to content

Commit 25df660

Browse files
committed
fix(hard_fork):optimize hard fork logic
1 parent dcf8982 commit 25df660

6 files changed

Lines changed: 83 additions & 15 deletions

File tree

chainbase/src/main/java/org/tron/common/utils/ForkController.java

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.tron.core.capsule.BlockCapsule;
2020
import org.tron.core.config.Parameter.ForkBlockVersionConsts;
2121
import org.tron.core.config.Parameter.ForkBlockVersionEnum;
22+
import org.tron.core.store.DynamicPropertiesStore;
2223

2324
@Slf4j(topic = "utils")
2425
public class ForkController {
@@ -37,6 +38,12 @@ public class ForkController {
3738

3839
public void init(ChainBaseManager manager) {
3940
this.manager = manager;
41+
try {
42+
checkLocalVersion();
43+
} catch (RuntimeException r) {
44+
logger.warn("Exception caught, detail:{}", r.getMessage());
45+
System.exit(1);
46+
}
4047
}
4148

4249
public boolean pass(ForkBlockVersionEnum forkBlockVersionEnum) {
@@ -87,7 +94,7 @@ private boolean passNew(int version) {
8794
}
8895
}
8996
return count >= Math
90-
.ceil((double) versionEnum.getHardForkRate() * manager.getWitnesses().size() / 100);
97+
.ceil((double) versionEnum.getHardForkRate() * stats.length / 100);
9198
}
9299

93100

@@ -116,9 +123,9 @@ private boolean check(byte[] stats) {
116123
private void downgrade(int version, int slot) {
117124
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
118125
int versionValue = versionEnum.getValue();
119-
if (versionValue > version) {
126+
if (versionValue > version && !pass(versionValue)) {
120127
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionValue);
121-
if (!check(stats) && Objects.nonNull(stats)) {
128+
if (Objects.nonNull(stats)) {
122129
stats[slot] = VERSION_DOWNGRADE;
123130
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
124131
}
@@ -129,15 +136,13 @@ private void downgrade(int version, int slot) {
129136
private void upgrade(int version, int slotSize) {
130137
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
131138
int versionValue = versionEnum.getValue();
132-
if (versionValue < version) {
139+
if (versionValue < version && !pass(versionValue)) {
133140
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionValue);
134-
if (!check(stats)) {
135-
if (stats == null || stats.length == 0) {
136-
stats = new byte[slotSize];
137-
}
138-
Arrays.fill(stats, VERSION_UPGRADE);
139-
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
141+
if (stats == null || stats.length == 0) {
142+
stats = new byte[slotSize];
140143
}
144+
Arrays.fill(stats, VERSION_UPGRADE);
145+
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
141146
}
142147
}
143148
}
@@ -155,15 +160,20 @@ public synchronized void update(BlockCapsule blockCapsule) {
155160
return;
156161
}
157162

163+
if (manager.getDynamicPropertiesStore().getLatestVersion() >= version) {
164+
return;
165+
}
166+
158167
downgrade(version, slot);
159168

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

165-
if (check(stats)) {
174+
if (pass(version)) {
166175
upgrade(version, stats.length);
176+
manager.getDynamicPropertiesStore().saveLatestVersion(version);
167177
return;
168178
}
169179

@@ -185,11 +195,12 @@ public synchronized void update(BlockCapsule blockCapsule) {
185195
}
186196

187197
public synchronized void reset() {
198+
int size = manager.getWitnessScheduleStore().getActiveWitnesses().size();
188199
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
189200
int versionValue = versionEnum.getValue();
190201
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionValue);
191202
if (Objects.nonNull(stats) && !pass(versionValue)) {
192-
Arrays.fill(stats, VERSION_DOWNGRADE);
203+
stats = new byte[size];
193204
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
194205
}
195206
}
@@ -212,4 +223,34 @@ private ForkController getInstance() {
212223
return instance;
213224
}
214225
}
226+
227+
public void checkLocalVersion() {
228+
DynamicPropertiesStore store = manager.getDynamicPropertiesStore();
229+
int latestVersion = store.getLatestVersion();
230+
if (latestVersion == 0) {
231+
for (ForkBlockVersionEnum version : ForkBlockVersionEnum.values()) {
232+
int v = version.getValue();
233+
if (pass(v) && latestVersion < v) {
234+
latestVersion = v;
235+
}
236+
}
237+
store.saveLatestVersion(latestVersion);
238+
return;
239+
}
240+
241+
if (!CommonParameter.getInstance().isVersionCheckEnable()) {
242+
return;
243+
}
244+
245+
int systemVersion = 0;
246+
for (ForkBlockVersionEnum version : ForkBlockVersionEnum.values()) {
247+
if (version.getValue() > systemVersion) {
248+
systemVersion = version.getValue();
249+
}
250+
}
251+
if (latestVersion > systemVersion) {
252+
throw new RuntimeException("Version check failed, latestVersion:"
253+
+ latestVersion + ", systemVersion:" + systemVersion);
254+
}
255+
}
215256
}

chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking<BytesCapsule>
101101
private static final byte[] STORAGE_EXCHANGE_TAX_RATE = "STORAGE_EXCHANGE_TAX_RATE".getBytes();
102102
private static final String FORK_CONTROLLER = "FORK_CONTROLLER";
103103
private static final String FORK_PREFIX = "FORK_VERSION_";
104+
private static final byte[] VERSION_NUMBER = "VERSION_NUMBER".getBytes();
104105
//This value is only allowed to be 0, 1, -1
105106
private static final byte[] REMOVE_THE_POWER_OF_THE_GR = "REMOVE_THE_POWER_OF_THE_GR".getBytes();
106107
//This value is only allowed to be 0, 1, -1
@@ -2282,6 +2283,19 @@ public Boolean getForked(int version) {
22822283
return value == null ? null : Boolean.valueOf(new String(value));
22832284
}
22842285

2286+
public void saveLatestVersion(int version) {
2287+
this.put(VERSION_NUMBER, new BytesCapsule(ByteArray.fromInt(version)));
2288+
}
2289+
2290+
public int getLatestVersion() {
2291+
BytesCapsule data = getUnchecked(VERSION_NUMBER);
2292+
if (data == null) {
2293+
saveLatestVersion(0);
2294+
return 0;
2295+
}
2296+
return ByteArray.toInt(data.getData());
2297+
}
2298+
22852299
/**
22862300
* get allow protobuf number.
22872301
*/

common/src/main/java/org/tron/common/parameter/CommonParameter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,9 @@ public class CommonParameter {
395395
public boolean version;
396396
@Getter
397397
@Setter
398+
public boolean versionCheckEnable;
399+
@Getter
400+
@Setter
398401
public String zenTokenId;
399402
@Getter
400403
@Setter

common/src/main/java/org/tron/core/Constant.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,5 +372,7 @@ public class Constant {
372372
public static final String DYNAMIC_CONFIG_ENABLE = "node.dynamicConfig.enable";
373373
public static final String DYNAMIC_CONFIG_CHECK_INTERVAL = "node.dynamicConfig.checkInterval";
374374

375+
public static final String NODE_VERSION_CHECK_ENABLE = "node.versionCheckEnable";
376+
375377
public static final String COMMITTEE_ALLOW_TVM_SHANGHAI = "committee.allowTvmShangHai";
376378
}

framework/src/main/java/org/tron/core/config/args/Args.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ public static void clearParam() {
233233
PARAMETER.p2pDisable = false;
234234
PARAMETER.dynamicConfigEnable = false;
235235
PARAMETER.dynamicConfigCheckInterval = 600;
236+
PARAMETER.versionCheckEnable = true;
236237
PARAMETER.allowTvmShangHai = 0;
237238
}
238239

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

1183+
PARAMETER.versionCheckEnable = !config.hasPath(Constant.NODE_VERSION_CHECK_ENABLE)
1184+
|| config.getBoolean(Constant.NODE_VERSION_CHECK_ENABLE);
1185+
11821186
PARAMETER.allowTvmShangHai =
11831187
config.hasPath(Constant.COMMITTEE_ALLOW_TVM_SHANGHAI) ? config
11841188
.getInt(Constant.COMMITTEE_ALLOW_TVM_SHANGHAI) : 0;

framework/src/main/java/org/tron/core/db/Manager.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,16 +1746,20 @@ private void processBlock(BlockCapsule block, List<TransactionCapsule> txs)
17461746

17471747
payReward(block);
17481748

1749-
if (chainBaseManager.getDynamicPropertiesStore().getNextMaintenanceTime()
1750-
<= block.getTimeStamp()) {
1749+
boolean flag = chainBaseManager.getDynamicPropertiesStore().getNextMaintenanceTime()
1750+
<= block.getTimeStamp();
1751+
if (flag) {
17511752
proposalController.processProposals();
1752-
chainBaseManager.getForkController().reset();
17531753
}
17541754

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

1759+
if (flag) {
1760+
chainBaseManager.getForkController().reset();
1761+
}
1762+
17591763
updateTransHashCache(block);
17601764
updateRecentBlock(block);
17611765
updateRecentTransaction(block);

0 commit comments

Comments
 (0)