-
Couldn't load subscription status.
- Fork 5.9k
Description
EIP: 735
Title: Claim Holder
Author: Fabian Vogelsteller (@frozeman)
Type: Standard
Category: ERC
Status: Discussion
Created: 2017-10-09
NOTE: Due to the changes in ERC725, this spec is not fully compatible with the current ERC725v2. If you're interested in adopting this spec to work with 725v2, please comment below, or send a gist with changes.
Abstract
The following describes standard functions for adding, removing and holding of claims.
These claims can attested from third parties (issuers) or self attested.
Motivation
This standardised claim holder interface will allow Dapps and smart contracts to check the claims about a claim holder. Trust is here transfered to the issuers of claims.
Definitions
claim issuer: is another smart contract or external account, which issues claims about this identity. The claim issuer can be an identity contract itself.claim: A claim is an information an issuer has about the identity holder. This contains the following:topic: Auint256number which represents the topic of the claim. (e.g. 1 biometric, 2 residence (ToBeDefined: number schemes, sub topics based on number ranges??))scheme: The scheme with which this claim SHOULD be verified or how it should be processed. Its auint256for different schemes. E.g. could3mean contract verification, where thedatawill be call data, and theissuera contract address to call (ToBeDefined). Those can also mean different key types e.g. 1 = ECDSA, 2 = RSA, etc. (ToBeDefined)issuer: The issuers identity contract address, or the address used to sign the above signature. If an identity contract, it should hold the key with which the above message was signed, if the key is not present anymore, the claim SHOULD be treated as invalid. The issuer can also be a contract address itself, at which the claim can be verified using the calldata.signature: Signature which is the proof that the claim issuer issued a claim oftopicfor this identity. it MUST be a signed message of the following structure:keccak256(address identityHolder_address, uint256 _ topic, bytes data)// orkeccak256(abi.encode(identityHolder_address, topic, data))?data: The hash of the claim data, sitting in another location, a bit-mask, call data, or actual data based on the claim scheme.uri: The location of the claim, this can be HTTP links, swarm hashes, IPFS hashes, and such.
Specification
Claim Holder
claim structure
The claims issued to the identity. Returns the claim properties.
struct Claim {
uint256 topic;
uint256 scheme;
address issuer; // msg.sender
bytes signature; // this.address + topic + data
bytes data;
string uri;
}getClaim
Returns a claim by ID.
function getClaim(bytes32 _claimId) constant returns(uint256 topic, uint256 scheme, address issuer, bytes signature, bytes data, string uri);getClaimIdsByTopic
Returns an array of claim IDs by topic.
function getClaimIdsByTopic(uint256 _topic) constant returns(bytes32[] claimIds);addClaim
Requests the ADDITION or the CHANGE of a claim from an issuer.
Claims can requested to be added by anybody, including the claim holder itself (self issued).
_signature is a signed message of the following structure: keccak256(address identityHolder_address, uint256 topic, bytes data).
Claim IDs are generated using keccak256(address issuer_address + uint256 topic).
This COULD implement an approval process for pending claims, or add them right away.
Possible claim topics:
1: Biometric data2: Permanent address
(TODO: add more in the initial standard? 3: Claim registry?)
Returns claimRequestId: COULD be send to the approve function, to approve or reject this claim.
Triggers if the claim is new Event and approval process exists: ClaimRequested
Triggers if the claim is new Event and is added: ClaimAdded
Triggers if the claim index existed Event: ClaimChanged
function addClaim(uint256 _topic, uint256 _scheme, address _issuer, bytes _signature, bytes _data, string _uri) returns (uint256 claimRequestId)removeClaim
Removes a claim.
Can only be removed by the claim issuer, or the claim holder itself.
Triggers Event: ClaimRemoved
function removeClaim(bytes32 _claimId) returns (bool success)Events
ClaimRequested
COULD be triggered when addClaim was successfully called.
event ClaimRequested(uint256 indexed claimRequestId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri)ClaimAdded
MUST be triggered when a claim was successfully added.
event ClaimAdded(bytes32 indexed claimId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri))ClaimRemoved
MUST be triggered when removeClaim was successfully called.
event ClaimRemoved(bytes32 indexed claimId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri))ClaimChanged
MUST be triggered when changeClaim was successfully called.
event ClaimChanged(bytes32 indexed claimId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri)Solidity Interface
pragma solidity ^0.4.18;
contract ERC735 {
event ClaimRequested(uint256 indexed claimRequestId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri);
event ClaimAdded(bytes32 indexed claimId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri);
event ClaimRemoved(bytes32 indexed claimId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri);
event ClaimChanged(bytes32 indexed claimId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri);
struct Claim {
uint256 topic;
uint256 scheme;
address issuer; // msg.sender
bytes signature; // this.address + topic + data
bytes data;
string uri;
}
function getClaim(bytes32 _claimId) public constant returns(uint256 topic, uint256 scheme, address issuer, bytes signature, bytes data, string uri);
function getClaimIdsByTopic(uint256 _ topic) public constant returns(bytes32[] claimIds);
function addClaim(uint256 _topic, uint256 _scheme, address _issuer, bytes _signature, bytes _data, string _uri) public returns (uint256 claimRequestId);
changeClaim(bytes32 _claimId, uint256 _topic, uint256 _scheme, address _issuer, bytes _signature, bytes _data, string _uri) returns (bool success);
function removeClaim(bytes32 _claimId) public returns (bool success);
}Constraints
- A claim can only be one per topic per issuer.