本文档涵盖了 go-ethereum 客户端中使用的加密功能和安全机制。这包括用于交易身份验证的 ECDSA 签名操作、用于 EIP-4844 blob 交易的 KZG 加密,以及用于资源管理的特定平台安全功能。
有关存储安全和 Merkle Patricia Trie 的信息,请参阅 Merkle Patricia Trie。有关共识层安全机制的信息,请参阅 Engine API。
geth 中的加密与安全系统围绕几个核心组件构建,这些组件提供不同类型的加密操作和安全保证。
来源: crypto/signature_cgo.go1-87 crypto/signature_nocgo.go1-194 crypto/kzg4844/kzg4844.go1-180
ECDSA 签名系统使用 secp256k1 椭圆曲线为以太坊交易提供加密身份验证。实现根据构建配置自动选择原生 C 库和纯 Go 实现。
签名系统公开了几项处理完整签名生命周期的关键函数:
| 功能 | 目的 | 输入/输出 |
|---|---|---|
签名 | 创建 ECDSA 签名 | (hash, privateKey) → [R ǁ S ǁ V] |
Ecrecover | 从签名中恢复公钥 | (hash, signature) → publicKey |
VerifySignature | 在不恢复的情况下验证签名 | (pubkey, hash, [R ǁ S]) → bool |
SigToPub | 将签名转换为公钥 | (hash, signature) → *ecdsa.PublicKey |
CompressPubkey | 将公钥压缩为 33 字节 | *ecdsa.PublicKey → []byte |
DecompressPubkey | 解压 33 字节公钥 | []byte → *ecdsa.PublicKey |
来源: crypto/signature_cgo.go17-18 crypto/signature_nocgo.go17-18 crypto/signature_cgo.go53-59 crypto/signature_nocgo.go78-96
签名系统使用特定的格式,其中签名被编码为 [R || S ǁ V],在末尾带有恢复 ID (V)。实现包含了重要的安全措施:
来源: crypto/signature_nocgo.go78-96 crypto/signature_cgo.go53-59 crypto/signature_test.go78-86
KZG4844 系统实现了 EIP-4844 blob 交易所需的加密操作,包括多项式承诺和证明。与签名系统一样,它也提供了 C 和 Go 实现之间的自动选择。
来源: crypto/kzg4844/kzg4844.go39-82 crypto/kzg4844/kzg4844.go107-150
KZG 系统使用运行时开关在 C 和 Go 实现之间进行切换,由 useCKZG 原子布尔值控制。这允许用户在性能优化的 C 库和更具可移植性的 Go 实现之间进行选择。
来源: crypto/kzg4844/kzg4844.go84-105 crypto/kzg4844/kzg4844_ckzg_cgo.go31-67 crypto/kzg4844/kzg4844_gokzg.go26-46
KZG 系统使用构建标签来确定哪些实现可用。
来源: crypto/kzg4844/kzg4844_ckzg_cgo.go17 crypto/kzg4844/kzg4844_ckzg_nocgo.go17
代码库包含多种特定平台安全和资源管理功能,可适应不同的操作系统和构建环境。
来源: metrics/cpu_enabled.go17-18 metrics/cpu_disabled.go17-18 metrics/cputime_unix.go17-18 cmd/utils/diskusage.go17-18 common/fdlimit/fdlimit_bsd.go17-18
代码库使用全面的构建标签策略来选择适当的实现。
| 组件 | 构建标签 | 目的 |
|---|---|---|
| CPU 指标 | !ios && !js && !wasip1 && !tinygo | 在具有系统调用的平台上启用 |
| CPU 时间 | !windows && !js && !wasip1 | 在类 Unix 系统上使用 rusage |
| 磁盘使用情况 | !windows && !openbsd && !wasip1 | 标准 Unix 磁盘统计信息 |
| FD 限制 | freebsd || dragonfly | BSD 特定的 int64 rlimit 字段 |
| ECDSA | !nacl && !js && !wasip1 && cgo | 基于 CGO 的 secp256k1 |
| KZG | ckzg && !nacl && !js && !wasip1 && cgo | 基于 C 的 KZG 实现 |
此策略可确保根据目标平台的性能,在构建时选择最合适的实现。
来源: metrics/cpu_enabled.go17-18 crypto/signature_cgo.go17-18 crypto/kzg4844/kzg4844_ckzg_cgo.go17
加密实现包含一些重要的安全考量
sync.Once 进行一次性初始化来源: crypto/signature_nocgo.go78-81 crypto/signature_cgo.go54-55 crypto/signature_test.go78-86 crypto/kzg4844/kzg4844.go84-105