trustbase-seller-backend 0.5.6 → 0.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/routes/chain-writes.js +3 -1
- package/routes/sp-notify.js +29 -15
- package/run-unified.js +11 -0
package/package.json
CHANGED
package/routes/chain-writes.js
CHANGED
|
@@ -65,7 +65,9 @@ function cfg() {
|
|
|
65
65
|
// 相对 CHAIN_HOME (如安装器写的 ./tb-keyring) 必须按 base 解析成绝对路径:
|
|
66
66
|
// 原样传给 trustchaind --home 时, CLI 按进程 cwd 解析 → cwd 一变就指向
|
|
67
67
|
// /tb-keyring 这种空 keyring, tx sign 直接失败 (2026-09-22 .215 实测故障)。
|
|
68
|
-
|
|
68
|
+
// SP_CHAIN_HOME 优先: SP 网关的 provider key 环常与 CHAIN_HOME 不同目录
|
|
69
|
+
// (kimi 18462 修复: 只在调用侧写 c.keyringHome 是幻影字段, CLI 只认 c.home)。
|
|
70
|
+
home: base_paths.resolveHome(process.env.SP_CHAIN_HOME || process.env.CHAIN_HOME || '/root/.trustchain'),
|
|
69
71
|
chainId: process.env.CHAIN_ID || 'trustchain-1',
|
|
70
72
|
lcdUrl: process.env.CHAIN_LCD_URL || rpcUrl.replace(':26657', ':1317'),
|
|
71
73
|
rpcUrl,
|
package/routes/sp-notify.js
CHANGED
|
@@ -73,7 +73,6 @@ async function submitPaymentFactToChain(fact) {
|
|
|
73
73
|
// [P1 修复 kimi 18462] 默认值不再写死 emergency-key (SP 网关机器上该 key 不存在且非 provider)
|
|
74
74
|
// 必填: SP_CHAIN_KEY_NAME + SP_CHAIN_HOME (或 CHAIN_HOME)
|
|
75
75
|
c.keyName = process.env.SP_CHAIN_KEY_NAME || "";
|
|
76
|
-
c.keyringHome = process.env.SP_CHAIN_HOME || process.env.CHAIN_HOME || c.keyringHome;
|
|
77
76
|
if (!c.keyName) {
|
|
78
77
|
console.warn("[sp-notify] SP_CHAIN_KEY_NAME 未设置 — 上链签名将失败。");
|
|
79
78
|
console.warn("[sp-notify] 请在 .env 配置: SP_CHAIN_KEY_NAME=<provider专用key名> + CHAIN_HOME=<keyring目录>");
|
|
@@ -353,31 +352,46 @@ async function verifyChainSigning(deps) {
|
|
|
353
352
|
if (!chainHome) {
|
|
354
353
|
console.error("[sp-notify][STARTUP-CHECK] ⚠️ CHAIN_HOME/SP_CHAIN_HOME 未设置 — 使用默认 /root/.trustchain (可能没有 provider key)");
|
|
355
354
|
}
|
|
355
|
+
// 必须和 submitPaymentFactToChain 用同一个 key: cfg() 默认 keyName 是 CHAIN_KEY_NAME||'seller',
|
|
356
|
+
// 直接用会验错对象 → 误报 (kimi 18462 复核修复)。home 由 cfg() 自己按
|
|
357
|
+
// SP_CHAIN_HOME > CHAIN_HOME > 默认 解析, 这里不再重复设 (kimi 18462)。
|
|
358
|
+
c.keyName = keyName;
|
|
356
359
|
|
|
357
360
|
// 检查 key 是否能解析出地址
|
|
358
361
|
try {
|
|
359
362
|
const addr = await chainWrites.keyAddress(c);
|
|
360
363
|
console.log("[sp-notify][STARTUP-CHECK] ✓ 签名 key 可用, provider 地址:", addr);
|
|
361
364
|
|
|
362
|
-
// 检查该地址是否是链上 ACTIVE provider
|
|
365
|
+
// 检查该地址是否是链上 ACTIVE provider。
|
|
366
|
+
// 用 trustchaind CLI 而不是 abci_query: 模块的 gRPC Query 路径不确定,
|
|
367
|
+
// 而 CLI 的 'q serviceprovider show' 是实机验证过的口径 (kimi 18462 复核修复:
|
|
368
|
+
// 原 abci_query path 未加引号 → 必 32602, 改对后仍返回空; 且非 200 时无任何输出)。
|
|
363
369
|
try {
|
|
364
|
-
const
|
|
365
|
-
|
|
366
|
-
const
|
|
367
|
-
const
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
370
|
+
const bin = c.bin || process.env.TRUSTCHAIND_BIN || "trustchaind";
|
|
371
|
+
const out = await new Promise((resolve) => {
|
|
372
|
+
const cp = require("child_process");
|
|
373
|
+
const child = cp.execFile(bin,
|
|
374
|
+
["q", "serviceprovider", "show", addr, "--node", c.rpcUrl, "--output", "json"],
|
|
375
|
+
{ timeout: 8000, maxBuffer: 1 << 20 },
|
|
376
|
+
(err, stdout) => resolve({ err, stdout }));
|
|
377
|
+
});
|
|
378
|
+
if (out.err || !out.stdout) {
|
|
379
|
+
console.error("[sp-notify][STARTUP-CHECK] ❌ provider 状态查询失败:",
|
|
380
|
+
String((out.err && out.err.message) || "无输出").slice(0, 160));
|
|
381
|
+
} else {
|
|
382
|
+
const parsed = JSON.parse(out.stdout);
|
|
383
|
+
const sp = parsed && (parsed.provider || parsed);
|
|
384
|
+
const status = sp && sp.status;
|
|
385
|
+
if (status === "ACTIVE") {
|
|
386
|
+
console.log("[sp-notify][STARTUP-CHECK] ✓ provider 状态 ACTIVE (质押 " + (sp.stake || "?") + " utct)");
|
|
387
|
+
} else if (status) {
|
|
388
|
+
console.error("[sp-notify][STARTUP-CHECK] ❌ provider 状态 " + status + " (需 ACTIVE) — 支付事实将被链上拒绝");
|
|
375
389
|
} else {
|
|
376
|
-
console.
|
|
390
|
+
console.error("[sp-notify][STARTUP-CHECK] ❌ provider 查询结果里没有 status 字段, 请人工核: trustchaind q serviceprovider show " + addr);
|
|
377
391
|
}
|
|
378
392
|
}
|
|
379
393
|
} catch (queryErr) {
|
|
380
|
-
console.warn("[sp-notify][STARTUP-CHECK] ⚠️ provider
|
|
394
|
+
console.warn("[sp-notify][STARTUP-CHECK] ⚠️ provider 状态查询异常 (链节点可能未启动):", queryErr.message);
|
|
381
395
|
}
|
|
382
396
|
return true;
|
|
383
397
|
} catch (keyErr) {
|
package/run-unified.js
CHANGED
|
@@ -633,6 +633,17 @@ async function startUnifiedServer() {
|
|
|
633
633
|
// 2026-09-26: 微信支付服务商 (SP) 模式三件套 — 特约商户回调 (/api/sp/notify/wechat) + 抽佣登记 (/api/sp/commission-rate*)
|
|
634
634
|
// 分账骨架在 payments/wechat/profitsharing.js (纯函数, 由 sp-notify 按抽佣比例触发, 默认 mock)
|
|
635
635
|
app.use('/api/sp', (0, sp_notify_1.createSpNotifyRouter)({ db: sqliteIndexer.getRawDb() }));
|
|
636
|
+
// 上链签名自检 (kimi 18462 接线): 签名 key 缺失 / 不是 ACTIVE provider 时启动即报,
|
|
637
|
+
// 不用等第一笔真实支付才发现写不上去。异步跑, 不阻塞启动, 失败只告警不退出。
|
|
638
|
+
try {
|
|
639
|
+
Promise.resolve(sp_notify_1.verifyChainSigning({ db: sqliteIndexer.getRawDb() }))
|
|
640
|
+
.then((ok) => {
|
|
641
|
+
if (!ok) console.warn(" ⚠️ [sp] 上链签名自检未通过, 支付事实将无法上链 (见上方 STARTUP-CHECK)");
|
|
642
|
+
})
|
|
643
|
+
.catch((e) => console.warn(" ⚠️ [sp] 上链签名自检异常 (不阻塞):", e && e.message));
|
|
644
|
+
} catch (e) {
|
|
645
|
+
console.warn(" ⚠️ [sp] 上链签名自检无法执行:", e && e.message);
|
|
646
|
+
}
|
|
636
647
|
// P1 fix: retryPending 此前只导出无调度方 — 支付事实上链失败的补链清扫, 每 5min 一轮
|
|
637
648
|
// (unref 不拖住进程退出; 连续 3 轮有失败额外告警, 单轮失败明细由 retryPending 内部 warn)
|
|
638
649
|
let spRetryFailStreak = 0;
|