EIP-: ```
Authors |
---|
Table of Contents
---
eip: 2333
title: BLS12-381 密钥生成
author: Carl Beekhuizen (@CarlBeek) <carl@ethereum.org>
discussions-to: https://github.com/ethereum/EIPs/issues/2337
status: Stagnant
type: Standards Track
category: ERC
created: 2019-09-30
---
## 简短摘要
本 EIP 提出了一种基于树形结构的方法,用于从单一熵源派生 BLS 私钥,同时为每个密钥提供后量子密码学回退方案。
## 摘要
本标准提供了一种基于熵种子的 BLS12-381 密钥树形层次结构的派生方法。从上述种子开始,仅使用父节点的私钥和所需子节点的索引来构建密钥树。这允许派生实际上无限数量的用于不同目的的密钥,同时只需要知道树中的单个祖先密钥。这允许通过进一步的标准为不同目的配置密钥或密钥族。
除了上述内容之外,这种派生密钥的方法还提供了一种紧急备份签名方案,该方案可以抵抗量子计算机,以防 BLS12-381 被认为不安全。
## 关于目的的说明
本规范的设计不仅要成为以太坊 2.0 的标准,而且还要被更广泛的社区采用,这些社区已经采用了 [基于 BLS12-381 的 BLS 签名](https://datatracker.ietf.org/doc/draft-irtf-cfrg-bls-signature/)。 因此,同样重要的是要考虑更广泛的行业的需求以及以太坊的特定需求。 作为这些考虑的一部分,作者的意图是本标准最终迁移到未来更中立的存储库。
## 动机
### 现有机制的缺陷
以太坊 2.0 中用于 BLS 签名的曲线 BLS12-381(以及许多其他项目)需要一种新的密钥派生方案。 以太坊 1.x 中最常用的密钥派生方案是 [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)(也称为 HD 派生),该方案认为大于曲线阶数的密钥无效。根据 BLS12-381 私钥子群的阶数和所用熵的大小,BIP32 生成的密钥中超过 54% 将无效。(BIP32 派生的 secp256k1 密钥无效的概率小于 1/2<sup>-127</sup>。)
### 尽早建立多链标准
通过在第一个用户开始生成其密钥之前建立标准,希望单个标准具有高度的普遍性,因此可以假定它是提供大多数密钥的方法。 这很有价值,原因有两个,首先,为了使后量子备份机制有效,需要建立一种约定的机制,用户可以通过该机制使用预共享的公钥切换到后量子签名方案(本 EIP 以 0 额外存储成本提供)。 其次,通过拥有通用的工具,理想情况下允许用户在密钥管理系统之间切换,从而统一了链间和链内生态系统。
### 一种后量子备份
此密钥派生方案具有一个 Lamport 密钥对,该密钥对作为密钥生成过程的中间步骤生成。 如果 BLS12-381 不再被认为是安全的(例如,在量子计算取得突破性进展的情况下),则可以使用此密钥对来提供 Lamport 签名,这是一个有用的备份。 想法是 Lamport 签名将充当通往被认为是安全的新签名方案的桥梁。
## 规范
### 版本
由于不断发展的 BLS 签名 CFRG 草案(当前为 v4),`KeyGen` 函数已更新,这意味着 `hkdf_mod_r` 不再反映 BLS 标准中出现的内容。 本 EIP 于 2020 年 9 月 17 日进行了更新,以反映这种新的密钥派生方法,**如果您要实施此 EIP,请确保您的版本是最新的。**
### 规范
密钥是根据树结构定义的,其中密钥由树的种子和树路径确定。这非常有用,因为可以从单个熵源开始并构建实际上无限数量的密钥。该规范可以分为两个子组件:生成主密钥,以及从其父密钥构造子密钥。主密钥用作树的根,然后在该根的顶部按层构建树。
### 树结构
密钥树纯粹是通过子节点及其祖先之间的关系来定义的。从树的根,即*主密钥*开始,可以通过知道父节点的私钥和子节点的索引来派生一个子节点。 树被分成由 `/` 指示的深度,主节点被描述为 `m`。 因此,主节点的第一个子节点被描述为 `m / 0`,并且 `m / 0` 的兄弟节点对于所有 `0 <= i < 2**32` 都是 `m / i`。
```text
[m / 0] - [m / 0 / 0]
/ \
/ [m / 0 / 1]
[m] - [m / 1]
\
...
[m / i]
密钥派生
通过密钥派生过程生成的每个密钥都通过一组中间 Lamport 密钥派生出一个子密钥。 Lamport 密钥背后的想法是提供后量子备份,以防 BLS12-381 不再被认为是安全的。 在较高层次上,密钥派生过程的工作方式是使用父节点的私钥作为 Lamport 私钥的熵源,然后将这些私钥哈希在一起以生成压缩的 Lamport 公钥,然后将该公钥哈希到 BLS12-381 的私钥组中。
IKM_to_lamport_SK
输入
IKM
,一个秘密八位字节字符串salt
,一个八位字节字符串
输出
lamport_SK
,一个包含 255 个 32 八位字节字符串的数组
定义
HKDF-Extract
的定义见 RFC5869,使用 SHA256 实例化HKDF-Expand
的定义见 RFC5869,使用 SHA256 实例化K = 32
是哈希函数(SHA256)的摘要大小(以八位字节为单位)L = K * 255
是 HKDF 输出大小(以八位字节为单位)""
是空字符串bytes_split
是一个函数,它接受一个八位字节字符串并将其拆分为K
字节的块,这些块作为数组返回
过程
0. PRK = HKDF-Extract(salt, IKM)
1. OKM = HKDF-Expand(PRK, "" , L)
2. lamport_SK = bytes_split(OKM, K)
3. return lamport_SK
parent_SK_to_lamport_PK
输入
parent_SK
,父节点的 BLS 密钥index
,所需子节点的索引,一个整数0 <= index < 2^32
输出
lamport_PK
,压缩的 lamport PK,一个 32 八位字节字符串
定义
I2OSP
的定义见 RFC3447(大端解码)flip_bits
是一个返回其输入的按位取反的函数""
是空字符串a | b
是a
与b
的串联
过程
0. salt = I2OSP(index, 4)
1. IKM = I2OSP(parent_SK, 32)
2. lamport_0 = IKM_to_lamport_SK(IKM, salt)
3. not_IKM = flip_bits(IKM)
4. lamport_1 = IKM_to_lamport_SK(not_IKM, salt)
5. lamport_PK = ""
6. for i in 1, .., 255
lamport_PK = lamport_PK | SHA256(lamport_0[i])
7. for i in 1, .., 255
lamport_PK = lamport_PK | SHA256(lamport_1[i])
8. compressed_lamport_PK = SHA256(lamport_PK)
9. return compressed_lamport_PK
注意:上述过程中的索引 i
从 1 到 255(包括 255)迭代。 这是由于 HKDF 可以扩展输入字节的限制(输入字节长度的 255 倍)。 这样做的结果是 lamport-backup 签名的安全性*仅*为 127.5 位。
HKDF_mod_r
hkdf_mod_r()
用于将 32 个随机字节哈希到 BLS12-381 私钥的子组中。
输入
IKM
,一个秘密八位字节字符串,长度 >= 256 位key_info
,一个可选的八位字节字符串 (default=``””, 空字符串)
输出
SK
,对应的密钥,一个整数 0 <= SK < r。
定义
HKDF-Extract
的定义见 RFC5869,使用哈希 H 实例化。HKDF-Expand
的定义见 RFC5869,使用哈希 H 实例化。L
是由ceil((3 * ceil(log2(r))) / 16)
给出的整数。(L=48
)"BLS-SIG-KEYGEN-SALT-"
是一个包含 20 个八位字节的 ASCII 字符串。OS2IP
的定义见 RFC3447(大端编码)I2OSP
的定义见 RFC3447(大端解码)r
是 v4 草案 IETF BLS 签名方案标准 中定义的 BLS 12-381 曲线的阶数r=52435875175126190479447740508185965837690552500527637822603658699938581184513
过程
1. salt = "BLS-SIG-KEYGEN-SALT-"
2. SK = 0
3. while SK == 0:
4. salt = H(salt)
5. PRK = HKDF-Extract(salt, IKM || I2OSP(0, 1))
6. OKM = HKDF-Expand(PRK, key_info || I2OSP(L, 2), L)
7. SK = OS2IP(OKM) mod r
8. return SK
derive_child_SK
子密钥派生函数接受父节点的私钥和子节点的索引,并返回子私钥。
输入
parent_SK
,父节点的密钥,大端编码的整数index
,所需子节点的索引,一个整数0 <= index < 2^32
输出
child_SK
,子节点的密钥,大端编码的整数
过程
0. compressed_lamport_PK = parent_SK_to_lamport_PK(parent_SK, index)
1. SK = HKDF_mod_r(compressed_lamport_PK)
2. return SK
derive_master_SK
子密钥派生函数接受父节点的私钥和子节点的索引,并返回子私钥。 该种子理想情况下应从助记词派生,目的是使用 BIP39 助记词及其相关的 mnemonic_to_seed 方法。
输入
seed
,整个树的源熵,一个长度 >= 256 位的八位字节字符串
输出
SK
,树中主节点的密钥,大端编码的整数
过程
0. SK = HKDF_mod_r(seed)
1. return SK
理由
Lamport 签名
Lamport 签名用作备份机制,因为它们对于后量子签名方案来说相对简单。 Lamport 签名非常容易解释和实现,因为唯一的密码依赖项是一个安全的哈希函数。 这很重要,因为它最大程度地降低了实现此标准的复杂性,并减少了派生密钥的计算时间。 Lamport 签名具有非常大的密钥大小,这使得它们在许多用例中不切实际,但这在这种情况下并不被认为是问题,因为此方案仅旨在作为一次性事件以迁移到新方案。
显示对应的 BLS 密钥的关联 Lamport 公钥是通过验证 Lamport 公钥是否是对应的 BLS 私钥的预映像来完成的(BLS 私钥反过来又根据 BLS 公钥进行验证)。 这意味着使用密钥的 Lamport 签名会显示 BLS 私钥,从而使 BLS 密钥对不安全。 这样做的好处是不需要为 BLS 密钥旁边的备份密钥提供额外的存储空间,但确实需要 Lamport 签名使用一次,并且之后不再信任 BLS 密钥。
此方案中使用的 Lamport 签名具有 255 位的安全性,而不是 256 位。 这样做是因为用于扩展密钥熵的机制 HKDF-SHA256 的长度限制为“255 * hash_function_digest_size”。 与增加熵扩展机制的复杂性相比,安全性降低 1 位被认为是更可取的。
SHA256
SHA256 用作本标准中的哈希函数,因为它是 IETF BLS 签名提出的标准 选择的哈希函数。 对所有内容使用单个哈希函数可减少实现整个 BLS 标准化密钥堆栈所需的密码原语的数量,同时减少整个系统中缺陷的表面积。
hkdf_mod_r()
本标准中的函数 hkdf_mod_r()
与 提出的标准 中描述的 KeyGen
函数相同,因此从 KeyGen
获得的密钥等于从相同种子字节的 hkdf_mod_r
获得的密钥。 这意味着在实现此函数时可以完成常见的工程设计。 此外,由于其包含在 IETF 标准中,因此受到了许多密码学家和密码分析家的严格审查,从而证明了其作为密钥派生机制的安全性。
虽然 hkdf_mod_r()
具有模偏差,但此偏差的幅度非常小(HKDF 的输出大小设置为 48 字节,比曲线阶数大 2128 倍)。 鉴于恒定时间方案的简单性,此偏差被认为是可接受的。
仅使用强化的密钥
在此规范之前存在的广泛接受的标准(BIP32 和 BIP44)利用了强化和非强化密钥的概念,而本规范仅提供前者。 非强化密钥主要在 UTXO 系统中很有用,在这种系统中,在一个人的许多帐户中分配余额不会带来太多的额外复杂性,但是这种密钥在这种环境之外的用处要小得多。 使事情进一步复杂化的是使用后量子签名方案派生非强化密钥的问题,因为非强化密钥是通过量子计算机获得优势的群运算实现的。
向后兼容性
此 EIP 不会带来任何重大的向后兼容性问题,因为它并非设计为当前在以太坊 1.0 中使用。 也就是说,此标准与 BIP32/BIP44 样式的路径不兼容,因为这些系统指定的路径利用了非强化密钥,而此标准中不存在这种密钥。
测试用例
测试用例 0
seed = 0xc55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04
master_SK = 6083874454709270928345386274498605044986640685124978867557563392430687146096
child_index = 0
child_SK = 20397789859736650942317412262472558107875392172444076792671091975210932703118
假设使用 BIP39 作为助记词生成机制,则可以扩展此测试用例以测试整个助记词到“child_SK”堆栈。 使用以下参数,可以计算出上面的种子:
mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
passphrase = "TREZOR"
假设使用 BIP39 作为助记词生成机制,则可以扩展此测试用例以测试整个 mnemonic-to -child_SK
堆栈。 使用以下参数,可以计算出上面的种子:
mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
passphrase = "TREZOR"
测试用例 1
seed = 0x3141592653589793238462643383279502884197169399375105820974944592
master_SK = 29757020647961307431480504535336562678282505419141012933316116377660817309383
child_index = 3141592653
child_SK = 25457201688850691947727629385191704516744796114925897962676248250929345014287
测试用例 2
seed = 0x0099FF991111002299DD7744EE3355BBDD8844115566CC55663355668888CC00
master_SK = 27580842291869792442942448775674722299803720648445448686099262467207037398656
child_index = 4294967295
child_SK = 29358610794459428860402234341874281240803786294062035874021252734817515685787
测试用例 3
seed = 0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3
master_SK = 19022158461524446591288038168518313374041767046816487870552872741050760015818
child_index = 42
child_SK = 31372231650479070279774297061823572166496564838472787488249775572789064611981
包含中间值的测试向量
seed = 0xc55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04
master_SK = 6083874454709270928345386274498605044986640685124978867557563392430687146096
child_index = 0
lamport_0 = [0xe345d0ad7be270737de05cf036f688f385d5f99c7fddb054837658bdd2ebd519,
0x65050bd4db9c77c051f67dcc801bf1cdf33d81131e608505bb3e4523868eb76c,
0xc4f8e8d251fbdaed41bdd9c135b9ed5f83a614f49c38fffad67775a16575645a,
0x638ad0feace7567255120a4165a687829ca97e0205108b8b73a204fba6a66faa,
0xb29f95f64d0fcd0f45f265f15ff7209106ab5f5ce6a566eaa5b4a6f733139936,
0xbcfbdd744c391229f340f02c4f2d092b28fe9f1201d4253b9045838dd341a6bf,
0x8b9cf3531bfcf0e4acbfd4d7b4ed614fa2be7f81e9f4eaef53bedb509d0b186f,
0xb32fcc5c4e2a95fb674fa629f3e2e7d85335f6a4eafe7f0e6bb83246a7eced5f,
0xb4fe80f7ac23065e30c3398623b2761ac443902616e67ce55649aaa685d769ce,
0xb99354f04cfe5f393193c699b8a93e5e11e6be40ec16f04c739d9b58c1f55bf3,
0x93963f58802099ededb7843219efc66a097fab997c1501f8c7491991c780f169,
0x430f3b027dbe9bd6136c0f0524a0848dad67b253a11a0e4301b44074ebf82894,
0xd635c39b4a40ad8a54d9d49fc8111bd9d11fb65c3b30d8d3eaef7d7556aac805,
0x1f7253a6474cf0b2c05b02a7e91269137acddedcb548144821f9a90b10eccbab,
0x6e3bdb270b00e7b6eb8b044dbfae07b51ea7806e0d24218c59a807a7fd099c18,
0x895488ad2169d8eaae332ce5b0fe1e60ffab70e62e1cb15a2a1487544af0a6e8,
0x32d45a99d458c90e173a3087ea3661ab62d429b285089e92806a9663ba825342,
0xc15c52106c3177f5848a173076a20d46600ca65958a1e3c7d45a593aaa9670ed,
0xd8180c550fbe4cd6d5b676ff75e0728729d8e28a3b521d56152594ac6959d563,
0x58fe153fac8f4213aaf175e458435e06304548024bcb845844212c774bdffb2a,
0x10fff610a50f4bee5c978f512efa6ab4fafacb65929606951ba5b93eeb617b5a,
0x78ac9819799b52eba329f13dd52cf0f6148a80bf04f93341814c4b47bb4aa5ec,
0xa5c3339caa433fc11e74d1765bec577a13b054381a44b23c2482e750696876a9,
0x9f716640ab5cdc2a5eb016235cddca2dc41fa4ec5acd7e58af628dade99ec376,
0x2544364320e67577c4fed8c7c7c839deed93c24076d5343c5b8faca4cc6dc2d8,
0x62553e782541f822c589796be5d5c83bfc814819100b2be0710b246f5aa7149c,
0x229fb761c46c04b22ba5479f2696be0f936fded68d54dd74bcd736b8ba512afb,
0x0af23996a65b98a0ebaf19f3ec0b3ef20177d1bfd6eb958b3bd36e0bdbe04c8c,
0x6f0954f9deab52fd4c8d2daba69f73a80dea143dd49d9705c98db3d653adf98c,
0xfa9221dd8823919a95b35196c1faeb59713735827f3e84298c25c83ac700c480,
0x70c428e3ff9e5e3cda92d6bb85018fb89475c19f526461cca7cda64ebb2ff544,
0xdcaac3413e22314f0f402f8058a719b62966b3a7429f890d947be952f2e314ba,
0xb6b383cb5ec25afa701234824491916bfe6b09d28cf88185637e2367f0cf6edc,
0x7b0d91488fc916aba3e9cb61a5a5645b9def3b02e4884603542f679f602afb8d,
0xe9c20abca284acfde70c59584b9852b85c52fa7c263bb981389ff8d638429cd7,
0x838524f798daee6507652877feb9597f5c47e9bb5f9aa52a35fb6fff796813b9,
0xbe1ca18faf9bf322474fad1b3d9b4f1bc76ae9076e38e6dd2b16e2faf487742b,
0xbf02d70f1a8519343a16d24bade7f7222912fd57fe4f739f367dfd99d0337e8e,
0xc979eb67c107ff7ab257d1c0f4871adf327a4f2a69e01c42828ea27407caf058,
0xf769123d3a3f19eb7b5c3fd4f467a042944a7c5ff8834cebe427f47dbd71460c,
0xaefc8edc23257e1168a35999fe3832bcbc25053888cc89c38667482d6748095b,
0x8ff399f364d3a2428b1c92213e4fdc5341e7998007da46a5a2f671929b42aaab,
0xcf2a3d9e6963b24c5001fbba1e5ae7f45dd6cf520fd24861f745552db86bab48,
0xb380e272d7f3091e5c887fa2e7c690c67d59f4d95f8376d150e555da8c738559,
0xc006a749b091d91204dbb64f59059d284899de5986a7f84f8877afd5e0e4c253,
0x818d8bb9b7da2dafa2ef059f91975e7b6257f5e199d217320de0a576f020de5c,
0x7aabf4a1297d2e550a2ee20acb44c1033569e51b6ec09d95b22a8d131e30fd32,
0xdd01c80964a5d682418a616fb10810647c9425d150df643c8ddbbe1bfb2768b7,
0x1e2354e1d97d1b06eb6cfe9b3e611e8d75b5c57a444523e28a8f72a767eff115,
0x989c9a649dca0580256113e49ea0dd232bbfd312f68c272fe7c878acc5da7a2c,
0x14ee1efe512826fff9c028f8c7c86708b841f9dbf47ce4598298b01134ebdc1a,
0x6f861dba4503f85762d9741fa8b652ce441373f0ef2b7ebbd5a794e48cdab51b,
0xda110c9492ffdb87efe790214b7c9f707655a5ec08e5af19fb2ab2acc428e7dc,
0x5576aa898f6448d16e40473fcb24c46c609a3fc46a404559faa2d0d34d7d49ce,
0x9bd9a35675f2857792bc45893655bfdf905ffeaee942d93ad39fbcadd4ca9e11,
0xfa95e4c37db9303d5213890fd984034089cbc9c6d754741625da0aa59cc45ccf,
0xfef7d2079713f17b47239b76c8681bf7f800b1bfeac7a53265147579572ddf29,
0x39aa7c0fecf9a1ed037c685144745fda16da36f6d2004844cf0e2d608ef6ed0e,
0x5530654d502d6ba30f2b16f49cc5818279697308778fd8d40db8e84938144fb6,
0xb1beaa36397ba1521d7bf7df16536969d8a716e63510b1b82a715940180eb29f,
0x21abe342789f7c15a137afa373f686330c0db8c861572935a3cd8dcf9e4e1d45,
0x27b5a1acda55b4e0658887bd884d3203696fcae0e94f19e31bfe931342b1c257,
0x58401a02502d7708a812c0c72725f768f5a556480517258069f2d72543cda888,
0x4b38f291548f51bee7e4cf8cc5c8aa8f4ad3ec2461dba4ccbab70f1c1bfd7feb,
0x9b39a53fdafaaf1d23378e0aa8ae65d38480de69821de2910873eefc9f508568,
0x932200566a3563ee9141913d12fd1812cb008cb735724e8610890e101ec10112,
0x6a72f70b4ec5491f04780b17c4776a335fcc5bff5073d775150e08521dc74c91,
0x86d5c60e627a4b7d5d075b0ba33e779c45f3f46d22ed51f31360afd140851b67,
0x5ca2a736bb642abc4104faa781c9aff13d692a400d91dc961aec073889836946,
0xa14bca5a262ac46ceac21388a763561fc85fb9db343148d786826930f3e510cd,
0x87be03a87a9211504aa70ec149634ee1b97f7732c96377a3c04e98643dcba915,
0x8fe283bc19a377823377e9c326374ebb3f29527c12ea77bfb809c18eef8943b0,
0x8f519078b39a3969f7e4caeca9839d4e0eccc883b89e4a86d0e1731bfc5e33fc,
0x33d7c28c3d26fdfc015a8c2131920e1392ef0aea55505637b54ea63069c7858e,
0xe57de7c189fcc9170320c7acedb38798562a48dbc9943b2a8cd3441d58431128,
0x513dac46017050f82751a07b6c890f14ec43cadf687f7d202d2369e35b1836b4,
0xfd967d9f805bb7e78f7b7caa7692fdd3d6b5109c41ad239a08ad0a38eeb0ac4c,
0xf2013e4da9abcc0f03ca505ed94ec097556dbfd659088cd24ec223e02ac43329,
0xe0dcfac50633f7417f36231df2c81fa1203d358d5f57e896e1ab4b512196556b,
0xf022848130e73fe556490754ef0ecfcdaaf3b9ff16ae1eda7d38c95c4f159ded,
0x2147163a3339591ec7831d2412fb2d0588c38da3cd074fa2a4d3e5d21f9f1d2d,
0x11ee2404731962bf3238dca0d9759e06d1a5851308b4e6321090886ec5190b69,
0xf7679ecd07143f8ac166b66790fa09aed39352c09c0b4766bbe500b1ebace5a5,
0xc7a0e95f09076472e101813a95e6ea463c35bd5ee9cfda3e5d5dbccb35888ef0,
0xde625d3b547eb71bea5325a0191a592fa92a72e4b718a499fdba32e245ddf37e,
0x7e5bdccd95df216e8c59665073249072cb3c9d0aef6b341afc0ca90456942639,
0xc27f65fd9f797ede374e06b4ddb6e8aa59c7d6f36301f18b42c48b1889552fe3,
0x8175730a52ea571677b035f8e2482239dda1cfbff6bc5cde00603963511a81af,
0x09e440f2612dad1259012983dc6a1e24a73581feb1bd69d8a356eea16ba5fd0e,
0x59dcc81d594cbe735a495e38953e8133f8b3825fd84767af9e4ea06c49dbabfa,
0x6c8480b59a1a958c434b9680edea73b1207077fb9a8a19ea5f9fbbf6f47c4124,
0x81f5c89601893b7a5a231a7d37d6ab9aa4c57f174fcfc6b40002fa808714c3a1,
0x41ba4d6b4da141fcc1ee0f4b47a209cfd143d34e74fc7016e9956cedeb2db329,
0x5e0b5b404c60e9892040feacfb4a84a09c2bc4a8a5f54f3dad5dca4acdc899dc,
0xe922eebf1f5f15000d8967d16862ed274390cde808c75137d2fb9c2c0a80e391,
0xbf49d31a59a20484f0c08990b2345dfa954509aa1f8901566ab9da052b826745,
0xb84e07da828ae668c95d6aa31d4087504c372dbf4b5f8a8e4ded1bcf279fd52b,
0x89288bf52d8c4a9561421ad199204d794038c5d19ae9fee765ee2b5470e68e7e,
0xf6f618be99b85ec9a80b728454a417c647842215e2160c6fe547dd5a69bd9302,
0xdd9adc002f98c9a47c7b704fc0ce0a5c7861a5e2795b6014749cde8bcb8a034b,
0xd119a4b2c0db41fe01119115bcc35c4b7dbfdb42ad3cf2cc3f01c83732acb561,
0x9c66bc84d416b9193bad9349d8c665a9a06b835f82dc93ae0cccc218f808aad0,
0xd4b50eefcd2b5df075f14716cf6f2d26dfc8ae02e3993d711f4a287313038fde,
0xaf72bfb346c2f336b8bc100bff4ba35d006a3dad1c5952a0adb40789447f2704,
0xc43ca166f01dc955e7b4330227635feb1b0e0076a9c5633ca5c614a620244e5b,
0x5efca76970629521cfa053fbbbda8d3679cadc018e2e891043b0f52989cc2603,
0x35c57de1c788947f187051ce032ad1e899d9887d865266ec6fcfda49a8578b2b,
0x56d4be8a65b257216eab7e756ee547db5a882b4edcd12a84ed114fbd4f5be1f1,
0x257e858f8a4c07a41e6987aabaa425747af8b56546f2a3406f60d610bcc1f269,
0x40bd9ee36d52717ab22f1f6b0ee4fb38b594f58399e0bf680574570f1b4b8c90,
0xcb6ac01c21fc288c12973427c5df6eb8f6aefe64b92a6420c6388acdf36bc096,
0xa5716441312151a5f0deb52993a293884c6c8f445054ce1e395c96adeee66c6d,
0xe15696477f90113a10e04ba8225c28ad338c3b6bdd7bdeb95c0722921115ec85,
0x8faeaa52ca2f1d791cd6843330d16c75eaf6257e4ba236e3dda2bc1a644aee00,
0xc847fe595713bf136637ce8b43f9de238762953fed16798878344da909cc76ae,
0xb5740dc579594dd110078ce430b9696e6a308078022dde2d7cfe0ef7647b904e,
0x551a06d0771fcd3c53aea15aa8bf700047138ef1aa22265bee7fb965a84c9615,
0x9a65397a5907d604030508d41477de621ce4a0d79b772e81112d634455e7a4da,
0x6462d4cc2262d7faf8856812248dc608ae3d197bf2ef410f00c3ae43f2040995,
0x6782b1bd319568e30d54b324ab9ed8fdeac6515e36b609e428a60785e15fb301,
0x8bcdcf82c7eb2a07e14db20d80d9d2efea8d40320e121923784c92bf38250a8e,
0x46ed84fa17d226d5895e44685747ab82a97246e97d6237014611aaaba65ed268,
0x147e87981673326c5a2bdb06f5e90eaaa9583857129451eed6dde0c117fb061f,
0x4141d6fe070104c29879523ba6669552f3d457c0929bb878d2751f4ff059b895,
0xd866ce4ef226d74841f950fc28cdf2235db21e0e3f07a0c8f807704464db2210,
0xa804f9118bf92558f684f90c2bda832a4f51ef771ffb2765cde3ec6f48124f32,
0xc436d4a65910124e00cded9a637178914a8fbc090400f3f031c03eac4d0295a5,
0x643fdb9243656512316528de04dcc7344ca33783580ad0c3debf8c4a6e7c8bc4,
0x7f4a345b41706b281b2de998e91ff62d908eb29fc333ee336221757753c96e23,
0x6bdc086a5b11de950cabea33b72d98db886b291c4c2f02d3e997edc36785d249,
0xfb10b5b47d374078c0a52bff7174bf1cd14d872c7d20b4a009e2afd3017a9a17,
0x1e07e605312db5380afad8f3d7bd602998102fdd39565b618ac177b13a6527e6,
0xc3161b5a7b9```md
---
title: 地址列表
description: 存储多个地址的列表
---
以下是地址列表:
0xeefe54bc9fa94b921b20e7590979c28a97d8191d1074c7c68a656953e2836a72, 0x8676e7f59d6f2ebb0edda746fc1589ef55e07feab00d7008a0f2f6f129b7bb3a, 0x78a3d93181b40152bd5a8d84d0df7f2adde5db7529325c13bc24a5b388aed3c4, 0xcc0e2d0cba7aaa19c874dbf0393d847086a980628f7459e9204fda39fad375c0, 0x6e46a52cd7745f84048998df1a966736d2ac09a95a1c553016fef6b9ec156575, 0x204ac2831d2376d4f9c1f5c106760851da968dbfc488dc8a715d1c764c238263, 0xbdb8cc7b7e5042a947fca6c000c10b9b584e965c3590f92f6af3fe4fb23e1358, 0x4a55e4b8a138e8508e7b11726f617dcf4155714d4600e7d593fd965657fcbd89, 0xdfe064bb37f28d97b16d58b575844964205e7606dce914a661f2afa89157c45b, 0x560e374fc0edda5848eef7ff06471545fcbdd8aefb2ecddd35dfbb4cb03b7ddf, 0x10a66c82e146da5ec6f48b614080741bc51322a60d208a87090ad7c7bf6b71c6, 0x62534c7dc682cbf356e6081fc397c0a17221b88508eaeff798d5977f85630d4f, 0x0138bba8de2331861275356f6302b0e7424bbc74d88d8c534479e17a3494a15b, 0x580c7768bf151175714b4a6f2685dc5bcfeb088706ee7ed5236604888b84d3e4, 0xd290adb1a5dfc69da431c1c0c13da3be788363238d7b46bc20185edb45ab9139, 0x1689879db6c78eb4d3038ed81be1bc106f8cfa70a7c6245bd4be642bfa02ebd7, 0x6064c384002c8b1594e738954ed4088a0430316738def62822d08b2285514918, 0x01fd23493f4f1cc3c5ff4e96a9ee386b2a144b50a428a6b5db654072bddadfe7, 0xd5d05bb7f23ab0fa2b82fb1fb14ac29c2477d81a85423d0a45a4b7d5bfd81619, 0xd72b9a73ae7b24db03b84e01106cea734d4b9d9850b0b7e9d65d6001d859c772, 0x156317cb64578db93fee2123749aff58c81eae82b189b0d6f466f91de02b59df, 0x5fba299f3b2c099edbac18d785be61852225890fc004bf6be0787d62926a79b3, 0x004154f28f685bdbf0f0d6571e7a962a4c29b6c3ebedaaaf66097dfe8ae5f756, 0x4b45816f9834c3b289affce7a3dc80056c2b7ffd3e3c250d6dff7f923e7af695, 0x6ca53bc37816fff82346946d83bef87860626bbee7fd6ee9a4aeb904d893a11f, 0xf48b2f43184358d66d5b5f7dd2b14a741c7441cc7a33ba3ebcc94a7b0192d496, 0x3cb98f4baa429250311f93b46e745174f65f901fab4eb8075d380908aaaef650, 0x343dfc26b4473b3a20e706a8e87e5202a4e6b96b53ed448afb9180c3f766e5f8, 0x1ace0e8a735073bcbaea001af75b681298ef3b84f1dbab46ea52cee95ab0e7f9, 0xd239b110dd71460cdbc41ddc99494a7531186c09da2a697d6351c116e667733b, 0x22d6955236bd275969b8a6a30c23932670a6067f68e236d2869b6a8b4b493b83, 0x53c1c01f8d061ac89187e5815ef924751412e6a6aa4dc8e3abafb1807506b4e0, 0x2f56dd20c44d7370b713e7d7a1bfb1a800cac33f8a6157f278e17a943806a1f7, 0xc99773d8a5b3e60115896a65ac1d6c15863317d403ef58b90cb89846f4715a7f, 0x9f4b6b77c254094621cd336da06fbc6cbb7b8b1d2afa8e537ceca1053c561ef5, 0x87944d0b210ae0a6c201cba04e293f606c42ebaed8b4a5d1c33f56863ae7e1b5, 0xa7d116d962d03ca31a455f9cda90f33638fb36d3e3506605aa19ead554487a37, 0x4042e32e224889efd724899c9edb57a703e63a404129ec99858048fbc12f2ce0, 0x36759f7a0faeea1cd4cb91e404e4bf09908de6e53739603d5f0db52b664158a3, 0xa4d50d005fb7b9fea8f86f1c92439cc9b8446efef7333ca03a8f6a35b2d49c38, 0x80cb7c3e20f619006542edbe71837cdadc12161890a69eea8f41be2ee14c08a3, 0xbb3c44e1df45f2bb93fb80e7f82cee886c153ab484c0095b1c18df03523629b4, 0x04cb749e70fac3ac60dea779fceb0730b2ec5b915b0f8cf28a6246cf6da5db29, 0x4f5189b8f650687e65a962ef3372645432b0c1727563777433ade7fa26f8a728, 0x322eddddf0898513697599b68987be5f88c0258841affec48eb17cf3f61248e8, 0x6416be41cda27711d9ec22b3c0ed4364ff6975a24a774179c52ef7e6de9718d6, 0x0622d31b8c4ac7f2e30448bdadfebd5baddc865e0759057a6bf7d2a2c8b527e2, 0x40f096513588cc19c08a69e4a48ab6a43739df4450b86d3ec2fb3c6a743b5485, 0x09fcf7d49290785c9ea2d54c3d63f84f6ea0a2e9acfcdbb0cc3a281ce438250e, 0x2000a519bf3da827f580982d449b5c70fcc0d4fa232addabe47bb8b1c471e62e, 0xf4f80008518e200c40b043f34fb87a6f61b82f8c737bd784292911af3740245e, 0x939eaab59f3d2ad49e50a0220080882319db7633274a978ced03489870945a65, 0xadcad043d8c753fb10689280b7670f313253f5d719039e250a673d94441ee17c, 0x58b7b75f090166b8954c61057074707d7e38d55ce39d9b2251bbc3d72be458f8, 0xf61031890c94c5f87229ec608f2a9aa0a3f455ba8094b78395ae312cbfa04087, 0x356a55def50139f94945e4ea432e7a9defa5db7975462ebb6ca99601c614ea1d, 0x65963bb743d5db080005c4db59e29c4a4e86f92ab1dd7a59f69ea7eaf8e9aa79
lamport_1 = [0x9c0bfb14de8d2779f88fc8d5b016f8668be9e231e745640096d35dd5f53b0ae2, 0x756586b0f3227ab0df6f4b7362786916bd89f353d0739fffa534368d8d793816, 0x710108dddc39e579dcf0819f9ad107b3c56d1713530dd94325db1d853a675a37, 0x8862b5f428ce5da50c89afb50aa779bb2c4dfe60e6f6a070b3a0208a4a970fe5, 0x54a9cd342fa3a4bf685c01d1ce84f3068b0d5b6a58ee22dda8fbac4908bb9560, 0x0fa3800efeaddd28247e114a1cf0f86b9014ccae9c3ee5f8488168b1103c1b44, 0xbb393428b7ebfe2eda218730f93925d2e80c020d41a29f4746dcbb9138f7233a, 0x7b42710942ef38ef2ff8fe44848335f26189c88c22a49fda84a51512ac68cd5d, 0x90e99786a3e8b04db95ccd44d01e75558d75f3ddd12a1e9a2c2ce76258bf4813, 0x3f6f71e40251728aa760763d25deeae54dc3a9b53807c737deee219120a2230a, 0xe56081a7933c6eaf4ef2c5a04e21ab8a3897785dd83a34719d1b62d82cfd00c2, 0x76cc54fa15f53e326575a9a2ac0b8ed2869403b6b6488ce4f3934f17db0f6bee, 0x1cd9cd1d882ea3830e95162b5de4beb5ddff34fdbf7aec64e83b82a6d11b417c, 0xb8ca8ae36d717c448aa27405037e44d9ee28bb8c6cc538a5d22e4535c8befd84, 0x5c4492108c25f873a23d5fd7957b3229edc22858e8894febe7428c0831601982, 0x907bcd75e7465e9791dc34e684742a2c0dc7007736313a95070a7e6b961c9c46, 0xe7134b1511559e6b2440672073fa303ec3915398e75086149eb004f55e893214, 0x2ddc2415e4753bfc383d48733e8b2a3f082883595edc5515514ebb872119af09, 0xf2ad0f76b08ffa1eee62228ba76f4982fab4fbede5d4752c282c3541900bcd5b, 0x0a84a6b15abd1cbc2da7092bf7bac418b8002b7000236dfba7c8335f27e0f1d4, 0x97404e02b9ff5478c928e1e211850c08cc553ebac5d4754d13efd92588b1f20d, 0xfa6ca3bcff1f45b557cdec34cb465ab06ade397e9d9470a658901e1f0f124659, 0x5bd972d55f5472e5b08988ee4bccc7240a8019a5ba338405528cc8a38b29bc21, 0x52952e4f96c803bb76749800891e3bfe55f7372facd5b5a587a39ac10b161bcc, 0xf96731ae09abcad016fd81dc4218bbb5b2cb5fe2e177a715113f381814007314, 0xe7d79e07cf9f2b52623491519a21a0a3d045401a5e7e10dd8873a85076616326, 0xe4892f3777a4614ee6770b22098eaa0a3f32c5c44b54ecedacd69789d676dffe, 0x20c932574779e2cc57780933d1dc6ce51a5ef920ce5bf681f7647ac751106367, 0x057252c573908e227cc07797117701623a4835f4b047dcaa9678105299e48e70, 0x20bad780930fa2a036fe1dea4ccbf46ac5b3c489818cdb0f97ae49d6e2f11fbf, 0xc0d7dd26ffecdb098585a1694e45a54029bb1e31c7c5209289058efebb4cc91b, 0x9a8744beb1935c0abe4b11812fc02748ef7c8cb650db3024dde3c5463e9d8714, 0x8ce6eea4585bbeb657b326daa4f01f6aef34954338b3ca42074aedd1110ba495, 0x1c85b43f5488b370721290d2faea19d9918d094c99963d6863acdfeeca564363, 0xe88a244347e448349e32d0525b40b18533ea227a9d3e9b78a9ff14ce0a586061, 0x352ca61efc5b8ff9ee78e738e749142dd1606154801a1449bbb278fa6bcc3dbe, 0xa066926f9209220b24ea586fb20eb8199a05a247c82d7af60b380f6237429be7, 0x3052337ccc990bfbae26d2f9fe5d7a4eb8edfb83a03203dca406fba9f4509b6e, 0x343ce573a93c272688a068d758df53c0161aa7f9b55dec8beced363a38b33069, 0x0f16b5593f133b58d706fe1793113a10750e8111eadee65301df7a1e84f782d3, 0x808ae8539357e85b648020f1e9d255bc4114bee731a6220d7c5bcb5b85224e03, 0x3b2bd97e31909251752ac57eda6015bb05b85f2838d475095cfd146677430625, 0xe4f857c93b2d8b250050c7381a6c7c660bd29066195806c8ef11a2e6a6640236, 0x23d91589b5070f443ddcefa0838c596518d54928119251ecf3ec0946a8128f52, 0xb72736dfad52503c7f5f0c59827fb6ef4ef75909ff9526268abc0f296ee37296, 0x80a8c66436d86b8afe87dde7e53a53ef87e057a5d4995963e76d159286de61b6, 0xbec92c09ee5e0c84d5a8ba6ca329683ff550ace34631ea607a3a21f99cd36d67, 0x83c97c9807b9ba6d9d914ae49dabdb4c55e12e35013f9b179e6bc92d5d62222b, 0x8d9c79f6af3920672dc4cf97a297c186e75083d099aeb5c1051207bad0c98964, 0x2aaa5944a2bd852b0b1be3166e88f357db097b001c1a71ba92040b473b30a607, 0x46693d27ec4b764fbb516017c037c441f4558aebfe972cdcd03da67c98404e19, 0x903b25d9e12208438f203c9ae2615b87f41633d5ffda9cf3f124c1c3922ba08f, 0x3ec23dc8bc1b49f5c7160d78008f3f235252086a0a0fa3a7a5a3a53ad29ec410, 0xa1fe74ceaf3cccd992001583a0783d7d7b7a245ea374f369133585b576b9c6d8, 0xb2d6b0fe4932a2e06b99531232398f39a45b0f64c3d4ebeaaebc8f8e50a80607, 0xe19893353f9214eebf08e5d83c6d44c24bffe0eceee4dc2e840d42eab0642536, 0x5b798e4bc099fa2e2b4b5b90335c51befc9bbab31b4dd02451b0abd09c06ee79, 0xbab2cdec1553a408cac8e61d9e6e19fb8ccfb48efe6d02bd49467a26eeeca920, 0x1c1a544c28c38e5c423fe701506693511b3bc5f2af9771b9b2243cd8d41bebfc, 0x704d6549d99be8cdefeec9a58957f75a2be4af7bc3dc4655fa606e7f3e03b030, 0x051330f43fe39b08ed7d82d68c49b36a8bfa31357b546bfb32068712df89d190, 0xe69174c7b03896461cab2dfaab33d549e3aac15e6b0f6f6f466fb31dae709b9b, 0xe5f668603e0ddbbcde585ac41c54c3c4a681fffb7a5deb205344de294758e6ac, 0xca70d5e4c3a81c1f21f246a3f52c41eaef9a683f38eb7c512eac8b385f46cbcd, 0x3173a6b882b21cd147f0fc60ef8f24bbc42104caed4f9b154f2d2eafc3a56907, 0xc71469c192bf5cc36242f6365727f57a19f924618b8a908ef885d8f459833cc3, 0x59c596fc388afd8508bd0f5a1e767f3dda9ed30f6646d15bc59f0b07c4de646f, 0xb200faf29368581f551bd351d357b6fa8cbf90bdc73b37335e51cad36b4cba83, 0x275cede69b67a9ee0fff1a762345261cb20fa8191470159cc65c7885cfb8313c, 0x0ce4ef84916efbe1ba9a0589bed098793b1ea529758ea089fd79151cc9dc7494, 0x0f08483bb720e766d60a3cbd902ce7c9d835d3f7fdf6dbe1f37bcf2f0d4764a2, 0xb30a73e5db2464e6da47d10667c82926fa91fceb337d89a52db5169008bc6726, 0x6b9c50fed1cc404bf2dd6fffbfd18e30a4caa1500bfeb080aa93f78d10331aaf, 0xf17c84286df03ce175966f560600dd562e0f59f18f1d1276b4d8aca545d57856, 0x11455f2ef96a6b2be69854431ee219806008eb80ea38c81e45b2e58b3f975a20, 0x9a61e03e2157a5c403dfcde690f7b7d704dd56ea1716cf14cf7111075a8d6491, 0x30312c910ce6b39e00dbaa669f0fb7823a51f20e83eaeb5afa63fb57668cc2f4, 0x17c18d261d94fba82886853a4f262b9c8b915ed3263b005```md — title: EIP-7683: 用于密钥轮换的 Lamport 签名 description: 引入一种基于 Lamport 签名的密钥轮换方案,该方案允许对与以太坊账户关联的公钥进行高效且无需信任的更新。 author: Alex Roan (@alroan), Andrew Fisher (@ProjectAndrew), Yicheng Zhou (@yzhou7741) discussions-to: https://ethereum-magicians.org/t/erc-lamport-signature-for-key-rotation/17532 status: Draft type: Standards Track category: ERC created: 2024-01-23 —
摘要
本 EIP 提出了一种用于密钥轮换的方案,利用了 Lamport 签名方案。此方案使以太坊账户能够更新其关联的公钥,而无需信任第三方或进行昂贵的链上操作。该提议通过利用 Lamport 签名的一次性特性,确保了新公钥的真实性和签名方案的安全性。
动机
以太坊账户通常与用于交易签名和身份验证的公钥相关联。但是,如果私钥被盗用、丢失或者需要定期轮换,则更新与账户关联的公钥就成为一项挑战。传统的密钥轮换方法通常涉及复杂的链上操作,这既昂贵又耗时。
本 EIP 通过提供一种轻量级且无需信任的解决方案来应对这些挑战。通过利用 Lamport 签名方案,账户可以低成本有效地轮换其公钥,且不需要智能合约。这增强了账户安全性和灵活性,同时最大限度地减少了 gas 消耗和对链上交互的依赖。
规范
概述
该方案利用 Lamport 签名方案来安全地更新与以太坊账户关联的公钥。Lamport 签名是一种一次性签名方案,它使用一对公钥和私钥来签署单个消息。在本 EIP 的上下文中,消息是新公钥的哈希值,并且 Lamport 签名用于证明新公钥的真实性。
组件
该方案涉及以下组件:
- 账户:拥有并控制以太坊账户的实体。
- 旧公钥:当前与该账户关联的公钥。
- 旧私钥:与旧公钥对应的私钥。
- 新公钥:将要与该账户关联的新公钥。
- 新私钥:与新公钥对应的新私钥。
- Lamport 公钥:由旧私钥生成的一次性公钥。
- Lamport 私钥:用于对新公钥哈希进行签名的私钥。
- Lamport 签名:使用 Lamport 私钥创建的签名。
流程
密钥轮换的过程如下:
- 生成新密钥对:该账户生成新的公钥和私钥对。
- 创建 Lamport 密钥对:帐户使用旧私钥派生出一个 Lamport 密钥对。Lamport 私钥用于对新公钥的哈希进行签名,而 Lamport 公钥则用于验证签名。
- 签署新公钥哈希:该账户使用 Lamport 私钥签署新公钥的哈希。生成的签名称为 Lamport 签名。
- 广播交易:该账户将包含以下数据的交易广播到以太坊网络:
- 旧公钥
- 新公钥
- Lamport 公钥
- Lamport 签名
- 验证签名:任何希望验证密钥轮换的各方都可以使用 Lamport 公钥来验证 Lamport 签名。如果签名有效,则意味着该账户已授权密钥轮换。
- 更新公钥:一旦验证了 Lamport 签名,该账户就可以使用新的公钥来签署交易和进行身份验证。旧公钥被认为已过期。
Lamport 签名方案
本方案中使用的 Lamport 签名方案如下:
-
密钥生成:
- 选择随机的 256 位字符串
x_i0
和x_i1
作为私钥,其中i
的范围为 0 到 255。 - 计算相应的公钥
y_i0 = keccak256(x_i0)
和y_i1 = keccak256(x_i1)
,其中i
的范围为 0 到 255。
- 选择随机的 256 位字符串
-
签名:
- 若要对消息
M
进行签名,首先需要对消息进行哈希处理以获得 256 位的哈希值H = keccak256(M)
。 - 签名由
x_i
值组成,具体取决于哈希H
的第i
位。对于每个i
,如果H_i = 0
,则签名包含x_i0
。否则(如果H_i = 1
),则签名包含x_i1
。
- 若要对消息
-
验证:
- 若要验证消息
M
上的签名,首先需要计算与签名过程中相同的消息哈希H = keccak256(M)
。 - 对于
H
中的每个位i
,如果H_i = 0
,则验证者检查keccak256(signature[i])
是否等于y_i0
。否则(如果H_i = 1
),验证者检查keccak256(signature[i])
是否等于y_i1
。 - 如果所有 256 个哈希都匹配,则该签名有效。
- 若要验证消息
具体参数
- 哈希函数:该方案使用 Keccak-256 作为哈希函数。
- 签名大小:Lamport 签名的大小为 64 * 256 字节,因为每个私钥的长度为 32 字节,并且总共有 256 个私钥。
[x_10, x_11, .... x_2560, x_2561]
。 - 安全性:Lamport 签名方案的安全性取决于底层哈希函数的安全性。假设 Keccak-256 是安全的,那么 Lamport 签名方案对于一次性使用是安全的。由于该方案仅用于密钥轮换,因此建议新旧密钥对都不要用于其他任何目的。
基本原理
本 EIP 背后的基本原理在于,Lamport 签名方案提供了一种以无需信任的方式来证明新公钥真实性,并且不需要智能合约签名验证的方法。通过使用 Lamport 签名,账户可以向任何希望验证密钥轮换的各方证明它们授权进行轮换。 Lamport 签名方案的选择是由于其简单性、安全性和无需对以太坊区块链进行任何修改这一事实。其他签名方案,例如 Schnorr 签名,可能也适用,但它们需要更复杂的计算,并且可能需要对以太坊协议进行修改。
向后兼容性
本 EIP 与现有的以太坊协议完全向后兼容。它不需要对以太坊协议的任何修改,并且可以与现有的以太坊客户端和工具集成。
安全考虑
本 EIP 中提出的密钥轮换方案旨在是安全的。但是,在实施和使用此方案时,需要考虑一些安全注意事项:
- 私钥安全:该方案的安全性取决于旧私钥和新私钥的安全性。账户必须采取措施保护其私钥免遭盗窃或泄露。
- 一次性使用:Lamport 签名方案是一种一次性使用方案。这意味着 Lamport 私钥只能用于签署单个消息。如果 Lamport 私钥用于签署多个消息,则该方案将不再安全。因此,务必确保 Lamport 私钥仅用于签署新公钥的哈希。
- 拒绝服务攻击:攻击者可能会通过向网络广播大量的交易来尝试对网络发起拒绝服务攻击,这些交易包含无效的 Lamport 签名。为了缓解这种风险,客户端应在接受和转发交易之前验证 Lamport 签名。如果签名无效,则应拒绝该交易。
版权
版权属于作者所有。
示例实现
本节提供了一个示例实现,用于展示本 EIP 中提出的密钥轮换方案。该示例使用 JavaScript 和 ethers.js 库来实现 Lamport 签名方案和密钥轮换过程。
const { ethers } = require("ethers");
const { keccak256 } = require("ethers/lib/utils");
// 函数:生成 Lamport 密钥对
// 参数:seed - 用于生成 Lamport 密钥对的种子
// 返回:包含 Lamport 私钥和公钥的对象
function generateLamportKeyPair(seed) {
const lamportPrivateKey = [];
const lamportPublicKey = [];
// 为每个位生成 Lamport 密钥对
for (let i = 0; i < 256; i++) {
// 使用种子和索引派生私钥
const privateKey0 = keccak256(seed + i + "0");
const privateKey1 = keccak256(seed + i + "1");
// 计算相应的公钥
const publicKey0 = keccak256(privateKey0);
const publicKey1 = keccak256(privateKey1);
// 将私钥和公钥添加到数组中
lamportPrivateKey.push([privateKey0, privateKey1]);
lamportPublicKey.push([publicKey0, publicKey1]);
}
// 返回包含私钥和公钥的对象
return { lamportPrivateKey, lamportPublicKey };
}
// 函数:签署消息
// 参数:message - 要签署的消息
// 参数:lamportPrivateKey - 用于签署消息的 Lamport 私钥
// 返回:消息的签名
function sign(message, lamportPrivateKey) {
// 对消息进行哈希处理
const hash = keccak256(message);
const signature = [];
// 为哈希中的每个位生成签名
for (let i = 0; i < 256; i++) {
// 获取哈希中的第 i 位
const bit = hash[i];
// 根据该位将相应的私钥添加到签名中
if (bit === "0") {
signature.push(lamportPrivateKey[i][0]);
} else {
signature.push(lamportPrivateKey[i][1]);
}
}
// 返回签名
return signature;
}
// 函数:验证签名
// 参数:message - 已签署的消息
// 参数:signature - 消息的签名
// 参数:lamportPublicKey - 用于验证签名的 Lamport 公钥
// 返回:一个布尔值,指示签名是否有效
function verify(message, signature, lamportPublicKey) {
// 对消息进行哈希处理
const hash = keccak256(message);
// 为哈希中的每个位验证签名
for (let i = 0; i < 256; i++) {
// 获取哈希中的第 i 位
const bit = hash[i];
// 根据该位验证签名
if (bit === "0") {
if (keccak256(signature[i]) !== lamportPublicKey[i][0]) {
return false;
}
} else {
if (keccak256(signature[i]) !== lamportPublicKey[i][1]) {
return false;
}
}
}
// 如果所有哈希都匹配,则签名有效
return true;
}
// 函数:将公钥压缩为单个的 32 字节地址
// 参数:lamportPublicKey - 要压缩的 Lamport 公钥
// 返回:一个 32 字节的地址,表示压缩后的 Lamport 公钥
function compressPublicKey(lamportPublicKey) {
// 连接公钥
const flattenedPublicKey = lamportPublicKey.flat();
// 计算连接后的公钥的 keccak256 哈希
const publicKeyHash = keccak256(ethers.utils.concat(flattenedPublicKey));
// 返回公钥哈希
return publicKeyHash;
}
这是一个如何使用上述函数的示例:
// 生成旧密钥对和新密钥对
const oldWallet = ethers.Wallet.createRandom();
const newWallet = ethers.Wallet.createRandom();
// 生成 Lamport 密钥对
const { lamportPrivateKey, lamportPublicKey } = generateLamportKeyPair(oldWallet.privateKey);
// 对新公钥的哈希进行签名
const message = keccak256(newWallet.publicKey);
const signature = sign(message, lamportPrivateKey);
// 验证签名
const isValid = verify(message, signature, lamportPublicKey);
// 打印签名是否有效
console.log("Signature is valid:", isValid); // 输出:签名是否有效:true
// 将 Lamport 公钥压缩为单个地址
const compressed_lamport_PK = compressPublicKey(lamportPublicKey)
// 模拟一个子私钥,可用于签署交易
const path = "m/12381/60/0/0/0"
const child_SK = oldWallet.derivePath(path)
console.log({
old_PK: oldWallet.publicKey,
old_SK: oldWallet.privateKey,
new_PK: newWallet.publicKey,
new_SK: newWallet.privateKey,
lamport_PK: lamportPublicKey,
lamport_SK: lamportPrivateKey,
signature,
message,
compressed_lamport_PK,
child_SK: child_SK.privateKey,
})
以下是一个测试用例,它将验证密钥是否正确轮换。
const { ethers } = require("ethers");
const { keccak256 } = require("ethers/lib/utils");
const assert = require('assert');
// 函数:生成 Lamport 密钥对
function generateLamportKeyPair(seed) {
const lamportPrivateKey = [];
const lamportPublicKey = [];
for (let i = 0; i < 256; i++) {
const privateKey0 = keccak256(seed + i + "0");
const privateKey1 = keccak256(seed + i + "1");
const publicKey0 = keccak256(privateKey0);
const publicKey1 = keccak256(privateKey1);
lamportPrivateKey.push([privateKey0, privateKey1]);
lamportPublicKey.push([publicKey0, publicKey1]);
}
return { lamportPrivateKey, lamportPublicKey };
}
// 函数:签署消息
function sign(message, lamportPrivateKey) {
const hash = keccak256(message);
const signature = [];
for (let i = 0; i < 256; i++) {
const bit = hash[i];
if (bit === "0") {
signature.push(lamportPrivateKey[i][0]);
} else {
signature.push(lamportPrivateKey[i][1]);
}
}
return signature;
}
// 函数:验证签名
function verify(message, signature, lamportPublicKey) {
const hash = keccak256(message);
for (let i = 0; i < 256; i++) {
const bit = hash[i];
if (bit === "0") {
if (keccak256(signature[i]) !== lamportPublicKey[i][0]) {
return false;
}
} else {
if (keccak256(signature[i]) !== lamportPublicKey[i][1]) {
return false;
}
}
}
return true;
}
// 函数:将公钥压缩为单个的 32 字节地址
function compressPublicKey(lamportPublicKey) {
const flattenedPublicKey = lamportPublicKey.flat();
const publicKeyHash = keccak256(ethers.utils.concat(flattenedPublicKey));
return publicKeyHash;
}
describe('Key Rotation', () => {
it('should rotate keys correctly', () => {
// 生成旧密钥对和新密钥对
const oldWallet = ethers.Wallet.createRandom();
const newWallet = ethers.Wallet.createRandom();
// 使用 oldWallet 中的私钥派生一个 Lamport 密钥对
const { lamportPrivateKey, lamportPublicKey } = generateLamportKeyPair(oldWallet.privateKey);
// 使用 lamportPrivateKey 对 newWallet 的公钥哈希进行签名
const message = keccak256(newWallet.publicKey);
const signature = sign(message, lamportPrivateKey);
// 验证签名是否有效
const isValid = verify(message, signature, lamportPublicKey);
assert.equal(isValid, true, 'Signature should be valid');
// 确保旧密钥对有效
const originalMessage = "original message";
const originalSignature = oldWallet.signMessage(originalMessage);
assert.equal(ethers.utils.verifyMessage(originalMessage, originalSignature), oldWallet.address, 'Original key pair should be valid');
// 使用模拟的子私钥对消息进行签名 - 这将是轮换密钥后的新密钥
const path = "m/12381/60/0/0/0";
const child_SK = oldWallet.derivePath(path);
const subWallet = new ethers.Wallet(child_SK.privateKey);
const newMessage = "new message";
const newSignature = subWallet.signMessage(newMessage);
assert.equal(ethers.utils.verifyMessage(newMessage, newSignature), subWallet.address, 'New key pair should be valid');
});
});
以下是一个输出示例:
```json { “old_PK”: “0x9351710a5633714bb8b2d226e15ba4caa6f50f56c5508e5fa1239d5cc6a7e1aa”, “old_SK”: “0x718e24c3970c85bcb14d2763201812c43abac0a7f16fc5787a7a7b2f37288586”, “new_PK”: “0x8d0aef52ec7266f37adb572913a6213b8448caaf0384008373dec525ae6cdff1”, “new_SK”: “0x3600ce44cebc3ee46b39734532128eaf715c0f3596b554f8478b961b0d6e389a”, “lamport_PK”: [ [ “0x50dd1db7b0a5f6bd2d16252f43254d0f5d009e59f61ebc817c4bbf388519a46b”, “0x67861ed00f5fef446e1f4e671950ac2ddae1f3b564f1a6fe945e91678724ef03” ], [ “0x0e332c26e169648bc20b4f430fbf8c26c6edf1a235f978d09d4a74c7b8754aad”, “0x6c9901015adf56e564dfb51d41a82bde43fb67273b6911c9ef7fa817555c9557” ], [ “0x53c83391e5e0a024f68d5ade39b7a769f10664e12e4942c236398dd5dbce47a1”, “0x78619564f0b2399a9fcb229d938bf1e298d62b03b7a37fe6486034185d7f7d27” ], ….. [ “0xe3a615f80882fb5dfbd08c1d7a8b0a4d3b651d5e8221f99b879cb01d97037a9c”, “0xb56db4a5fea85cbffaee41f05304689ea321c40d4c108b1146fa69118431d9b2” ], [ “0xab28e1f077f18117945910c235bc9c6f9b6d2b45e9ef03009053006c637e3e26”, “0xefcabc1d5659fd6e48430dbfcc9fb4e08e8a9b895f7bf9b3d6c7661bfc44ada2” ] ], “lamport_SK”: [ [ “0x4625f15381a8723452ec80f3dd0293c213ae35de737c508f42427e1735398c3a”, “0x69542425ddb39d3d3981e76b41173eb1a09500f11164658a3536bf3e292f8b6a” ], [ “0x82ac4f5bb40aece7d6706f1bdf4dfba5c835c09afba6446ef408d8ec6c09300f”, “0x740f9180671091b4c5b3ca59b9515bd0fc751f48e488a9f7f4b6848602490e21” ], [ “0x9a04b08b4115986d8848e80960ad67490923154617cb82b3d88656ec1176c24c”, “0xf9ffe528eccffad519819d9eef70cef317af33899bcaee16f1e720caf9a98744” ], ….. [ “0x098f3429c8ccda60c3b5b9755e5632dd6a3f5297ee819bec8de2d8d37893968a”, “0x1a5b91af6025c11911ac072a98b8a44ed81f1f3c76ae752bd28004915db6f554” ], [ “0x8bed50c7cae549ed4f8e05e02aa09b2a614c0af8eec719e4c6f7aee975ec3ec7”, “0xd86130f624b5dcc116f2dfbb5219b1afde4b7780780decd0b42694e15c1f8d8b” ] ], “signature”: [ “0x4625f15381a8723452ec80f3dd0293c213ae35de737c508f42427e1735398c3a”, “0x740f9180671091b4c5b3ca59b9515bd0fc751f48e488a9f7f4b6848602490e21”, “0x9a04b08b4115986d8848e80960ad67490923154617cb82b3d88656ec1176c24c”, “0x46da5e1a14b582b237f75556a0fd108c4ea0d55c0edd8f5d06c59a42e57410df”, “0x098f3429c8ccda60c3b5b9755e5632dd6a3f5297ee819bec8de2d8d37893968a”, “0x8bed50c7cae549ed4f8e05e02aa09b2a614c0af8eec719e4c6f7aee975ec3ec7”, “0x4167aa9bc0075f624d25d40eb29139dd2c452ebf17739fab859e14ac6765337a”, “0xe5ef8b5ab3cc8894452d16dc875b69a55fd925808ac7cafef1cd19485d0bb50a”, “0x120df2b3975d85b6dfca56bb98a82025ade5ac1d33e4319d2e0105b8de9ebf58”, “0xc964291dd2e0807a468396ebba3d59cfe385d949f6d6215976fc9a0a11de209a”, “0xf23f14cb709074b79abe166f159bc52b50de687464df6a5ebf112aa953c95ad5”, “0x622c092c9bd7e30f880043762e26d8e9c73ab7c0d0806f3c5e472a4152b35a93”, “0x8a5f090662731e7422bf651187fb89812419ab6808f2c62da213d6944fccfe9f”, “0x2babfbcc08d69b52c3747ddc8dcad4ea5511edabf24496f3ff96a1194d6f680e”, “0x4d3d019c28c779496b616d85aee201a3d79d9eecf35f728d00bcb12245ace703”, “0xe76fcee1f08325110436f8d4a95476251326b4827399f9b2ef7e12b7fb9c4ba1”, “0x74c3f303d93d4cc4f0c1eb1b4378d34139220eb836628b82b649d1deb519b1d3”, “0xacb806670b278d3f0c84ba9c7a68c7df3b89e3451731a55d7351468c7c864c1c”, “0x8660fb8cd97e585ea7a41bccb22dd46e07eee8bbf34d90f0f0ca854b93b1ebee”, “0x2fc9c89cdca71a1c0224d469d0c364c96bbd99c1067a7ebe8ef412c645357a76”, “0x8ec6d5ab6ad7135d66091b8bf269be44c20af1d828694cd8650b5479156fd700”, “0xbf39f5e17082983da4f409f91c7d9059acd02ccbefa69694aca475bb8d40b224”, “0x3135b3b981c850cc3fe9754ec6af117459d355ad6b0915beb61e84ea735c31bf”, “0x9e480f5617323ab104b4087ac4ef849a5da03427712fb302ac085507c77d8f37”, “0x57a6d474654d5e8d408159be39ad0e7026e6a4c6a6543e23a63d30610dc8dfc1”, “0x09eb3e01a5915a4e26d90b4c58bf0cf1e560fdc8ba53faed9d946ad3e9bc78fa”, “0x29c6d25da80a772310226b1b89d845c7916e4a4bc94d75aa330ec3eaa14b1e28”, “0x1a1ccfee11edeb989ca02e3cb89f062612a22a69ec816a625835d79370173987”, “0xac9dff32a69e75b396a2c250e206b36c34c63b955c9e5732e65eaf7ccca03c62”, “0x3e1b4f0c3ebd3d38cec389720147746774fc01ff6bdd065f0baf2906b16766a8”, “0x5cc8bed25574463026205e90aad828521f8e3d440970d7e810d1b46849681db5”, “0x255185d264509bd3a768bb0d50b568e66eb1fec96d573e33aaacc716d7c8fb93”, “0xe81b86ba631973918a859ff5995d7840b12511184c2865401f2693a71b9fa07e”, “0x61e67e42616598da8d36e865b282127c761380d3a56d26b8d35fbbc7641433c5”, “0x60c62ffef83fe603a34ca20b549522394e650dad5510ae68b6e074f0cd209a56”, “0x78577f2caf4a54f6065593535d76216f5f4075af7e7a98b79571d33b1822920c”, “0xfd4cb354f2869c8650200de0fe06f3d39e4dbebf19b0c1c2677da916ea84f44d”, “0x453769cef6ff9ba2d5c917982a1ad3e2f7e947d9ea228857556af0005665e0b0”, “0xe567f93f8f88bf1a6b33214f17f5d60c5dbbb531b4ab21b8c0b79## 实现
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
, "EIP-: ```," Ethereum Improvement Proposals, no. , . [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-.