From c158599c97e1a77cd4d8d903d0fc33a29d94f81b Mon Sep 17 00:00:00 2001 From: halibobo1205 <82020050+halibobo1205@users.noreply.github.com> Date: Wed, 4 Feb 2026 21:57:02 +0800 Subject: [PATCH 1/4] Merge master to develop (#6543) --- README.md | 243 +++-- .../core/actuator/AssetIssueActuator.java | 12 + .../core/actuator/ProposalCreateActuator.java | 3 +- .../actuator/ShieldedTransferActuator.java | 34 +- .../org/tron/core/utils/ProposalUtil.java | 38 +- .../java/org/tron/core/vm/EnergyCost.java | 9 + .../org/tron/core/vm/OperationActions.java | 15 + .../org/tron/core/vm/OperationRegistry.java | 11 + .../tron/core/vm/PrecompiledContracts.java | 56 +- .../src/main/java/org/tron/core/vm/VM.java | 5 +- .../java/org/tron/core/vm/VMConstant.java | 1 + .../org/tron/core/vm/config/ConfigLoader.java | 1 + .../tron/core/vm/program/ContractState.java | 10 + .../java/org/tron/core/vm/program/Memory.java | 2 +- .../org/tron/core/vm/program/Program.java | 114 ++- .../vm/program/invoke/ProgramInvokeImpl.java | 5 +- .../tron/core/vm/repository/Repository.java | 4 + .../core/vm/repository/RepositoryImpl.java | 33 + .../org/tron/core/vm/repository/Type.java | 2 +- .../org/tron/core/vm/repository/Value.java | 2 +- .../vm/repository/WriteOptionsWrapper.java | 24 - build.gradle | 92 +- chainbase/build.gradle | 1 - .../common/storage/WriteOptionsWrapper.java | 29 +- .../leveldb/LevelDbDataSourceImpl.java | 94 +- .../rocksdb/RocksDbDataSourceImpl.java | 476 ++++----- .../org/tron/common/utils/LocalWitnesses.java | 37 +- .../org/tron/common/utils/StorageUtils.java | 16 +- .../tron/common/zksnark/JLibrustzcash.java | 107 +- .../org/tron/common/zksnark/JLibsodium.java | 35 +- .../tron/core/capsule/TransactionCapsule.java | 11 +- .../tron/core/capsule/utils/MarketUtils.java | 79 +- .../java/org/tron/core/db/TronDatabase.java | 26 +- .../tron/core/db/TronStoreWithRevoking.java | 21 +- .../tron/core/db/common/DbSourceInter.java | 55 +- .../db/common/iterator/RockStoreIterator.java | 13 +- .../db/common/iterator/StoreIterator.java | 5 + .../org/tron/core/db2/common/LevelDB.java | 3 +- .../org/tron/core/db2/common/RocksDB.java | 5 +- .../org/tron/core/db2/common/TxCacheDB.java | 11 +- .../tron/core/db2/core/SnapshotManager.java | 13 +- .../org/tron/core/store/AccountStore.java | 10 +- .../tron/core/store/CheckPointV2Store.java | 17 +- .../core/store/DynamicPropertiesStore.java | 34 + .../store/MarketPairPriceToOrderStore.java | 23 +- .../org/tron/core/store/WitnessStore.java | 2 +- common/build.gradle | 39 +- .../org/tron/common/exit/ExitManager.java | 2 +- .../java/org/tron/common/log/LogService.java | 5 +- .../tron/common/logsfilter/FilterQuery.java | 14 +- .../common/parameter/CommonParameter.java | 33 +- .../tron/common/setting/RocksDbSettings.java | 123 ++- .../java/org/tron/common/utils/ByteArray.java | 2 +- .../org/tron/common/utils/StringUtil.java | 17 + .../tron/common/utils/TimeoutInterceptor.java | 30 + .../src/main/java/org/tron/core/Constant.java | 19 + .../org/tron/core/config/CommonConfig.java | 2 - .../java/org/tron/core/config/Parameter.java | 7 +- .../org/tron/core/config/args/Storage.java | 9 + .../MaintenanceUnavailableException.java | 20 + .../org/tron/core/exception/P2pException.java | 1 + .../org/tron/core/exception/TronError.java | 4 +- .../jsonrpc/JsonRpcExceedLimitException.java | 16 + .../exception/jsonrpc/JsonRpcException.java | 32 + .../JsonRpcInternalException.java | 8 +- .../JsonRpcInvalidParamsException.java | 4 +- .../JsonRpcInvalidRequestException.java | 4 +- .../JsonRpcMethodNotFoundException.java | 4 +- .../JsonRpcTooManyResultException.java | 4 +- .../org/tron/core/vm/config/VMConfig.java | 10 + .../java/org/tron/common/crypto/ECKey.java | 3 +- .../main/java/org/tron/common/crypto/Rsv.java | 26 + .../java/org/tron/common/crypto/sm2/SM2.java | 3 +- .../org/tron/common/crypto/zksnark/Fp12.java | 2 +- .../org/tron/common/crypto/zksnark/Fp2.java | 2 +- .../org/tron/common/crypto/zksnark/Fp6.java | 2 +- docker/arm64/Dockerfile | 33 + framework/build.gradle | 53 +- .../tron/common/application/RpcService.java | 31 +- .../application/TronApplicationContext.java | 2 + .../org/tron/common/backup/BackupManager.java | 2 +- .../common/logsfilter/EventPluginLoader.java | 10 +- .../src/main/java/org/tron/core/Wallet.java | 234 +++-- .../java/org/tron/core/config/args/Args.java | 182 ++-- .../core/config/args/WitnessInitializer.java | 149 +++ .../tron/core/consensus/ConsensusService.java | 7 +- .../tron/core/consensus/ProposalService.java | 8 + .../main/java/org/tron/core/db/Manager.java | 147 ++- .../core/metrics/node/NodeMetricManager.java | 7 +- .../tron/core/net/P2pEventHandlerImpl.java | 10 +- .../org/tron/core/net/P2pRateLimiter.java | 32 + .../net/message/handshake/HelloMessage.java | 7 +- .../FetchInvDataMsgHandler.java | 97 +- .../SyncBlockChainMsgHandler.java | 8 + .../TransactionsMsgHandler.java | 5 +- .../tron/core/net/peer/PeerConnection.java | 23 +- .../tron/core/net/peer/PeerStatusCheck.java | 4 + .../service/handshake/HandshakeService.java | 20 +- .../core/net/service/relay/RelayService.java | 8 +- .../core/net/service/sync/SyncService.java | 11 +- .../org/tron/core/services/RpcApiService.java | 102 +- .../core/services/event/BlockEventCache.java | 9 +- .../core/services/event/BlockEventGet.java | 53 +- .../services/event/HistoryEventService.java | 19 +- .../services/event/RealtimeEventService.java | 43 +- .../services/event/SolidEventService.java | 37 +- .../services/filter/HttpApiAccessFilter.java | 3 +- .../core/services/filter/HttpInterceptor.java | 3 +- .../filter/LiteFnQueryHttpFilter.java | 3 +- .../services/http/FullNodeHttpApiService.java | 6 + .../GetPaginatedNowWitnessListServlet.java | 52 + .../services/http/GetProposalByIdServlet.java | 2 +- .../services/http/RateLimiterServlet.java | 5 +- .../solidity/SolidityNodeHttpApiService.java | 5 + .../http/PBFT/HttpApiOnPBFTService.java | 2 +- .../RpcApiServiceOnSolidity.java | 7 + ...inatedNowWitnessListOnSolidityServlet.java | 24 + .../solidity/HttpApiOnSolidityService.java | 8 +- .../core/services/jsonrpc/JsonRpcApiUtil.java | 2 +- .../jsonrpc/JsonRpcErrorResolver.java | 81 ++ .../core/services/jsonrpc/JsonRpcServlet.java | 1 + .../core/services/jsonrpc/TronJsonRpc.java | 56 +- .../services/jsonrpc/TronJsonRpcImpl.java | 221 +++- .../jsonrpc/filters/LogBlockQuery.java | 84 +- .../services/jsonrpc/filters/LogFilter.java | 2 +- .../jsonrpc/filters/LogFilterAndResult.java | 2 +- .../jsonrpc/filters/LogFilterWrapper.java | 2 +- .../services/jsonrpc/filters/LogMatch.java | 16 +- .../jsonrpc/types/BuildArguments.java | 4 +- .../services/jsonrpc/types/CallArguments.java | 4 +- .../jsonrpc/types/TransactionReceipt.java | 206 ++-- .../jsonrpc/types/TransactionResult.java | 16 +- .../org/tron/core/zen/ZksnarkInitService.java | 44 +- .../main/java/org/tron/program/DBConvert.java | 413 -------- .../main/java/org/tron/program/FullNode.java | 10 +- .../org/tron/program/KeystoreFactory.java | 12 +- .../java/org/tron/program/SolidityNode.java | 27 +- .../main/java/org/tron/program/Version.java | 6 +- .../src/main/resources/config-localtest.conf | 1 + framework/src/main/resources/config.conf | 462 ++++++--- .../http/InvalidMediaTypeException.java | 61 ++ .../org/springframework/http/MediaType.java | 841 +++++++++++++++ .../test/java/org/tron/common/BaseTest.java | 8 + .../test/java/org/tron/common/EntityTest.java | 39 + .../java/org/tron/common/ParameterTest.java | 6 + .../tron/common/backup/BackupServerTest.java | 3 +- .../org/tron/common/crypto/ECKeyTest.java | 6 + .../org/tron/common/crypto/SM2KeyTest.java | 6 + .../logsfilter/NativeMessageQueueTest.java | 19 +- .../vm/BatchValidateSignContractTest.java | 8 + .../tron/common/runtime/vm/Create2Test.java | 2 +- .../common/runtime/vm/OperationsTest.java | 121 +++ .../vm/ValidateMultiSignContractTest.java | 8 + .../common/storage/CheckOrInitEngineTest.java | 263 +++++ .../leveldb/LevelDbDataSourceImplTest.java | 182 +++- .../RocksDbDataSourceImplTest.java | 186 +++- .../org/tron/common/utils/FileUtilTest.java | 1 + .../org/tron/common/utils/HashCodeTest.java | 23 + .../tron/common/utils/ObjectSizeUtilTest.java | 62 -- .../common/utils/client/Configuration.java | 11 +- .../common/utils/client/utils/HttpMethed.java | 2 +- .../utils/client/utils/TransactionUtils.java | 15 +- .../java/org/tron/core/CoreExceptionTest.java | 10 +- .../core/CreateCommonTransactionTest.java | 47 - .../java/org/tron/core/ShieldWalletTest.java | 20 +- .../tron/core/ShieldedTRC20BuilderTest.java | 14 +- .../java/org/tron/core/WalletMockTest.java | 6 +- .../test/java/org/tron/core/WalletTest.java | 153 +++ .../core/actuator/AssetIssueActuatorTest.java | 50 + .../ExchangeTransactionActuatorTest.java | 105 +- .../ShieldedTransferActuatorTest.java | 4 +- .../core/actuator/utils/ProposalUtilTest.java | 104 ++ .../actuator/vm/ProgramTraceListenerTest.java | 28 +- .../core/actuator/vm/SerializersTest.java | 12 + .../tron/core/capsule/BlockCapsuleTest.java | 2 +- .../capsule/utils/ExchangeProcessorTest.java | 65 +- .../org/tron/core/config/args/ArgsTest.java | 11 +- .../core/config/args/LocalWitnessTest.java | 121 ++- .../config/args/WitnessInitializerTest.java | 268 +++++ .../org/tron/core/db/AccountStoreTest.java | 24 + .../java/org/tron/core/db/DBIteratorTest.java | 5 +- .../java/org/tron/core/db/ManagerTest.java | 78 +- .../tron/core/db/TransactionExpireTest.java | 10 +- .../org/tron/core/db/WitnessStoreTest.java | 4 +- .../java/org/tron/core/db2/ChainbaseTest.java | 5 +- .../org/tron/core/db2/CheckpointV2Test.java | 14 +- .../db2/RevokingDbWithCacheNewValueTest.java | 13 +- .../org/tron/core/db2/SnapshotImplTest.java | 15 +- .../tron/core/db2/SnapshotManagerTest.java | 14 +- .../org/tron/core/db2/SnapshotRootTest.java | 27 +- .../tron/core/event/BlockEventCacheTest.java | 24 +- .../tron/core/event/BlockEventGetTest.java | 69 +- .../core/event/HistoryEventServiceTest.java | 3 +- .../tron/core/exception/TronErrorTest.java | 100 +- .../org/tron/core/jsonrpc/ApiUtilTest.java | 13 + .../java/org/tron/core/jsonrpc/BloomTest.java | 2 +- .../core/jsonrpc/ConcurrentHashMapTest.java | 10 +- .../org/tron/core/jsonrpc/JsonRpcTest.java | 2 +- .../tron/core/jsonrpc/JsonrpcServiceTest.java | 135 ++- .../tron/core/jsonrpc/LogBlockQueryTest.java | 108 ++ .../core/jsonrpc/LogMatchExactlyTest.java | 15 +- .../core/jsonrpc/SectionBloomStoreTest.java | 2 + .../prometheus/PrometheusApiServiceTest.java | 2 +- .../test/java/org/tron/core/net/BaseNet.java | 134 --- .../java/org/tron/core/net/BaseNetTest.java | 16 - .../core/net/P2pEventHandlerImplTest.java | 14 +- .../org/tron/core/net/P2pRateLimiterTest.java | 23 + .../FetchInvDataMsgHandlerTest.java | 66 ++ .../messagehandler/MessageHandlerTest.java | 15 +- .../messagehandler/PbftMsgHandlerTest.java | 15 +- .../SyncBlockChainMsgHandlerTest.java | 48 +- .../core/net/peer/PeerConnectionTest.java | 16 + .../tron/core/net/peer/PeerManagerTest.java | 24 + .../nodepersist/NodePersistServiceTest.java | 40 + .../core/net/services/AdvServiceTest.java | 3 + .../services/EffectiveCheckServiceTest.java | 43 +- .../net/services/HandShakeServiceTest.java | 88 +- .../core/net/services/RelayServiceTest.java | 122 ++- .../net/services/ResilienceServiceTest.java | 67 +- .../core/net/services/SyncServiceTest.java | 11 + .../core/services/DelegationServiceTest.java | 81 +- .../core/services/NodeInfoServiceTest.java | 70 +- .../core/services/ProposalServiceTest.java | 20 + .../core/services/RpcApiServicesTest.java | 79 +- .../org/tron/core/services/WalletApiTest.java | 43 +- .../filter/HttpApiAccessFilterTest.java | 2 +- .../LiteFnQueryGrpcInterceptorTest.java | 38 +- .../filter/LiteFnQueryHttpFilterTest.java | 2 +- .../filter/RpcApiAccessInterceptorTest.java | 36 +- .../services/http/GetRewardServletTest.java | 8 +- .../core/services/http/HttpServletTest.java | 4 + .../services/jsonrpc/BuildArgumentsTest.java | 4 +- .../services/jsonrpc/CallArgumentsTest.java | 4 +- .../jsonrpc/JsonRpcErrorResolverTest.java | 75 ++ .../jsonrpc/TransactionReceiptTest.java | 69 +- .../jsonrpc/TransactionResultTest.java | 44 +- .../core/services/stop/BlockTimeStopTest.java | 6 +- .../services/stop/ConditionallyStopTest.java | 113 +-- .../tron/core/zksnark/LibrustzcashTest.java | 13 +- .../tron/core/zksnark/SaplingNoteTest.java | 2 +- .../tron/core/zksnark/SendCoinShieldTest.java | 38 +- .../core/zksnark/ShieldedReceiveTest.java | 60 +- .../org/tron/keystroe/CredentialsTest.java | 23 +- .../java/org/tron/program/DBConvertTest.java | 116 --- .../org/tron/program/SolidityNodeTest.java | 26 +- .../src/test/resources/config-localtest.conf | 3 +- .../src/test/resources/config-test-index.conf | 1 + .../test/resources/config-test-mainnet.conf | 1 + framework/src/test/resources/config-test.conf | 5 +- framework/src/test/resources/logback-test.xml | 4 +- gradle/jdk17/java-tron.vmoptions | 8 + gradle/verification-metadata.xml | 913 +++++++++-------- install_dependencies.sh | 957 ++++++++++++++++++ jitpack.yml | 2 +- platform/build.gradle | 17 + .../arm/org/tron/common/math/MathWrapper.java | 254 +++++ .../MarketOrderPriceComparatorForRocksDB.java | 32 + .../common/org/tron/common/arch/Arch.java | 91 ++ .../tron/common/utils/MarketComparator.java | 114 +-- .../MarketOrderPriceComparatorForLevelDB.java | 4 +- .../org/tron/common/math/MathWrapper.java | 0 .../MarketOrderPriceComparatorForRocksDB.java | 7 +- plugins/README.md | 12 +- plugins/build.gradle | 43 +- .../arm/org/tron/plugins/ArchiveManifest.java | 29 + .../java/arm/org/tron/plugins/DbArchive.java | 50 + .../{ => common}/org/tron/plugins/Db.java | 0 .../org/tron/plugins/DbConvert.java | 59 +- .../{ => common}/org/tron/plugins/DbCopy.java | 0 .../{ => common}/org/tron/plugins/DbLite.java | 11 +- .../{ => common}/org/tron/plugins/DbMove.java | 0 .../{ => common}/org/tron/plugins/DbRoot.java | 24 +- .../org/tron/plugins/Toolkit.java | 0 .../org/tron/plugins/utils/ByteArray.java | 0 .../org/tron/plugins/utils/CryptoUitls.java | 0 .../org/tron/plugins/utils/DBUtils.java | 57 +- .../org/tron/plugins/utils/FileUtils.java | 0 .../org/tron/plugins/utils/MarketUtils.java | 68 ++ .../org/tron/plugins/utils/MerkleRoot.java | 0 .../org/tron/plugins/utils/Sha256Hash.java | 0 .../tron/plugins/utils/db/DBInterface.java | 39 + .../org/tron/plugins/utils/db/DBIterator.java | 0 .../org/tron/plugins/utils/db/DbTool.java | 24 +- .../tron/plugins/utils/db/LevelDBImpl.java | 7 +- .../plugins/utils/db/LevelDBIterator.java | 0 .../tron/plugins/utils/db/RockDBIterator.java | 12 +- .../tron/plugins/utils/db/RocksDBImpl.java | 97 ++ .../MarketOrderPriceComparatorForLevelDB.java | 28 - .../MarketOrderPriceComparatorForRockDB.java | 38 - .../tron/plugins/utils/db/DBInterface.java | 23 - .../tron/plugins/utils/db/RocksDBImpl.java | 69 -- .../org/tron/plugins/ArchiveManifest.java | 3 +- .../{ => x86}/org/tron/plugins/DbArchive.java | 3 +- .../java/org/tron/plugins/DbCopyTest.java | 19 +- .../java/org/tron/plugins/DbLiteTest.java | 32 +- .../java/org/tron/plugins/DbMoveTest.java | 79 +- .../java/org/tron/plugins/DbRootTest.java | 21 +- .../test/java/org/tron/plugins/DbTest.java | 44 +- .../{ => leveldb}/ArchiveManifestTest.java | 46 +- .../plugins/{ => leveldb}/DbArchiveTest.java | 45 +- .../plugins/{ => leveldb}/DbConvertTest.java | 16 +- .../{ => leveldb}/DbLiteLevelDbTest.java | 3 +- .../{ => leveldb}/DbLiteLevelDbV2Test.java | 3 +- .../{ => rocksdb}/DbLiteRocksDbTest.java | 3 +- .../plugins/rocksdb/DbLiteRocksDbV2Test.java | 13 + plugins/src/test/resources/config.conf | 6 - protocol/build.gradle | 7 +- protocol/src/main/protos/api/api.proto | 6 + protocol/src/main/protos/core/Tron.proto | 4 +- .../core/contract/asset_issue_contract.proto | 4 +- settings.gradle | 1 + start.sh.simple | 192 ++++ 312 files changed, 10096 insertions(+), 4296 deletions(-) delete mode 100644 actuator/src/main/java/org/tron/core/vm/repository/WriteOptionsWrapper.java create mode 100644 common/src/main/java/org/tron/common/utils/TimeoutInterceptor.java create mode 100644 common/src/main/java/org/tron/core/exception/MaintenanceUnavailableException.java create mode 100644 common/src/main/java/org/tron/core/exception/jsonrpc/JsonRpcExceedLimitException.java create mode 100644 common/src/main/java/org/tron/core/exception/jsonrpc/JsonRpcException.java rename common/src/main/java/org/tron/core/exception/{ => jsonrpc}/JsonRpcInternalException.java (53%) rename common/src/main/java/org/tron/core/exception/{ => jsonrpc}/JsonRpcInvalidParamsException.java (68%) rename common/src/main/java/org/tron/core/exception/{ => jsonrpc}/JsonRpcInvalidRequestException.java (69%) rename common/src/main/java/org/tron/core/exception/{ => jsonrpc}/JsonRpcMethodNotFoundException.java (68%) rename common/src/main/java/org/tron/core/exception/{ => jsonrpc}/JsonRpcTooManyResultException.java (69%) create mode 100644 crypto/src/main/java/org/tron/common/crypto/Rsv.java create mode 100644 docker/arm64/Dockerfile create mode 100644 framework/src/main/java/org/tron/core/config/args/WitnessInitializer.java create mode 100644 framework/src/main/java/org/tron/core/net/P2pRateLimiter.java create mode 100644 framework/src/main/java/org/tron/core/services/http/GetPaginatedNowWitnessListServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetPaginatedNowWitnessListOnSolidityServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcErrorResolver.java delete mode 100644 framework/src/main/java/org/tron/program/DBConvert.java create mode 100644 framework/src/test/java/org/springframework/http/InvalidMediaTypeException.java create mode 100644 framework/src/test/java/org/springframework/http/MediaType.java create mode 100644 framework/src/test/java/org/tron/common/storage/CheckOrInitEngineTest.java rename framework/src/test/java/org/tron/common/storage/{leveldb => rocksdb}/RocksDbDataSourceImplTest.java (71%) create mode 100644 framework/src/test/java/org/tron/common/utils/HashCodeTest.java delete mode 100644 framework/src/test/java/org/tron/common/utils/ObjectSizeUtilTest.java delete mode 100644 framework/src/test/java/org/tron/core/CreateCommonTransactionTest.java create mode 100644 framework/src/test/java/org/tron/core/actuator/vm/SerializersTest.java create mode 100644 framework/src/test/java/org/tron/core/config/args/WitnessInitializerTest.java create mode 100644 framework/src/test/java/org/tron/core/jsonrpc/LogBlockQueryTest.java delete mode 100644 framework/src/test/java/org/tron/core/net/BaseNet.java delete mode 100644 framework/src/test/java/org/tron/core/net/BaseNetTest.java create mode 100644 framework/src/test/java/org/tron/core/net/P2pRateLimiterTest.java create mode 100644 framework/src/test/java/org/tron/core/net/service/nodepersist/NodePersistServiceTest.java create mode 100644 framework/src/test/java/org/tron/core/services/jsonrpc/JsonRpcErrorResolverTest.java delete mode 100644 framework/src/test/java/org/tron/program/DBConvertTest.java create mode 100644 gradle/jdk17/java-tron.vmoptions create mode 100755 install_dependencies.sh create mode 100644 platform/build.gradle create mode 100644 platform/src/main/java/arm/org/tron/common/math/MathWrapper.java create mode 100644 platform/src/main/java/arm/org/tron/common/utils/MarketOrderPriceComparatorForRocksDB.java create mode 100644 platform/src/main/java/common/org/tron/common/arch/Arch.java rename plugins/src/main/java/org/tron/plugins/utils/MarketUtils.java => platform/src/main/java/common/org/tron/common/utils/MarketComparator.java (50%) rename {chainbase/src/main/java => platform/src/main/java/common}/org/tron/common/utils/MarketOrderPriceComparatorForLevelDB.java (87%) rename {common/src/main/java => platform/src/main/java/x86}/org/tron/common/math/MathWrapper.java (100%) rename chainbase/src/main/java/org/tron/common/utils/MarketOrderPriceComparatorForRockDB.java => platform/src/main/java/x86/org/tron/common/utils/MarketOrderPriceComparatorForRocksDB.java (70%) create mode 100644 plugins/src/main/java/arm/org/tron/plugins/ArchiveManifest.java create mode 100644 plugins/src/main/java/arm/org/tron/plugins/DbArchive.java rename plugins/src/main/java/{ => common}/org/tron/plugins/Db.java (100%) rename plugins/src/main/java/{ => common}/org/tron/plugins/DbConvert.java (89%) rename plugins/src/main/java/{ => common}/org/tron/plugins/DbCopy.java (100%) rename plugins/src/main/java/{ => common}/org/tron/plugins/DbLite.java (99%) rename plugins/src/main/java/{ => common}/org/tron/plugins/DbMove.java (100%) rename plugins/src/main/java/{ => common}/org/tron/plugins/DbRoot.java (84%) rename plugins/src/main/java/{ => common}/org/tron/plugins/Toolkit.java (100%) rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/ByteArray.java (100%) rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/CryptoUitls.java (100%) rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/DBUtils.java (72%) rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/FileUtils.java (100%) create mode 100644 plugins/src/main/java/common/org/tron/plugins/utils/MarketUtils.java rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/MerkleRoot.java (100%) rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/Sha256Hash.java (100%) create mode 100644 plugins/src/main/java/common/org/tron/plugins/utils/db/DBInterface.java rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/db/DBIterator.java (100%) rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/db/DbTool.java (85%) rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/db/LevelDBImpl.java (83%) rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/db/LevelDBIterator.java (100%) rename plugins/src/main/java/{ => common}/org/tron/plugins/utils/db/RockDBIterator.java (76%) create mode 100644 plugins/src/main/java/common/org/tron/plugins/utils/db/RocksDBImpl.java delete mode 100644 plugins/src/main/java/org/tron/plugins/comparator/MarketOrderPriceComparatorForLevelDB.java delete mode 100644 plugins/src/main/java/org/tron/plugins/comparator/MarketOrderPriceComparatorForRockDB.java delete mode 100644 plugins/src/main/java/org/tron/plugins/utils/db/DBInterface.java delete mode 100644 plugins/src/main/java/org/tron/plugins/utils/db/RocksDBImpl.java rename plugins/src/main/java/{ => x86}/org/tron/plugins/ArchiveManifest.java (98%) rename plugins/src/main/java/{ => x86}/org/tron/plugins/DbArchive.java (98%) rename plugins/src/test/java/org/tron/plugins/{ => leveldb}/ArchiveManifestTest.java (69%) rename plugins/src/test/java/org/tron/plugins/{ => leveldb}/DbArchiveTest.java (71%) rename plugins/src/test/java/org/tron/plugins/{ => leveldb}/DbConvertTest.java (76%) rename plugins/src/test/java/org/tron/plugins/{ => leveldb}/DbLiteLevelDbTest.java (76%) rename plugins/src/test/java/org/tron/plugins/{ => leveldb}/DbLiteLevelDbV2Test.java (76%) rename plugins/src/test/java/org/tron/plugins/{ => rocksdb}/DbLiteRocksDbTest.java (76%) create mode 100644 plugins/src/test/java/org/tron/plugins/rocksdb/DbLiteRocksDbV2Test.java create mode 100644 start.sh.simple diff --git a/README.md b/README.md index 0d0eeb6ef71..0f8b30704bf 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,25 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
CRITICAL: The returned WriteOptionsWrapper holds native resources + * and MUST be closed + * after use to prevent memory leaks. It is strongly recommended to use a try-with-resources + * statement. + * + *
Example of correct usage: + *
{@code
+ * try ( WriteOptionsWrapper readOptions = WriteOptionsWrapper.getInstance()) {
+ * // do something
+ * }
+ * }
+ *
+ * @return a new WriteOptionsWrapper that must be closed.
+ */
public static WriteOptionsWrapper getInstance() {
WriteOptionsWrapper wrapper = new WriteOptionsWrapper();
wrapper.level = new org.iq80.leveldb.WriteOptions();
@@ -23,4 +42,12 @@ public WriteOptionsWrapper sync(boolean bool) {
this.rocks.setSync(bool);
return this;
}
+
+ @Override
+ public void close() {
+ if (rocks != null) {
+ rocks.close();
+ }
+ // leveldb WriteOptions has no close method, and does not need to be closed
+ }
}
diff --git a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java
index 506ecdcb6c7..c48800573e1 100644
--- a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java
+++ b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java
@@ -17,8 +17,9 @@
import static org.fusesource.leveldbjni.JniDBFactory.factory;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Sets;
-import java.io.File;
+import com.google.common.primitives.Bytes;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -30,26 +31,20 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Objects;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
-
-import com.google.common.primitives.Bytes;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.iq80.leveldb.CompressionType;
import org.iq80.leveldb.DB;
import org.iq80.leveldb.DBIterator;
-import org.iq80.leveldb.Logger;
import org.iq80.leveldb.Options;
import org.iq80.leveldb.ReadOptions;
import org.iq80.leveldb.WriteBatch;
import org.iq80.leveldb.WriteOptions;
-import org.slf4j.LoggerFactory;
import org.tron.common.parameter.CommonParameter;
import org.tron.common.storage.WriteOptionsWrapper;
import org.tron.common.storage.metric.DbStat;
@@ -73,29 +68,11 @@ public class LevelDbDataSourceImpl extends DbStat implements DbSourceInterCRITICAL: The returned iterator holds native resources and MUST be closed + * after use to prevent memory leaks. It is strongly recommended to use a try-with-resources + * statement. + * + *
Example of correct usage: + *
{@code
+ * try (DBIterator iterator = db.iterator()) {
+ * while (iterator.hasNext()) {
+ * // ... process entry
+ * }
+ * }
+ * }
+ *
+ * @return a new database iterator that must be closed.
+ */
@Override
public org.tron.core.db.common.iterator.DBIterator iterator() {
return new StoreIterator(getDBIterator());
@@ -467,7 +455,7 @@ public StreamCRITICAL: The returned iterator holds native resources and MUST be closed + * after use to prevent memory leaks. It is strongly recommended to use a try-with-resources + * statement. + * + *
Example of correct usage: + *
{@code
+ * try (DBIterator iterator = db.iterator()) {
+ * while (iterator.hasNext()) {
+ * // ... process entry
+ * }
+ * }
+ * }
+ *
+ * @return a new database iterator that must be closed.
+ */
@Override
public org.tron.core.db.common.iterator.DBIterator iterator() {
- return new RockStoreIterator(getRocksIterator());
- }
-
- private void updateByBatchInner(MapCRITICAL: The returned iterator holds native resources and MUST be closed + * after use to prevent memory leaks. It is strongly recommended to use a try-with-resources + * statement. + * + *
Example of correct usage: + *
{@code
+ * try ( ReadOptions readOptions = new ReadOptions().setFillCache(false);
+ * RocksIterator iterator = getRocksIterator(readOptions)) {
+ * iterator.seekToFirst();
+ * // do something
+ * }
+ * }
+ *
+ * @return a new database iterator that must be closed.
+ */
+ private RocksIterator getRocksIterator(ReadOptions readOptions) {
+ throwIfNotAlive();
+ return database.newIterator(readOptions);
+ }
+
+ /**
+ * Returns an ReadOptions.
+ *
+ * CRITICAL: The returned ReadOptions holds native resources and MUST be closed + * after use to prevent memory leaks. It is strongly recommended to use a try-with-resources + * statement. + * + *
Example of correct usage: + *
{@code
+ * try (ReadOptions readOptions = getReadOptions();
+ * RocksIterator iterator = getRocksIterator(readOptions)) {
+ * iterator.seekToFirst();
+ * // do something
+ * }
+ * }
+ *
+ * @return a new database iterator that must be closed.
+ */
+ private ReadOptions getReadOptions() {
+ throwIfNotAlive();
+ return new ReadOptions().setFillCache(false);
}
public boolean deleteDbBakPath(String dir) {
@@ -545,7 +491,7 @@ public boolean deleteDbBakPath(String dir) {
@Override
public RocksDbDataSourceImpl newInstance() {
- return new RocksDbDataSourceImpl(parentPath, dataBaseName, RocksDbSettings.getSettings());
+ return new RocksDbDataSourceImpl(parentPath, dataBaseName);
}
diff --git a/chainbase/src/main/java/org/tron/common/utils/LocalWitnesses.java b/chainbase/src/main/java/org/tron/common/utils/LocalWitnesses.java
index 940a107a2ac..7179045ea7e 100644
--- a/chainbase/src/main/java/org/tron/common/utils/LocalWitnesses.java
+++ b/chainbase/src/main/java/org/tron/common/utils/LocalWitnesses.java
@@ -25,6 +25,7 @@
import org.tron.common.crypto.SignInterface;
import org.tron.common.crypto.SignUtils;
import org.tron.core.config.Parameter.ChainConstant;
+import org.tron.core.exception.TronError;
@Slf4j(topic = "app")
public class LocalWitnesses {
@@ -32,6 +33,7 @@ public class LocalWitnesses {
@Getter
private ListCRITICAL: Must be closed after use to prevent native memory leaks. + * Use try-with-resources. + * + *
{@code
+ * try (Options options = getOptionsByDbName(dbName)) {
+ * // do something
+ * }
+ * }
+ *
+ * @param dbName db name
+ * @return a new Options instance that must be closed
+ */
+ public static Options getOptionsByDbName(String dbName) {
+ RocksDbSettings settings = getSettings();
+
+ Options options = new Options();
+
+ options.setLogger(new Logger(options) {
+ @Override
+ protected void log(InfoLogLevel infoLogLevel, String logMsg) {
+ rocksDbLogger.info("{} {}", dbName, logMsg);
+ }
+ });
+ // most of these options are suggested by https://github.com/facebook/rocksdb/wiki/Set-Up-Options
+
+ // general options
+ if (settings.isEnableStatistics()) {
+ options.setStatistics(new Statistics());
+ options.setStatsDumpPeriodSec(60);
+ }
+ options.setCreateIfMissing(true);
+ options.setIncreaseParallelism(1);
+ options.setLevelCompactionDynamicLevelBytes(true);
+ options.setMaxOpenFiles(settings.getMaxOpenFiles());
+
+ // general options supported user config
+ options.setNumLevels(settings.getLevelNumber());
+ options.setMaxBytesForLevelMultiplier(settings.getMaxBytesForLevelMultiplier());
+ options.setMaxBytesForLevelBase(settings.getMaxBytesForLevelBase());
+ options.setMaxBackgroundCompactions(settings.getCompactThreads());
+ options.setLevel0FileNumCompactionTrigger(settings.getLevel0FileNumCompactionTrigger());
+ options.setTargetFileSizeMultiplier(settings.getTargetFileSizeMultiplier());
+ options.setTargetFileSizeBase(settings.getTargetFileSizeBase());
+
+ // table options
+ final BlockBasedTableConfig tableCfg;
+ options.setTableFormatConfig(tableCfg = new BlockBasedTableConfig());
+ tableCfg.setBlockSize(settings.getBlockSize());
+ tableCfg.setBlockCache(RocksDbSettings.getCache());
+ tableCfg.setCacheIndexAndFilterBlocks(true);
+ tableCfg.setPinL0FilterAndIndexBlocksInCache(true);
+ tableCfg.setFilter(new BloomFilter(10, false));
+ if (Constant.MARKET_PAIR_PRICE_TO_ORDER.equals(dbName)) {
+ ComparatorOptions comparatorOptions = new ComparatorOptions();
+ options.setComparator(new MarketOrderPriceComparatorForRocksDB(comparatorOptions));
+ }
+
+ if (isRunningInCI()) {
+ options.optimizeForSmallDb();
+ // Disable fallocate calls to avoid issues with disk space
+ options.setAllowFAllocate(false);
+ // Set WAL size limits to avoid excessive disk
+ options.setMaxTotalWalSize(2 * 1024 * 1024);
+ // Set recycle log file
+ options.setRecycleLogFileNum(1);
+ // Enable creation of missing column families
+ options.setCreateMissingColumnFamilies(true);
+ // Set max background flushes to 1 to reduce resource usage
+ options.setMaxBackgroundFlushes(1);
+ }
+
+ return options;
+ }
+
+ private static boolean isRunningInCI() {
+ return Arrays.stream(CI_ENVIRONMENT_VARIABLES).anyMatch(System.getenv()::containsKey);
+ }
}
diff --git a/common/src/main/java/org/tron/common/utils/ByteArray.java b/common/src/main/java/org/tron/common/utils/ByteArray.java
index b77dd310380..d0ac4cbaddf 100644
--- a/common/src/main/java/org/tron/common/utils/ByteArray.java
+++ b/common/src/main/java/org/tron/common/utils/ByteArray.java
@@ -14,7 +14,7 @@
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.util.encoders.Hex;
-import org.tron.core.exception.JsonRpcInvalidParamsException;
+import org.tron.core.exception.jsonrpc.JsonRpcInvalidParamsException;
/*
* Copyright (c) [2016] [ The {@linkplain #getSubtype() subtype} is set to "*", parameters empty. + * + * @param type the primary type + * @throws IllegalArgumentException if any of the parameters contain illegal characters + */ + public MediaType(String type) { + super(type); + } + + /** + * Create a new {@code MediaType} for the given primary type and subtype. + *
The parameters are empty.
+ *
+ * @param type the primary type
+ * @param subtype the subtype
+ * @throws IllegalArgumentException if any of the parameters contain illegal characters
+ */
+ public MediaType(String type, String subtype) {
+ super(type, subtype, Collections.emptyMap());
+ }
+
+ /**
+ * Create a new {@code MediaType} for the given type, subtype, and character set.
+ *
+ * @param type the primary type
+ * @param subtype the subtype
+ * @param charset the character set
+ * @throws IllegalArgumentException if any of the parameters contain illegal characters
+ */
+ public MediaType(String type, String subtype, Charset charset) {
+ super(type, subtype, charset);
+ }
+
+ /**
+ * Create a new {@code MediaType} for the given type, subtype, and quality value.
+ *
+ * @param type the primary type
+ * @param subtype the subtype
+ * @param qualityValue the quality value
+ * @throws IllegalArgumentException if any of the parameters contain illegal characters
+ */
+ public MediaType(String type, String subtype, double qualityValue) {
+ this(type, subtype, Collections.singletonMap(PARAM_QUALITY_FACTOR,
+ Double.toString(qualityValue)));
+ }
+
+ /**
+ * Copy-constructor that copies the type, subtype and parameters of the given
+ * {@code MediaType}, and allows to set the specified character set.
+ *
+ * @param other the other media type
+ * @param charset the character set
+ * @throws IllegalArgumentException if any of the parameters contain illegal characters
+ * @since 4.3
+ */
+ public MediaType(MediaType other, Charset charset) {
+ super(other, charset);
+ }
+
+ /**
+ * Copy-constructor that copies the type and subtype of the given {@code MediaType},
+ * and allows for different parameters.
+ *
+ * @param other the other media type
+ * @param parameters the parameters, may be {@code null}
+ * @throws IllegalArgumentException if any of the parameters contain illegal characters
+ */
+ public MediaType(MediaType other, @Nullable Map This method can be used to parse an Accept or Content-Type header.
+ *
+ * @param mediaTypes the string to parse
+ * @return the list of media types
+ * @throws InvalidMediaTypeException if the media type value cannot be parsed
+ */
+ public static List This method can be used to parse an Accept or Content-Type header.
+ *
+ * @param mediaTypes the string to parse
+ * @return the list of media types
+ * @throws InvalidMediaTypeException if the media type value cannot be parsed
+ * @since 4.3.2
+ */
+ public static List This method can be used to for an {@code Accept} or {@code Content-Type} header.
+ *
+ * @param mediaTypes the media types to create a string representation for
+ * @return the string representation
+ */
+ public static String toString(Collection Given two media types:
+ * For example:
+ * Given two media types:
+ * For instance, {@code text/*} includes {@code text/plain} and {@code text/html},
+ * and {@code application/*+xml} includes {@code application/soap+xml}, etc.
+ * This method is not symmetric.
+ * Simply calls {@link MimeType#includes(MimeType)} but declared with a
+ * {@code MediaType} parameter for binary backwards compatibility.
+ *
+ * @param other the reference media type with which to compare
+ * @return {@code true} if this media type includes the given media type;
+ * {@code false} otherwise
+ */
+ public boolean includes(@Nullable MediaType other) {
+ return super.includes(other);
+ }
+
+ /**
+ * Indicate whether this {@code MediaType} is compatible with the given media type.
+ * For instance, {@code text/*} is compatible with {@code text/plain},
+ * {@code text/html}, and vice versa. In effect, this method is similar to
+ * {@link #includes}, except that it is symmetric.
+ * Simply calls {@link MimeType#isCompatibleWith(MimeType)} but declared with a
+ * {@code MediaType} parameter for binary backwards compatibility.
+ *
+ * @param other the reference media type with which to compare
+ * @return {@code true} if this media type is compatible with the given media type;
+ * {@code false} otherwise
+ */
+ public boolean isCompatibleWith(@Nullable MediaType other) {
+ return super.isCompatibleWith(other);
+ }
+
+ /**
+ * Return a replica of this instance with the quality value of the given {@code MediaType}.
+ *
+ * @return the same instance if the given MediaType doesn't have a quality value,
+ * or a new one otherwise
+ */
+ public MediaType copyQualityValue(MediaType mediaType) {
+ if (!mediaType.getParameters().containsKey(PARAM_QUALITY_FACTOR)) {
+ return this;
+ }
+ Map
+ *
+ * audio/basic < audio/* < */*
+ * audio/* < audio/*;q=0.7; audio/*;q=0.3
+ * audio/basic;level=1 < audio/basic
+ * audio/basic == text/html
+ * audio/basic == audio/wave
+ *
+ * @param mediaTypes the list of media types to be sorted
+ * @see HTTP 1.1: Semantics
+ * and Content, section 5.3.2
+ */
+ public static void sortBySpecificity(List
+ *
+ *
+ * @param mediaTypes the list of media types to be sorted
+ * @see #getQualityValue()
+ */
+ public static void sortByQualityValue(List