本文档涵盖了 go-ethereum 中使用的加密原语和函数,包括用于交易身份验证的 ECDSA 签名以及用于 EIP-4844 批次数据的 KZG 承诺。该实现为性能优化和平台兼容性提供了多个后端。
有关以太坊虚拟机加密预编译的信息,请参阅 智能合约执行。
go-ethereum 中的加密系统设计了多个实现后端,以平衡性能和可移植性。该系统提供了纯 Go 实现和优化的 C 库绑定,并带有自动回退机制。
来源:crypto/signature_cgo.go17-18 crypto/signature_nocgo.go17-18 crypto/kzg4844/kzg4844_ckzg_cgo.go17 crypto/kzg4844/kzg4844_ckzg_nocgo.go17
ECDSA 实现使用 secp256k1 椭圆曲线提供加密签名,这是以太坊交易认证和地址派生的基础。
| 功能 | 目的 | 输入 | 输出 |
|---|---|---|---|
Ecrecover | 从签名恢复公钥 | hash, signature | public key |
SigToPub | 将签名转换为 ECDSA 公钥 | hash, signature | *ecdsa.PublicKey |
Sign | 创建 ECDSA 签名 | hash, private key | signature [R||S||V] |
VerifySignature | 根据公钥验证签名 | pubkey, hash, signature | bool |
DecompressPubkey | 解压缩 33 字节公钥 | compressed pubkey | *ecdsa.PublicKey |
CompressPubkey | 将公钥压缩为 33 字节 | *ecdsa.PublicKey | compressed bytes |
构建系统会根据 CGO 的可用性以及构建标签中定义的平台约束来选择合适的实现。
来源:crypto/signature_cgo.go17-18 crypto/signature_nocgo.go17-18
基于 CGO 的实现使用优化的 C secp256k1 库以获得更好的性能
来源:crypto/signature_cgo.go32-86
纯 Go 实现使用 Decred 的 secp256k1 库作为回退
来源:crypto/signature_nocgo.go32-194
KZG(Kate-Zaverucha-Goldberg)承诺在 EIP-4844 中用于实现批次数据的有效验证,而无需完整的批次内容。该系统支持 C 和 Go 实现。
| 类型 | 大小 | 目的 |
|---|---|---|
Blob | 131072 字节 | 用于承诺的原始批次数据 |
Commitment | 48 字节 | 多项式的 KZG 承诺 |
Proof | 48 字节 | 用于验证的 KZG 证明 |
Point | 32字节 | BLS 域元素 |
Claim | 32字节 | 声明的求值 |
来源:crypto/kzg4844/kzg4844.go84-150
该系统提供三个实现后端
启用 CGO 时可用,高性能 C 库实现
来源:crypto/kzg4844/kzg4844_ckzg_cgo.go31-151
适用于所有平台的纯 Go 实现
来源:crypto/kzg4844/kzg4844_gokzg.go26-116
为不支持的平台提供编译支持
来源:crypto/kzg4844/kzg4844_ckzg_nocgo.go17-70
两个 KZG 实现都需要使用存储在 JSON 文件中的受信任设置参数进行初始化
来源:crypto/kzg4844/kzg4844_ckzg_cgo.go38-67 crypto/kzg4844/kzg4844_gokzg.go33-46 crypto/kzg4844/trusted_setup.json1-3
加密系统包括特定平台的优化和兼容层,以确保在不同的操作系统和架构上实现最佳性能。
来源:crypto/signature_cgo.go17-18 crypto/signature_nocgo.go17-18 metrics/cpu_enabled.go17-18 common/fdlimit/fdlimit_bsd.go17-18
该系统包括特定于平台的 CPU 和资源监控功能
| 平台 | 实现 | 功能性 |
|---|---|---|
| Unix-like | cpu_enabled.go | 通过 gopsutil 获取完整的 CPU 统计信息 |
| iOS/JS/WASI | cpu_disabled.go | Stub 实现 |
| Windows/JS | cputime_nop.go | CPU 时间返回 0 |
| Unix | cputime_unix.go | 使用 syscall.Getrusage() |
来源:metrics/cpu_enabled.go17-44 metrics/cpu_disabled.go17-24 metrics/cputime_unix.go17-36 metrics/cputime_nop.go17-26
加密函数依赖于多个外部库,并根据平台功能和性能要求选择不同的库
| 库 | 目的 | 用途 |
|---|---|---|
github.com/decred/dcrd/dcrec/secp256k1/v4 | 纯 Go secp256k1 | ECDSA 回退实现 |
github.com/crate-crypto/go-eth-kzg | 纯 Go KZG | KZG 备用实现 |
github.com/ethereum/c-kzg-4844/v2 | C KZG 库 | 高性能 KZG 操作 |
github.com/supranational/blst | BLS 签名 | 其他加密原语 |