sgiath/secp256k1

GitHub: sgiath/secp256k1

为 Bitcoin Core 的 secp256k1 加密库提供 Elixir NIF 绑定,支持 ECDSA、Schnorr、ECDH 及 MuSig2 等区块链密码学操作。

Stars: 4 | Forks: 2

# Secp256k1 [![Hex.pm](https://img.shields.io/hexpm/v/lib_secp256k1.svg?style=flat&color=blue)](https://hex.pm/packages/lib_secp256k1) [![Docs](https://img.shields.io/badge/api-docs-green.svg?style=flat)](https://hexdocs.pm/lib_secp256k1) [![License](https://img.shields.io/badge/license-WTFPL-brightgreen)](LICENSE) 为 [bitcoin-core/secp256k1](https://github.com/bitcoin-core/secp256k1) 加密库提供的 Elixir NIF 绑定。广泛应用于 Bitcoin、Ethereum、Nostr 和其他区块链/加密货币应用中。 ## 功能 - **密钥对生成** - 安全的随机私钥,支持压缩、非压缩或 x-only 公钥 - **ECDSA 签名** - 使用传统的 Bitcoin 签名方案进行签名和验证 - **Schnorr 签名** - 兼容 BIP-340,用于 Taproot 和 Nostr - **MuSig2** - BIP-327 多方 Schnorr 签名(实验性) - **ECDH** - Diffie-Hellman 共享密钥计算 ## 安装说明 ### 系统依赖 该库会自动编译底层的 C 库,但需要构建工具: **Linux (Ubuntu/Debian)** ``` sudo apt-get install build-essential automake libtool autoconf ``` **macOS** ``` brew install make gcc autoconf automake libtool ``` ### Elixir 依赖 添加到你的 `mix.exs`: ``` def deps do [ {:lib_secp256k1, "~> 0.7"} ] end ``` ## 快速入门 ### 生成密钥对 ``` # 压缩版 pubkey (33 bytes) - 标准 Bitcoin 格式 {seckey, pubkey} = Secp256k1.keypair(:compressed) # X-only pubkey (32 bytes) - 用于 Schnorr/Taproot/Nostr {seckey, pubkey} = Secp256k1.keypair(:xonly) # 从现有 secret key 派生 pubkey pubkey = Secp256k1.pubkey(seckey, :compressed) ``` ### ECDSA 签名 ``` {seckey, pubkey} = Secp256k1.keypair(:compressed) # 签名 message hash msg_hash = :crypto.hash(:sha256, "Hello Bitcoin!") signature = Secp256k1.ecdsa_sign(msg_hash, seckey) # 验证 Secp256k1.ecdsa_valid?(signature, msg_hash, pubkey) #=> true ``` ### Schnorr 签名 (BIP-340) ``` {seckey, pubkey} = Secp256k1.keypair(:xonly) # 签名(适用于 32-byte hash 或任意 message) msg_hash = :crypto.hash(:sha256, "Hello Nostr!") signature = Secp256k1.schnorr_sign(msg_hash, seckey) # 验证 Secp256k1.schnorr_valid?(signature, msg_hash, pubkey) #=> true ``` ### ECDH 共享密钥 ``` {alice_seckey, _alice_pubkey} = Secp256k1.keypair(:compressed) {_bob_seckey, bob_pubkey} = Secp256k1.keypair(:compressed) # 返回 libsecp256k1 的默认 hashed ECDH 输出。 shared_secret = Secp256k1.ecdh(alice_seckey, bob_pubkey) byte_size(shared_secret) #=> 32 ``` ### MuSig2 多重签名 (BIP-327) 适用于多方共同创建单个聚合签名的多方签名场景。有关完整的协议,请参阅 [MuSig 指南](https://hexdocs.pm/lib_secp256k1/musig.html)。 ``` # 聚合多个签名者的 public keys {:ok, agg_pubkey, cache} = Secp256k1.MuSig.pubkey_agg([alice_pubkey, bob_pubkey]) # ... nonce 生成、聚合、签名轮次 ... # 最终签名验证为标准 Schnorr Secp256k1.schnorr_valid?(final_sig, msg_hash, agg_pubkey) ``` ## 文档 - [HexDocs](https://lib-secp256k1.hexdocs.pm/) - API 参考 - [使用指南](https://lib-secp256k1.hexdocs.pm/usage.html) - 详细示例 - [MuSig 指南](https://lib-secp256k1.hexdocs.pm/musig.html) - 多重签名协议 ## 平台支持 - **Linux** - 完全支持,主要开发平台 - **macOS** - 依赖 Homebrew 提供支持 - **Windows** - 未经测试,欢迎贡献 ## 许可证 [WTFPL](LICENSE) - Do What The Fuck You Want To Public License 底层的 secp256k1 C 库采用 MIT 许可证。
标签:Elixir, 以太坊, 区块链, 密码学, 手动系统调用, 椭圆曲线加密, 比特币