18
18
import org .tron .core .Wallet ;
19
19
import org .tron .core .capsule .BlockCapsule ;
20
20
import org .tron .core .config .Parameter .ForkBlockVersionConsts ;
21
+ import org .tron .core .config .Parameter .ForkBlockVersionEnum ;
21
22
import org .tron .core .db .Manager ;
22
23
23
24
@ Slf4j
24
25
@ NoArgsConstructor (access = AccessLevel .PRIVATE )
25
26
public class ForkController {
26
27
28
+ private static final byte VERSION_DOWNGRADE = (byte ) 0 ;
27
29
private static final byte VERSION_UPGRADE = (byte ) 1 ;
28
30
private static final byte HARD_FORK_EFFECTIVE = (byte ) 2 ;
29
31
private static final byte [] check ;
30
32
private static final byte [] check2 ;
33
+
31
34
static {
32
35
check = new byte [1024 ];
33
36
Arrays .fill (check , VERSION_UPGRADE );
@@ -45,6 +48,10 @@ public void init(Manager manager) {
45
48
passSet .clear ();
46
49
}
47
50
51
+ public boolean pass (ForkBlockVersionEnum forkBlockVersionEnum ) {
52
+ return pass (forkBlockVersionEnum .getValue ());
53
+ }
54
+
48
55
public synchronized boolean pass (int version ) {
49
56
if (!checkEnergy (version )) {
50
57
return false ;
@@ -102,6 +109,18 @@ private boolean check(byte[] check, byte[] stats) {
102
109
return true ;
103
110
}
104
111
112
+ private void downgrade (int version , int slot ) {
113
+ for (ForkBlockVersionEnum versionEnum : ForkBlockVersionEnum .values ()) {
114
+ if (versionEnum .getValue () > version ) {
115
+ byte [] stats = manager .getDynamicPropertiesStore ().statsByVersion (versionEnum .getValue ());
116
+ if (!check2 (stats ) && stats != null ) {
117
+ stats [slot ] = VERSION_DOWNGRADE ;
118
+ manager .getDynamicPropertiesStore ().statsByVersion (versionEnum .getValue (), stats );
119
+ }
120
+ }
121
+ }
122
+ }
123
+
105
124
public synchronized void update (BlockCapsule blockCapsule ) {
106
125
List <ByteString > witnesses = manager .getWitnessController ().getActiveWitnesses ();
107
126
ByteString witness = blockCapsule .getWitnessAddress ();
@@ -115,6 +134,8 @@ public synchronized void update(BlockCapsule blockCapsule) {
115
134
return ;
116
135
}
117
136
137
+ downgrade (version , slot );
138
+
118
139
byte [] stats = manager .getDynamicPropertiesStore ().statsByVersion (version );
119
140
if (check (stats ) || check2 (stats )) {
120
141
return ;
@@ -138,9 +159,13 @@ public synchronized void update(BlockCapsule blockCapsule) {
138
159
version );
139
160
}
140
161
162
+ private void setSolidNumWithVersion5BeEffective () {
163
+
164
+ }
165
+
141
166
public synchronized void updateWhenMaintenance (BlockCapsule blockCapsule ) {
142
167
int version = blockCapsule .getInstance ().getBlockHeader ().getRawData ().getVersion ();
143
- if (version < ForkBlockVersionConsts .VERSION_3_2_2 || passSet .contains (version )) {
168
+ if (version < ForkBlockVersionEnum .VERSION_3_2_2 . getValue () || passSet .contains (version )) {
144
169
return ;
145
170
}
146
171
@@ -152,7 +177,10 @@ public synchronized void updateWhenMaintenance(BlockCapsule blockCapsule) {
152
177
if (check (stats )) {
153
178
Arrays .fill (stats , HARD_FORK_EFFECTIVE );
154
179
manager .getDynamicPropertiesStore ().statsByVersion (version , stats );
155
- logger .info ("*******hard fork is effective in the maintenance, version is {}" , version );
180
+ logger .info (
181
+ "*******hard fork is effective in the maintenance:{}, version:{}" ,
182
+ ArrayUtils .toObject (stats ),
183
+ version );
156
184
}
157
185
}
158
186
0 commit comments