Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,9 @@ public class CommonParameter {
@Getter
@Setter
public int jsonRpcMaxBlockFilterNum = 50000;
@Getter
@Setter
public int jsonRpcMaxLogFilterNum = 20000;

@Getter
@Setter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ public void setHttpPBFTPort(int v) {
private int maxBlockRange = 5000;
private int maxSubTopics = 1000;
private int maxBlockFilterNum = 50000;
private int maxLogFilterNum = 20000;
}

@Getter
Expand Down
5 changes: 4 additions & 1 deletion common/src/main/resources/reference.conf
Original file line number Diff line number Diff line change
Expand Up @@ -398,8 +398,11 @@ node {
# Maximum topics within a topic criteria, >0 otherwise no limit
maxSubTopics = 1000

# Maximum number for blockFilter
# Maximum number for blockFilter. >0 otherwise no limit
maxBlockFilterNum = 50000
Comment thread
317787106 marked this conversation as resolved.

# Maximum number of concurrent eth_newFilter registrations, >0 otherwise no limit
maxLogFilterNum = 20000
}

# Disabled API list (works for http, rpc and pbft, not jsonrpc). Case insensitive.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package org.tron.common.logsfilter.capsule;

import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.handleBLockFilter;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.tron.core.capsule.BlockCapsule;
import org.tron.core.services.jsonrpc.TronJsonRpcImpl;

@Slf4j(topic = "API")
@ToString
Expand All @@ -19,19 +18,21 @@ public class BlockFilterCapsule extends FilterTriggerCapsule {
@Setter
private boolean solidified;

public BlockFilterCapsule(BlockCapsule block, boolean solidified) {
blockHash = block.getBlockId().toString();
this.solidified = solidified;
private final TronJsonRpcImpl jsonRpc;

public BlockFilterCapsule(BlockCapsule block, boolean solidified, TronJsonRpcImpl jsonRpc) {
this(block.getBlockId().toString(), solidified, jsonRpc);
}

public BlockFilterCapsule(String blockHash, boolean solidified) {
public BlockFilterCapsule(String blockHash, boolean solidified, TronJsonRpcImpl jsonRpc) {
this.blockHash = blockHash;
this.solidified = solidified;
this.jsonRpc = jsonRpc;
}

@Override
public void processFilterTrigger() {
handleBLockFilter(this);
jsonRpc.handleBLockFilter(this);
}

}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package org.tron.common.logsfilter.capsule;

import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.handleLogsFilter;

import java.util.List;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.tron.common.bloom.Bloom;
import org.tron.core.services.jsonrpc.TronJsonRpcImpl;
import org.tron.protos.Protocol.TransactionInfo;

@Slf4j(topic = "API")
Expand All @@ -33,18 +32,22 @@ public class LogsFilterCapsule extends FilterTriggerCapsule {
@Setter
private boolean removed;

private final TronJsonRpcImpl jsonRpc;

public LogsFilterCapsule(long blockNumber, String blockHash, Bloom bloom,
List<TransactionInfo> txInfoList, boolean solidified, boolean removed) {
List<TransactionInfo> txInfoList, boolean solidified, boolean removed,
TronJsonRpcImpl jsonRpc) {
this.blockNumber = blockNumber;
this.blockHash = blockHash;
this.bloom = bloom;
this.txInfoList = txInfoList;
this.solidified = solidified;
this.removed = removed;
this.jsonRpc = jsonRpc;
}

@Override
public void processFilterTrigger() {
handleLogsFilter(this);
jsonRpc.handleLogsFilter(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,7 @@ private static void applyNodeConfig(NodeConfig nc) {
PARAMETER.jsonRpcMaxBlockRange = jsonrpc.getMaxBlockRange();
PARAMETER.jsonRpcMaxSubTopics = jsonrpc.getMaxSubTopics();
PARAMETER.jsonRpcMaxBlockFilterNum = jsonrpc.getMaxBlockFilterNum();
PARAMETER.jsonRpcMaxLogFilterNum = jsonrpc.getMaxLogFilterNum();

// ---- P2P sub-bean ----
PARAMETER.nodeP2pVersion = nc.getP2p().getVersion();
Expand Down
11 changes: 9 additions & 2 deletions framework/src/main/java/org/tron/core/db/Manager.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import org.apache.commons.collections4.CollectionUtils;
import org.bouncycastle.util.encoders.Hex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.tron.api.GrpcAPI;
import org.tron.api.GrpcAPI.TransactionInfoList;
Expand Down Expand Up @@ -141,6 +142,7 @@
import org.tron.core.service.MortgageService;
import org.tron.core.service.RewardViCalService;
import org.tron.core.services.event.exception.EventException;
import org.tron.core.services.jsonrpc.TronJsonRpcImpl;
import org.tron.core.store.AccountAssetStore;
import org.tron.core.store.AccountIdIndexStore;
import org.tron.core.store.AccountIndexStore;
Expand Down Expand Up @@ -276,6 +278,10 @@ public class Manager {
@Autowired
private RewardViCalService rewardViCalService;

@Lazy
@Autowired
private TronJsonRpcImpl tronJsonRpcImpl;

/**
* Cycle thread to rePush Transactions
*/
Expand Down Expand Up @@ -2264,7 +2270,8 @@ private void reOrgLogsFilter() {
}

private void postBlockFilter(final BlockCapsule blockCapsule, boolean solidified) {
BlockFilterCapsule blockFilterCapsule = new BlockFilterCapsule(blockCapsule, solidified);
BlockFilterCapsule blockFilterCapsule =
new BlockFilterCapsule(blockCapsule, solidified, tronJsonRpcImpl);
if (!filterCapsuleQueue.offer(blockFilterCapsule)) {
logger.info("Too many filters, block filter lost: {}.", blockCapsule.getBlockId());
}
Expand All @@ -2278,7 +2285,7 @@ private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified,
= getTransactionInfoByBlockNum(blockNumber).getTransactionInfoList();
LogsFilterCapsule logsFilterCapsule = new LogsFilterCapsule(blockNumber,
blockCapsule.getBlockId().toString(), blockCapsule.getBloom(), transactionInfoList,
solidified, removed);
solidified, removed, tronJsonRpcImpl);

if (!filterCapsuleQueue.offer(logsFilterCapsule)) {
logger.info("Too many filters, logs filter lost: {}.", blockNumber);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ public class JsonRpcApiUtil {
public static final String TAG_SAFE_SUPPORT_ERROR = "TAG safe not supported";
public static final String BLOCK_NUM_ERROR = "invalid block number";

static SecureRandom random = new SecureRandom();
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NIT] Hoisting random to a static field is a nice perf win👍. One small follow-up: consider tightening it to private static final:
private static final SecureRandom random = new SecureRandom();
As written (package-private, non-final), anything in org.tron.core.services.jsonrpc can reassign it. A well-meaning test or perf experiment could quietly do: JsonRpcApiUtil.random = new Random(42);// compiles, no warning
…and filter IDs silently become predictable, which breaks the unguessability assumption clients rely on. private final closes that path at compile time, and also gives JMM safe-publication guarantees for free.


public static byte[] convertToTronAddress(byte[] address) {
byte[] newAddress = new byte[21];
byte[] temp = new byte[] {Wallet.getAddressPreFixByte()};
Expand Down Expand Up @@ -567,7 +569,6 @@ public static long parseBlockNumber(String blockNumOrTag, Wallet wallet)
}

public static String generateFilterId() {
SecureRandom random = new SecureRandom();
byte[] uid = new byte[16]; // 128 bits are converted to 16 bytes
random.nextBytes(uid);
return ByteArray.toHexString(uid);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,9 +291,10 @@ CompilationResult ethSubmitHashrate(String hashrate, String id)
@JsonRpcErrors({
@JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"),
@JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"),
@JsonRpcError(exception = JsonRpcExceedLimitException.class, code = -32005, data = "{}"),
})
String newFilter(FilterRequest fr) throws JsonRpcInvalidParamsException,
JsonRpcMethodNotFoundException;
JsonRpcMethodNotFoundException, JsonRpcExceedLimitException;

@JsonRpcMethod("eth_newBlockFilter")
@JsonRpcErrors({
Expand Down
Loading
Loading