菜单

密码学函数

相关源文件

本文档涵盖了 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 签名系统

ECDSA 实现使用 secp256k1 椭圆曲线提供加密签名,这是以太坊交易认证和地址派生的基础。

核心 ECDSA 函数

功能目的输入输出
Ecrecover从签名恢复公钥hash, signaturepublic key
SigToPub将签名转换为 ECDSA 公钥hash, signature*ecdsa.PublicKey
Sign创建 ECDSA 签名hash, private keysignature [R||S||V]
VerifySignature根据公钥验证签名pubkey, hash, signaturebool
DecompressPubkey解压缩 33 字节公钥compressed pubkey*ecdsa.PublicKey
CompressPubkey将公钥压缩为 33 字节*ecdsa.PublicKeycompressed bytes

实现选择

构建系统会根据 CGO 的可用性以及构建标签中定义的平台约束来选择合适的实现。

来源:crypto/signature_cgo.go17-18 crypto/signature_nocgo.go17-18

CGO 实现

基于 CGO 的实现使用优化的 C secp256k1 库以获得更好的性能

来源:crypto/signature_cgo.go32-86

纯 Go 实现

纯 Go 实现使用 Decred 的 secp256k1 库作为回退

来源:crypto/signature_nocgo.go32-194

KZG 承诺系统

KZG(Kate-Zaverucha-Goldberg)承诺在 EIP-4844 中用于实现批次数据的有效验证,而无需完整的批次内容。该系统支持 C 和 Go 实现。

KZG 数据类型

类型大小目的
Blob131072 字节用于承诺的原始批次数据
Commitment48 字节多项式的 KZG 承诺
Proof48 字节用于验证的 KZG 证明
Point32字节BLS 域元素
Claim32字节声明的求值

核心 KZG 函数

来源:crypto/kzg4844/kzg4844.go84-150

KZG 实现后端

该系统提供三个实现后端

C-KZG 实现 (CGO)

启用 CGO 时可用,高性能 C 库实现

来源:crypto/kzg4844/kzg4844_ckzg_cgo.go31-151

Go-KZG 实现

适用于所有平台的纯 Go 实现

来源:crypto/kzg4844/kzg4844_gokzg.go26-116

Stub 实现

为不支持的平台提供编译支持

来源: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-likecpu_enabled.go通过 gopsutil 获取完整的 CPU 统计信息
iOS/JS/WASIcpu_disabled.goStub 实现
Windows/JScputime_nop.goCPU 时间返回 0
Unixcputime_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 secp256k1ECDSA 回退实现
github.com/crate-crypto/go-eth-kzg纯 Go KZGKZG 备用实现
github.com/ethereum/c-kzg-4844/v2C KZG 库高性能 KZG 操作
github.com/supranational/blstBLS 签名其他加密原语

来源: go.mod21-24 go.mod16-17 go.mod62