Open bluesteens opened 1 year ago
Affected Parties (help determine Sunrise/Sunset):
Affected OCI Artifact
Change Category (Guides Steering Review)
Steering/Industry Review
[ ] Business-Level (May affect business operations)
[x] OCI Governance, Policy or website feature
Steering/Industry Notification
[ ] Technical-Level (Does not affect business operations)
[ ] OCI Internal Process or Infrastructure
Communication
Spherity is proposing to enhance the currently implemented MVP. To summarise possible improvements and requirements:
Spherity has been given a grant by the Ethereum Foundation to create a general specification and library for the Ethereum community for this specific problem. A first draft can be found here. We propose to use this as the basis for an upgraded trusted issuer solution.
The new specification mentioned above describes a trusted hint registry.
A hint is a metadata snippet that describes key attributes related to verifiable data or identities. These hints provide insights, aiding in the interpretation, reliability, and verifiability of decentralized ecosystem data. Hints can be used for multiple purposes, like revocation data, timestamping offline data, or trusted issuer information.
In this registry, an Ethereum address (namespace) owns a space of bytes32 hint lists. In those hint lists, any given bytes32 hint key can point to a bytes32 hint value. The structure is visualised below.
hint registry
├─ namespace
│ ├─ hint list 0
│ │ ├─ hint key 0
│ │ │ ├─ hint value
│ │ ├─ hint key x
│ │ │ ├─ hint value
│ ├─ hint list 1
│ │ ├─ hint key 0
│ │ │ ├─ hint value
... ... ... ...
The specification also describes a set of management features:
To apply this to the OCI needs, we propose to do the following:
Instead of implementing a custom audited voting process, we can resort to user-friendly multi-sig wallets. These wallets allow multiple existing wallets to be part of an organisational wallet. In there, every action, e.g., adding a trusted issuer, needs to reach a certain quorum by the participating wallets (statekeepers) before the multi-sig wallet carries out an action for them. So multiple signatures are needed before an action can be taken, which is comparable to typical internal processes in enterprises. We propose to use the usage of Gnosis Safe as they provide a user-friendly multi-sig wallet reachable via the web with all the invitation and voting features needed for OCI. OCI statekeepers will still need hardware wallets to use Safe.
As described earlier, the data structure is hierarchically organised into namespaces, hint lists, hint keys, and their hint values.
0x1825a61b3b384c564efb355d7aee9ef08d663bb59b5d308146fcaeaa4a1de1ff
.The structure can be visualised like so:
hint registry
├─ 0x..... (OCI address)
│ ├─ 0x1825a61b3b384c564efb355d7aee9ef08d663bb59b5d308146fcaeaa4a1de1ff (https://open-credentialing-initiative.github.io/schemas/credentials/IdentityCredential-v1.0.0.jsonld)
│ │ ├─ 68bc8ca5d3b25b356cac4918838a92e284e06653081c2b8fd296250aab79a26f (did:example:example)
│ │ │ ├─ 0x0000000000000000000000000000000000000000000000000000000000000001 (true)
... ... ... ...
We propose to offer two methods that a digital wallet can call:
low-level: getHint(address _namespace, bytes32 _list, bytes32 _key) external view returns (bytes32);
With this one, the digital wallet needs to do the hashing operations outlined above itself to get the trust status of an issuer DID in a specific credential schema URL.
high-level: isTrustedIssuer(address _namespace, string _contextUrl, string _issuerDid) external view returns (bool);
With this one, the digital wallet only needs to provide the OCI multi-sig address, credential schema URL string, and issuer DID string.
With the high-level method, wallets need to change their contract calls from this
const did = "did:example:example";
const isTrustedIssuer = await contract.isTrustedIssuer(did);
to this
const ociAddress = "0x.....";
const schemaUrl = "https://open-credentialing-initiative.github.io/schemas/credentials/IdentityCredential-v1.0.0.jsonld";
const did = "did:example:example";
const isTrustedIssuer = await contract.isTrustedIssuer(ociAddress, schemaUrl, did);
The new contract emit events on the blockchain for various actions happening in the registry. One of them is the HintValueChanged
event that is being emitted whenever a hint value in the registry changes somewhere.
With an open web socket connection, the digital wallet can subscribe to HintValueChanged
events happening in the OCI address namespace and create a local cache of the values inside of it. It can persist the credential type context URL hash (hint list), the DID hash (hint key), and the bytes32 representation of the bool defining if that DID is now trusted or not from now on.
With every incoming verification or generation call, the digital wallet can then generate Keccak256 hashes of the credential type context URL and issuer DID and check against cached values. This way, wallets can spare on further external calls to an Ethereum wallet with every verification or generation, reducing further latency from calls to the wallet APIs.
P&A call 12/7/23 - Next steps:
Approved by Steering 2024-01-29
Steering summary
Spherity has built an Ethereum-based smart contract-based trusted credential issuer registry. In principle, this registry is functional and ready for use by the intended ecosystem and managed by trusted entities. However, with knowledge gained since its release, we have realized that the existing MVP requires changes based on needs of the ecosystem. This is part of OCI's continuous improvement.
Updated assessment following architectural and development work
Envisaged improvements
Upgradability
Granularity
Delegation
UX
Scope of work
Projected impact on ecosystem player & OCI Statekeepers:
Wallet
to something like this
VRS
Issuer
Trading Partner
Statekeeper