KIP 113: BLS public key registry
Author | Ian, Ollie, Joseph, and Aidan |
---|---|
Discussions-To | https://github.com/klaytn/kips/issues/113 |
Status | Draft |
Type | Standards Track |
Category | Core |
Created | 2023-05-22 |
Simple Summary
A design of simple BLS12-381 registry.
Abstract
This standard defines an interface for BLS12-381 registry, which enables nodes or smart contracts to access and view all the public keys of the associated addresses.
Motivation
A standard interface allows developers to associate an address with a BLS public key, and provides a standardized way of interacting with the registry. The objective is to design a simple registry that includes essential functions, and minimal access control, thereby reducing any potential security risks.
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.
Registry contract must implement the IKIP113 interface:
pragma solidity ^0.8.19;
/// @title KIP-113 BLS public key registry
/// @dev See https://github.com/klaytn/kips/issues/113
interface IKIP113 {
struct BlsPublicKeyInfo {
/// @dev compressed BLS12-381 public key (48 bytes)
bytes publicKey;
/// @dev proof-of-possession (96 bytes)
/// must be a result of PopProve algorithm as per
/// draft-irtf-cfrg-bls-signature-05 section 3.3.3.
/// with ciphersuite "BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"
bytes pop;
}
event PubkeyRegistered(address addr, bytes publicKey, bytes pop);
event PubkeyUnregistered(address addr, bytes publicKey, bytes pop);
/// @dev Registers the given public key associated with the `msg.sender` address.
/// The function validates the following requirements:
/// - The function MUST revert if `publicKey.length != 48` or `pop.length != 96`.
/// - The function MUST revert if `publicKey` or `pop` is equal to zero.
/// - The function SHOULD authenticate and authorize `msg.sender`.
/// The function emits a `PubkeyRegistered` event.
/// _Note_ The function is not able to verify the validity of the public key and the proof-of-possession due to the lack of [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537). See [validation](https://kips.klaytn.foundation/KIPs/kip-113#validation) for off-chain validation.
function registerPublicKey(bytes calldata publicKey, bytes calldata pop) external;
/// @dev Unregisters the public key associated with the given `addr` address.
/// The function validates the following requirements:
/// - The function MUST revert if `addr` has not been registered.
/// - The function SHOULD authenticate and authorize `msg.sender`.
/// The function emits a `PubkeyUnregistered` event.
function unregisterPublicKey(address addr) external;
/// @dev Returns the public key and proof-of-possession given a `addr`.
/// The function MUST revert if given `addr` is not registered.
/// _Note_ The function is not able to verify the validity of the public key and the proof-of-possession due to the lack of [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537). See [validation](https://kips.klaytn.foundation/KIPs/kip-113#validation) for off-chain validation.
function getInfo(address addr) external view returns (BlsPublicKeyInfo memory pubkey);
/// @dev Returns all the stored addresses, public keys, and proof-of-possessions at once.
/// _Note_ The function is not able to verify the validity of the public key and the proof-of-possession due to the lack of [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537). See [validation](https://kips.klaytn.foundation/KIPs/kip-113#validation) for off-chain validation.
function getAllInfo() external view returns (address[] memory addrList, BlsPublicKeyInfo[] memory pubkeyList);
}
Definitions
The terms public key and proof-of-possession (hereinafter referred to as pop) are from the ciphersuite BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_. Things to note:
- Public key: 48 bytes.
- Proof-of-possession (pop): 96 bytes.
Smart Contracts Overview
The proposed smart contract will be implemented in Solidity and will be compatible with the Ethereum Virtual Machine (EVM).
The smart contract will have the following features:
- Register a public key and a proof-of-possession
- Unregister a public key
- View the registered public keys
Methods
registerPublicKey
Registers the given public key associated with the msg.sender
address. This function can be called whether msg.sender
has already registered a public key or not.
The function validates the following requirements:
- The function MUST revert if
publicKey.length != 48
orpop.length != 96
. - The function MUST revert if
publicKey
orpop
is equal to zero. - The function SHOULD authenticate and authorize
msg.sender
.
The function emits a PubkeyRegistered
event.
Note The function is not able to verify the validity of the public key and the proof-of-possession due to the lack of EIP-2537. See validation for off-chain validation.
function registerPublicKey(bytes memory publicKey, bytes memory pop)
unregisterPublicKey
Unregisters the public key associated with the given addr
address.
The function validates the following requirements:
- The function MUST revert if
addr
has not been registered. - The function SHOULD authenticate and authorize
msg.sender
.
The function emits a PubkeyUnregistered
event.
function unregisterPublicKey(address addr)
getInfo
Returns the public key and proof-of-possession given a addr
.
The function MUST revert if given addr
is not registered.
Note The function is not able to verify the validity of the public key and the proof-of-possession due to the lack of EIP-2537. See validation for off-chain validation.
function getInfo(address addr) external view returns (BlsPublicKeyInfo pubkey)
getAllInfo
Returns all the stored addresses, public keys, and proof-of-possessions at once.
Note The function is not able to verify the validity of the public key and the proof-of-possession due to the lack of EIP-2537. See validation for off-chain validation.
function getAllInfo() external view returns (address[] addrList, BlsPublicKeyInfo[])
Validation
After reading from Registry, users must perform the following validations:
Backwards Compatibility
This does not affect the backward compatibility as this is a newly deployed contract.
Copyright
Copyright and related rights waived via CC0.