Skip to content

Commit 9e3ea6b

Browse files
committed
Merge upstream/develop into feat/request_size
Pulls in 12 new upstream commits since the previous merge. Conflicts resolved: - ArgsTest.java: keep upstream's testAllowShieldedTransactionApiDefault alongside our 7 maxMessageSize tests; one closing brace at end of class. Other touchpoints in our hot zone (Args.java, NodeConfig.java, reference.conf, NodeConfigTest.java, Util.java) auto-merged cleanly; maxMessageSize logic (normalize/parse in NodeConfig.fromConfig, HttpConfig/JsonRpcConfig fields, reference.conf 4M defaults) is preserved. Compile: :common:compileJava + :framework:compileJava + :framework:compileTestJava all SUCCESSFUL.
2 parents da0c6d0 + 2c307c8 commit 9e3ea6b

82 files changed

Lines changed: 5161 additions & 731 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/pr-build.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ jobs:
5454
- name: Build
5555
run: ./gradlew clean build --no-daemon
5656

57+
- name: Toolkit jar smoke test
58+
run: |
59+
set -e
60+
JAR=plugins/build/libs/Toolkit.jar
61+
java -jar "$JAR" help
62+
java -jar "$JAR" db --help
63+
java -jar "$JAR" db archive -h
64+
java -jar "$JAR" keystore --help
65+
5766
build-ubuntu:
5867
name: Build ubuntu24 (JDK 17 / aarch64)
5968
if: ${{ github.event_name == 'pull_request' || inputs.job == 'all' || inputs.job == 'ubuntu' }}
@@ -84,6 +93,15 @@ jobs:
8493
- name: Build
8594
run: ./gradlew clean build --no-daemon
8695

96+
- name: Toolkit jar smoke test
97+
run: |
98+
set -e
99+
JAR=plugins/build/libs/Toolkit.jar
100+
java -jar "$JAR" help
101+
java -jar "$JAR" db --help
102+
java -jar "$JAR" db archive -h
103+
java -jar "$JAR" keystore --help
104+
87105
docker-build-rockylinux:
88106
name: Build rockylinux (JDK 8 / x86_64)
89107
if: ${{ github.event_name == 'pull_request' || inputs.job == 'all' || inputs.job == 'rockylinux' }}
@@ -127,6 +145,15 @@ jobs:
127145
- name: Build
128146
run: ./gradlew clean build --no-daemon
129147

148+
- name: Toolkit jar smoke test
149+
run: |
150+
set -e
151+
JAR=plugins/build/libs/Toolkit.jar
152+
java -jar "$JAR" help
153+
java -jar "$JAR" db --help
154+
java -jar "$JAR" db archive -h
155+
java -jar "$JAR" keystore --help
156+
130157
- name: Test with RocksDB engine
131158
run: ./gradlew :framework:testWithRocksDb --no-daemon
132159

@@ -172,6 +199,15 @@ jobs:
172199
- name: Build
173200
run: ./gradlew clean build --no-daemon --no-build-cache
174201

