Skip to content

Commit f3b6d5c

Browse files
committed
<fix>(precompiled): add compatibility_version set version check.
1 parent cd77661 commit f3b6d5c

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

.ci/ci_check.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ build_node()
105105
{
106106
local node_type="${1}"
107107
local sed_cmd=$(get_sed_cmd)
108+
curl -LO https://raw.githubusercontent.com/FISCO-BCOS/console/master/tools/get_account.sh
109+
curl -LO https://raw.githubusercontent.com/FISCO-BCOS/console/master/tools/get_gm_account.sh
108110
if [ "${node_type}" == "wasm" ];then
109111
bash build_chain.sh -l 127.0.0.1:4 -e ./fisco-bcos -w "${2}"
110112
else

src/integration-test/java/org/fisco/bcos/sdk/v3/test/transaction/codec/EvenDemoTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package org.fisco.bcos.sdk.v3.test.transaction.codec;
22

33
import org.apache.commons.lang3.StringUtils;
4-
import org.checkerframework.checker.units.qual.C;
54
import org.fisco.bcos.sdk.v3.BcosSDK;
65
import org.fisco.bcos.sdk.v3.client.Client;
7-
import org.fisco.bcos.sdk.v3.crypto.CryptoSuite;
86
import org.fisco.bcos.sdk.v3.model.ConstantConfig;
9-
import org.fisco.bcos.sdk.v3.model.CryptoType;
107
import org.fisco.bcos.sdk.v3.model.TransactionReceipt;
118
import org.fisco.bcos.sdk.v3.test.contract.solidity.EventSubDemo;
129
import org.fisco.bcos.sdk.v3.utils.Hex;

src/main/java/org/fisco/bcos/sdk/v3/contract/auth/manager/AuthManager.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package org.fisco.bcos.sdk.v3.contract.auth.manager;
22

3+
import static org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig.SystemConfigService.COMPATIBILITY_VERSION;
4+
import static org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig.SystemConfigService.checkCompatibilityVersion;
35
import static org.fisco.bcos.sdk.v3.model.PrecompiledConstant.SYNC_KEEP_UP_THRESHOLD;
46

57
import java.math.BigInteger;
68
import java.util.List;
79
import java.util.function.Function;
10+
import java.util.stream.Collectors;
811
import org.fisco.bcos.sdk.v3.client.Client;
912
import org.fisco.bcos.sdk.v3.client.protocol.response.BcosGroupInfo;
1013
import org.fisco.bcos.sdk.v3.client.protocol.response.SyncStatus;
@@ -348,6 +351,18 @@ public BigInteger createSetSysConfigProposal(String key, String value)
348351
throw new ContractException(
349352
"Invalid value \"" + value + "\" for " + key + ", please check valid range.");
350353
}
354+
if (COMPATIBILITY_VERSION.equals(key) && !checkCompatibilityVersion(client, value)) {
355+
String nodeVersionString =
356+
client.getGroupInfo().getResult().getNodeList().stream()
357+
.map(node -> node.getIniConfig().getBinaryInfo().getVersion())
358+
.collect(Collectors.joining(","));
359+
throw new ContractException(
360+
"The compatibility version "
361+
+ value
362+
+ " is not supported, please check the version of the chain. (The version of the chain is "
363+
+ nodeVersionString
364+
+ ")");
365+
}
351366
TransactionReceipt tr =
352367
committeeManager.createSetSysConfigProposal(
353368
key, value, DEFAULT_BLOCK_NUMBER_INTERVAL);

src/main/java/org/fisco/bcos/sdk/v3/contract/precompiled/sysconfig/SystemConfigService.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,28 @@
1616

1717
import java.math.BigInteger;
1818
import java.util.HashMap;
19+
import java.util.List;
1920
import java.util.Map;
2021
import java.util.function.Predicate;
22+
import java.util.stream.Collectors;
2123
import org.fisco.bcos.sdk.v3.client.Client;
24+
import org.fisco.bcos.sdk.v3.client.protocol.response.BcosGroupNodeInfo;
2225
import org.fisco.bcos.sdk.v3.contract.precompiled.model.PrecompiledAddress;
2326
import org.fisco.bcos.sdk.v3.crypto.keypair.CryptoKeyPair;
27+
import org.fisco.bcos.sdk.v3.model.EnumNodeVersion;
2428
import org.fisco.bcos.sdk.v3.model.RetCode;
2529
import org.fisco.bcos.sdk.v3.model.TransactionReceipt;
2630
import org.fisco.bcos.sdk.v3.transaction.codec.decode.ReceiptParser;
2731
import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException;
2832

2933
public class SystemConfigService {
3034
private final SystemConfigPrecompiled systemConfigPrecompiled;
35+
private final Client client;
3136
public static final String TX_COUNT_LIMIT = "tx_count_limit";
3237
public static final String TX_GAS_LIMIT = "tx_gas_limit";
3338
public static final String CONSENSUS_PERIOD = "consensus_leader_period";
3439
public static final String AUTH_STATUS = "auth_check_status";
40+
public static final String COMPATIBILITY_VERSION = "compatibility_version";
3541
public static final int TX_GAS_LIMIT_MIN = 100000;
3642
private static final Map<String, Predicate<BigInteger>> predicateMap = new HashMap<>();
3743

@@ -44,6 +50,7 @@ public class SystemConfigService {
4450
}
4551

4652
public SystemConfigService(Client client, CryptoKeyPair credential) {
53+
this.client = client;
4754
this.systemConfigPrecompiled =
4855
SystemConfigPrecompiled.load(
4956
client.isWASM()
@@ -54,6 +61,18 @@ public SystemConfigService(Client client, CryptoKeyPair credential) {
5461
}
5562

5663
public RetCode setValueByKey(String key, String value) throws ContractException {
64+
if (COMPATIBILITY_VERSION.equals(key) && !checkCompatibilityVersion(client, value)) {
65+
String nodeVersionString =
66+
client.getGroupInfo().getResult().getNodeList().stream()
67+
.map(node -> node.getIniConfig().getBinaryInfo().getVersion())
68+
.collect(Collectors.joining(","));
69+
throw new ContractException(
70+
"The compatibility version "
71+
+ value
72+
+ " is not supported, please check the version of the chain. (The version of the chain is "
73+
+ nodeVersionString
74+
+ ")");
75+
}
5776
TransactionReceipt receipt = systemConfigPrecompiled.setValueByKey(key, value);
5877
return ReceiptParser.parseTransactionReceipt(
5978
receipt, tr -> systemConfigPrecompiled.getSetValueByKeyOutput(receipt).getValue1());
@@ -76,4 +95,23 @@ public static boolean checkSysNumberValueValidation(String key, String value) {
7695
public static boolean isCheckableInValueValidation(String key) {
7796
return predicateMap.containsKey(key);
7897
}
98+
99+
public static boolean checkCompatibilityVersion(Client client, String version) {
100+
try {
101+
EnumNodeVersion.Version setVersion = EnumNodeVersion.getClassVersion(version);
102+
List<BcosGroupNodeInfo.GroupNodeInfo> nodeList =
103+
client.getGroupInfo().getResult().getNodeList();
104+
return nodeList.stream()
105+
.allMatch(
106+
node ->
107+
setVersion.compareTo(
108+
EnumNodeVersion.getClassVersion(
109+
node.getIniConfig()
110+
.getBinaryInfo()
111+
.getVersion()))
112+
<= 0);
113+
} catch (Exception e) {
114+
return false;
115+
}
116+
}
79117
}

0 commit comments

Comments
 (0)