太长不看 —— 后量子花费从创世区块起就在 TensorCash 上线:
- 新增一种地址类型
tc1z…(Witness v2)。共识禁用了 Taproot 的 key-path 花费;标准钱包模板承诺到单个 ML-DSA leaf(FIPS 204,经由 liboqs),所以钱包 生成的tc1z花费就是后量子的。 - 能装 原生币和已发行资产——主网上已经有了(区块 20,246 里有一份 COMPUTE 期权 存放 在 v2 输出中;从这类输出里 ML-DSA 花出去 的交易还没出现)。
- 收款不加价;从里面花出去大约是普通花费的 10 倍——那个好几 KB 的格签名只在 花费时才出现。
- 用之前先看两条:在你自己掌控的硬件上签名(liboqs 并不打算用于处理敏感数据的 生产环境),以及 每把密钥都单独备份(目前还没有助记词派生)。
大多数链把后量子安全当成「以后再说」的问题——等量子计算机真的逼近了,再来一次注定 吵翻天的迁移。TensorCash 是创世分叉,没有历史 UTXO 要抢救,所以我们没等:从创世区块 起,一条后量子花费通道就和大家熟悉的 ECDSA/Schnorr 通道并行跑着。要不要用,取决于你 往哪种地址里打钱。这篇就用大白话过一遍——它是什么、怎么花、能装什么,以及动手之前该 知道什么。
新的地址类型:tc1z…
TensorCash 同时跑着两条花费通道,按地址逐个选:
- Witness v0/v1——ECDSA/Schnorr,从 Bitcoin 继承下来的成熟那一套
(
tc1q…/tc1p…)。 - Witness v2——只走 script path 的 Taproot 栈,标准后量子模板用的就是它。地址是
tc1z…(测试网tct1z…,regtesttcrt1z…)。
tc1z 就是一个普通的 32 字节 Taproot 输出,bech32m 编码——长度和形状跟 v1 地址一模
一样,只是版本字符从 p 换成了 z(校验和跟着变)。往它上面收款没什么特别;变的是
怎么花出去。
只留 script path:key path 被关掉了
一个 Taproot 输出,可以用一个 key-path 签名花掉,也可以用一段 leaf script 花掉。在 Witness v2 上,key path 被共识禁用了——v2 输出 只能 走 script path。
这一点为什么要紧:key-path 花费是用 secp256k1 上的一个 Schnorr 签名来授权的,而这条
曲线正是量子计算机会攻破的那条。把它关掉,就意味着 任何 tc1z 输出上都没有
key-path 签名可攻击。至于 leaf 里到底要求什么,那是脚本自己的事——TensorCash 标准的
generatemldsaaddress 模板把它做成 单个 ML-DSA leaf,于是花费权限落在 ML-DSA
加上 Taproot 的哈希承诺上,完全没有 secp256k1 那条路。自定义的 v2 脚本可以用别的
leaf,也可以混着用,所以 tc1z 这个前缀只能证明 key path 关了,不能 证明策略就是
纯 ML-DSA。本文后面讲的都是那个标准模板。
为什么 secp256k1 会倒,格却不会
secp256k1 的安全性建立在离散对数问题上——你的公钥是一个点 k·G,安全与否取决于没人
能还原出私钥 k。这个问题藏着一层 周期性 结构,而 Shor 算法 正是为找出这种
结构而生的:量子计算机只要够大,就能把 k 直接算出来。ML-DSA 依赖的则是带结构的
module-lattice 问题,目前没有类似 Shor 那样的多项式时间攻击。量子算法仍然能削掉
一部分攻击成本,所以 ML-DSA 的参数集在选取时,就同时按经典估计 和 量子估计去对齐
NIST 的安全强度分级——这是有证据支撑的信心,不是「不会再出现更好的攻击」的证明。
签名:ML-DSA(FIPS 204),经由 liboqs
leaf 验证的是一个 ML-DSA 签名——NIST 于 2024 年 8 月以 FIPS 204 标准化的 Module-Lattice DSA——用的是 liboqs(Open Quantum Safe 项目)里的实现。一共三套 参数集,创建地址时选一套:
| 参数集 | NIST 等级 | 签名大小 | 大致相当于 |
|---|---|---|---|
| ML-DSA-44 | 等级 2 | ~2.4 KB | AES-128 量级 |
| ML-DSA-65(TensorCash 默认) | 等级 3 | ~3.3 KB | AES-192 量级 |
| ML-DSA-87 | 等级 5 | ~4.6 KB | AES-256 量级 |
TensorCash 默认用 ML-DSA-65,是在体积和安全之间取的折中(FIPS 204 把三套都标准化
了,并没有指定用哪一套)。签名本身是 witness 栈上的一个元素,由新的
OP_CHECKMLSIGVERIFY 操作码对着公钥去校验,作用在做了域分离的 TapSighash/ML-DSA
上——所以它撑大的从来不是你 收款 的那个输出,只有你 花费 的那个输入。记住这一
点,下面讲手续费时要用。

在钱包里就是两个字段的事——地址类型选 Bech32m (Post-Quantum),安全级别选 ML-DSA-65——应用本身也标出了本文说的同样两条注意事项:这把密钥不是 HD 派生出来 的(记得备份),以及花起来更贵。(图中名称和数字均为占位。)
tc1z 地址能装什么
原生 TSC: 一直都行——v2 输出和别的输出一样能装币。
资产: 能,而且不是纸上谈兵。TensorCash 的资产本身就是一等公民 UTXO,和别的 UTXO
一样可以待在 v2 输出上。主网上已经发生过:在 区块 20,246,一笔交易把两个单位的
COMPUTE.V26P100K(一份 COMPUTE Index 期权)转 进 了一个
钱包创建的 tc1z… 输出(交易)。这笔交易的输入是普通的 Witness-v1 花费,
所以严谨的说法是:已发行资产可以 存放 在 v2 输出里——还没有出现从这类输出里
花出去 的、由 ML-DSA 认证的花费(公钥和 leaf 在该输出被花掉之前一直藏着)。某个
资产允不允许走后量子通道,取决于发行方的政策,但这个能力是真实的,今天就已经在线上。

