【比特币】ERC - 725 详细说明

为什么提到ERC725

今天我去翻uport官网,发现了官网的一张图

【比特币】ERC - 725 详细说明_第1张图片

那么什么是ERC725呢?

首先去EIP项目,发现已经发布的EIP中并没有725.

然后查询issue,发现了编号为725的issue.

ERC725

EIP: 
Title: ERC-725 Identity
Author: Fabian Vogelsteller 
Type: Standard
Category: ERC
Status: Discussion
Created: 2017-10-02
Requires: ERC 735

概述

以下描述了用于人类,群组,对象和机器的唯一标识的标准功能。
该身份可以持有签署行为(交易,文件,登录,访问等)和声明的密钥,这些证书来自第三方(发行人)和自我证明,以及直接在区块链上行事的代理功能。

动机

这个标准化的身份界面将允许Dapps,智能合约和第三方通过功能XXX中描述的2个步骤来检查人员,组织,对象或机器的有效性。 信托在这里被转移到债权发行人。

验证身份的最重要功能是:XXX

管理身份的最重要职能是:XXX

描述

密钥:密钥是来自外部帐户或合同地址的公共密钥。

索赔发行人:是另一个智能合同或外部帐户,它发布有关此身份的索赔。 索赔发行人本身可以是身份合同。

声明:有关声明的详细信息,请参阅#735

规格

身份

密钥管理

密钥是加密公钥,或与此标识关联的合约地址。
结构应该如下:

Key 此身份拥有的公钥

  • purpose 密钥类型的uint256,如1 = MANAGEMENT,2 = ACTION,3 = CLAIM,4 = ENCRYPTION类型
  • keyType 使用的密钥类型,对于不同的密钥类型,这将是uint256。 例如 1 = ECDSA,2 = RSA等。
  • key bytes32公钥。 //对于非十六进制和长键,它是密钥的Keccak256散列
struct Key {
    uint256 purpose;
    uint256 keyType;
    bytes32 key;
}

getKey

如果持有该身份,返回关键数据。

function getKey(bytes32 _key, utin256 _purpose) constant returns(uint256 purpose, uint256 keyType, bytes32 key);

getKeyPurpose

返回密钥类型,如果通过身份持有。 如果密钥未被保持,则返回0。

function getKeyPurpose(bytes32 _key) constant returns(uint256[] purpose);

getKeysByPurpose

返回由此标识保存的公钥字节32的数组。

function getKeysByPurpose(uint256 _purpose) constant returns(bytes32[] keys);

addKey

将_key添加到标识。 _purpose指定了密钥的用途。 最初我们提出四个目的:

1:管理密钥,可以管理身份
2:在这个身份名称中执行动作的ACTION密钥(签名,登录,交易等)
3:CLAIM签名者密钥,用于签署其他需要可更新的身份的声明。
4:加密密钥,用于加密数据例如 坚持要求。

只能由目的1的关键字或身份本身来完成。 如果其身份本身,审批过程将决定其批准。

触发事件:KeyAdded

function addKey(bytes32 _key, uint256 _purpose, uint256 _keyType) returns (bool success)

removeKey

从身份中删除_key。

只能由目的1的关键字或身份本身来完成。 如果其身份本身,审批过程将决定其批准。

触发事件:KeyRemoved

function removeKey(bytes32 _key, uint256 _purpose) returns (bool success)

身份使用

execute

对其他合同或其本身或者以太网的转移执行操作。
应该要求批准通过一个或多个用途1或2的密钥来批准此执行。

执行可以用作addKey,removeKey和replaceKey以及removeClaim的唯一访问器。

返回executionId:应该发送给批准函数,批准或拒绝这个执行。

触发器事件:ExecutionRequested
直接执行触发器事件:Executed

function execute(address _to, uint256 _value, bytes _data) returns (uint256 executionId)

approve

批准执行或声明增加。
如果执行的_to是身份合同本身,那么这应该要求m个批准关键目标1,以成功批准执行。
如果执行的_to是另一个合同,并且成功批准执行,则COULD需要n个密钥批准目的2。

触发事件:Approved
成功执行时触发事件:Executed
触发成功的声明添加事件:ClaimAdded

function approve(uint256 _id, bool _approve) returns (bool success)

身份验证

要求:ERC 735

需要对ERC 735进行以下更改:

addClaim

这应该创建一个待处理的请求,该请求应该被n个m批准来自目标1的密钥的批准或拒绝。

只有事件:
如果触发的要求是新的事件和审批过程中存在:ClaimRequested
触发如果索赔指数存在事件:ClaimChanged

removeClaim

必须由权利要求的发行者,或目的1的密钥,或身份本身来完成。 如果其身份本身,审批过程将决定其批准。

Events

KeyAdded

务必在成功调用addKey时触发。

event KeyAdded(bytes32 indexed key, uint256 indexed purpose, uint256 indexed keyType)

KeyRemoved

必须在成功调用removeKey时触发。

event KeyRemoved(bytes32 indexed key, uint256 indexed purpose, uint256 indexed keyType)

ExecutionRequested

务必在成功调用execute后触发。

event ExecutionRequested(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data)

Executed

务必在批准被调用并且执行成功approve后触发。

event Executed(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data)

Approved

务必在成功调用approve后触发。

event Approved(uint256 indexed executionId, bool approved)

需要对ERC 735进行以下更改:

ClaimRequested

必须在成功调用addClaim时触发。

ClaimAdded

当批准被称为并成功添加了要求必须被触发。

Solidity Interface

pragma solidity ^0.4.18;

contract ERC725 {

    uint256 constant MANAGEMENT_KEY = 1;
    uint256 constant ACTION_KEY = 2;
    uint256 constant CLAIM_SIGNER_KEY = 3;
    uint256 constant ENCRYPTION_KEY = 4;

    event KeyAdded(bytes32 indexed key, uint256 indexed purpose, uint256 indexed keyType);
    event KeyRemoved(bytes32 indexed key, uint256 indexed purpose, uint256 indexed keyType);
    event ExecutionRequested(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data);
    event Executed(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data);
    event Approved(uint256 indexed executionId, bool approved);

    struct Key {
        uint256 purpose; //e.g., MANAGEMENT_KEY = 1, ACTION_KEY = 2, etc.
        uint256 keyType; // e.g. 1 = ECDSA, 2 = RSA, etc.
        bytes32 key;
    }

    function getKey(bytes32 _key, uint256 _purpose) public constant returns(uint256 purpose, uint256 keyType, bytes32 key);
    function getKeyPurpose(bytes32 _key) public constant returns(uint256[] purpose);
    function getKeysByPurpose(uint256 _purpose) public constant returns(bytes32[] keys);
    function addKey(bytes32 _key, uint256 _purpose, uint256 _keyType) public returns (bool success);
    function execute(address _to, uint256 _value, bytes _data) public returns (uint256 executionId);
    function approve(uint256 _id, bool _approve) public returns (bool success);
}

限制

权利要求只能每发行者类型的一种类型。

其他参考

  • Slides of the ERC Identity presentation
  • In-contract claim VS claim registry
  • Identity related reports
  • W3C Verifiable Claims Use Cases
  • Decentralised Identity Foundation
  • Sovrin Foundation Self Sovereign Identity

一句话总结

智能合约内部的权限管理标准。

参考资料

  • https://medium.com/uport/different-approaches-to-ethereum-identity-standards-a09488347c87
  • https://github.com/ethereum/EIPs/issues/725
  • https://github.com/ethereum/EIPs

你可能感兴趣的:(区块链技术,智能合约Solidity)