Repository navigation
Expand file tree
/
Copy pathconfig.example.yaml
More file actions
127 lines (111 loc) · 7.44 KB
/
Copy pathconfig.example.yaml
File metadata and controls
127 lines (111 loc) · 7.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
listen:
host: 0.0.0.0
port: 8545
# 状态展示页路径:默认 "/"(与 WebSocket 端点同路径);
# 改为如 "/dash" 可将页面移出根路径,设为 false 则完全禁用页面(/status JSON 接口不受影响)
# statusPagePath: "/"
upstreams:
- name: node-a
url: http://127.0.0.1:18545
# WebSocket 端点;不配则按 url 推导(http→ws, https→wss)
# wsUrl: ws://127.0.0.1:18546
weight: 2
# 客户端侧限速:限制代理发往该上游的请求速率(令牌桶,按 HTTP 请求计,
# 一个批量算一次)。桶里没有令牌时优先选择其他上游,全都没有才等待,
# 用于遵守上游服务商自己的配额、避免触发 429。不配则不限速。
# rateLimit:
# requestsPerSecond: 10
# burst: 20 # 突发容量,缺省 ceil(requestsPerSecond)
# 该上游返回限流响应后的冷却时长(毫秒),覆盖全局 upstreamCooldown.defaultMs
# cooldownMs: 30000
# 附加到该上游每个请求的 HTTP 头:JSON-RPC POST(含健康轮询)与 WebSocket 握手均带上。
# 用于需 API key 或自定义头的节点;值可能含密钥,配置文件勿入版本库。
# headers:
# Authorization: Bearer <api-key>
# x-api-key: <api-key>
# 方法级路由黑白名单:声明该上游可/不可承载哪些 RPC 方法,选路时自动回避,
# 请求因此改由其他节点承载,不会因该节点的已知限制而失败(如 publicnode 免费档
# 对 eth_getTransactionReceipt 一律 403)。条目为方法全名或命名空间通配("debug_*")。
# deny 优先于 allow;两者都不配即不限制。
# methods:
# deny: [eth_getTransactionReceipt, debug_*]
# allow: [eth_*, net_*]
- name: node-b
url: http://127.0.0.1:28545
weight: 1
# 期望的链 ID(如 1 = 以太坊主网)。配置后,报告其他 chainId 的节点会被摘除;
# 不配置则自动采用多数节点的 chainId 作为基准。
# chainId: 1
health:
pollIntervalMs: 5000 # 健康轮询间隔
requestTimeoutMs: 10000 # 上游请求超时
maxBlockLag: 5 # 落后池内最大高度超过此值则摘除
failureThreshold: 3 # 连续失败次数达到此值则摘除
maxRetries: 2 # 单请求最多尝试的上游数
retryBaseDelayMs: 100 # 重试退避基数:第 n 次重试延迟 base * 2^(n-1)
retryMaxDelayMs: 1000 # 重试退避上限
wsHeads: true # 通过持久的 eth_subscribe("newHeads") WS 连接跟踪链高(WS 断开时自动回退 HTTP 轮询);
# false 时块高仅来自 HTTP 轮询,WS 可用性改为每轮探测
wsPingIntervalMs: 30000 # 上游 WS 连接的客户端保活:每隔该毫秒数发 ping,连续两个间隔收不到 pong 则判定死链
# 主动断开重连。防止服务商网关空闲断连(close 1006);0 关闭
security:
# 直接拒绝的 RPC 命名空间(公网入口加固)
blockedNamespaces: [admin, personal, debug, trace, miner, txpool]
maxBatchSize: 100 # 单个批量请求最大元素数
maxBodyBytes: 1048576 # 请求体大小上限(1MB)
maxLogsRange: 10000 # eth_getLogs 最大区块跨度
rateLimit:
enabled: true # 按客户端 IP 的令牌桶限速(依赖 X-Forwarded-For,需部署在反向代理之后)
requestsPerSecond: 50 # HTTP JSON-RPC 每秒每 IP(批量按元素数计费)
burst: 100 # 突发容量
wsMessagesPerSecond: 20 # WS 消息每秒每 IP
wsBurst: 40
maxSubscriptionsPerIp: 20 # 同一 IP 的并发 eth_subscribe 订阅数上限(跨连接合计)
filters:
stickyTtlMs: 300000 # 代理侧 filter ID 映射的空闲 TTL(粘滞路由);每次轮询刷新,对齐 geth 默认 5 分钟的 filter 过期
txpool:
mirror: false # 通过上游 WS newPendingTransactions 订阅维护本地 pending 交易镜像,
# 并本地应答客户端的 eth_subscribe("newPendingTransactions");
# 与 wsHeads 共用每上游一条的持久 WS 连接。默认关闭(高频事件流)
syncing:
mirror: false # 本地应答客户端的 eth_subscribe("syncing"):只要任一上游处于同步中就返回
# syncing(带进度对象),全部同步完才回 false(订阅后立即回当前状态,
# 之后只在聚合状态变化时推送)。状态来自上游 WS syncing 订阅,
# HTTP 健康轮询作回退;与 wsHeads 共用每上游一条的持久 WS 连接。默认关闭
reorg:
enabled: true # 基于上游 newHeads 的 parentHash 连续性检测链上重组;确认的重组会记录日志、
# 计入指标(ethproxy_reorgs_detected_total / ethproxy_reorg_depth)并经 pool.onReorg 广播。
# 需要 wsHeads 开启(HTTP 轮询拿不到块哈希)。单点上游的短暂分歧会被仲裁过滤,
# 只有冲突分支被后续块接续或被第二个上游证实才判定为重组
windowSize: 128 # 用于定位分叉点的近期区块头滑动窗口大小(过浅的窗口会让重组深度只报下界)
cors:
enabled: true # 跨域支持(浏览器 DApp 需要)
origin: "*" # "*" 允许任意域;多个域用逗号分隔,如 "https://a.com, https://b.com"
cache:
enabled: true # 总开关:false 时所有请求绕过缓存(也不会连接 Redis)
backend: memory # memory | filesystem | redis
shortTtlMs: 2000 # 链头相关数据的短 TTL(dynamicTtl 开启时作为上限与初始回退值)
pendingTtlMs: 1000 # 未打包交易收据等的极短 TTL
unfinalizedTtlMs: 900000 # 7 个重组校验方法(按块高取块/数量/叔块 + 按哈希取交易/收据)未定型条目的兜底 TTL;
# 正确性由读取时对照重组检测器窗口校验保证,此 TTL 只约束窗口无法担保的条目寿命
dynamicTtl: true # 按观测到的出块间隔动态调整短 TTL(间隔/4,钳制在 [minTtlMs, shortTtlMs])
minTtlMs: 200 # 动态 TTL 下限
finalityDepth: 64 # 区块号 ≤ 链头 - finalityDepth 视为不可变,永久缓存
memory:
maxEntries: 100000
# backend: redis 时启用:
# redis:
# url: redis://127.0.0.1:6379
# keyPrefix: "ethproxy:"
# backend: filesystem 时启用:条目以 JSON 文件落盘(键 sha256 散列为文件名,
# 散列到 256 个子目录),进程内存占用与缓存条目数无关。
# filesystem:
# dir: ./cache # 缓存目录,按需创建;Docker 部署建议挂卷
# sweepIntervalMs: 60000 # 后台清扫周期(删过期/损坏文件、执行 maxBytes);0 关闭
# maxBytes: 1073741824 # 磁盘软上限(默认 1GiB),超限从最旧文件开始驱逐
# 上游限流冷却(被动):上游以 HTTP 429(按 Retry-After 头)或限流类
# JSON-RPC error 拒绝请求时,代理将该上游停用一段时间——冷却期内选路
# 跳过它、健康轮询也暂停,到期自动恢复。
# upstreamCooldown:
# defaultMs: 15000 # 响应未带 Retry-After 时的缺省冷却(毫秒)
# maxMs: 300000 # 冷却上限(毫秒),含 Retry-After 推算值