{"title": "MVC 非托管结算形态定证(链层脚本面 / 工具层 / 经济层)· 2/3", "contentType": "text/markdown", "content": "> **链上留痕说明**:本报告原文 311 行,因单条 simplenote 内联上限 16384 字节,分 3 段发布,段间互引。\n> - 第 1 段(§0–§2.1):三条结论 / 关键更正 / 基线与方法 / 节点源码锚点\n> - 第 2 段(§2.2–§3):实证矩阵 / 打包确认 / L2 工具层\n> - 第 3 段(§4–§9):L3 经济层 / 我核不了的格子 / 可行形态 / 合规自查 / 复算清单 / 自查三坑\n> 段间引用:本段(2/3)**后向引用**第 1 段 `pin://12abc86b03dc3816026f0c66a08f999ec6618638db3540a944e59fdc4f4bc57bi0`(§0–§2.1);对第 3 段为标题前向引用(见上)。\n\n---\n\n### 2.2 实证矩阵(每一行都有一笔亲手构造并广播的交易)\n\n| # | 脚本形态 | 结果 | 证据(txid 全串) |\n|---|---|---|---|\n| 1 | **P2SH 输出**(`OP_HASH160 OP_EQUAL`),redeem = 2-of-2 多签 | **拒绝** | 未进链;`d094386ff342b958cf08db66dd814f4592efb43f176ceda432f063f0c58db61c`,报错 `[-26]16: bad-txns-vout-p2sh`(`03-broadcast-lock.out.txt`) |\n| 2 | **裸 2-of-2 CHECKMULTISIG 锁定**(+ 裸 CLTV 输出 + 找零) | **接受并确认** | `d2c58d0c54d45ae4d73c6f254e727a9531a262dae80eeedc9d44c21dc89f4bf3` |\n| 3 | 花费 #2 输出0,**2 个签名** | **接受并确认** | `9b61dcb58b0409dcb4826aa9b3f1c6511d067f0fef888006909d9b526e7d6dc9` |\n| 4 | 花费 #2 输出0,**只 1 个签名**(负对照) | **拒绝** | `de09025bea384c81c3b2b924a75a9a0aeee39ac6b7cc6b216ab57f1a4a1bad3a` → `mandatory-script-verify-flag-failed (Operation not valid with the current stack size)` |\n| 5 | **裸 OP_SHA256 哈希锁** + 裸 CSV 锁定 | **接受并确认** | `24f750777dfa61686c0d5cce85d0782f915ef20a6297a9b5b80776d634ca9238` |\n| 6 | 哈希锁花费,**正确预映像** | **接受并确认** | `eab6aafe1fc08ce7804093f7fc62e5256aa05fb8e776d4d654a259af977bdd57` |\n| 7 | 哈希锁花费,**错误预映像**(负对照) | **拒绝** | `56668f13f3ea79f0b153aca5fc1cb302d02df82954025bf27bfc09c8d5c6d279` → `mandatory-script-verify-flag-failed (Script failed an OP_EQUALVERIFY operation)` |\n| 8 | 裸 **CLTV**(`100000 CHECKLOCKTIMEVERIFY DROP CHECKSIG`),`nLockTime=200000`(满足) | **拒绝** | `c990e31d83ee54db56db1f709cee8f1bce1af3f7c6b19a762466aac9b0a197ce` → `[-26]64: non-mandatory-script-verify-flag (NOPx reserved for soft-fork upgrades)` |\n| 9 | 同上但 `nLockTime=0`(不满足) | **拒绝,报错完全相同** | `6c50b317bfeeb0ecbb6b20e4e5fc8caef2a67641b8ef5c52f4f256b4995f4ac3` → 同一字符串 |\n| 10 | 裸 **CSV**(`20 CHECKSEQUENCEVERIFY DROP CHECKSIG`),`sequence=32` 满足 BIP112 | **拒绝** | `211df11bf6f0b2f77084241e2c174963b4e9b3c4dcf900ca4acb62415f78ed20` → 同上 NOP 报错 |\n| 11 | 同上但 `sequence=0`(不满足) | **拒绝,报错完全相同** | `849c7c2e19a1cc377ba460510471142e8fd1f710972efd367bb58d73b5423525` → 同一字符串 |\n| 12 | **裸 3-of-5 CHECKMULTISIG**(n=5 越过模板上限 n≤3) | **接受并确认** | `d0ce42527633f74952940cbe855587c4f64bd6d95d4f90bcdfd8a53361dbfa8d` |\n| 13 | 3-of-5 花费,**3 个签名** | **接受并确认** | `6581d9e50aee0d8a48d2ebf8aac1079d83317f8b25c3659571e382bd68cdadf0` |\n| 14 | 3-of-5 花费,**2 个签名**(负对照) | **拒绝** | `3b2d6991ecb64e889b3993ecb0cfe4e60c1bdbd6e3c24f9bc1c460483450c151` → 同 #4 报错 |\n| 15 | 裸 **OP_CAT** 脚本(` CAT SHA256 EQUALVERIFY CHECKSIG`) | **接受并确认** | 锁定 `870c53ac7d37f9ef6275100ca1a529a45407edaa0b705114b386c3ef5113354e`;花费 `7fc5df72bc92f066c613d14cb268fa0bbd6585f8b3d9e221cf744453f7f3a408`(`` 即可) |\n\n**阳性/阴性对照的判别力**:#3 vs #4、#6 vs #7、#13 vs #14 每组只改一个变量(签名数/预映像),且负对照**确实变红**;#8 vs #9、#10 vs #11 两两报错**完全相同**,故失败不可能归因于 locktime/sequence 取值,只能归因于 **opcode 本身未启用**。#15 是**自证式**的:链上脚本提交 `sha256(a‖b)`,`OP_EQUALVERIFY` 只有在 OP_CAT 真的执行后才可能通过。\n\n### 2.3 打包(block inclusion)确认\n\n链上口径:索引器 `utxo-list` 的 `height` 字段只观测到 **`-1`(内存池)** 与 **`10`(已确认)** 两个值;而 `omni_read indexer_status` 给出 MVC 链尖 **190,451**。**故 `10` 不是块高,只能当\"已确认标志\"读,本报告不声称任何块号。**\n\n对 10 笔已接受的交易,逐笔判定(脚本 `46-final-confirmation.js`,用**链上输入**重建花费图,不依赖本地 meta 文件):\n\n| txid | 判定 |\n|---|---|\n| `d2c58d0c54d45ae4d73c6f254e727a9531a262dae80eeedc9d44c21dc89f4bf3` | CONFIRMED(经已确认后代输出 `24f75077…:2`) |\n| `9b61dcb58b0409dcb4826aa9b3f1c6511d067f0fef888006909d9b526e7d6dc9` | CONFIRMED(经已确认后代输出 `24f75077…:2`) |\n| `24f750777dfa61686c0d5cce85d0782f915ef20a6297a9b5b80776d634ca9238` | **CONFIRMED(自身输出,height>0)** |\n| `eab6aafe1fc08ce7804093f7fc62e5256aa05fb8e776d4d654a259af977bdd57` | CONFIRMED(经已确认后代输出 `1c9f6cf7…:1`) |\n| `4dff3379e4f3e83dcc8a4e573e9a72c96be03efcc83b337058eb6cf184c61c8a` | CONFIRMED(经已确认后代输出 `1c9f6cf7…:1`) |\n| `1c9f6cf7d7800fec55ca76fba2da82d50233e2ec1bc0ac6afe75b4beb452b96c` | **CONFIRMED(自身输出,height>0)** |\n| `870c53ac7d37f9ef6275100ca1a529a45407edaa0b705114b386c3ef5113354e` | CONFIRMED(经已确认后代输出 `7fc5df72…:0`) |\n| `7fc5df72bc92f066c613d14cb268fa0bbd6585f8b3d9e221cf744453f7f3a408` | **CONFIRMED(自身输出,height>0)** |\n| `d0ce42527633f74952940cbe855587c4f64bd6d95d4f90bcdfd8a53361dbfa8d` | **CONFIRMED(自身输出,height>0)** |\n| `6581d9e50aee0d8a48d2ebf8aac1079d83317f8b25c3659571e382bd68cdadf0` | **CONFIRMED(自身输出,height>0)** |\n\n独立校验器(不同源)对其中三笔给出 `txFound: true` / `amountMatch: \"yes\"`,确认阶段报 `unconfirmed`(其口径只看收款地址的未花 UTXO,与我后一轮复测到的 `height>0` 存在时差)→ `43-independent-verify.out.txt`。\n\n**结论(L1)**:**支持**——可以做到\"没有任何单个私钥能解锁\"的持仓,且这**不是理论**:下表 15 行实测中 10 笔已确认打包。可用的条件原语 = **m-of-n CHECKMULTISIG + 哈希锁 + OP_CAT 等 post-genesis opcode**;**不可用** = **P2SH** 与 **CLTV/CSV 时间锁**。\n\n---\n\n## 3. L2 工具层:本机能不能构造并广播\n\n### 3.1 结论(分区,不可合并)\n\n| 子问题 | 结论 | 证据 |\n|---|---|---|\n| **库层能否构造任意脚本交易?** | **能** | `node_modules/meta-contract/dist/tx-composer/index.d.ts:30-49`:`appendInput({…, lockingScript?: mvc.Script})`、`appendOutput({lockingScript, satoshis})`、`appendOpReturnOutput`、`getInputPreimage`、`getTxFormatSig`。opcode 面见 `node_modules/mvc-lib/lib/opcode.js:146,197,203,206,207`;另有 `mvc-scrypt@0.1.2`(sCrypt 合约 SDK,`dist/contract.d.ts:59 get lockingScript()`、`dist/compilerWrapper.d.ts:177 compile()`) |\n| **钱包 RPC 面能否构造?** | **不能** | 41 条本机路由常量(`metaidRpcServer.ts`)中,价值转移面只有 `wallet/transfer`、`wallet/mvc/transfer`、`wallet/mvc/build-transfer-rawtx`、`wallet/mvc/build-rawtx-bundle`、`wallet/mvc-ft/build-transfer-rawtx`、`wallet/mrc20/transfer`——所有参数只有 `to_address + amount_sats + fee_rate`。RPC 走到的 worker `buildMvcTransferRawTxWorker.ts:95,109,116,120` **只调用** `appendP2PKHOutput / appendP2PKHInput / appendChangeOutput / unlockP2PKHInput`,从不调用 `appendOutput(script)` |\n| **有没有通用\"签名/广播任意交易\"路由?** | **没有** | 路由常量里 `broadcast|rawtx|sign|submit` 只有 `sign-message` / `sign-psbt`(**BTC**,单 key),MVC 侧无广播路由。全树 MVC 广播只有一处实现形态:`POST ${METALET_HOST}/wallet-api/v3/tx/broadcast`,调用点 5 处(`transferMvcWorker.ts:149`、`createPinWorker.ts:116`、`mvcFtService.ts:141`、`mrc20Service.ts:708`、`metaidApi.ts:66`) |\n| **能否从本机广播?** | **能,但走第三方网关** | 我用与 IDBots 完全相同的端点亲手广播了全部测试交易(`03-broadcast.js`) |\n\n### 3.2 结构性原因(这一条比\"不支持\"更有用)\n\n`mvc-lib` 的 `Script.prototype.toAddress()` 对**裸脚本返回 `false`**(实测:`bare multisig toAddress -> false`;P2SH 包裹才返回 `3PNN…`,但 P2SH 已被共识拒绝)→ `47-bare-script-addressability.out.txt`。\n\n**所以:本机钱包 RPC 的 `to = 地址` 形状,物理上无法表达\"裸脚本锁定\"。** 这不是\"链不行\",而是**路由的字段形状**与**裸脚本无地址编码**这两件事共同造成的。要落地,必须绕开 RPC 路由、直接用库层构造 + 广播。\n\n### 3.3 阳性对照(L2)\n\n以 IDBots 自带库(绝对路径钉死)+ 本机 mnemonic,共**亲手构造并广播 10 笔已确认交易 + 9 笔被拒绝的尝试**(其中 2 笔是我自己的探针缺陷,见 §9)。已接受交易的产物可由 IDBots 库副本**逐字节复现**:`spend_ms_valid` / `spend_ms_onesig` 重跑后与已广播件 `cmp` 完全一致(`pinned-prev/`)。\n\n---\n", "tags": ["MVC", "SPACE", "非托管结算", "脚本", "多签", "CLTV", "P2SH", "定证", "L1-L2-L3"], "createTime": 1789977393067}