协议演进 / BIP/比特币改进提案 / BIP-450

BIP-450 Formosa——以主题助记故事编码种子

把 BIP-39 的无关联单词串改成有语法、有主题的故事句子来编码同一份熵,种子推导仍回到 BIP-39,旧钱包与地址不变。本 BIP 目前处于草案状态。

一、档案卡

档案卡
编号BIP-450
标题Formosa—Seed encoding by themed mnemonic stories
作者Yuri S Villas Boas <[email protected]>, André Fidencio Gonçalves <[email protected]>
指定日期2026-05-15
讨论日期2023-05-02
层级Applications(应用)
类型Specification(规范类)
状态Draft(草案)
依赖BIP-32, BIP-39
阅读版https://bips.dev/450
官方原文https://github.com/bitcoin/bips/blob/master/bip-0450.mediawiki

二、放在哪一族

助记词与种子编码族,是 BIP-39 的扩展,不是替代。

这一族的分工是:BIP-32 定义分层确定性钱包如何从种子派生密钥,BIP-39 定义如何把熵编码成助记词、再由助记词经 PBKDF2 推出种子。BIP-450(Formosa)只改最外层的一环——熵呈现给人的样子——并且刻意让种子推导绕回 BIP-39,所以档案卡中把 BIP-32、BIP-39 列为依赖。

原文的说法是:BIP-39 本身就是 Formosa 的一个“主题”(theme),Formosa 是它的严格超集。

三、它要解决什么

助记词比原始二进制或十六进制好记、好抄、好口述,但 BIP-39 的词串有一个先天弱点:词与词之间没有语法关系、没有语义关系。人的记忆是联想式的——能挂上已有知识、形成画面和故事的信息才容易长期记住——一串互不相关的词恰恰不给记忆任何抓手。

Formosa 的做法是把词汇按句法角色(如主语、动词、形容词、宾语、地点)拆进若干小词表,再让整句落在一个连贯的语义域里:中世纪奇幻、科幻、自然、金融,或用户自选的主题。同样 33 比特熵,BIP-39 给三个孤立的词,Formosa 给一句可以想象出画面的话,例如原文示例主题 medieval_fantasy 下的一句 “king unveil sweet wine queen throne_room”,补上主题隐含的冠词与介词,就是“国王向王后揭开甜酒”的场景。

原文特别划清一条界限:这是搬运计算机生成的随机数的转写工具,不是把用户自编的句子加工成钱包种子的工具——后者即所谓脑钱包(brainwallet),不在本提案范围内。

四、规则本身

4.1 术语与主题(theme)结构

为避免 sentence 一词两义,原文固定了术语:word 是一个词;category 是一个句法角色,自带词表与固定位宽;theme 是全部 category、词表、位宽、顺序与约束的集合,相当于 Formosa 版的 BIP-39 词表;sentence 是由一个主题对单个 33 比特熵块编码得到的词序,相当于 BIP-39 的连续三个词;全部 sentence 顺序拼接就是 mnemonic(助记故事)。

主题是一份 JSON 文档,定义:

全部 BIT_LENGTH 之和必须等于 33。LED_BY 表示“本角色的词表不是一张平表,而是按主导角色已选出的词索引的一组子表”,用来表达语义搭配限制(例如某个宾语只能配某些形容词);该关系必须无环,且主导角色必须在 FILLING_ORDER 中排在被主导者之前。词表条目须用 UTF-8、NFKD 规范化编码。

4.2 从熵到助记故事

与 BIP-39 同构:初始熵为 128–256 比特且为 32 的倍数;校验和取熵的 SHA256 哈希的前(熵比特数 / 32)位,拼在熵末尾;拼接后的比特流按每 33 比特切块,每块编码一个 sentence。

初始熵(比特) 校验和(比特) 总比特 句子数 助记词数(6 词主题) 助记词数(BIP-39)
128 4 132 4 24 12
160 5 165 5 30 15
192 6 198 6 36 18
224 7 231 7 42 21
256 8 264 8 48 24

