uma / secp256k1-nostr
PHP 的 secp256k1_nostr 扩展
This package is auto-updated.
Last update: 2024-09-01 20:44:49 UTC
README
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 发行版上,第一步可能略有不同。
-
安装构建扩展和 secp256k1 所需的依赖项。
$ sudo apt install autoconf build-essential git libtool php8.1-dev pkgconf
-
克隆此存储库及其子模块。
$ git clone https://github.com/1ma/secp256k1-nostr-php $ cd secp256k1-nostr-php $ git submodule init $ git submodule update
-
一步构建 secp256k1 和扩展。然后,将扩展(
secp256k1_nostr.so
)安装到您的本地 PHP 中。'安装'命令可能需要 sudo 权限。可选地,您可以在安装之前使用make check
运行测试。$ make secp256k1 ext $ make check $ sudo make install
-
将
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
常见问题解答
我如何生成私钥?
私钥只是一个随机的 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_nostr
在PECL上有提供吗?
没有:(”)