118 lines
5.8 KiB
Markdown
118 lines
5.8 KiB
Markdown
|
---
|
|||
|
eip: 6538
|
|||
|
title: Stealth Meta-Address Registry
|
|||
|
description: A registry to map addresses to stealth meta-addresses
|
|||
|
author: Matt Solomon (@mds1), Toni Wahrstätter (@nerolation), Ben DiFrancesco (@apbendi), Vitalik Buterin (@vbuterin)
|
|||
|
discussions-to: https://ethereum-magicians.org/t/stealth-meta-address-registry/12888
|
|||
|
status: Draft
|
|||
|
type: Standards Track
|
|||
|
category: ERC
|
|||
|
created: 2023-01-24
|
|||
|
---
|
|||
|
|
|||
|
## Abstract
|
|||
|
|
|||
|
This specification defines a standardized way of storing and retrieving an entity's stealth meta-address, by extending [ERC-5564](./eip-5564.md).
|
|||
|
|
|||
|
## Motivation
|
|||
|
|
|||
|
The standardization of stealth address generation holds the potential to greatly enhance the privacy capabilities of Ethereum by enabling the recipient of a transfer to remain anonymous when receiving an asset. By introducing a central smart contract for users to store their stealth meta-addresses, EOAs and contracts can programmatically engage in stealth interactions using a variety of stealth address scehemes.
|
|||
|
|
|||
|
## Specification
|
|||
|
|
|||
|
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.
|
|||
|
|
|||
|
This contract defines an `ERC5564Registry` that stores the stealth meta-address for entities. These entities may be identified by an address, ENS name, or other identifier. This MUST be a singleton contract, with one instance per chain.
|
|||
|
|
|||
|
The contract is specified below. A one byte integer is used to identify the stealth address scheme. This integer is used to differentiate between different stealth address schemes. A mapping from the scheme ID to it's specification is maintained at [this](../assets/eip-5564/scheme_ids.md) location.
|
|||
|
|
|||
|
```solidity
|
|||
|
pragma solidity ^0.8.17;
|
|||
|
|
|||
|
/// @notice Registry to map an address or other identifier to its stealth meta-address.
|
|||
|
contract ERC5564Registry {
|
|||
|
/// @dev Emitted when a registrant updates their stealth meta-address.
|
|||
|
event StealthMetaAddressSet(
|
|||
|
bytes indexed registrant, uint256 indexed scheme, bytes stealthMetaAddress
|
|||
|
);
|
|||
|
|
|||
|
/// @notice Maps a registrant's identifier to the scheme to the stealth meta-address.
|
|||
|
/// @dev Registrant may be a 160 bit address or other recipient identifier, such as an ENS name.
|
|||
|
/// @dev Scheme is an integer identifier for the stealth address scheme.
|
|||
|
/// @dev MUST return zero if a registrant has not registered keys for the given inputs.
|
|||
|
mapping(bytes => mapping(uint256 => bytes)) public stealthMetaAddressOf;
|
|||
|
|
|||
|
/// @notice Sets the caller's stealth meta-address for the given stealth address scheme.
|
|||
|
/// @param scheme An integer identifier for the stealth address scheme.
|
|||
|
/// @param stealthMetaAddress The stealth meta-address to register.
|
|||
|
function registerKeys(uint256 scheme, bytes memory stealthMetaAddress) external {
|
|||
|
stealthMetaAddressOf[abi.encode(msg.sender)][scheme] = stealthMetaAddress;
|
|||
|
}
|
|||
|
|
|||
|
/// @notice Sets the `registrant`s stealth meta-address for the given scheme.
|
|||
|
/// @param registrant Recipient identifier, such as an ENS name.
|
|||
|
/// @param scheme An integer identifier for the stealth address scheme.
|
|||
|
/// @param signature A signature from the `registrant` authorizing the registration.
|
|||
|
/// @param stealthMetaAddress The stealth meta-address to register.
|
|||
|
/// @dev MUST support both EOA signatures and EIP-1271 signatures.
|
|||
|
/// @dev MUST revert if the signature is invalid.
|
|||
|
function registerKeysOnBehalf(
|
|||
|
address registrant,
|
|||
|
uint256 scheme,
|
|||
|
bytes memory signature,
|
|||
|
bytes memory stealthMetaAddress
|
|||
|
) external {
|
|||
|
// TODO If registrant has no code, spit signature into r, s, and v and call `ecrecover`.
|
|||
|
// TODO If registrant has code, call `isValidSignature` on the registrant.
|
|||
|
}
|
|||
|
|
|||
|
/// @notice Sets the `registrant`s stealth meta-address for the given scheme.
|
|||
|
/// @param registrant Recipient identifier, such as an ENS name.
|
|||
|
/// @param scheme An integer identifier for the stealth address scheme.
|
|||
|
/// @param signature A signature from the `registrant` authorizing the registration.
|
|||
|
/// @param stealthMetaAddress The stealth meta-address to register.
|
|||
|
/// @dev MUST support both EOA signatures and EIP-1271 signatures.
|
|||
|
/// @dev MUST revert if the signature is invalid.
|
|||
|
function registerKeysOnBehalf(
|
|||
|
bytes memory registrant,
|
|||
|
uint256 scheme,
|
|||
|
bytes memory signature,
|
|||
|
bytes memory stealthMetaAddress
|
|||
|
) external {
|
|||
|
// TODO How to best generically support any registrant identifier / name
|
|||
|
// system without e.g. hardcoding support just for ENS?
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Deployment is done using the keyless deployment method commonly known as Nick’s method, TODO continue describing this and include transaction data, can base it off the format/description used in [ERC-1820](./eip-1820.md) and [ERC-2470](./eip-2470.md).
|
|||
|
|
|||
|
## Rationale
|
|||
|
|
|||
|
Having a central smart contract for registering stealth meta-addresses has several benefits:
|
|||
|
|
|||
|
1. It guarantees interoperability with other smart contracts, as they can easily retrieve and utilize the registered stealth meta-addresses. This enables applications such as ENS or Gnosis Safe to use that information and integrate stealth addresses into their services.
|
|||
|
|
|||
|
2. It ensures that users are not dependent on off-chain sources to retrieve a user's stealth meta-address.
|
|||
|
|
|||
|
3. Registration of a stealth meta-address in this contract provides a standard way for users to communicate that they're ready to participate in stealth interactions.
|
|||
|
|
|||
|
4. By deploying the registry as a singleton contract, multiple projects can access the same set of stealth meta-addresses, contributing to improved standardization.
|
|||
|
|
|||
|
## Backwards Compatibility
|
|||
|
|
|||
|
This EIP is fully backward compatible.
|
|||
|
|
|||
|
## Reference Implementation
|
|||
|
|
|||
|
You can find an implementation of this standard above.
|
|||
|
|
|||
|
## Security Considerations
|
|||
|
|
|||
|
TODO
|
|||
|
|
|||
|
## Copyright
|
|||
|
|
|||
|
Copyright and related rights waived via [CC0](../LICENSE.md).
|
|||
|
|