uma/secp256k1-nostr

PHP 的 secp256k1_nostr 扩展

安装: 137

依赖: 0

建议者: 0

安全: 0

星标: 7

关注者: 1

分支: 2

开放问题: 1

语言:C

类型:扩展

v0.1.3 2024-08-01 20:10 UTC

This package is auto-updated.

Last update: 2024-09-01 20:44:49 UTC


README

CI

secp256k1_nostr 是一个 PHP 7.4+ 扩展,用于根据 NIP-01 验证 Nostr 事件。

它作为 Bitcoin Core 的 libsecp256k1 的厚包装和有观点的包装实现。

示例用法

<?php

$text = '
{
  "id": "62fa167369a603b1181a49ecf2e20e7189833417c3fb49666c5644901da27bcc",
  "pubkey": "84fdf029f065438702b011c2002b489fd00aaea69b18efeae8261c44826a8886",
  "created_at": 1689033061,
  "kind": 1,
  "tags": [],
  "content": "This event was created at https://nostrtool.com/ with a throwaway key.",
  "sig": "a67e8d286605e3d7dfd3e0bd1642f85a25bb0cd70ec2ed941349ac879f617868a3ffa2a9040bb43c024594a79e4878429a990298c51ae4d6d20533589f4a04df"
}';

$event = json_decode($text);

var_dump(secp256k1_nostr_verify($event->pubkey, $event->id, $event->sig));

// Mangle last half-byte of the signature on purpose
$event->sig[127] = 'e';

var_dump(secp256k1_nostr_verify($event->pubkey, $event->id, $event->sig));

上面的脚本将输出

bool(true)
bool(false)

安装(Linux)

以下说明针对 Ubuntu 22.04 LTS。然而,在其他不使用 APT 软件包管理器的 Linux 发行版上,第一步可能略有不同。

  1. 安装构建扩展和 secp256k1 所需的依赖项。

    $ sudo apt install autoconf build-essential git libtool php8.1-dev pkgconf
  2. 克隆此存储库及其子模块。

    $ git clone https://github.com/1ma/secp256k1-nostr-php
    $ cd secp256k1-nostr-php
    $ git submodule init
    $ git submodule update
  3. 一步构建 secp256k1 和扩展。然后,将扩展(secp256k1_nostr.so)安装到您的本地 PHP 中。'安装'命令可能需要 sudo 权限。可选地,您可以在安装之前使用 make check 运行测试。

    $ make secp256k1 ext
    $ make check
    $ sudo make install
  4. extension=secp256k1_nostr.so 添加到您的 php.ini 文件中。请注意,PHP CLI 和 PHP-FPM 通常具有不同的 php.ini 文件,因此您需要编辑两个。最后,使用 php -m 测试扩展是否正确加载。

    $ echo "extension=secp256k1_nostr.so" | sudo tee -a /etc/php/8.1/cli/php.ini
    $ php -m | grep nostr
    secp256k1_nostr
    
    $ echo "extension=secp256k1_nostr.so" | sudo tee -a /etc/php/8.1/fpm/php.ini
    $ php-fpm8.1 -m | grep nostr
    secp256k1_nostr

完整 API

查看 secp256k1_nostr.stub.php

常见问题解答

我如何生成私钥?

私钥只是一个随机的 32 字节字符串。唯一的限制是它必须是十六进制编码的。

secp256k1_nostr 的所有函数仅接受十六进制编码的字符串,以减少处理 Nostr 事件时的摩擦。

$privateKey = bin2hex(random_bytes(32));
$publicKey = secp256k1_nostr_derive_pubkey($privateKey);

字节超出有效私钥范围的远程可能性非常小。在这种情况下,secp256k1_nostr_derive_pubkey() 将抛出异常,但在实践中,除非您故意向函数提供如 0000000000000000000000000000000000000000000000000000000000000000 这样的错误私钥,否则这种情况永远不会发生。

secp256k1_nostr 函数的存根吗?

是的。只需使用 Composer 将 uma/secp256k1-nostr 作为您项目的开发依赖项安装即可

$ composer require --dev uma/secp256k-nostr

注意: 这不是上述真实安装步骤的替代品。这只会使 secp256k1_nostr.stub.php 文件对您的 IDE 可见,以便它了解扩展函数。但 这不是 安装扩展,即前面提到的 secp256k1_nostr.so 文件。

开发此扩展的动机是什么?

我最近开始使用异步 PHP 编写一个玩具 Nostr 中继,该项目中的一个核心类是 "Event" 域对象,它在构造时验证其自己的签名。

当我编写第一批单元测试时,我很快发现现有的 PHP Schnorr 库非常慢,因此我构建了自己的本地扩展。

它可以在任何需要用 PHP 验证 Nostr 事件的上下文中使用,而不仅仅是中继。

此扩展与 secp256k1-php 有何不同?

secp256k1-php 是一个对 libsecp256k1 库的通用绑定,通过逐个暴露其完整的API函数(也称为“瘦包装器”)。相比之下,secp256k1_nostr 是一个针对Nostr事件验证的“厚包装器”,在这种情况下,libsecp256k1 仅是一个实现细节。

secp256k1_nostr 可以在 secp256k1-php 的基础上作为一个常规PHP库编写,但遗憾的是,该项目似乎已被放弃。在我写这段话的时候,它在master分支上已经没有活动4年了,代码甚至无法在PHP 8.0和更高版本上编译。

如果您需要一个暴露所有功能的 libsecp256k1 绑定,您应该尝试恢复该项目。

secp256k1_nostr 是否遵循语义版本化

是的,但在1.0版本发布之前,API可能仍然会演变。

4. Major version zero (0.y.z) is for initial development.
   Anything MAY change at any time.
   The public API SHOULD NOT be considered stable.

Windows支持吗?

不支持,我也不打算做这项工作。但欢迎提交PR。

secp256k1_nostrPECL上有提供吗?

没有:(”)