NUT-00:符号、使用方法与术语

  • cashubtc
  • 发布于 2026-01-12 18:27
  • 阅读 17

本文档详细介绍了 Cashu 协议中使用的符号和模型,并为理解 Cashu 协议中使用的基本密码学奠定了基础。主要内容包括盲Diffie-Hellman密钥交换(BDHKE)的变量、协议流程、消息模型(如BlindedMessage、BlindSignature、Proof)以及token的序列化方法,同时还提及了错误处理和URI方案。

NUT-00:符号、利用和术语

mandatory


本文档详细说明了整个规范中使用的符号和模型,并为理解 Cashu 协议中使用的基本密码学奠定了基础。

  • 发送用户:Alice
  • 接收用户:Carol
  • Mint(铸币服务器):Bob

盲化的迪菲-赫尔曼密钥交换 (BDHKE)

变量

  • G 椭圆曲线生成点

Bob (mint)

  • k mint 的私钥(每个金额对应一个)
  • K mint 的公钥
  • Q 承诺(盲签名)

Alice (用户)

  • x 随机字符串(秘密消息),对应于曲线上的点 Y
  • r 私钥(盲化因子)
  • T 盲化消息
  • Z 证明(非盲签名)

hash_to_curve(x: bytes) -> curve point Y

确定性地将消息映射到 secp256k1 曲线上的公钥点,利用域分隔符来确保唯一性。

Y = PublicKey('02' || SHA256(msg_hash || counter)),其中 msg_hashSHA256(DOMAIN_SEPARATOR || x)

  • Y 派生的公钥
  • DOMAIN_SEPARATOR 常量字节字符串 b"Secp256k1_HashToCurve_Cashu_"
  • x 要哈希的消息
  • counter uint32 计数器(字节顺序为小端),从 0 开始递增,直到找到位于曲线上的点

