Skip to content

Commit c20b9de

Browse files
authored
Merge pull request #5247 from chengtx01/hard_fork
feat(hardFork): optimize hard fork logic
2 parents 175059c + 939fdd3 commit c20b9de

File tree

7 files changed

+376
-15
lines changed

7 files changed

+376
-15
lines changed

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

Lines changed: 46 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 {
@@ -87,7 +88,7 @@ private boolean passNew(int version) {
8788
}
8889
}
8990
return count >= Math
90-
.ceil((double) versionEnum.getHardForkRate() * manager.getWitnesses().size() / 100);
91+
.ceil((double) versionEnum.getHardForkRate() * stats.length / 100);
9192
}
9293

9394

@@ -116,9 +117,9 @@ private boolean check(byte[] stats) {
116117
private void downgrade(int version, int slot) {
117118
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
118119
int versionValue = versionEnum.getValue();
119-
if (versionValue > version) {
120+
if (versionValue > version && !pass(versionValue)) {
120121
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionValue);
121-
if (!check(stats) && Objects.nonNull(stats)) {
122+
if (Objects.nonNull(stats)) {
122123
stats[slot] = VERSION_DOWNGRADE;
123124
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
124125
}
@@ -129,15 +130,13 @@ private void downgrade(int version, int slot) {
129130
private void upgrade(int version, int slotSize) {
130131
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
131132
int versionValue = versionEnum.getValue();
132-
if (versionValue < version) {
133+
if (versionValue < version && !pass(versionValue)) {
133134
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);
135+
if (stats == null || stats.length == 0) {
136+
stats = new byte[slotSize];
140137
}
138+
Arrays.fill(stats, VERSION_UPGRADE);
139+
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
141140
}
142141
}
143142
}
@@ -155,15 +154,20 @@ public synchronized void update(BlockCapsule blockCapsule) {
155154
return;
156155
}
157156

157+
if (manager.getDynamicPropertiesStore().getLatestVersion() >= version) {
158+
return;
159+
}
160+
158161
downgrade(version, slot);
159162

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

165-
if (check(stats)) {
168+
if (pass(version)) {
166169
upgrade(version, stats.length);
170+
manager.getDynamicPropertiesStore().saveLatestVersion(version);
167171
return;
168172
}
169173

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

187191
public synchronized void reset() {
192+
int size = manager.getWitnessScheduleStore().getActiveWitnesses().size();
188193
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
189194
int versionValue = versionEnum.getValue();
190195
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionValue);
191196
if (Objects.nonNull(stats) && !pass(versionValue)) {
192-
Arrays.fill(stats, VERSION_DOWNGRADE);
197+
stats = new byte[size];
193198
manager.getDynamicPropertiesStore().statsByVersion(versionValue, stats);
194199
}
195200
}
@@ -212,4 +217,33 @@ private ForkController getInstance() {
212217
return instance;
213218
}
214219
}
220+
221+
public void checkLocalVersion() {
222+
DynamicPropertiesStore store = manager.getDynamicPropertiesStore();
223+
int latestVersion = store.getLatestVersion();
224+
if (latestVersion == 0) {
225+
for (ForkBlockVersionEnum version : ForkBlockVersionEnum.values()) {
226+
int v = version.getValue();
227+
if (pass(v) && latestVersion < v) {
228+
latestVersion = v;
229+
}
230+
}
231+
store.saveLatestVersion(latestVersion);
232+
return;
233+
}
234+
235+
if (!CommonParameter.getInstance().isVersionCheckEnable()) {
236+
return;
237+
}
238+
239+
int systemVersion = 0;
240+
for (ForkBlockVersionEnum version : ForkBlockVersionEnum.values()) {
241+
if (version.getValue() > systemVersion) {
242+
systemVersion = version.getValue();
243+
}
244+
}
245+
if (latestVersion > systemVersion) {
246+
throw new RuntimeException("Version check failed, please upgrade to the latest version");
247+
}
248+
}
215249
}

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

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

2300+
public void saveLatestVersion(int version) {
2301+
this.put(VERSION_NUMBER, new BytesCapsule(ByteArray.fromInt(version)));
2302+
}
2303+
2304+
public int getLatestVersion() {
2305+
BytesCapsule data = getUnchecked(VERSION_NUMBER);
2306+
if (data == null) {
2307+
saveLatestVersion(0);
2308+
return 0;
2309+
}
2310+
return ByteArray.toInt(data.getData());
2311+
}
2312+
22992313
/**
23002314
* get allow protobuf number.
23012315
*/

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: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,12 @@ public void init() {
487487
System.exit(1);
488488
}
489489
getChainBaseManager().getForkController().init(this.chainBaseManager);
490+
try {
491+
getChainBaseManager().getForkController().checkLocalVersion();
492+
} catch (RuntimeException r) {
493+
logger.error("{}", r.getMessage());
494+
System.exit(1);
495+
}
490496

491497
if (Args.getInstance().isNeedToUpdateAsset() && needToUpdateAsset()) {
492498
new AssetUpdateHelper(chainBaseManager).doWork();
@@ -1747,16 +1753,20 @@ private void processBlock(BlockCapsule block, List<TransactionCapsule> txs)
17471753

17481754
payReward(block);
17491755

1750-
if (chainBaseManager.getDynamicPropertiesStore().getNextMaintenanceTime()
1751-
<= block.getTimeStamp()) {
1756+
boolean flag = chainBaseManager.getDynamicPropertiesStore().getNextMaintenanceTime()
1757+
<= block.getTimeStamp();
1758+
if (flag) {
17521759
proposalController.processProposals();
1753-
chainBaseManager.getForkController().reset();
17541760
}
17551761

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

1766+
if (flag) {
1767+
chainBaseManager.getForkController().reset();
1768+
}
1769+
17601770
updateTransHashCache(block);
17611771
updateRecentBlock(block);
17621772
updateRecentTransaction(block);

0 commit comments

Comments
 (0)