Alert Source Discuss
🚧 Stagnant Standards Track: ERC

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

简单总结

钱包存储和密钥存储的标准布局和命名格式,适用于分层(例如文件系统、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-6c77f49fc6244a320100-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.