本文档详细介绍了 Cashu 协议中使用的符号和模型,并为理解 Cashu 协议中使用的基本密码学奠定了基础。主要内容包括盲Diffie-Hellman密钥交换(BDHKE)的变量、协议流程、消息模型(如BlindedMessage、BlindSignature、Proof)以及token的序列化方法,同时还提及了错误处理和URI方案。
mandatory
本文档详细说明了整个规范中使用的符号和模型,并为理解 Cashu 协议中使用的基本密码学奠定了基础。
AliceCarolBobG 椭圆曲线生成点k mint 的私钥(每个金额对应一个)K mint 的公钥Q 承诺(盲签名)x 随机字符串(秘密消息),对应于曲线上的点 Yr 私钥(盲化因子)T 盲化消息Z 证明(非盲签名)hash_to_curve(x: bytes) -> curve point Y确定性地将消息映射到 secp256k1 曲线上的公钥点,利用域分隔符来确保唯一性。
Y = PublicKey('02' || SHA256(msg_hash || counter)),其中 msg_hash 是 SHA256(DOMAIN_SEPARATOR || x)
Y 派生的公钥DOMAIN_SEPARATOR 常量字节字符串 b"Secp256k1_HashToCurve_Cashu_"x 要哈希的消息counter uint32 计数器(字节顺序为小端),从 0 开始递增,直到找到位于曲线上的点Bob 发布公钥 K = kGAlice 选择秘密值 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(非盲化)(x, C) 对作为一个 token,并将其发送给 Carol。Carol 可以将 (x, C) 发送给 Bob,然后 Bob 检查 k*hash_to_curve(x) == C(验证),如果成立,则将其视为 token 的有效花费,并将 x 添加到已花费秘密值的列表中。BlindedMessage一个加密的(“盲化的”)秘密值和一个金额从 Alice 发送到 Bob,用于 铸造 tokens 或 交换 tokens。BlindedMessage 也称为 output。
{
"amount": int,
"id": hex_str,
"B_": hex_str
}
amount 是请求的 BlindSignature 的值,id 是请求的密钥集 ID,我们期望从中获得签名,而 B_ 是由 Alice 生成的盲化的秘密消息。数组 [BlindedMessage] 也被称为 BlindedMessages。
BlindSignatureBlindSignature 在 铸造 tokens 或 交换 tokens 后从 Bob 发送到 Alice。BlindSignature 也称为 promise。
{
"amount": int,
"id": hex_str,
"C_": hex_str
}
amount 是盲化 token 的值,id 是签署 token 的 mint 密钥的 密钥集 ID,而 C_ 是对在上一步中发送的秘密消息 B_ 的盲签名。
ProofProof 也称为 input,由 Alice 从收到的 BlindSignature 生成。数组 [Proof] 称为 Proofs。Alice 将 Proofs 发送给 Bob 以 熔化 tokens。序列化 的 Proofs 也可以从 Alice 发送到 Carol。收到 token 后,Carol 会将其反序列化,并从 Bob 请求 交换 以接收新的 Proofs。
{
"amount": int,
"id": hex_str,
"secret": str,
"C": hex_str,
}
amount 是 Proof 的金额,secret 是秘密消息,是一个 utf-8 编码的字符串(建议使用从 32 个随机字节生成的 64 个字符的十六进制字符串,以防止指纹识别),C 是对 secret 的非盲签名(十六进制字符串),id 是签署 token 的 mint 公钥的 密钥集 ID(十六进制字符串)。
如果发生错误,mint 会以 HTTP 状态代码 400 响应,并在响应中包含以下数据:
{
"detail": "oops",
"code": 1337
}
在这里,detail 是错误消息,code 是错误代码。错误代码将在有关使用特定 API 端点的文档中定义。
可以序列化 Tokens 以在用户 Alice 和 Carol 之间发送。序列化的 Tokens 具有 Cashu token 前缀、版本控制标志和 token。可选地,还可以使用 URI 前缀来使 Tokens 可在网络上点击。
我们使用以下格式进行 token 序列化:
cashu[version][token]
钱包以 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] 中的任何空格。
此 token 格式的 [version] 值为 A。
为了使 Cashu tokens 可在网络上点击,我们使用 URI 方案 cashu:。带有 URI 标签的序列化 token 变为
cashu:cashuAeyJwcm9vZn...
反序列化的 base64_token_json 是
{
"token": [
{
"mint": str,
"proofs": Proofs
},
...
],
"unit": str <optional>,
"memo": str <optional>
}
mint 是 mint URL,Proofs 是 Proof 对象的数组。接下来的两个元素仅用于向接收用户显示适当的信息:unit 是 token 密钥集的货币单位(有关支持的单位,请参见 Keysets),而 memo 是来自发送者的可选文本备忘录。
{
"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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!