Skip to content

Commit cd9df1c

Browse files
committed
hard fork in mantenance
1 parent 805ed34 commit cd9df1c

File tree

2 files changed

+20
-102
lines changed

2 files changed

+20
-102
lines changed

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

Lines changed: 16 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
import com.google.common.collect.Streams;
55
import com.google.protobuf.ByteString;
66
import java.util.Arrays;
7-
import java.util.HashSet;
87
import java.util.List;
9-
import java.util.Set;
8+
import java.util.Objects;
109
import java.util.stream.Collectors;
1110
import java.util.stream.Stream;
1211
import lombok.AccessLevel;
@@ -27,75 +26,42 @@ public class ForkController {
2726

2827
private static final byte VERSION_DOWNGRADE = (byte) 0;
2928
private static final byte VERSION_UPGRADE = (byte) 1;
30-
private static final byte HARD_FORK_EFFECTIVE = (byte) 2;
3129
private static final byte[] check;
32-
private static final byte[] check2;
3330

3431
static {
3532
check = new byte[1024];
3633
Arrays.fill(check, VERSION_UPGRADE);
37-
check2 = new byte[1024];
38-
Arrays.fill(check2, HARD_FORK_EFFECTIVE);
3934
}
4035

4136
@Getter
4237
private Manager manager;
4338

44-
private Set<Integer> passSet = new HashSet<>();
45-
4639
public void init(Manager manager) {
4740
this.manager = manager;
48-
passSet.clear();
4941
}
5042

5143
public boolean pass(ForkBlockVersionEnum forkBlockVersionEnum) {
5244
return pass(forkBlockVersionEnum.getValue());
5345
}
5446

5547
public synchronized boolean pass(int version) {
56-
if (!checkEnergy(version)) {
57-
return false;
58-
}
59-
60-
if (passSet.contains(version)) {
61-
return true;
62-
}
63-
64-
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(version);
65-
boolean pass;
6648
if (version == ForkBlockVersionConsts.ENERGY_LIMIT) {
67-
pass = check(stats);
68-
} else {
69-
pass = check2(stats);
49+
return checkForEnergyLimit();
7050
}
7151

72-
if (pass) {
73-
passSet.add(version);
74-
}
75-
return pass;
52+
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(version);
53+
return check(stats);
7654
}
7755

7856
// when block.version = 5,
7957
// it make block use new energy to handle transaction when block number >= 4727890L.
8058
// version !=5, skip this.
81-
private boolean checkEnergy(int version) {
82-
if (version != ForkBlockVersionConsts.ENERGY_LIMIT) {
83-
return true;
84-
}
85-
59+
private boolean checkForEnergyLimit() {
8660
long blockNum = manager.getDynamicPropertiesStore().getLatestBlockHeaderNumber();
8761
return blockNum >= 4727890L;
8862
}
8963

9064
private boolean check(byte[] stats) {
91-
return check(check, stats);
92-
}
93-
94-
private boolean check2(byte[] stats) {
95-
return check(check2, stats);
96-
}
97-
98-
private boolean check(byte[] check, byte[] stats) {
9965
if (stats == null || stats.length == 0) {
10066
return false;
10167
}
@@ -113,7 +79,7 @@ private void downgrade(int version, int slot) {
11379
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
11480
if (versionEnum.getValue() > version) {
11581
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionEnum.getValue());
116-
if (!check2(stats) && stats != null) {
82+
if (!check(stats) && Objects.nonNull(stats)) {
11783
stats[slot] = VERSION_DOWNGRADE;
11884
manager.getDynamicPropertiesStore().statsByVersion(versionEnum.getValue(), stats);
11985
}
@@ -130,14 +96,12 @@ public synchronized void update(BlockCapsule blockCapsule) {
13096
}
13197

13298
int version = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion();
133-
if (version < ForkBlockVersionConsts.ENERGY_LIMIT || passSet.contains(version)) {
99+
if (version < ForkBlockVersionEnum.VERSION_3_2_2.getValue()) {
134100
return;
135101
}
136102

137-
downgrade(version, slot);
138-
139103
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(version);
140-
if (check(stats) || check2(stats)) {
104+
if (check(stats)) {
141105
return;
142106
}
143107

@@ -147,6 +111,7 @@ public synchronized void update(BlockCapsule blockCapsule) {
147111

148112
stats[slot] = VERSION_UPGRADE;
149113
manager.getDynamicPropertiesStore().statsByVersion(version, stats);
114+
downgrade(version, slot);
150115
logger.info(
151116
"*******update hard fork:{}, witness size:{}, solt:{}, witness:{}, version:{}",
152117
Streams.zip(witnesses.stream(), Stream.of(ArrayUtils.toObject(stats)), Maps::immutableEntry)
@@ -159,53 +124,13 @@ public synchronized void update(BlockCapsule blockCapsule) {
159124
version);
160125
}
161126

162-
private void setSolidNumWithVersion5BeEffective(int version, int witnessSize) {
163-
if (version != ForkBlockVersionConsts.ENERGY_LIMIT) {
164-
return;
165-
}
166-
167-
long num = manager.getDynamicPropertiesStore().getSolidNumWithVersion5();
168-
if (num == -1) {
169-
long blockNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
170-
manager.getDynamicPropertiesStore().setSolidNumWithVersion5(blockNum + witnessSize * 2 / 3);
171-
}
172-
}
173-
174-
public synchronized void updateWhenMaintenance(BlockCapsule blockCapsule) {
175-
int version = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion();
176-
if (version < ForkBlockVersionEnum.VERSION_3_2_2.getValue() || passSet.contains(version)) {
177-
return;
178-
}
179-
180-
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(version);
181-
if (check2(stats)) {
182-
return;
183-
}
184-
185-
if (check(stats)) {
186-
Arrays.fill(stats, HARD_FORK_EFFECTIVE);
187-
manager.getDynamicPropertiesStore().statsByVersion(version, stats);
188-
logger.info(
189-
"*******hard fork is effective in the maintenance:{}, version:{}",
190-
ArrayUtils.toObject(stats),
191-
version);
192-
}
193-
}
194-
195-
public synchronized void reset(BlockCapsule blockCapsule) {
196-
int version = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion();
197-
if (version < ForkBlockVersionConsts.ENERGY_LIMIT || passSet.contains(version)) {
198-
return;
199-
}
200-
201-
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(version);
202-
if (check(stats) || check2(stats)) {
203-
return;
204-
}
205-
206-
if (stats != null) {
207-
Arrays.fill(stats, (byte) 0);
208-
manager.getDynamicPropertiesStore().statsByVersion(version, stats);
127+
public synchronized void reset() {
128+
for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum.values()) {
129+
byte[] stats = manager.getDynamicPropertiesStore().statsByVersion(versionEnum.getValue());
130+
if (!check(stats) && Objects.nonNull(stats)) {
131+
Arrays.fill(stats, VERSION_DOWNGRADE);
132+
manager.getDynamicPropertiesStore().statsByVersion(versionEnum.getValue(), stats);
133+
}
209134
}
210135
}
211136

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

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@ private void applyBlock(BlockCapsule block) throws ContractValidateException,
678678
processBlock(block);
679679
this.blockStore.put(block.getBlockId().getBytes(), block);
680680
this.blockIndexStore.put(block.getBlockId());
681-
updateFork();
681+
updateFork(block);
682682
if (System.currentTimeMillis() - block.getTimeStamp() >= 60_000) {
683683
revokingStore.setMaxFlushCount(SnapshotManager.DEFAULT_MAX_FLUSH_COUNT);
684684
} else {
@@ -1363,14 +1363,8 @@ public void updateLatestSolidifiedBlock() {
13631363
logger.info("update solid block, num = {}", latestSolidifiedBlockNum);
13641364
}
13651365

1366-
public void updateFork() {
1367-
try {
1368-
long latestSolidifiedBlockNum = dynamicPropertiesStore.getLatestSolidifiedBlockNum();
1369-
BlockCapsule solidifiedBlock = getBlockByNum(latestSolidifiedBlockNum);
1370-
forkController.update(solidifiedBlock);
1371-
} catch (ItemNotFoundException | BadItemException e) {
1372-
logger.error("solidified block not found");
1373-
}
1366+
public void updateFork(BlockCapsule block) {
1367+
forkController.update(block);
13741368
}
13751369

13761370
public long getSyncBeginNumber() {
@@ -1405,8 +1399,7 @@ private void processMaintenance(BlockCapsule block) {
14051399
proposalController.processProposals();
14061400
witnessController.updateWitness();
14071401
this.dynamicPropertiesStore.updateNextMaintenanceTime(block.getTimeStamp());
1408-
forkController.updateWhenMaintenance(block);
1409-
forkController.reset(block);
1402+
forkController.reset();
14101403
}
14111404

14121405
/**

0 commit comments

Comments
 (0)