202+
- name: Toolkit jar smoke test
203+
run: |
204+
set -e
205+
JAR=plugins/build/libs/Toolkit.jar
206+
java -jar "$JAR" help
207+
java -jar "$JAR" db --help
208+
java -jar "$JAR" db archive -h
209+
java -jar "$JAR" keystore --help
210+
175211
- name: Test with RocksDB engine
176212
run: ./gradlew :framework:testWithRocksDb --no-daemon --no-build-cache
177213

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -886,6 +886,22 @@ public static void validator(DynamicPropertiesStore dynamicPropertiesStore,
886886
}
887887
break;
888888
}
889+
case ALLOW_HARDEN_RESOURCE_CALCULATION: {
890+
if (!forkController.pass(ForkBlockVersionEnum.VERSION_4_8_2)) {
891+
throw new ContractValidateException(
892+
"Bad chain parameter id [ALLOW_HARDEN_RESOURCE_CALCULATION]");
893+
}
894+
if (dynamicPropertiesStore.getAllowHardenResourceCalculation() == 1) {
895+
throw new ContractValidateException(
896+
"[ALLOW_HARDEN_RESOURCE_CALCULATION] has been valid, "
897+
+ "no need to propose again");
898+
}
899+
if (value != 1) {
900+
throw new ContractValidateException(
901+
"This value[ALLOW_HARDEN_RESOURCE_CALCULATION] is only allowed to be 1");
902+
}
903+
break;
904+
}
889905
default:
890906
break;
891907
}
@@ -971,7 +987,8 @@ public enum ProposalType { // current value, value range
971987
ALLOW_TVM_BLOB(89), // 0, 1
972988
PROPOSAL_EXPIRE_TIME(92), // (0, 31536003000)
973989
ALLOW_TVM_SELFDESTRUCT_RESTRICTION(94), // 0, 1
974-
ALLOW_TVM_OSAKA(96); // 0, 1
990+
ALLOW_TVM_OSAKA(96), // 0, 1
991+
ALLOW_HARDEN_RESOURCE_CALCULATION(97); // 0, 1
975992

976993
private long code;
977994

actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public static void load(StoreFactory storeFactory) {
4646
VMConfig.initAllowTvmBlob(ds.getAllowTvmBlob());
4747
VMConfig.initAllowTvmSelfdestructRestriction(ds.getAllowTvmSelfdestructRestriction());
4848
VMConfig.initAllowTvmOsaka(ds.getAllowTvmOsaka());
49+
VMConfig.initAllowHardenResourceCalculation(ds.getAllowHardenResourceCalculation());
4950
}
5051
}
5152
}

actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import com.google.common.collect.HashBasedTable;
1010
import com.google.protobuf.ByteString;
11+
import java.math.BigInteger;
1112
import java.util.HashMap;
1213
import java.util.HashSet;
1314
import java.util.Optional;
@@ -17,6 +18,7 @@
1718
import org.bouncycastle.util.Strings;
1819
import org.bouncycastle.util.encoders.Hex;
1920
import org.tron.common.crypto.Hash;
21+
import org.tron.common.math.StrictMathWrapper;
2022
import org.tron.common.parameter.CommonParameter;
2123
import org.tron.common.runtime.vm.DataWord;
2224
import org.tron.common.utils.ByteArray;
@@ -223,7 +225,7 @@ public Pair<Long, Long> getAccountEnergyUsageBalanceAndRestoreSeconds(AccountCap
223225
long totalEnergyLimit = getDynamicPropertiesStore().getTotalEnergyCurrentLimit();
224226
long totalEnergyWeight = getTotalEnergyWeight();
225227

226-
long balance = (long) ((double) newEnergyUsage * totalEnergyWeight / totalEnergyLimit * TRX_PRECISION);
228+
long balance = usageToBalance(newEnergyUsage, totalEnergyWeight, totalEnergyLimit);
227229

228230
return Pair.of(balance, restoreSlots * BLOCK_PRODUCED_INTERVAL / 1_000);
229231
}
@@ -246,11 +248,22 @@ public Pair<Long, Long> getAccountNetUsageBalanceAndRestoreSeconds(AccountCapsul
246248
long totalNetLimit = getDynamicPropertiesStore().getTotalNetLimit();
247249
long totalNetWeight = getTotalNetWeight();
248250

249-
long balance = (long) ((double) newNetUsage * totalNetWeight / totalNetLimit * TRX_PRECISION);
251+
long balance = usageToBalance(newNetUsage, totalNetWeight, totalNetLimit);
250252

251253
return Pair.of(balance, restoreSlots * BLOCK_PRODUCED_INTERVAL / 1_000);
252254
}
253255

