sgiath/secp256k1
GitHub: sgiath/secp256k1
为 Bitcoin Core 的 secp256k1 加密库提供 Elixir NIF 绑定,支持 ECDSA、Schnorr、ECDH 及 MuSig2 等区块链密码学操作。
Stars: 4 | Forks: 2
# Secp256k1
[](https://hex.pm/packages/lib_secp256k1)
[](https://hexdocs.pm/lib_secp256k1)
[](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, 以太坊, 区块链, 密码学, 手动系统调用, 椭圆曲线加密, 比特币