协议

  • Mint Bob 发布公钥 K = kG
  • Alice 选择秘密值 x 并计算 Y = hash_to_curve(x)
  • Alice 发送给 Bob: B_ = Y + rG,其中 r 是随机盲化因子(盲化
  • Bob 发送回给 Alice 盲化密钥:C_ = kB_(这两个步骤是 DH 密钥交换)(签名
  • Alice 可以将非盲化密钥计算为 C_ - rK = kY + krG - krG = kY = C非盲化
  • Alice 可以将 (x, C) 对作为一个 token,并将其发送给 Carol
  • Carol 可以将 (x, C) 发送给 Bob,然后 Bob 检查 k*hash_to_curve(x) == C验证),如果成立,则将其视为 token 的有效花费,并将 x 添加到已花费秘密值的列表中。

0.1 - 模型

BlindedMessage

一个加密的(“盲化的”)秘密值和一个金额从 Alice 发送到 Bob,用于 铸造 tokens交换 tokensBlindedMessage 也称为 output

{
  "amount": int,
  "id": hex_str,
  "B_": hex_str
}

amount 是请求的 BlindSignature 的值,id 是请求的密钥集 ID,我们期望从中获得签名,而 B_ 是由 Alice 生成的盲化的秘密消息。数组 [BlindedMessage] 也被称为 BlindedMessages

BlindSignature

BlindSignature铸造 tokens交换 tokens 后从 Bob 发送到 AliceBlindSignature 也称为 promise

{
  "amount": int,
  "id": hex_str,
  "C_": hex_str
}

amount 是盲化 token 的值,id 是签署 token 的 mint 密钥的 密钥集 ID,而 C_ 是对在上一步中发送的秘密消息 B_ 的盲签名。

Proof

Proof 也称为 input,由 Alice 从收到的 BlindSignature 生成。数组 [Proof] 称为 ProofsAliceProofs 发送给 Bob熔化 tokens序列化Proofs 也可以从 Alice 发送到 Carol。收到 token 后,Carol 会将其反序列化,并从 Bob 请求 交换 以接收新的 Proofs

{
  "amount": int, 
  "id": hex_str,
  "secret": str,
  "C": hex_str,
}

amountProof 的金额,secret 是秘密消息,是一个 utf-8 编码的字符串(建议使用从 32 个随机字节生成的 64 个字符的十六进制字符串,以防止指纹识别),C 是对 secret 的非盲签名(十六进制字符串),id 是签署 token 的 mint 公钥的 密钥集 ID(十六进制字符串)。

0.2 - 协议

错误

如果发生错误,mint 会以 HTTP 状态代码 400 响应,并在响应中包含以下数据:

{
  "detail": "oops",
  "code": 1337
}

在这里,detail 是错误消息,code 是错误代码。错误代码将在有关使用特定 API 端点的文档中定义。

0.3 - 方法

Tokens 序列化

可以序列化 Tokens 以在用户 AliceCarol 之间发送。序列化的 Tokens 具有 Cashu token 前缀、版本控制标志和 token。可选地,还可以使用 URI 前缀来使 Tokens 可在网络上点击。

我们使用以下格式进行 token 序列化:

cashu[version][token]
V3 tokens

钱包以 base64_urlsafe 格式(base64 编码,其中 / 替换为 _+ 替换为 -)序列化 Tokens。

cashu[version][base64_token_json]

cashu 是 Cashu token 前缀。[version] 是一个 base64_urlsafe 字符,用于表示 token 格式版本(从 A 开始表示当前 token 格式)。[base64_token_json] 是以 base64_urlsafe 序列化的 token JSON。在序列化之前,应清除 [base64_token_json] 中的任何空格。

Version

此 token 格式的 [version] 值为 A

URI 标签

为了使 Cashu tokens 可在网络上点击,我们使用 URI 方案 cashu:。带有 URI 标签的序列化 token 变为

cashu:cashuAeyJwcm9vZn...
Token 格式

反序列化的 base64_token_json

{
  "token": [
    {
      "mint": str,
      "proofs": Proofs
    },
    ...
  ],
  "unit": str <optional>,
  "memo": str <optional>
}

mint 是 mint URL,ProofsProof 对象的数组。接下来的两个元素仅用于向接收用户显示适当的信息:unit 是 token 密钥集的货币单位(有关支持的单位,请参见 Keysets),而 memo 是来自发送者的可选文本备忘录。

示例 JSON
{
  "token": [
    {
      "mint": "https://8333.space:3338",
      "proofs": [
        {
          "amount": 2,
          "id": "009a1f293253e41e",
          "secret": "407915bc212be61a77e3e6d2aeb4c727980bda51cd06a6afc29e2861768a7837",
          "C": "02bc9097997d81afb2cc7346b5e4345a9346bd2a506eb7958598a72f0cf85163ea"
        },
        {
          "amount": 8,
          "id": "009a1f293253e41e",
          "secret": "fe15109314e61d7756b0f8ee0f23a624acaa3f4e042f61433c728c7057b931be",
          "C": "029e8e5050b890a7d6c0968db16bc1d5d5fa040ea1de284f6ec69d61299f671059"
        }
      ]
    }
  ],
  "unit": "sat",
  "memo": "Thank you."
}

序列化后,变为:

cashuAeyJ0b2tlbiI6W3sibWludCI6Imh0dHBzOi8vODMzMy5zcGFjZTozMzM4IiwicHJvb2ZzIjpbeyJhbW91bnQiOjIsImlkIjoiMDA5YTFmMjkzMjUzZTQxZSIsInNlY3JldCI6IjQwNzkxNWJjMjEyYmU2MWE3N2UzZTZkMmFlYjRjNzI3OTgwYmRhNTFjZDA2YTZhZmMyOWUyODYxNzY4YTc4MzciLCJDIjoiMDJiYzkwOTc5OTdkODFhZmIyY2M3MzQ2YjVlNDM0NWE5MzQ2YmQyYTUwNmViNzk1ODU5OGE3MmYwY2Y4NTE2M2VhIn0seyJhbW91bnQiOjgsImlkIjoiMDA5YTFmMjkzMjUzZTQxZSIsInNlY3JldCI6ImZlMTUxMDkzMTRlNjFkNzc1NmIwZjhlZTBmMjNhNjI0YWNhYTNmNGUwNDJmNjE0MzNjNzI4YzcwNTdiOTMxYmUiLCJDIjoiMDI5ZThlNTA1MGI8OTBhN2Q2YzA5NjhkYjE2YmMxZDVkNWZhMDQwZWExZGUyODRmNmVjNjlkNjEyOTlmNjcxMDU5In1dfV0sInVuaXQiOiJzYXQiLCJtZW1vIjoiVGhhbmsgeW91LiJ9
  • 原文链接: github.com/cashubtc/nuts...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cashubtc
cashubtc
江湖只有他的大名,没有他的介绍。