每块内部按 FILLING_ORDER 依次为每个 category 读取对应位宽的比特、解析出实际词表(有 LED_BY 时先按主导词查子表)、按下标选词;最后按 NATURAL_ORDER 输出,即为该句。

BIP-39 在这个框架里是特例:只有一个名为 WORD 的 category,位宽 11,词表 2048 条,无 LED_BY,每句重复取三次。

为什么定 33 比特?因为 BIP-39 的 11 比特词加“每 32 比特熵配 1 比特校验和”,使合法总长度恒为 33 的倍数;33 是能让任意主题无损对齐同一熵与校验和边界的最小单位,这正是完全向后兼容的前提。

4.3 从助记故事到种子:必须绕回 BIP-39

种子推导分两步,缺一不可:

  1. 解码:用编码时同一主题把助记故事解回熵,并校验校验和;不匹配时软件必须发出警告。实现应通过逐一尝试已知主题解析、按词与校验和匹配来识别当前主题。
  2. 重编码:把恢复出的熵用 BIP-39 英文词表重新编码成标准 BIP-39 助记词。

然后完全按 BIP-39 做 PBKDF2:以该助记词(UTF-8 NFKD)为口令、“mnemonic”加口令短语(passphrase,无则为空串,UTF-8 NFKD)为盐,2048 轮 HMAC-SHA512,得到 512 比特种子。

后果是:同份熵无论用哪个主题记诵,种子、密钥与地址都相同;用户可以换主题、也可以退回 BIP-39,不丢钱包;只支持 BIP-39 的钱包与支持 Formosa 的钱包从同份熵推出同一批密钥。

4.4 主题的设计要求

原文对主题设计者给出方向:语义范围单一连贯;词汇以可成像的具体名词、形容词为宜,避免抽象词;词表排序以便二分查找;尽量让短前缀(如前两个字母)就能唯一确定一个词。小词表还带来信息密度优势:BIP-39 需 4 个字符定位一个 11 比特词(2.75 比特/字符),128 条的 7 比特词表只需 2 个字符(3.50 比特/字符)。原文举的 nationalities 主题算出 3.30 比特/字符,比 BIP-39 高约 20%。

原文同时强调:强烈不建议用非标准自定义主题生成助记词——助记词只在恢复时还能拿到那份主题文件才有意义,非标准主题的保存责任完全在用户自己。

五、谁必须动

普通持币人:不强制迁移。继续使用 BIP-39 助记词完全有效;若改用 Formosa 主题记诵,必须把所用主题与助记故事一并可靠保存,丢了主题文件等于丢了恢复路径。

钱包开发者:需实现主题解析、按 FILLING_ORDER / NATURAL_ORDER 与 LED_BY 的编解码、校验和验证与警告,以及“解码后重编码为 BIP-39 再 PBKDF2”的两步种子推导;只认 BIP-39 的旧钱包无需改动,只是解不了非 BIP-39 主题。

主题设计者:词表规模必须精确满足 2^BIT_LENGTH、各位宽之和为 33、LED_BY 无环,并按 4.4 的可记忆性与前缀唯一性要求打磨词表。

共识层与节点:完全无关。这是应用层的编码约定,不改变任何交易、地址或共识规则。

六、现在算不算数,以及一个常见误读

状态为 Draft(草案)。原文给出参考实现与标准主题的仓库链接,并附测试向量(测试口令短语统一用 “TREZOR”,且因种子推导绕回 BIP-39,同一熵下各主题共用同一组种子测试向量)。但它仍是草案,不是钱包厂商必须跟随的定版标准;原文没有声称任何主流钱包已经采用,本页也不做此推断。

常见误读:

“用了 Formosa 的故事助记词,种子和地址就和 BIP-39 不一样,或者换个主题就换了一个钱包。”

不对。种子只是熵的函数,不是主题的函数:推导时先解码回熵,再用 BIP-39 英文词表重编码后做 PBKDF2。同一熵在任何主题下、乃至退回纯 BIP-39 时,种子、BIP-32 密钥与地址都完全一致。变的只是人记诵的那层外衣。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。