NIP-13:Nostr工作量证明机制

nostr-protocol 发布于 2025-12-24 阅读 98

NIP-13 定义了 Nostr 笔记的工作量证明(PoW)机制,通过 nonce 标签实现。难度由事件 ID 的前导零位数决定,挖矿时需更新 nonce 并重新计算 ID。提供了 C 和 JavaScript 验证代码,并支持委托 PoW,允许将计算外包给第三方。

工作量证明

草稿 可选 中继

本 NIP 定义了一种为 nostr 笔记生成和解释工作量证明的方法。工作量证明(PoW)是一种为笔记添加计算工作证明的方式。这是一种承载证明,所有中继和客户端都可以通过少量代码进行通用验证。此证明可用作垃圾信息防御手段。

难度 定义为 NIP-01 id 中前导零比特的数量。例如,id 000000000e9d97a1ab09fc381030b346cdd7a142ad57e6df0b46dc9bef6c7e2d 的难度为 36,因为有 36 个前导零比特。

002f... 在二进制中是 0000 0000 0010 1111...,有 10 个前导零比特。不要忘记统计小于等于 7 的十六进制数字的前导零比特数。

挖矿

要为 NIP-01 笔记生成 PoW,需要使用 nonce 标签:

{"content": "我只是在挖我自己的矿", "tags": [["nonce", "1", "21"]]}

在挖矿过程中,nonce 标签的第二个条目会被更新,然后重新计算 id(参见 NIP-01)。如果 id 具有所需数量的前导零比特,则笔记已被挖出。建议在此过程中也更新 created_at

nonce 标签的第三个条目 应该 包含目标难度。这允许客户端防范这种情况:批量垃圾信息发送者针对较低难度,却侥幸匹配到更高难度。例如,如果你要求回复你的线程具有 40 位难度,但看到提交的目标是 30,即使笔记具有 40 位难度,你也可以安全地拒绝它。如果没有提交的目标难度,你就无法拒绝它。所有诚实的矿工都应该接受提交目标难度的做法,客户端 可以 拒绝匹配目标难度但缺少难度承诺的笔记。

挖矿示例

{
  "id": "000006d8c378af1779d2feebc7603a125d99eca0ccf1085959b307f64e5dd358",
  "pubkey": "a48380f4cfcc1ad5378294fcac36439770f9c878dd880ffa94bb74ea54a6f243",
  "created_at": 1651794653,
  "kind": 1,
  "tags": [
    ["nonce", "776797", "20"]
  ],
  "content": "我只是在挖我自己的矿",
  "sig": "284622fc0a3f4f1303455d5175f7ba962a3300d136085b9566801bc2e0699de0c7e31e44c81fb40ad9049173742e904713c3594a1da0fc5d2382a25c11aba977"
}

验证

以下是用于计算 nostr 事件 id 中难度(即前导零比特数)的参考 C 代码:

int zero_bits(unsigned char b)
{
        int n = 0;

        if (b == 0)
                return 8;

        while (b >>= 1)
                n++;

        return 7-n;
}

/* 计算哈希中前导零比特的数量 */
int count_leading_zero_bits(unsigned char *hash)
{
        int bits, total, i;
        for (i = 0, total = 0; i < 32; i++) {
                bits = zero_bits(hash[i]);
                total += bits;
                if (bits != 8)
                        break;
        }
        return total;
}

以下是执行相同操作的 JavaScript 代码:

// hex 应为十六进制字符串(不带 0x 前缀)
function countLeadingZeroes(hex) {
  let count = 0;

  for (let i = 0; i < hex.length; i++) {
    const nibble = parseInt(hex[i], 16);
    if (nibble === 0) {
      count += 4;
    } else {
      count += Math.clz32(nibble) - 28;
      break;
    }
  }

  return count;
}

委托工作量证明

由于 NIP-01 笔记 id 不涉及任何签名,PoW 可以外包给 PoW 提供商(可能需付费)。这为客户提供了一种方式,使其消息能够发送到受 PoW 限制的中继,而无需自己执行任何工作,这对手机等能源受限设备非常有用。

  • 原文链接: github.com/nostr-protoco...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论