同一件事,从钱包这边看——一份 COMPUTE 期权进到一个 Witness-v2 输出里,标签是 ml-dsa。(钱包名称、余额以及其他金额和地址都是占位;这笔 COMPUTE 收款是区块 20,246 里真实的那笔交易。)
在 explorer.tensorcash.org 上,v2 输出会出现在对应的交易页面
(/tx/…)——一旦被花掉,那个好几 KB 的 ML-DSA witness 就直接看得到——资产则有自己
的 /asset/… 页面。
手续费:花的时候付钱,收的时候不付
手续费按重量收,ML-DSA 签名是 2.4–4.6 KB,Schnorr 才 ~64 字节——但这份重量只有在你 花掉 一个标准 ML-DSA v2 输出时才会出现。
收款 不多花一分钱:输出还是那个 32 字节的程序。区块 20,246 那笔转 进 v2 输出的 交易,342 vB 付了 363 sats——没有任何 ML-DSA 溢价,它的体积就是普通的输入、输出 加资产元数据。格签名要到后面花费时才出现。
花费成本主要由固定大小的签名、揭示出来的公钥脚本和 control block 决定。Segwit 的 4× witness 折扣能缓解一些,但按那个区块同样的 ~1.06 sat/vB 算,一笔简单的 1 进 2 出花费 大致是这样:
| 花费类型 | 交易大小 | 手续费 | 相对标准 |
|---|---|---|---|
| 标准 Taproot(Schnorr) | ~155 vB | ~165 sats | 1.0× |
| ML-DSA-44 | ~1,084 vB | ~1,151 sats | 7.0× |
| ML-DSA-65(默认) | ~1,466 vB | ~1,556 sats | 9.5× |
| ML-DSA-87 | ~1,956 vB | ~2,076 sats | 12.6× |
所以默认的后量子花费大约是 普通花费的 10 倍量级(单看花费的那个输入,就从 ~58 vB 涨到 ~1,370 vB)。钱包里那句「~70×」的警告量的是另一回事——那是签名本身的膨胀 (~3.3 KB 对 ~64 字节);有 witness 折扣和固定开销摊着,整笔交易的溢价降到表里的 ~10×。换成绝对数,按这个费率 ~1,556 sats 就是 0.0000156 TSC。这笔溢价是实打实 的,每花掉一个后量子输出就要付一次,而且只由你自己承担——照一笔大型多签花费的 量级去预算就行。
签名:用你自己掌控的硬件
有一条得老实说:ML-DSA 那部分代码用的是 liboqs,而 liboqs 项目自己 不建议在生产环境中依赖这个库去处理敏感数据。它声称不存在依赖秘密值的分支,也做了 一些侧信道检查,但并没有覆盖所有时序通道或物理通道——而且今天硬件钱包对它的支持基本 等于没有。所以 请在你自己拥有并信任的硬件上签 ML-DSA v2 交易,冷存储最好离线签, 别用可能观测到时序或功耗的共享签名机、托管签名服务。
两条运维上的事实:
- 目前还没有助记词派生——这是钱包的限制,不是算法的(FIPS 204 的密钥可以从 32
字节种子重新生成)。每把密钥都必须单独备份;
generatemldsaaddress在创建时就把 私钥返回给你,方便你备份。钱包文件丢了,密钥就跟着没了。 - 加密钱包下的 ML-DSA 签名 还在收尾;现阶段请走直接传入密钥材料的 RPC 流程。
地址卫生:ML-DSA 密钥在花费前一直藏着
每次收款都换个新地址——这在哪条链上都是好习惯,而且不花钱。这里还有个不错的性质:在 标准模板里,ML-DSA 公钥是待在 Taproot leaf 内部 的,只有输出被花掉时才揭示,所以一 个没花过的输出压根不暴露任何后量子密钥。把边界说清楚:金额、资产元数据和交易图谱和任 何 Bitcoin 式的链一样,仍然是公开的,藏起来的只有 密钥材料。所以一个收过钱、但从 未花费过的后量子地址,不会给攻击者留下任何可以拿去硬算的 ML-DSA 密钥。
后量子,从创世区块起
结论:TensorCash 从创世起就提供了一个后量子花费选项——不用迁移,没有激活窗口,
而且(因为是创世分叉)也不存在暴露在外、得赶紧转到安全地方去的历史余额。一枚币走不走
这条通道,取决于你选哪种地址;而它已经在被用了:区块 20,246 里就有
COMPUTE.V26P100K 存放在一个 v2 输出中。
运营方大可以继续把热的、短期停留的余额放在 v0/v1 上——工具和硬件都成熟,而且密码分析 不是一夜之间的事。长期限的托管面对的是另一种敞口——针对授权的 先存下来、以后再伪造 风险——这种情况下,即便 witness 更大、签名栈更年轻,标准的 ML-DSA v2 模板也可能是值 得的。
完整的构造——编码、共识规则、sighash、威胁模型——都在后量子花费白皮书里。
想试试的话,在桌面钱包里用
generatemldsaaddress 生成一个 tc1z 地址,往里打点钱,然后在区块浏览器
上看着它。后量子通道不是路线图上的一项——它从创世区块就在那儿。
本文由 Imosuke Takakuni 以化名撰写。