6.9 KiB
eip | title | author | discussions-to | status | type | category | created |
---|---|---|---|---|---|---|---|
725 | Proxy Account | Fabian Vogelsteller (@frozeman), Tyler Yasaka (@tyleryasaka) | https://github.com/ethereum/EIPs/issues/725 | Draft | Standards Track | ERC | 2017-10-02 |
Simple Summary
A standard interface for a simple proxy account.
Abstract
The following describes standard functions for a unique identifiable proxy account to be used by humans, groups, organisations, objects and machines. The proxy has 2 abilities: (1) it can execute arbitrary contract calls, and (2) it can hold arbitrary data through a generic key/value store. One of these keys should hold the owner of the contract. The owner may be an address or a key manager contract for more complex management logic. Most importantly, this contract should be the reference point for a long-lasting identifiable profiles.
Motivation
Standardizing a minimal interface for an proxy account allows third parties to interact with various proxy accounts contracts in a consistent manner. the benefit is a persistent account that is independent from single keys and can attach an arbitrary amount of information to verifiy, or enhance the accounts purpose.
Specification
Methods
owner
Returns the current owner
address public owner;
changeOwner
Changes the current owner. MUST only be called by the current owner of the contract.
function changeOwner(address _owner);
Triggers Event: OwnerChanged
getData
Returns the data at the specified key.
function getData(bytes32 _key) external view returns (bytes _value);
setData
Sets the data at a specific key. MUST only be called by the current owner of the contract.
Triggers Event: DataChanged
function setData(bytes32 _key, bytes _value) external;
execute
Executes an action on other contracts or a transfer of the blockchains native cryptocurrency. MUST only be called by the current owner of the contract.
function execute(uint256 _operationType, address _to, uint256 _value, bytes _data) external;
The operationType
should represent the assembly operation as follows:
0
forcall
1
forcreate
Others may be added in the future. Inspired by ERC1077 and Gnosis
Events
DataChanged
MUST be triggered when setData
was successfully called.
event DataChanged(bytes32 indexed key, bytes value);
ContractCreated
MUST be triggered when execute
creates a new contract using the _operationType
1
.
event ContractCreated(address indexed contractAddress);
OwnerChanged
MUST be triggered when changeOwner
was successfully called.
event OwnerChanged(address indexed ownerAddress);
Ownership
This contract is controlled by the owner. The owner can be a smart contract or an address, or itself.
Data keys
Data keys, should be the keccak256 hash of a type name.
e.g. myNewKeyType
is 0xa94996022594f93c34a730df0ae89d1ecd69dff98c17d0387e69ce58346323a4
Multiple keys of the same type
Multiple keys for the same key type must add a keyTypeName-1
at the end of the key type.
This would looks as follows for myNewKeyType
:
version 0 myNewKeyType
: 0xa94996022594f93c34a730df0ae89d1ecd69dff98c17d0387e69ce58346323a4
version 1 myNewKeyType-1
: 0xb6dace1ed14874742c4d1b8cd9b270305176f769e0ae22118a02c2db4e620f29
version 2 myNewKeyType-2
: 0x6cc96a01de588f4550e8c3a821aed065ae7897f8dfb61836c78c0389e499d9ed
...
Anyone that would like to standardize a new data key should make a pull request to update the table below.
Name | Description | Key | value |
---|---|---|---|
owner | The owner of the proxy account | 0x0000000000000000000000000000000000000000000000000000000000000000 | left padded owner address, e.g. 0x000000000000000000000000de0B295669a9FD93d5F28D9Ec85E40f4cb697BAe |
735 | The proxy accounts claim holder contract (per ERC735) | 0xb0f23aea7d77ce19f9393243a7b50a3bcaac893c7d68a5a309dea7cacf035fd0 | left padded address of the claim holder contract, e.g. 0x000000000000000000000000de0B295669a9FD93d5F28D9Ec85E40f4cb697BAe |
780 | The proxy accounts claim holder contract (per ERC735) | 0xdaf52dba5981246bcf8fd7c6b00dce587fdcf5e2a95b281eea95dcd1376afdcd | left padded address of the claim registry contract, e.g. 0x000000000000000000000000de0B295669a9FD93d5F28D9Ec85E40f4cb697BAe |
Rationale
The purpose of an identity proxy is to allow an entity to exist as a first-class citizen in Ethereum, with the ability to execute arbitrary contract calls. At that same time the proxy account should be managed by an arbitrary simple or complex logic.
It also opens up the possibility of meta transactions, where a third party can send a transaction to the owner contract, that then verifies the execution permission based on a signed message.
It further allows any information to be attached to that proxy accounts which can be in the forms of claims via ERC735 or ERC780, or any arbitrary new systems and protocols.
This specification was chosen to allow the most flexibility and experimentation around verifiable manageable accounts.
Implementation
Solidity Interface
pragma solidity ^0.5.4;
interface ERC725 {
event DataChanged(bytes32 indexed key, bytes32 indexed value);
event OwnerChanged(address indexed ownerAddress);
event ContractCreated(address indexed contractAddress);
// address public owner;
function changeOwner(address _owner) external;
function getData(bytes32 _key) external view returns (bytes32 _value);
function setData(bytes32 _key, bytes32 _value) external;
function execute(uint256 _operationType, address _to, uint256 _value, bytes calldata _data) external;
}
Additional References
- 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
Copyright
Copyright and related rights waived via CC0.