Run Redbelly Proof by Query Holder Instance¶
- Clone the
receptor-holderrepository from Github which implements routes for Proof by Query and Selective Disclosure. - Pre-requisites/Assumptions:
- Task
- ts-node
- Run
task dlcircuitto download and unzip the Iden3 Circuits.
Environment variables¶
You will need these values to run holder on the various Redbelly environments.
- Create
.envfile. - Copy values from
.env.exampleto.env
.env
RHS_URL= 'https://rhs.testnet.redbelly.network'CIRCUITS_PATH= {Add path to Iden3 Circuits}RPC_URL= 'https://rbn-aws-eu-north-1a-0-b.devnet.redbelly.network:8545'WALLET_KEY= {Add your Private Key}STATE_CONTRACT_ADDRESS=0x73Fdb30a0A01aEB6d2A6fc8cdAc6d88D891898F9BSC_ADDRESS= 0x403e0043a2D1016a4D8765965843441444e0fc13PORT= {Optional: Add port for Holder Server}
RHS_URL= 'https://rhs.redbelly.network'CIRCUITS_PATH= {Add path to Iden3 Circuits}RPC_URL= 'https://rbn-aws-eu-north-1a-0-b.devnet.redbelly.network:8545'WALLET_KEY= {Add your Private Key}STATE_CONTRACT_ADDRESS= Coming SoonBSC_ADDRESS= Coming SoonPORT= {Optional: Add port for Holder Server}
Install Dependencies¶
Run Demo¶
Note
Run in watch mode using npm run dev
Create DID¶
Creates a Decentralised Identity (DID) and saves it as a global instance of the DID for the holder server.
- Fetch the response generated and append below as holder's DID.
Sample Holder's DID
{
"message": "did successfully created",
"did": {
"method": "iden3",
"id": "polygon:mumbai:x5fEEnyoRGR6dTCWMwJ87gUBRTRWYPiLJkyEHYCv6",
"idStrings": [
"polygon",
"mumbai",
"x5fEEnyoRGR6dTCWMwJ87gUBRTRWYPiLJkyEHYCv6"
],
"params": [],
"path": "",
"pathSegments": [],
"query": "",
"fragment": ""
},
"did_String": "did:iden3:polygon:mumbai:x5fEEnyoRGR6dTCWMwJ87gUBRTRWYPiLJkyEHYCv6"
}
Create Issuer's DID¶
- Run Issuer Instance; and run the following curl command.
Sample Issuer's DID
{
"payload": {
"method": "iden3",
"id": "polygon:mumbai:x32x9zKVv8mxno2EE6DiP7YeKSxhQbeHL4p7GbDAM",
"idStrings": [
"polygon",
"mumbai",
"x32x9zKVv8mxno2EE6DiP7YeKSxhQbeHL4p7GbDAM"
],
"params": [],
"path": "",
"pathSegments": [],
"query": "",
"fragment": ""
}
}
Pass DID to Issuer¶
- Run Issuer Instance;
- Pass the generated holder's DID to the Issuer to obtain the Verifiable Credential.
- Run Issuer Instance; and run the following curl command.
curl --location 'http://localhost:3000/generate-pbq-credentials' \
--header 'Content-Type: application/json' \
--data '{"did":{holderDID}}'
- Fetch the Verifiable Credential generated by the Issuer's Response.
Sample Verifiable Credential
{
"message": "OK",
"credential": {
"id": "urn:951481e8-e5f5-48c3-b185-b3f9e6263ac2",
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld",
"https://redbellynetwork.github.io/did-schema/passport/credential/v1.jsonld"
],
"type": ["VerifiableCredential", "PassportCredential"],
"credentialSubject": {
"id": "did:iden3:polygon:mumbai:x3LXBvzJR4vwV4kHvwSrkBP9PRNYpiLwwTisVEKrZ",
"name": "james testeleven",
"passportNumber": "E55173628",
"nationality": "AUS",
"birthDate": 19600101,
"customerReference": "2fcecbfc-a926-cf72-6182-4f475da27b28",
"expiryDate": 20250101,
"publicAddress": "0x9e125dB4B5Af7DBe334aA9653b2829b6F07e0391",
"type": "PassportCredential"
},
"issuer": "did:iden3:polygon:mumbai:wznFQLNCwNgrcysagm7M1WZ1iv2ZgZqwYK8dZMZ1k",
"issuanceDate": "2024-01-31T08:32:25.358Z",
"credentialSchema": {
"id": "https://redbellynetwork.github.io/did-schema/passport/credential/PassportCredential-v1.json",
"type": "JsonSchema2023"
},
"credentialStatus": {
"id": "http://localhost:8080/node?state=d00c36de5b7818e102b47c534fd97c125d88796826b064115acfd74e397ab00f",
"type": "Iden3ReverseSparseMerkleTreeProof",
"revocationNonce": 1940
},
"proof": [
{
"issuerData": {
"id": "did:iden3:polygon:mumbai:wznFQLNCwNgrcysagm7M1WZ1iv2ZgZqwYK8dZMZ1k",
"state": {
"rootOfRoots": "0000000000000000000000000000000000000000000000000000000000000000",
"revocationTreeRoot": "0000000000000000000000000000000000000000000000000000000000000000",
"claimsTreeRoot": "8299309aaa4def73548235a717ec3b2fc8b91efbdba958aacaefbcccdbeb011c",
"value": "d00c36de5b7818e102b47c534fd97c125d88796826b064115acfd74e397ab00f"
},
"mtp": {
"existence": true,
"siblings": []
},
"authCoreClaim": "cca3371a6cb1b715004407e325bd993c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000789a607710ebfa952cde0c650dedec522311e2ae3821a9c7471ef3d41fda5e0bbdf80c621861243963cf45ec8aa5024c18ed0e8188b72ad25c0029e284512c180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"credentialStatus": {
"id": "http://localhost:8080/node?state=d00c36de5b7818e102b47c534fd97c125d88796826b064115acfd74e397ab00f",
"type": "Iden3ReverseSparseMerkleTreeProof",
"revocationNonce": 0
}
},
"type": "BJJSignature2021",
"coreClaim": "cca3371a6cb1b715004407e325bd993c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000789a607710ebfa952cde0c650dedec522311e2ae3821a9c7471ef3d41fda5e0bbdf80c621861243963cf45ec8aa5024c18ed0e8188b72ad25c0029e284512c180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"signature": "signature"
},
{
"issuerData": {
"id": "did:iden3:polygon:mumbai:wznFQLNCwNgrcysagm7M1WZ1iv2ZgZqwYK8dZMZ1k",
"state": {
"claimsTreeRoot": "edf712698b5c2b42e9923129f74bea6c62cbc02f283839231543c70566ea4d13",
"revocationTreeRoot": "0000000000000000000000000000000000000000000000000000000000000000",
"rootOfRoots": "df9330f8306c7b8e68195648ae120b7b01b1bbfdd238dddada02e0d78a3ec724",
"value": "48eca96ed3813815860a42c7b2674574aa019be5c2f5db4b1b6c75ade7e15a14",
"txId": "0xf276904e0a34b1fc43bc51a3a7d29bafec0502b12a6e6f16b928dadbb214724d"
}
},
"type": "Iden3SparseMerkleTreeProof",
"coreClaim": "coreClaim",
"mtp": {
"existence": true,
"siblings": [
"0",
"12668154443577484692186593348211170053898334608718851465299950935342343821698"
]
}
}
]
}
}
Receive CR from Verifier¶
- Run Verifier Instance; and run the following curl command.
- Fetch the Credential Request generated by the Verifier's Response.
Sample Credential Request
{
"id": 26,
"circuitId": "credentialAtomicQueryMTPV2OnChain",
"query": {
"allowedIssuers": ["*"],
"type": "DriversLicenceCredential",
"context": "https://redbellynetwork.github.io/did-schema/driversLicence/credential/v1.jsonld",
"credentialSubject": { "birthDate": { "$lt": 20020101 } }
}
}
Save VC from Issuer, Generate and Submit Proof¶
Generates proof based on the value provided in verifiableCredential and credentialRequest. The generated proof is then submitted to the Receptor Smart Contract for verification. Append verifiable credential and credential request to curl command below.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"verifiableCredential": <--verifiableCredential from Issuer-->, "credentialRequest": <--credentialRequest from Verifier-->}' \
http://localhost:5000/generate-submit-proof
On successful proof verification, we receive the proof's mapping in response which informs about successful proof verification.