256+
private long usageToBalance(long usage, long totalWeight, long totalLimit) {
257+
if (hardenResourceCalculation()) {
258+
return BigInteger.valueOf(usage)
259+
.multiply(BigInteger.valueOf(totalWeight))
260+
.multiply(BigInteger.valueOf(TRX_PRECISION))
261+
.divide(BigInteger.valueOf(totalLimit))
262+
.longValueExact();
263+
}
264+
return (long) ((double) usage * totalWeight / totalLimit * TRX_PRECISION);
265+
}
266+
254267
@Override
255268
public AssetIssueCapsule getAssetIssue(byte[] tokenId) {
256269
byte[] tokenIdWithoutLeadingZero = ByteUtil.stripLeadingZeroes(tokenId);
@@ -896,8 +909,19 @@ private long recover(long lastUsage, long lastTime, long now, long personalWindo
896909
}
897910

898911
private long increase(long lastUsage, long usage, long lastTime, long now, long windowSize) {
899-
long averageLastUsage = divideCeil(lastUsage * precision, windowSize);
900-
long averageUsage = divideCeil(usage * precision, windowSize);
912+
long averageLastUsage;
913+
long averageUsage;
914+
if (hardenResourceCalculation()) {
915+
BigInteger biPrecision = BigInteger.valueOf(precision);
916+
BigInteger biWindowSize = BigInteger.valueOf(windowSize);
917+
averageLastUsage = divideCeilExact(
918+
BigInteger.valueOf(lastUsage).multiply(biPrecision), biWindowSize);
919+
averageUsage = divideCeilExact(
920+
BigInteger.valueOf(usage).multiply(biPrecision), biWindowSize);
921+
} else {
922+
averageLastUsage = divideCeil(lastUsage * precision, windowSize);
923+
averageUsage = divideCeil(usage * precision, windowSize);
924+
}
901925

902926
if (lastTime != now) {
903927
assert now > lastTime;
@@ -917,21 +941,46 @@ private long divideCeil(long numerator, long denominator) {
917941
return (numerator / denominator) + ((numerator % denominator) > 0 ? 1 : 0);
918942
}
919943

944+
private long divideCeilExact(BigInteger numerator, BigInteger denominator) {
945+
BigInteger[] divRem = numerator.divideAndRemainder(denominator);
946+
long result = divRem[0].longValueExact();
947+
if (divRem[1].signum() > 0) {
948+
result = StrictMathWrapper.addExact(result, 1);
949+
}
950+
return result;
951+
}
952+
920953
private long getUsage(long usage, long windowSize) {
954+
if (hardenResourceCalculation()) {
955+
return BigInteger.valueOf(usage)
956+
.multiply(BigInteger.valueOf(windowSize))
957+
.divide(BigInteger.valueOf(precision))
958+
.longValueExact();
959+
}
921960
return usage * windowSize / precision;
922961
}
923962

963+
private boolean hardenResourceCalculation() {
964+
return VMConfig.allowHardenResourceCalculation();
965+
}
966+
924967
public long calculateGlobalEnergyLimit(AccountCapsule accountCapsule) {
925968
long frozeBalance = accountCapsule.getAllFrozenBalanceForEnergy();
926-
if (frozeBalance < 1_000_000L) {
969+
if (frozeBalance < TRX_PRECISION) {
927970
return 0;
928971
}
929-
long energyWeight = frozeBalance / 1_000_000L;
972+
long energyWeight = frozeBalance / TRX_PRECISION;
930973
long totalEnergyLimit = getDynamicPropertiesStore().getTotalEnergyCurrentLimit();
931974
long totalEnergyWeight = getDynamicPropertiesStore().getTotalEnergyWeight();
932975

933976
assert totalEnergyWeight > 0;
934977

978+
if (hardenResourceCalculation()) {
979+
return BigInteger.valueOf(energyWeight)
980+
.multiply(BigInteger.valueOf(totalEnergyLimit))
981+
.divide(BigInteger.valueOf(totalEnergyWeight))
982+
.longValueExact();
983+
}
935984
return (long) (energyWeight * ((double) totalEnergyLimit / totalEnergyWeight));
936985
}
937986

build.gradle

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ ext.archInfo = [
3535
// https://github.com/grpc/grpc-java/issues/7690
3636
// https://github.com/grpc/grpc-java/pull/12319, Add support for macOS aarch64 with universal binary
3737
// https://github.com/grpc/grpc-java/pull/11371 , 1.64.x is not supported CentOS 7.
38-
ProtocGenVersion: isArm64 && isMac ? '1.76.0' : '1.60.0'
38+
ProtocGenVersion: isArm64 || isMac ? '1.81.0' : '1.60.0'
3939
],
4040
VMOptions: isArm64 ? "${rootDir}/gradle/jdk17/java-tron.vmoptions" : "${rootDir}/gradle/java-tron.vmoptions"
4141
]
@@ -81,16 +81,17 @@ subprojects {
8181
}
8282

8383
dependencies {
84-
implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
85-
implementation group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.25'
84+
implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.36'
85+
implementation group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.36'
86+
implementation group: 'org.slf4j', name: 'jul-to-slf4j', version: '1.7.36'
8687
implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.13'
8788
implementation "com.google.code.findbugs:jsr305:3.0.0"
8889
implementation group: 'org.springframework', name: 'spring-context', version: "${springVersion}"
8990
implementation "org.apache.commons:commons-lang3:3.4"
9091
implementation group: 'org.apache.commons', name: 'commons-math', version: '2.2'
9192
implementation "org.apache.commons:commons-collections4:4.1"
9293
implementation group: 'joda-time', name: 'joda-time', version: '2.3'
93-
implementation group: 'org.bouncycastle', name: 'bcprov-jdk18on', version: '1.79'
94+
implementation group: 'org.bouncycastle', name: 'bcprov-jdk18on', version: '1.84'
9495

9596
compileOnly 'org.projectlombok:lombok:1.18.34'
9697
annotationProcessor 'org.projectlombok:lombok:1.18.34'

chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
import java.util.Map;
3333
import java.util.Map.Entry;
3434
import java.util.Set;
35+
import java.util.concurrent.ScheduledExecutorService;
36+
import java.util.concurrent.ScheduledFuture;
37+
import java.util.concurrent.TimeUnit;
3538
import java.util.concurrent.locks.ReadWriteLock;
3639
import java.util.concurrent.locks.ReentrantReadWriteLock;
3740
import java.util.stream.Collectors;
@@ -45,6 +48,7 @@
4548
import org.iq80.leveldb.ReadOptions;
4649
import org.iq80.leveldb.WriteBatch;
4750
import org.iq80.leveldb.WriteOptions;
51+
import org.tron.common.es.ExecutorServiceManager;
4852
import org.tron.common.parameter.CommonParameter;
4953
import org.tron.common.storage.WriteOptionsWrapper;
5054
import org.tron.common.storage.metric.DbStat;
@@ -61,6 +65,11 @@
6165
public class LevelDbDataSourceImpl extends DbStat implements DbSourceInter<byte[]>,
6266
Iterable<Entry<byte[], byte[]>>, Instance<LevelDbDataSourceImpl> {
6367

68+
/** First watchdog WARN fires this many seconds after factory.open() begins. */
69+
private static final long OPEN_WATCHDOG_INITIAL_DELAY_SEC = 60;
70+
/** Subsequent watchdog WARN lines are emitted on this interval. */
71+
private static final long OPEN_WATCHDOG_PERIOD_SEC = 30;
72+
6473
private String dataBaseName;
6574
private DB database;
6675
private volatile boolean alive;
@@ -121,6 +130,14 @@ private void openDatabase(Options dbOptions) throws IOException {
121130
if (!Files.isSymbolicLink(dbPath.getParent())) {
122131
Files.createDirectories(dbPath.getParent());
123132
}
133+
final long openStartNs = System.nanoTime();
134+
ScheduledExecutorService watchdog = ExecutorServiceManager
135+
.newSingleThreadScheduledExecutor("db-open-watchdog-" + dataBaseName, true);
136+
ScheduledFuture<?> watchdogTask = watchdog.scheduleAtFixedRate(
137+
() -> logSlowOpen(dbPath, openStartNs),
138+
OPEN_WATCHDOG_INITIAL_DELAY_SEC,
139+
OPEN_WATCHDOG_PERIOD_SEC,
140+
TimeUnit.SECONDS);
124141
try {
125142
DbSourceInter.checkOrInitEngine(getEngine(), dbPath.toString(),
126143
TronError.ErrCode.LEVELDB_INIT);
@@ -139,6 +156,28 @@ private void openDatabase(Options dbOptions) throws IOException {
139156
logger.error("Open Database {} failed", dataBaseName, e);
140157
}
141158
throw new TronError(e, TronError.ErrCode.LEVELDB_INIT);
159+
} finally {
160+
watchdogTask.cancel(false);
161+
watchdog.shutdownNow();
162+
}
163+
}
164+
165+
/**
166+
* Emits a WARN when factory.open() is still blocked — usually because the
167+
* MANIFEST has grown large enough to make replay expensive.
168+
*/
169+
void logSlowOpen(Path dbPath, long startNs) {
170+
try {
171+
long elapsedSec = TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startNs);
172+
logger.warn("DB {} open still in progress after {}s. path={}. "
173+
+ "This startup will complete; to speed up future restarts, run "
174+
+ "`java -jar Toolkit.jar db archive -d {}` before the next startup "
175+
+ "to rebuild the MANIFEST (the tool requires an exclusive DB lock, "
176+
+ "so it cannot run while the node is up).",
177+
dataBaseName, elapsedSec, dbPath, parentPath);
178+
} catch (Exception e) {
179+
// Purely observational - never let the watchdog disrupt startup.
180+
logger.debug("db-open-watchdog failure for {}: {}", dataBaseName, e.getMessage());
142181
}
143182
}
144183

chainbase/src/main/java/org/tron/common/storage/metric/DbStat.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ protected void statProperty() {
1717
double size = Double.parseDouble(tmp[2]) * 1048576.0;
1818
Metrics.gaugeSet(MetricKeys.Gauge.DB_SST_LEVEL, files, getEngine(), getName(), level);
1919
Metrics.gaugeSet(MetricKeys.Gauge.DB_SIZE_BYTES, size, getEngine(), getName(), level);
20-
logger.info("DB {}, level:{},files:{},size:{} M",
20+
logger.debug("DB {}, level:{},files:{},size:{} M",
2121
getName(), level, files, size / 1048576.0);
2222
});
2323
} catch (Exception e) {

chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.util.List;
3636
import java.util.concurrent.ExecutorService;
3737
import java.util.concurrent.Future;
38+
import java.util.concurrent.TimeUnit;
3839
import java.util.concurrent.atomic.AtomicInteger;
3940
import lombok.Getter;
4041
import lombok.Setter;
@@ -94,6 +95,8 @@ public class TransactionCapsule implements ProtoCapsule<Transaction> {
9495
.newFixedThreadPool(esName, CommonParameter.getInstance()
9596
.getValidContractProtoThreadNum());
9697
private static final String OWNER_ADDRESS = "ownerAddress_";
98+
// 2-6 ms in general, so we set 50 ms as the threshold for slow signature verification.
99+
private static final long SLOW_SIG_VERIFY_MS = 50;
97100

98101
private Transaction transaction;
99102
@Setter
@@ -648,6 +651,7 @@ public boolean validatePubSignature(AccountStore accountStore,
648651

649652
byte[] hash = getTransactionId().getBytes();
650653

654+
long startNs = System.nanoTime();
651655
try {
652656
if (!validateSignature(this.transaction, hash, accountStore, dynamicPropertiesStore)) {
653657
isVerified = false;
@@ -656,12 +660,27 @@ public boolean validatePubSignature(AccountStore accountStore,
656660
} catch (SignatureException | PermissionException | SignatureFormatException e) {
657661
isVerified = false;
658662
throw new ValidateSignatureException(e.getMessage());
663+
} finally {
664+
logSlowSigVerify(startNs);
659665
}
660666
isVerified = true;
661667
}
662668
return true;
663669
}
664670

671+
/**
672+
* WARN-logs when a single signature verification exceeds
673+
* {@link #SLOW_SIG_VERIFY_MS}. Package-private so it can be exercised from
674+
* tests without forcing a real slow crypto path.
675+
*/
676+
void logSlowSigVerify(long startNs) {
677+
long costMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
678+
if (costMs > SLOW_SIG_VERIFY_MS) {
679+
logger.warn("slow verify: txId={}, sigCount={}, cost={} ms",
680+
getTransactionId(), this.transaction.getSignatureCount(), costMs);
681+
}
682+
}
683+
665684
/**
666685
* validate signature
667686
*/

0 commit comments

Comments
 (0)