Skip to content

Commit c340519

Browse files
committed
feat(approving): convert the approving window configuration to chain governance
1 parent 15e8c0e commit c340519

10 files changed

Lines changed: 80 additions & 4 deletions

File tree

actuator/src/main/java/org/tron/core/actuator/ProposalCreateActuator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR;
44
import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR;
55
import static org.tron.core.actuator.ActuatorConstant.WITNESS_EXCEPTION_STR;
6+
import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL;
67

78
import com.google.protobuf.ByteString;
89
import com.google.protobuf.InvalidProtocolBufferException;
@@ -53,7 +54,8 @@ public boolean execute(Object result) throws ContractExeException {
5354

5455
long currentMaintenanceTime =
5556
chainBaseManager.getDynamicPropertiesStore().getNextMaintenanceTime();
56-
long now3 = now + CommonParameter.getInstance().getProposalExpireTime();
57+
long now3 = now
58+
+ chainBaseManager.getDynamicPropertiesStore().getProposalVotingWindow() * BLOCK_PRODUCED_INTERVAL;
5759
long round = (now3 - currentMaintenanceTime) / maintenanceTimeInterval;
5860
long expirationTime =
5961
currentMaintenanceTime + (round + 1) * maintenanceTimeInterval;

actuator/src/main/java/org/tron/core/utils/ProposalUtil.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import static org.tron.core.Constant.CREATE_ACCOUNT_TRANSACTION_MIN_BYTE_SIZE;
55
import static org.tron.core.Constant.DYNAMIC_ENERGY_INCREASE_FACTOR_RANGE;
66
import static org.tron.core.Constant.DYNAMIC_ENERGY_MAX_FACTOR_RANGE;
7+
import static org.tron.core.Constant.MAX_PROPOSAL_VOTING_WINDOW;
8+
import static org.tron.core.Constant.MIN_PROPOSAL_VOTING_WINDOW;
79
import static org.tron.core.config.Parameter.ChainConstant.ONE_YEAR_BLOCK_NUMBERS;
810

911
import org.tron.common.utils.ForkController;
@@ -839,6 +841,20 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore,
839841
}
840842
break;
841843
}
844+
case PROPOSAL_VOTING_WINDOW: {
845+
if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_8_1)) {
846+
throw new ContractValidateException(
847+
"Bad chain parameter id [PROPOSAL_VOTING_WINDOW]");
848+
}
849+
if (value < MIN_PROPOSAL_VOTING_WINDOW
850+
|| value > MAX_PROPOSAL_VOTING_WINDOW) {
851+
throw new ContractValidateException(
852+
"This value[PROPOSAL_VOTING_WINDOW] is only allowed to be greater than or equal "
853+
+ "to " + MIN_PROPOSAL_VOTING_WINDOW + " and less than or equal to "
854+
+ MAX_PROPOSAL_VOTING_WINDOW + "!");
855+
}
856+
break;
857+
}
842858
default:
843859
break;
844860
}
@@ -921,7 +937,8 @@ public enum ProposalType { // current value, value range
921937
ALLOW_TVM_CANCUN(83), // 0, 1
922938
ALLOW_STRICT_MATH(87), // 0, 1
923939
CONSENSUS_LOGIC_OPTIMIZATION(88), // 0, 1
924-
ALLOW_TVM_BLOB(89); // 0, 1
940+
ALLOW_TVM_BLOB(89), // 0, 1
941+
PROPOSAL_VOTING_WINDOW(92); // (86400, 201600]
925942

926943
private long code;
927944

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.tron.core.store;
22

33
import static org.tron.common.math.Maths.max;
4+
import static org.tron.core.Constant.MIN_PROPOSAL_VOTING_WINDOW;
45
import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL;
56
import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD;
67

@@ -231,6 +232,7 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking<BytesCapsule>
231232
private static final byte[] ALLOW_TVM_CANCUN = "ALLOW_TVM_CANCUN".getBytes();
232233

233234
private static final byte[] ALLOW_TVM_BLOB = "ALLOW_TVM_BLOB".getBytes();
235+
private static final byte[] PROPOSAL_VOTING_WINDOW = "PROPOSAL_VOTING_WINDOW".getBytes();
234236

235237
@Autowired
236238
private DynamicPropertiesStore(@Value("properties") String dbName) {
@@ -2946,6 +2948,21 @@ public long getAllowTvmBlob() {
29462948
.orElse(CommonParameter.getInstance().getAllowTvmBlob());
29472949
}
29482950

2951+
public void saveProposalVotingWindow(long proposalVotingWindow) {
2952+
this.put(PROPOSAL_VOTING_WINDOW, new BytesCapsule(ByteArray.fromLong(proposalVotingWindow)));
2953+
}
2954+
2955+
public long getProposalVotingWindow() {
2956+
return Optional.ofNullable(getUnchecked(PROPOSAL_VOTING_WINDOW))
2957+
.map(BytesCapsule::getData)
2958+
.map(ByteArray::toLong)
2959+
.orElse(CommonParameter.getInstance().getProposalVotingWindow());
2960+
}
2961+
2962+
public boolean supportProposalVotingWindow() {
2963+
return getProposalVotingWindow() > MIN_PROPOSAL_VOTING_WINDOW;
2964+
}
2965+
29492966
private static class DynamicResourceProperties {
29502967

29512968
private static final byte[] ONE_DAY_NET_LIMIT = "ONE_DAY_NET_LIMIT".getBytes();

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,10 @@ public class CommonParameter {
724724
@Setter
725725
public long allowTvmBlob;
726726

727+
@Getter
728+
@Setter
729+
public long proposalVotingWindow = 86400L;
730+
727731
private static double calcMaxTimeRatio() {
728732
//return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1)));
729733
return 5.0;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public class Constant {
3939
public static final long MAX_CONTRACT_RESULT_SIZE = 2L;
4040
public static final long PB_DEFAULT_ENERGY_LIMIT = 0L;
4141
public static final long CREATOR_DEFAULT_ENERGY_LIMIT = 1000 * 10_000L;
42+
public static final long MIN_PROPOSAL_VOTING_WINDOW = 86400L; // Number of blocks to 3 days
43+
public static final long MAX_PROPOSAL_VOTING_WINDOW = 201600L; // Number of blocks to 7 days
4244

4345

4446
// Numbers

common/src/main/java/org/tron/core/config/Parameter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public enum ForkBlockVersionEnum {
2626
VERSION_4_7_4(29, 1596780000000L, 80),
2727
VERSION_4_7_5(30, 1596780000000L, 80),
2828
VERSION_4_7_7(31, 1596780000000L, 80),
29-
VERSION_4_8_0(32, 1596780000000L, 80);
29+
VERSION_4_8_0(32, 1596780000000L, 80),
30+
VERSION_4_8_1(33, 1596780000000L, 80);
3031
// if add a version, modify BLOCK_VERSION simultaneously
3132

3233
@Getter
@@ -75,7 +76,7 @@ public class ChainConstant {
7576
public static final int SINGLE_REPEAT = 1;
7677
public static final int BLOCK_FILLED_SLOTS_NUMBER = 128;
7778
public static final int MAX_FROZEN_NUMBER = 1;
78-
public static final int BLOCK_VERSION = 32;
79+
public static final int BLOCK_VERSION = 33;
7980
public static final long FROZEN_PERIOD = 86_400_000L;
8081
public static final long DELEGATE_PERIOD = 3 * 86_400_000L;
8182
public static final long TRX_PRECISION = 1000_000L;

framework/src/main/java/org/tron/core/Wallet.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,6 +1387,11 @@ public Protocol.ChainParameters getChainParameters() {
13871387
.setValue(dbManager.getDynamicPropertiesStore().getAllowTvmBlob())
13881388
.build());
13891389

1390+
builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder()
1391+
.setKey("getProposalVotingWindow")
1392+
.setValue(dbManager.getDynamicPropertiesStore().getProposalVotingWindow())
1393+
.build());
1394+
13901395
return builder.build();
13911396
}
13921397

framework/src/main/java/org/tron/core/consensus/ProposalService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,10 @@ public static boolean process(Manager manager, ProposalCapsule proposalCapsule)
384384
manager.getDynamicPropertiesStore().saveAllowTvmBlob(entry.getValue());
385385
break;
386386
}
387+
case PROPOSAL_VOTING_WINDOW: {
388+
manager.getDynamicPropertiesStore().saveProposalVotingWindow(entry.getValue());
389+
break;
390+
}
387391
default:
388392
find = false;
389393
break;

framework/src/test/java/org/tron/common/ParameterTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,5 +316,7 @@ public void testCommonParameter() {
316316
assertEquals(1, parameter.getAllowEnergyAdjustment());
317317
parameter.setMaxCreateAccountTxSize(1000);
318318
assertEquals(1000, parameter.getMaxCreateAccountTxSize());
319+
parameter.setProposalVotingWindow(86400L);
320+
assertEquals(86400L, parameter.getProposalVotingWindow());
319321
}
320322
}

framework/src/test/java/org/tron/core/services/ProposalServiceTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package org.tron.core.services;
22

3+
import static org.tron.core.Constant.MAX_PROPOSAL_VOTING_WINDOW;
4+
import static org.tron.core.Constant.MIN_PROPOSAL_VOTING_WINDOW;
35
import static org.tron.core.utils.ProposalUtil.ProposalType.CONSENSUS_LOGIC_OPTIMIZATION;
46
import static org.tron.core.utils.ProposalUtil.ProposalType.ENERGY_FEE;
7+
import static org.tron.core.utils.ProposalUtil.ProposalType.PROPOSAL_VOTING_WINDOW;
58
import static org.tron.core.utils.ProposalUtil.ProposalType.TRANSACTION_FEE;
69
import static org.tron.core.utils.ProposalUtil.ProposalType.WITNESS_127_PAY_PER_BLOCK;
710

@@ -131,4 +134,23 @@ public void testUpdateConsensusLogicOptimization() {
131134
Assert.assertTrue(dbManager.getDynamicPropertiesStore().disableJavaLangMath());
132135
}
133136

137+
@Test
138+
public void testProposalVotingWindow() {
139+
long defaultWindow = dbManager.getDynamicPropertiesStore().getProposalVotingWindow();
140+
Assert.assertEquals(MIN_PROPOSAL_VOTING_WINDOW, defaultWindow);
141+
Assert.assertFalse(dbManager.getDynamicPropertiesStore().supportProposalVotingWindow());
142+
143+
Proposal proposal = Proposal.newBuilder().putParameters(PROPOSAL_VOTING_WINDOW.getCode(),
144+
MAX_PROPOSAL_VOTING_WINDOW).build();
145+
ProposalCapsule proposalCapsule = new ProposalCapsule(proposal);
146+
proposalCapsule.setExpirationTime(1627279200000L);
147+
boolean result = ProposalService.process(dbManager, proposalCapsule);
148+
Assert.assertTrue(result);
149+
150+
long window = dbManager.getDynamicPropertiesStore().getProposalVotingWindow();
151+
Assert.assertEquals(MAX_PROPOSAL_VOTING_WINDOW, window);
152+
153+
Assert.assertTrue(dbManager.getDynamicPropertiesStore().supportProposalVotingWindow());
154+
}
155+
134156
}

0 commit comments

Comments
 (0)