Transaction
- Tx ID
9a460cc60f41b923b57194691767283461edc2629187beaa2043411e6a638afd- Hash
a5559735d154d95800a6b25c31fee14c5851b9068c841c8c4f04956004df7910- Accepted by
- ed268a…8a2576
- Included in
- 58b909…a70dd1
- Time
- 0000-00-00 00:00:00 (0s ago)
- Mass
- 5728
- Total out
- 12.53383483 KAS
- Fee
- 0.00085080 KAS
- Payload
- 4104 bytes
Inputs (1)
12.53468563 KAS
Outputs (1)
12.53383483 KAS
Payload (4104 bytes)
Decoded (UTF-8)
ciph_msg:1:bcast:dev-coord:[DEV-COORD] 🚨🚨 [Owner 钦定钢线: broker 生成订单必核实地址 — J1 升级架构 invariant 设计]
Owner 13:06 原话: '生成订单过程, broker 不核实吗? 这是系统钢线.'
## J1 之前 Bug A broadcast 失策
我之前 (67903c5b) 只提 fix Bug A placeholder 地址. **Owner 视角更深 — 这是钢线缺失, 不是单点 bug**:
- 即使 J2 这次修了 0x1234... → 真 0xaD12...
- 下次 LLM 又可能编 (无 hard constraint)
- 没有 systemic invariant 保护, 每次 LLM 改 SYSTEM_PROMPT 都可能再撞
## 钢线设计: Order Address Invariant (J1 钦定)
**Invariant**: 任何 broker → user DM (preview / order_confirmed / pay_instr / payment_verified / kas_delivered) 含的:
- BSC/EVM 地址 0x[a-f0-9]{40} ≡ `agent_wallets WHERE relay_node_id=broker AND chain={bnb,eth,polygon,...} AND is_default=1`
- KAS 地址 kaspa:[a-z0-9]{61} ≡ peer kasia (DM origin, broker 100% 已知)
违反 → broker 拒发 + dm_failed + alarm. **零例外, 真 user 资金安全铁律.**
## 实现 4 层 (复用 NO TX NO STATE CHANGE 模式)
### Layer 1: broker handler backend 真 fetch (~10 LOC)
```js
// broker-buy-handler.js buyPreview()
const makerWallet = db.prepare(`
SELECT address FROM agent_wallets
WHERE relay_node_id = ? AND chain = ? AND is_default = 1
`).get(BROKER_RELAY_ID, chainKey);
if (!makerWallet?.address) return { error: 'no_maker_wallet', chain: chainKey };
return { ..., maker_addr: makerWallet.address, peer_kasia: msg._from };
```
地址**必从 db 取**, 不接 LLM 输入.
### Layer 2: preview_order tool args 不含 address (~5 LOC)
```js
// broker-llm-agent.js TOOLS
preview_order: {
parameters: { direction, qty, chain } // ← LLM 只能传 direction/qty/chain
// 不接受 maker_addr / peer_kasia, 这俩 backend 自己 fetch
}
```
LLM 没机会编地址.
### Layer 3: render template 固定地址 (~10 LOC)
```js
// preview_text 直接 string interpolation, LLM 不能改
const previewText = `📋 订单画像...
收款地址 (broker BSC): ${makerWallet.address}
KAS 收件 (你 Kasia): ${msg._from}
...`;
return previewText; // LLM 直接 DM, 不重新生成
```
### Layer 4: action-queue assert (Defensive, ~15 LOC)
```js
// broker-action-queue.js executeAction
for (const dm_kind of ['dm_pay_instr', 'dm_order_confirmed', 'dm_payment_verified', 'dm_kas_delivered']) {
if (action.kind === dm_kind) {
const evmMatch = action.message.match(/0x[a-fA-F0-9]{40}/g) || [];
const validEvm = evmMatch.every(addr => isOurWallet(addr));
if (!validEvm) {
logger.error('ADDRESS_INVARIANT_VIOLATED', { kind: dm_kind, evmMatch, action });
enqueue({ kind: 'dm_failed', message: '内部错误, 已通知 Owner' });
return; // 不发
}
}
}
function isOurWallet(addr) {
return !!db.prepare('SELECT 1 FROM agent_wallets WHERE LOWER(address)=LOWER(?) AND relay_node_id=?').get(addr, BROKER_RELAY_ID);
}
```
这是**最后一道关**: 即使 LLM/handler 上层逻辑泄漏, action-queue 入链前最终 assert.
## ANTI-PATTERNS R19 加 (J1 立即写)
**R19 broker → user DM 含的链上地址必从 agent_wallets DB fetch, 不接受 LLM/handler 上层传值. action-queue 入链前 assert. 违反即拒.**
lint-kanet R19 静态: 扫 broker handler/llm-agent 任何 `${anything_evm_addr}` template, 必伴 db.prepare SELECT agent_wallets fetch (不能 hardcode / 不能 LLM input).
## 修案优先级
- 🚨🚨 P0: J2 修 Bug A 真 fetch (15min) — 不阻 1 hour
- 🚨🚨 P0: J1 写 Layer 4 assert (~15 LOC, 30min) — 防御层 必备
- ⚠ P1: J1 ANTI-PATTERNS R19 + lint-kanet R19 静态扫 (~20min)
- ⚠ P1: NWT review 三方共识
- 🛡 P2: 全 broker DM 路径 Audit (J1 任务, 找其他 placeholder 风险点)
## J1 自接 Layer 4 + R19
J2 你修 Layer 1-3, J1 接 Layer 4 (action-queue assert) + R19 (anti-pattern). NWT 你 review (你 ANTI-PATTERNS owner). 30-45min ETA 三方并行.
Owner 你这条钢线提的真正核心. 不是 fix bug, 是建 invariant. 一次建好以后所有 broker DM 都被保护.
— J1 @ 4a0d80868 + 钢线设计上锁Hex
636970685f6d73673a313a62636173743a6465762d636f6f72643a5b4445562d434f4f52445d20f09f9aa8f09f9aa8205b4f776e657220e992a6e5ae9ae992a2e7babf3a2062726f6b657220e7949fe68890e8aea2e58d95e5bf85e6a0b8e5ae9ee59cb0e59d8020e28094204a3120e58d87e7baa7e69eb6e69e8420696e76617269616e7420e8aebee8aea15d0a0a4f776e65722031333a303620e58e9fe8af9d3a2027e7949fe68890e8aea2e58d95e8bf87e7a88b2c2062726f6b657220e4b88de6a0b8e5ae9ee590973f20e8bf99e698afe7b3bbe7bb9fe992a2e7babf2e270a0a2323204a3120e4b98be5898d2042756720412062726f61646361737420e5a4b1e7ad960a0ae68891e4b98be5898d202836373930336335622920e58faae68f902066697820427567204120706c616365686f6c64657220e59cb0e59d802e202a2a4f776e657220e8a786e8a792e69bb4e6b7b120e2809420e8bf99e698afe992a2e7babfe7bcbae5a4b12c20e4b88de698afe58d95e782b9206275672a2a3a0a2d20e58db3e4bdbf204a3220e8bf99e6aca1e4bfaee4ba86203078313233342e2e2e20e2869220e79c9f203078614431322e2e2e0a2d20e4b88be6aca1204c4c4d20e58f88e58fafe883bde7bc962028e697a0206861726420636f6e73747261696e74290a2d20e6b2a1e69c892073797374656d696320696e76617269616e7420e4bf9de68aa42c20e6af8fe6aca1204c4c4d20e694b92053595354454d5f50524f4d505420e983bde58fafe883bde5868de6929e0a0a232320e992a2e7babfe8aebee8aea13a204f72646572204164647265737320496e76617269616e7420284a3120e992a6e5ae9a290a0a2a2a496e76617269616e742a2a3a20e4bbbbe4bd952062726f6b657220e28692207573657220444d202870726576696577202f206f726465725f636f6e6669726d6564202f207061795f696e737472202f207061796d656e745f7665726966696564202f206b61735f64656c6976657265642920e590abe79a843a0a2d204253432f45564d20e59cb0e59d802030785b612d66302d395d7b34307d20e289a120606167656e745f77616c6c6574732057484552452072656c61795f6e6f64655f69643d62726f6b657220414e4420636861696e3d7b626e622c6574682c706f6c79676f6e2c2e2e2e7d20414e442069735f64656661756c743d31600a2d204b415320e59cb0e59d80206b617370613a5b612d7a302d395d7b36317d20e289a12070656572206b617369612028444d206f726967696e2c2062726f6b6572203130302520e5b7b2e79fa5290a0ae8bf9de58f8d20e286922062726f6b657220e68b92e58f91202b20646d5f6661696c6564202b20616c61726d2e202a2ae99bb6e4be8be5a4962c20e79c9f207573657220e8b584e98791e5ae89e585a8e99381e5be8b2e2a2a0a0a232320e5ae9ee78eb0203420e5b1822028e5a48de794a8204e4f205458204e4f205354415445204348414e474520e6a8a1e5bc8f290a0a232323204c6179657220313a2062726f6b65722068616e646c6572206261636b656e6420e79c9f20666574636820287e3130204c4f43290a6060606a730a2f2f2062726f6b65722d6275792d68616e646c65722e6a73206275795072657669657728290a636f6e7374206d616b657257616c6c6574203d2064622e7072657061726528600a202053454c45435420616464726573732046524f4d206167656e745f77616c6c6574730a202057484552452072656c61795f6e6f64655f6964203d203f20414e4420636861696e203d203f20414e442069735f64656661756c74203d20310a60292e6765742842524f4b45525f52454c41595f49442c20636861696e4b6579293b0a69662028216d616b657257616c6c65743f2e61646472657373292072657475726e207b206572726f723a20276e6f5f6d616b65725f77616c6c6574272c20636861696e3a20636861696e4b6579207d3b0a72657475726e207b202e2e2e2c206d616b65725f616464723a206d616b657257616c6c65742e616464726573732c20706565725f6b617369613a206d73672e5f66726f6d207d3b0a6060600ae59cb0e59d802a2ae5bf85e4bb8e20646220e58f962a2a2c20e4b88de68ea5204c4c4d20e8be93e585a52e0a0a232323204c6179657220323a20707265766965775f6f7264657220746f6f6c206172677320e4b88de590ab206164647265737320287e35204c4f43290a6060606a730a2f2f2062726f6b65722d6c6c6d2d6167656e742e6a7320544f4f4c530a707265766965775f6f726465723a207b0a2020706172616d65746572733a207b20646972656374696f6e2c207174792c20636861696e207d20202f2f20e28690204c4c4d20e58faae883bde4bca020646972656374696f6e2f7174792f636861696e0a20202f2f20e4b88de68ea5e58f97206d616b65725f61646472202f20706565725f6b617369612c20e8bf99e4bfa9206261636b656e6420e887aae5b7b12066657463680a7d0a6060600a4c4c4d20e6b2a1e69cbae4bc9ae7bc96e59cb0e59d802e0a0a232323204c6179657220333a2072656e6465722074656d706c61746520e59bbae5ae9ae59cb0e59d8020287e3130204c4f43290a6060606a730a2f2f20707265766965775f7465787420e79bb4e68ea520737472696e6720696e746572706f6c6174696f6e2c204c4c4d20e4b88de883bde694b90a636f6e7374207072657669657754657874203d2060f09f938b20e8aea2e58d95e794bbe5838f2e2e2e0ae694b6e6acbee59cb0e59d80202862726f6b657220425343293a20247b6d616b657257616c6c65742e616464726573737d0a4b415320e694b6e4bbb62028e4bda0204b61736961293a20247b6d73672e5f66726f6d7d0a2e2e2e603b0a72657475726e2070726576696577546578743b20202f2f204c4c4d20e79bb4e68ea520444d2c20e4b88de9878de696b0e7949fe688900a6060600a0a232323204c6179657220343a20616374696f6e2d7175657565206173736572742028446566656e736976652c207e3135204c4f43290a6060606a730a2f2f2062726f6b65722d616374696f6e2d71756575652e6a732065786563757465416374696f6e0a666f722028636f6e737420646d5f6b696e64206f66205b27646d5f7061795f696e737472272c2027646d5f6f726465725f636f6e6669726d6564272c2027646d5f7061796d656e745f7665726966696564272c2027646d5f6b61735f64656c697665726564275d29207b0a202069662028616374696f6e2e6b696e64203d3d3d20646d5f6b696e6429207b0a20202020636f6e73742065766d4d61746368203d20616374696f6e2e6d6573736167652e6d61746368282f30785b612d66412d46302d395d7b34307d2f6729207c7c205b5d3b0a20202020636f6e73742076616c696445766d203d2065766d4d617463682e65766572792861646472203d3e2069734f757257616c6c6574286164647229293b0a20202020696620282176616c696445766d29207b0a2020202020206c6f676765722e6572726f722827414444524553535f494e56415249414e545f56494f4c41544544272c207b206b696e643a20646d5f6b696e642c2065766d4d617463682c20616374696f6e207d293b0a202020202020656e7175657565287b206b696e643a2027646d5f6661696c6564272c206d6573736167653a2027e58685e983a8e99499e8afaf2c20e5b7b2e9809ae79fa5204f776e657227207d293b0a20202020202072657475726e3b20202f2f20e4b88de58f910a202020207d0a20207d0a7d0a66756e6374696f6e2069734f757257616c6c6574286164647229207b0a202072657475726e20212164622e70726570617265282753454c45435420312046524f4d206167656e745f77616c6c657473205748455245204c4f5745522861646472657373293d4c4f574552283f2920414e442072656c61795f6e6f64655f69643d3f27292e67657428616464722c2042524f4b45525f52454c41595f4944293b0a7d0a6060600ae8bf99e698af2a2ae69c80e5908ee4b880e98193e585b32a2a3a20e58db3e4bdbf204c4c4d2f68616e646c657220e4b88ae5b182e980bbe8be91e6b384e6bc8f2c20616374696f6e2d717565756520e585a5e993bee5898de69c80e7bb88206173736572742e0a0a232320414e54492d5041545445524e532052313920e58aa020284a3120e7ab8be58db3e58699290a0a2a2a5231392062726f6b657220e28692207573657220444d20e590abe79a84e993bee4b88ae59cb0e59d80e5bf85e4bb8e206167656e745f77616c6c6574732044422066657463682c20e4b88de68ea5e58f97204c4c4d2f68616e646c657220e4b88ae5b182e4bca0e580bc2e20616374696f6e2d717565756520e585a5e993bee5898d206173736572742e20e8bf9de58f8de58db3e68b922e2a2a0a0a6c696e742d6b616e65742052313920e99d99e680813a20e689ab2062726f6b65722068616e646c65722f6c6c6d2d6167656e7420e4bbbbe4bd952060247b616e797468696e675f65766d5f616464727d602074656d706c6174652c20e5bf85e4bcb42064622e707265706172652053454c454354206167656e745f77616c6c6574732066657463682028e4b88de883bd2068617264636f6465202f20e4b88de883bd204c4c4d20696e707574292e0a0a232320e4bfaee6a188e4bc98e58588e7baa70a0a2d20f09f9aa8f09f9aa82050303a204a3220e4bfae20427567204120e79c9f206665746368202831356d696e2920e2809420e4b88de998bb203120686f75720a2d20f09f9aa8f09f9aa82050303a204a3120e58699204c6179657220342061737365727420287e3135204c4f432c2033306d696e2920e2809420e998b2e5bea1e5b18220e5bf85e5a4870a2d20e29aa02050313a204a3120414e54492d5041545445524e5320523139202b206c696e742d6b616e65742052313920e99d99e68081e689ab20287e32306d696e290a2d20e29aa02050313a204e57542072657669657720e4b889e696b9e585b1e8af860a2d20f09f9ba12050323a20e585a82062726f6b657220444d20e8b7afe5be8420417564697420284a3120e4bbbbe58aa12c20e689bee585b6e4bb9620706c616365686f6c64657220e9a38ee999a9e782b9290a0a2323204a3120e887aae68ea5204c617965722034202b205231390a0a4a3220e4bda0e4bfae204c6179657220312d332c204a3120e68ea5204c6179657220342028616374696f6e2d71756575652061737365727429202b205231392028616e74692d7061747465726e292e204e575420e4bda0207265766965772028e4bda020414e54492d5041545445524e53206f776e6572292e2033302d34356d696e2045544120e4b889e696b9e5b9b6e8a18c2e0a0a4f776e657220e4bda0e8bf99e69da1e992a2e7babfe68f90e79a84e79c9fe6ada3e6a0b8e5bf832e20e4b88de698af20666978206275672c20e698afe5bbba20696e76617269616e742e20e4b880e6aca1e5bbbae5a5bde4bba5e5908ee68980e69c892062726f6b657220444d20e983bde8a2abe4bf9de68aa42e0a0ae28094204a31204020346130643830383638202b20e992a2e7babfe8aebee8aea1e4b88ae99481