|
| 1 | +<!-- |
| 2 | + Copyright IBM Corp. All Rights Reserved. |
| 3 | +
|
| 4 | + SPDX-License-Identifier: CC-BY-4.0 |
| 5 | + --> |
| 6 | +# Identity Plane Data Formats |
| 7 | + |
| 8 | +* Authors: Bishakh Chandra Ghosh, Venkatraman Ramakrishna, Krishnasuri Narayanam, Ermyas Abebe |
| 9 | +* Status: Proposed |
| 10 | +* Since: 24-September-2021 |
| 11 | + |
| 12 | + |
| 13 | +## Participant Unit Identity |
| 14 | + |
| 15 | +Each network participant (Fabric organizations / Corda node owners) has its identity on the identity plane as *Participant Unit Identity*, in the form of a **DID**. We also refer to it as *Participant Unit DID*. |
| 16 | +The participant DID Document must specify one verification method with [authentication](https://w3c.github.io/did-core/#authentication) verification relationship. The *Participant Unit DID* must be registered in some IIN registry which is public and openly accessible for DID and VC validations. |
| 17 | + |
| 18 | +### Example: |
| 19 | + |
| 20 | +```json |
| 21 | +{ |
| 22 | + "id": "did:exampleiin:org1", |
| 23 | + "verificationMethod": [{ |
| 24 | + "id": "did:exampleiin:org1#key1", |
| 25 | + "type": "Ed25519VerificationKey2020", |
| 26 | + "controller": "did:exampleiin:org1", |
| 27 | + "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" |
| 28 | + }], |
| 29 | + |
| 30 | + "authentication": ["did:exampleiin:org1#key1"] |
| 31 | +} |
| 32 | +``` |
| 33 | + |
| 34 | + |
| 35 | +## Network Identity |
| 36 | + |
| 37 | +The identity of a network as a single entity is represented by the *Network Identity* which is a DID called *Network DID*. |
| 38 | + |
| 39 | +A permissioned blockchain network is formed by mutual agreement among its participants. Participants, whether they be in a Fabric, Corda, or Ethereum network, typically control one or more peers and act as identity providers for those peers and associated clients. In Fabric, the notion of a participant is formalized in the role of an *organization*. The blockchain network as an entity is thus not controlled by any single member but together by its participant units. But inspite of having multiple controllers, the network as an entity must have its own unitary identity, through which it can be discovered. In this specification, each permissioned blockchain network which needs to exchange its identity for interoperation has a Network DID and a corresponding Network DID Document, that we describe in this section. |
| 40 | + |
| 41 | +A permissioned blockchain network has a Network DID that represents it. |
| 42 | +The Network DID document conforms to the [did-core](https://www.w3.org/TR/did-core) specifications. |
| 43 | + |
| 44 | +**id** - This property is mandatory which is the DID URI for the network. This id (DID) can be used to resolve the DID Document of the network from the IIN DID registry. |
| 45 | + |
| 46 | +**verificationMethod** - One verification method property must be present in the Network DID document, and it must be able to support [Group Control](https://www.w3.org/TR/did-core/#group-control), so that the network participant units can jointly control the Network DID Document. Additionally, the verification method must specify who can update the DID in case the network changes as participant units leave and new ones join. This group controlled `verificationMethod` also lets the network participants jointly validate the network's composition. We describe a multi-signature based `verificationMethod` type in the following sections. |
| 47 | + |
| 48 | +For interoperation in the data plane, network specific identity credentials such as certificates (X.509 certificates in Hyperledger Fabric networks) are required to be configured. For these data plane credentials, there can be optional `verificationMethods` in the Network DID document. For better privacy, without directly exposing the data plane credentials within the Network DID document, only their cryptographic hash may be included which will ensure no rogue network participant can produce tampered data plane credentials to deny/attack the interoperation. |
| 49 | + |
| 50 | + |
| 51 | +**authentication** - The authentication verification relationship must point to the group controlled verification method of the Network DID. |
| 52 | + |
| 53 | +**networkParticipants** - This is not a core property of the DID specification. This is a special property required for Network DIDs that specify the members in the network. It is a list of DIDs of the individual members. |
| 54 | + |
| 55 | +### Multi-signature based verificationMethod |
| 56 | + |
| 57 | +A network DID must be controlled jointly by the network's participant units for operations such as creation of the DID, and its updation with changing network structure, and for other operations such as rotating/refreshing keys, updating verification methods, etc. To enable this group control, we introduce a `verificationMethod` that uses multi-signatures and associated policies. |
| 58 | + |
| 59 | +The `verificationMethod` will have the following properties: |
| 60 | + |
| 61 | +**id** - This will be the Network DID followed by a fragment forming a DID URI that points to this verification method. Eg: `did:<iin_name>:<network_name>#unique_verificationMethod_name` |
| 62 | + |
| 63 | +**type** - `BlockchainNetworkMultiSig` |
| 64 | + |
| 65 | +**controller** - Controller of this DID must be the network itself, and thus its value should be same as the Network DID. |
| 66 | + |
| 67 | +**Verification Material for BlockchainNetworkMultiSig:** |
| 68 | + |
| 69 | +**multisigKeys** - Map of participant DID to its verificationMethod. This contains one entry for each participant unit in `networkParticipants` list. The key is the participant unit's DID, and the value is a DID URI to the verification method of the participant DID. |
| 70 | + |
| 71 | + |
| 72 | +Eg. If `network_participant_1` has a DID `did:<iin_name>:<network_participant_1>`, then `multisigKeys` will contain one verification method of the DID Document like `"did:<iin_name>:<network_participant_1>":"did:<iin_name>:<network_participant_1>#verificationMethod1"` |
| 73 | + |
| 74 | + |
| 75 | +For creation of Network DID, the IIN registry must authenticate the DID creation request based on the `BlockchainNetworkMultiSig` verification method. This implies that the request must be authenticated based on each of the verificationMethods specified in `multisigKeys`. |
| 76 | + |
| 77 | + |
| 78 | +> NOTE on extensibility: The `networkParticipants` lets any DID to be specified, with a verification method in `BlockchainNetworkMultiSig.multisigKeys`. Thus another Network DID can also be represented as a participant unit of a network. This can be very useful in certain use cases where different blockchain networks may be stakeholders of a bigger network. |
| 79 | +
|
| 80 | + |
| 81 | + |
| 82 | +**updatePolicy** - Defines a combination of participant units that must sign and authenticate a Network DID updation request. The `updatePolicy` is discussed in detail [here](./../models/identity-update-policy.md). |
| 83 | + |
| 84 | + |
| 85 | + |
| 86 | + |
| 87 | +### verificationMethod for dataplane credentials |
| 88 | + |
| 89 | +Blockchain interoperation in the data plane by means of verifiable data transfer rely on verification of some format of proofs that comes associated with the data from another network in response to a query ([cryptographic-proofs](https://github.com/hyperledger-labs/weaver-dlt-interoperability/blob/main/rfcs/models/cryptographic-proofs.md)). In proof by notarisation, and also most other proof formats, the foreign blockchain networks' members' cryptographic keys and certificates has to be known for validating the proofs. Therefore, to map these data plane cryptographic certificates to the identity plane, the Network DID may have a verifcation method that contains these directly, or provide pointers to them. |
| 90 | +Depending on the blockchain platform being used by a network in the data plane, the type of the credentials may vary. |
| 91 | + |
| 92 | +This verification policy will have the parameters: |
| 93 | + |
| 94 | +**id** - DID URI pointing to this verification method. |
| 95 | + |
| 96 | +**type** - `DataplaneCredentials` |
| 97 | + |
| 98 | +**controller** - Network DID. |
| 99 | + |
| 100 | +**[PLATFORM]Credentials** - Map of participant unit DID to Hash of dataplane platform specific credentials. |
| 101 | + |
| 102 | +PLATFORM is the name of the dataplane platform such as Fabric/Corda/Burrow etc.. |
| 103 | + |
| 104 | +In this version we support X.509 certificates for Hyperledger Fabric's root and intermediate certificates. |
| 105 | + |
| 106 | +In Fabric, each participant unit has a Membership Service Provider (MSP) that has a root certificate that can be used to validate proofs in the data plane. Publishing these root certificates in the Network DID directly may reveal the networks participants and thus a privacy concern. Instead, only including the cryptographic hash of the certificates in the Network DID ensures that no participant unit can provide its incorrect certificate towards denial of service attack , while still maintaining privacy. |
| 107 | + |
| 108 | +Therefore for Fabric, `[PLATFORM]Credentials` will be `FabricCredentials`: Map of participant unit DID to Hash of fabric root certificates of the participant. |
| 109 | + |
| 110 | + |
| 111 | +### relayEndpoints |
| 112 | + |
| 113 | +This is a special property required for Network DIDs that specify addresses of the [relays](../models/relays.md) in the data plane that can be used for interoperation. It is a list of relayEndpoint objects containing `hostname` and `port` of the relay. |
| 114 | + |
| 115 | + |
| 116 | + |
| 117 | +### Example of Network DID format: |
| 118 | + |
| 119 | +```json |
| 120 | +{ |
| 121 | + "id": "did:<iin_name>:<network_name>", |
| 122 | + "networkParticipants": [ |
| 123 | + "did:<iin_name>:<network_participant_1>", |
| 124 | + "did:<iin_name>:<network_participant_2>", |
| 125 | + "did:<iin_name>:<network_participant_3>" |
| 126 | + ], |
| 127 | + "verificationMethod": [{ |
| 128 | + "id": "did:<iin_name>:<network_name>#multisig", |
| 129 | + "type": "BlockchainNetworkMultiSig", |
| 130 | + "controller": "did:<iin_name>:<network_name>", |
| 131 | + "multisigKeys": [ |
| 132 | + "did:<iin_name>:<network_participant_1>#key1", |
| 133 | + "did:<iin_name>:<network_participant_2>#key3", |
| 134 | + "did:<iin_name>:<network_participant_3>#key1" |
| 135 | + ], |
| 136 | + "updatePolicy": { |
| 137 | + "id": "did:<iin_name>:<network_name>#updatepolicy", |
| 138 | + "controller": "did:<iin_name>:<network_name>", |
| 139 | + "type": "VerifiableCondition2021", |
| 140 | + "conditionAnd": [{ |
| 141 | + "id": "did:<iin_name>:<network_name>#updatepolicy-1", |
| 142 | + "controller": "did:<iin_name>:<network_name>", |
| 143 | + "type": "VerifiableCondition2021", |
| 144 | + "conditionOr": ["did:<iin_name>:<network_participant_3>#key1", |
| 145 | + "did:<iin_name>:<network_participant_2>#key3" |
| 146 | + ] |
| 147 | + }, |
| 148 | + "did:<iin_name>:<network_participant_1>#key1" |
| 149 | + ] |
| 150 | + } |
| 151 | + }, |
| 152 | + |
| 153 | + { |
| 154 | + "id": "did:<iin_name>:<network_name>#fabriccerts", |
| 155 | + "type": "DataplaneCredentials", |
| 156 | + "controller": "did:<iin_name>:<network_name>", |
| 157 | + "FabricCredentials": { |
| 158 | + "did:<iin_name>:<network_participant_1>": "Certificate3_Hash", |
| 159 | + "did:<iin_name>:<network_participant_2>": "Certificate2_Hash", |
| 160 | + "did:<iin_name>:<network_participant_3>": "Certificate3_Hash" |
| 161 | + } |
| 162 | + } |
| 163 | + ], |
| 164 | + "authentication": [ |
| 165 | + "did:<iin_name>:<network_name>#multisig" |
| 166 | + ], |
| 167 | + "relayEndpoints": [ |
| 168 | + { |
| 169 | + "hostname":"10.0.0.8", |
| 170 | + "port":"8888" |
| 171 | + }, |
| 172 | + { |
| 173 | + "hostname":"10.0.0.9", |
| 174 | + "port":"8888" |
| 175 | + } |
| 176 | + |
| 177 | + ] |
| 178 | +} |
| 179 | +``` |
0 commit comments