feat(blockrun): add isolated Solana payment support - #690
Conversation
|
|
已处理并复核 原 review 评论(评审 commit
已修复。Type 100 的请求级 redirect 策略现在先拒绝 signed redirect 和跨源 redirect,再委托原 client 的
已修复。最终 Solana signer 入口统一
本项未按建议修改,属于有意的资金安全边界。signed 后的错误既可能是上游故障,也可能是“结算已成功但响应丢失”、响应解析失败、客户端断开或流截断;当前错误分类无法可靠归因。恢复通用 penalty 会让一次模糊错误自动 cooldown/禁用生产现有 Base 渠道。当前请求仍严格禁止 retry/failover,并保留 channel/status/request/payment reconciliation 记录供告警与人工隔离。
同上,暂不修改。持续 signed 429/5xx 的确值得隔离,但安全实现应是保留原始 cause、按明确上游健康故障分类、使用阈值和跨节点 quarantine;不能把所有
同上,暂不修改。当前设计优先保证 signed 后不产生第二次签名/新 nonce,也避免模糊结算误伤线上 Base。独立 code review 与 architecture review 已重新检查该取舍,结论分别为 APPROVE 与 CLEAR。
已修复。新建 Type 100 + Solana 时始终强制官方 Solana URL;新建 Base 仅在 URL 为空时填默认值,保留 Base 自定义 URL;编辑态完全不自动改 URL。补充纯函数状态矩阵测试。 验证结果:
生产建议:Router 与 newapi-console 均需部署,先上 staging;生产保持 Solana 渠道禁用,先回归并观察现有 Type 100 Base 和 Type 102,再启用单个低余额 Solana 渠道。 |
背景与问题
BlockRun Go SDK 已增加 Solana 支付能力。生产环境同时运行多个 Base 链 Type 100 BlockRun 渠道,因此本次变更的硬约束是:
100 / BlockRun。/v1/chat/completions、/v1/messages、/v1/responses。101 / BlockRunVideo、102 / BlockRunSeedance不进入 Solana 路径。BlockRun 作者确认:结算只对同一签名/nonce 幂等,不按 task/job 去重。不同签名代表不同 nonce,可能分别结算。因此 signed attempt 之后,new-api 必须禁止内部重签、重试和换渠道。
根因与方案
显式支付链
渠道
settings新增:blockrun_payment_chainblockrun_max_payment_atomic缺失或空 chain 固定解析为 Base,不根据 URL、私钥或 402 内容猜链。Solana 必须新建独立 Type 100 渠道;已有记录禁止 Base ↔ Solana 直接切换,也禁止进入或离开 Type 100,从而封堵
100(Base) → 101 → 100(Solana)绕过。Base 兼容
基础 SDK 升级为
blockrun-llm-go v0.19.5,未引入 VIP。v0.19.5 会向 Base envelope 加入未签名的 builder-code extension。兼容层继续委托 SDK 完成签名,仅在 envelope 层恢复 402 中的原始 extensions。Type 100 Base 和 Type 102 共享该入口,不复制或修改密码学实现。Solana 信任边界
Solana signer 只接受:
scheme=exactnetwork=solanamaxTimeoutSeconds <= 300混合 accepts 会显式选 Solana;多个不一致 Solana option 会拒绝。
signed attempt 资金安全
签名成功后、发送 signed HTTP 请求前写入请求级 payment state。此后禁止 retry、failover、second signature 和 redirect;不触发 auto-ban/cooldown;第二次 402 丢弃原始 body;不确定失败归一化为
blockrun_settlement_unknown;对账只保留 SHA-256 前缀和 request ID。该状态只保护同一次 Gin 请求,不宣称跨节点或跨独立 POST 幂等。
变更范围
web/defaultType 100 链、URL、wallet、cap 表单。明确不包含:图片 Solana、101/102 Solana、classic、website、数据库迁移、跨请求分布式幂等、Terraform、Cloudflare。
验证证据
通过:
go test ./relay/channel/blockrun ./relay/channel -count=1go test ./types ./relay/common ./dto -count=1go build ./relay/channel/blockrun/...go vetbun run typecheckbun run build:checkbun run i18n:syncgit diff --check完整
go test ./relay/...仍被仓库既有、与本次无关的 Claude 文件断言和 Codex image nil-info panic 阻断;本次相关包以及 BlockRunVideo/BlockRunSeedance 定向测试通过。风险与边界
blockrun_settlement_unknown后不得自动重新提交。部署建议
newapi-consolerequired;staging required;newapi-web、Terraform、Cloudflare not required。发布顺序:
任何 Base 或 Type 102 回归异常均阻断生产启用。