ERC-2680: Ethereum 2 钱包布局
Authors | Jim McDonald <Jim@mcdee.net> |
---|---|
Created | 2020-05-29 |
Discussion Link | https://ethereum-magicians.org/t/eip-2680-ethereum-2-wallet-layout/4323 |
Table of Contents
简单总结
钱包存储和密钥存储的标准布局和命名格式,适用于分层(例如文件系统、Amazon S3)和非分层(键/值)存储系统。
摘要
以太坊钱包在持久存储中的布局没有标准,导致不同的钱包实现不兼容。这定义了以太坊钱包存储和密钥存储的放置标准,使得不同的软件可以与相同的钱包和密钥一起工作。
动机
钱包和账户的标准布局允许验证器之间的互操作性。这有利于用户,因为他们可以在不同的验证器软件之间移动(以及返回),而无需移动文件。这很重要,因为任何包含密钥的文件的移动都存在删除或复制它们的风险,这两种情况都可能导致无法访问资金。
规范
一个钱包有四个要素需要解决。这些定义如下。
基本位置
基本位置必须是众所周知的,要么是预定义的,要么是由存储系统的连接参数定义的。
对于文件系统,不同操作系统的预定义基本位置如下:
- Windows:
%APPDATA%\ethereum2\wallets
- MacOSX:
${HOME}/Library/Application Support/ethereum2/wallets
- Linux:
${HOME}/.config/ethereum2/wallets
对于其他分层存储,例如 Amazon S3,基本位置必须是小写的十六进制字符串,表示字符串 “Ethereum 2 wallet:” 的 SHA-256 哈希值,并附加分层存储的标识符。例如,如果用户 Amazon S3 账户的账户 ID 是 “AbC0438EB”,则:
- 字符串为
Ethereum 2 wallet:AbC0438EB
- 字符串的 SHA-256 哈希值将是字节数组
0x991ec14a8d13836b10d8c3039c9e30876491cb8aa9c9c16967578afc815c9229
- 基本位置将是字符串
991ec14a8d13836b10d8c3039c9e30876491cb8aa9c9c16967578afc815c9229
对于非分层存储,没有基本位置。
钱包容器
钱包容器保存钱包存储和相关的密钥存储。
钱包容器由钱包的 UUID 标识。 它必须是符合 RFC 4122 第 3 节 中规定的句法结构的字符串。
钱包存储
钱包存储元素包含钱包存储,并保存在钱包容器中。它由钱包的 UUID 标识。 它必须是符合 RFC 4122 第 3 节 中规定的句法结构的字符串。
密钥存储
密钥存储元素包含给定密钥的密钥存储,并保存在钱包容器中。它由密钥的 UUID 标识。 它必须是符合 RFC 4122 第 3 节 中规定的句法结构的字符串。
分层存储示例
分层存储是存储和组织信息的常见方法。最常见的例子是文件系统,但许多基于对象的存储(例如 Amazon S3)也提供分层命名。
将这些元素组合在一起,用于具有钱包 UUID 1f031fff-c51d-44fc-8baf-d6b304cb70a7
和密钥 UUID 1302106c-8441-4e2e-b687-6c77f49fc624
和 4a320100-83fd-4db7-8126-6d6d205ba834
的示例钱包,得到以下布局:
- 1f031fff-c51d-44fc-8baf-d6b304cb70a7
+- 1302106c-8441-4e2e-b687-6c77f49fc624
+- 1f031fff-c51d-44fc-8baf-d6b304cb70a7
+- 4a320100-83fd-4db7-8126-6d6d205ba834
非分层存储示例
非分层存储使用简化的方法,其中钱包 UUID 和密钥 UUID 使用 ‘:’ 字符连接。使用与上面相同的示例钱包和密钥 UUID 将导致具有以下密钥的对象:
1f031fff-c51d-44fc-8baf-d6b304cb70a7:1302106c-8441-4e2e-b687-6c77f49fc624
1f031fff-c51d-44fc-8baf-d6b304cb70a7:1f031fff-c51d-44fc-8baf-d6b304cb70a7
1f031fff-c51d-44fc-8baf-d6b304cb70a7:4a320100-83fd-4db7-8126-6d6d205ba834
防止并发写入访问
待定
迭代钱包
在分层存储和具有迭代能力的非分层存储的情况下,迭代钱包就是迭代根容器中的文件。
实现者可以在基本位置包含索引。如果是这样,则它必须遵循以下“索引格式”部分中指定的结构。
迭代账户
在分层存储的情况下,迭代账户就是迭代钱包容器中的文件。
实现者可以在钱包容器中包含该钱包内账户的索引。如果是这样,则它必须遵循以下“索引格式”部分中指定的结构。
索引格式
钱包和账户的索引格式是相同的,遵循标准 JSON 模式。
{
"type": "array",
"items": {
"type": "object",
"properties": {
"uuid": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"uuid",
"name"
]
}
}
索引必须使用标识符“index”。
公钥不得存储在索引中。
理由
类似于密钥存储的钱包存储标准,提供了钱包之间更高程度的兼容性,并允许它们之间更简单的钱包和密钥交换。
实现
文件系统布局的 Go 实现可以在 https://github.com/wealdtech/go-eth2-wallet-filesystem 找到。
Amazon S3 布局的 Go 实现可以在 https://github.com/wealdtech/go-eth2-wallet-s3 找到。
安全注意事项
钱包存储的位置被定义为在每个用户的个人空间内,从而降低了意外暴露信息的可能性。然而,仍然有可能设置权限以使此数据对世界可读,并且实现此 EIP 的应用程序应尝试设置和重置权限,以确保只有相关用户才能访问该信息。
钱包和密钥存储的名称都是 UUID,确保没有数据从元数据中泄露。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Jim McDonald <Jim@mcdee.net>, "ERC-2680: Ethereum 2 钱包布局 [DRAFT]," Ethereum Improvement Proposals, no. 2680, May 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2680.