Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-7406: 多命名空间链上注册表

以太坊上通用的多命名空间注册表,具有以太坊上的映射结构

Authors Mengshi Zhang (@MengshiZhang), Zihao Chen (@zihaoccc)
Created 2023-07-23
Discussion Link https://ethereum-magicians.org/t/eip-7406-multi-namespace-onchain-registry/15216
Requires EIP-137

摘要

本 EIP 提出了一种通用的链上注册表条目描述,支持多命名空间,其中每个条目的结构都是映射类型。多命名空间注册表支持在区块链中存储键值映射的集合,作为具有可追溯变更历史的权威信息来源。这些映射记录充当指针,并与链上资产结合,通过封装广泛的细节,在各种用例中提供增强的通用性。所提出的解决方案引入了一种通用的映射数据结构,该结构足够灵活,可以支持不同的情况并与之兼容,从而为当前的类 ENS 注册表提供了一种更具可扩展性和功能强大的替代方案。

动机

基于区块链的注册表是去中心化应用程序的基本组成部分,支持存储和检索基本信息。现有的解决方案(如 ENS 注册表)服务于特定的用例,但可能缺乏适应更复杂场景所需的灵活性。需要一种具有多命名空间支持的更通用的映射数据结构,以便使开发人员能够使用单个注册表有效地处理各种用例。

所提出的多命名空间注册表具有以下几个主要优点:

  • 通用性:开发人员可以定义和管理多个命名空间,每个命名空间都有其独特的键集,从而可以更精细地控制和组织数据。例如,基于不同的命名空间,单个相同的键可以派生为指向不同值的不同指针,如果此注册表存储会话,则可以将命名空间指定为会话类型,或者如果注册表存储此类数据,则短 URL -> 完整 URL 映射。
  • 可追溯的历史记录:通过利用多命名空间功能,注册表可以通过使用多命名空间区分作为版本号来支持条目版本控制,从而能够跟踪数据更改历史记录、恢复数据或数据墓碑化。这有助于在单个合约中进行数据管理和治理。
  • 增强的兼容性:所提出的结构旨在与传统类 ENS 注册表范围之外的各种用例兼容,从而促进其在各种去中心化应用程序中的采用。

规范

本文档中的关键词“必须”,“禁止”,“需要”,“应该”,“不应该”,“推荐”,“可以”和“可选”应按照 RFC 2119 中的描述进行解释。

注册表规范

多命名空间注册表合约公开以下函数:

function owner(bytes32 namespace, bytes32 key) external view returns (address);
  • 返回给定 namespace 下指定 key 的所有者。
function resolver(bytes32 namespace, bytes32 key) external view returns (address);
  • 返回给定 namespace 下指定 key 的解析器地址。
function setOwner(bytes32 namespace, bytes32 key, address newOwner) external;
  • 将指定 namespacekey 的所有权转移给另一个所有者。此函数只能由特定 namespacekey 的当前所有者调用。不同 namespaces 下的同一 key 可能具有不同的所有者。成功调用此函数将记录事件 Transfer(bytes32 namespace, bytes32 key, address newOwner)
function createNamespace(bytes32 namespace) external;
  • 在当前注册表中创建一个新的 namespace,例如新版本或新型协议。成功调用此函数将记录事件 NewNamespace(bytes32 namespace)
function setResolver(bytes32 namespace, bytes32 key, address newResolver) external;
  • 设置给定 namespacekey 的解析器地址。此函数只能由特定 namespace 下 key 的所有者调用。不同命名空间下的同一键可能具有不同的解析器。成功调用此函数将记录事件 NewResolver(bytes32 namespace, bytes32 key, address newResolver)

解析器规范

多命名空间解析器合约可以利用与 ERC-137 中定义的相同的规范。

原理

通过支持多个命名空间,注册表可以满足各种用例,包括但不限于身份管理、会话管理、记录跟踪和去中心化内容发布。这种灵活性使开发人员能够轻松地设计和实施更复杂的去中心化应用程序。

向后兼容性

由于本 EIP 引入了一项新功能,并且没有修改任何现有行为,因此不存在向后兼容性问题。

参考实现

附录 A:注册表实现

pragma solidity ^0.8.12;

import "./IERC7406Interface.sol";

contract ERC7406 {
    struct Record {
        address owner;
        address resolver;
    }


    // A map is used to record namespace existence
    // 使用 map 来记录命名空间是否存在
    mapping(byte32=>uint) namespaces;
    mapping(bytes32=>mapping(bytes32=>Record)) records;

    event NewOwner(bytes32 indexed namespace, bytes32 indexed key, address owner);
    event Transfer(bytes32 indexed namespace, bytes32 indexed key, address owner);
    event NewResolver(bytes32 indexed namespace, bytes32 indexed key, address resolver);
    event NewNamespace(bytes32 namespace)

    modifier only_owner(bytes32 namespace, bytes32 key) {
        if(records[namespace][key].owner != msg.sender) throw;
        _
    }

    modifier only_approver() {
        if(records[0][0].owner != msg.sender) throw;
        _
    }

    function ERC7406(address approver) {
        records[0][0].owner = approver;
    }

    function owner(bytes32 namespace, bytes32 key) constant returns (address) {
        return records[namespace][key].owner;
    }
  
    function createNamespace(bytes32 namespace) only_approver() {
       if (status == 0) throw;
       NewNamespace(namespace);
       if (namespaces[namespace] != 0) {
           return;
       }
       namespaces[namespace] = 1;
    }

    function resolver(bytes32 namespace, bytes32 key) constant returns (address) {
        if (namespaces[namespace] == 0) throw;
        return records[namespace][key].resolver;
    }

    function setOwner(bytes32 namespace, bytes32 key, address owner) only_owner(namespace, key) {
        Transfer(key, namespace, owner);
        records[namespace][key].owner = owner;
    }

    function setResolver(bytes32 namespace, bytes32 key, address resolver) only_approver() {
        if (namespaces[namespace] == 0) {
            this.createNamespace(namespace, 1);
        }
        NewResolver(key, namespace, resolver);
        records[namespace][key].resolver = resolver;
    }
}

安全注意事项

所提出的多命名空间注册表由于其管理各种命名空间和访问控制的能力而引入了若干安全注意事项。将进行全面的测试、审计和同行评审,以识别和缓解潜在的攻击媒介和漏洞。鼓励具有安全意识的开发人员为审计过程做出贡献。

版权

版权和相关权利已通过 CC0 放弃。

Citation

Please cite this document as:

Mengshi Zhang (@MengshiZhang), Zihao Chen (@zihaoccc), "ERC-7406: 多命名空间链上注册表 [DRAFT]," Ethereum Improvement Proposals, no. 7406, July 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7406.