@0xpolygonid/js-sdk 1.28.0 → 1.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/browser/esm/index.js +1288 -405
- package/dist/browser/esm/index.js.map +1 -1
- package/dist/browser/umd/index.js +24155 -23269
- package/dist/browser/umd/index.js.map +1 -1
- package/dist/node/cjs/iden3comm/constants.js +3 -1
- package/dist/node/cjs/iden3comm/handlers/common.js +63 -1
- package/dist/node/cjs/iden3comm/handlers/contract-request.js +64 -7
- package/dist/node/cjs/iden3comm/handlers/index.js +1 -0
- package/dist/node/cjs/iden3comm/handlers/problem-report.js +55 -0
- package/dist/node/cjs/iden3comm/types/index.js +1 -0
- package/dist/node/cjs/iden3comm/types/protocol/contract-request.js +6 -0
- package/dist/node/cjs/iden3comm/types/protocol/problem-report.js +2 -0
- package/dist/node/cjs/iden3comm/utils/contract-request.utils.js +16 -1
- package/dist/node/cjs/proof/proof-service.js +26 -0
- package/dist/node/cjs/schema-processor/jsonld/cache.js +15 -0
- package/dist/node/cjs/storage/blockchain/onchain-zkp-verifier.js +107 -16
- package/dist/node/cjs/storage/blockchain/state.js +5 -6
- package/dist/node/cjs/verifiable/constants.js +5 -2
- package/dist/node/esm/iden3comm/constants.js +3 -1
- package/dist/node/esm/iden3comm/handlers/common.js +62 -2
- package/dist/node/esm/iden3comm/handlers/contract-request.js +66 -9
- package/dist/node/esm/iden3comm/handlers/index.js +1 -0
- package/dist/node/esm/iden3comm/handlers/problem-report.js +28 -0
- package/dist/node/esm/iden3comm/types/index.js +1 -0
- package/dist/node/esm/iden3comm/types/protocol/contract-request.js +5 -1
- package/dist/node/esm/iden3comm/types/protocol/problem-report.js +1 -0
- package/dist/node/esm/iden3comm/utils/contract-request.utils.js +14 -1
- package/dist/node/esm/proof/proof-service.js +26 -0
- package/dist/node/esm/schema-processor/jsonld/cache.js +15 -0
- package/dist/node/esm/storage/blockchain/onchain-zkp-verifier.js +107 -16
- package/dist/node/esm/storage/blockchain/state.js +5 -6
- package/dist/node/esm/verifiable/constants.js +5 -2
- package/dist/types/iden3comm/constants.d.ts +1 -0
- package/dist/types/iden3comm/handlers/common.d.ts +16 -1
- package/dist/types/iden3comm/handlers/contract-request.d.ts +3 -1
- package/dist/types/iden3comm/handlers/index.d.ts +1 -0
- package/dist/types/iden3comm/handlers/problem-report.d.ts +17 -0
- package/dist/types/iden3comm/types/index.d.ts +1 -0
- package/dist/types/iden3comm/types/protocol/auth.d.ts +8 -0
- package/dist/types/iden3comm/types/protocol/contract-request.d.ts +12 -0
- package/dist/types/iden3comm/types/protocol/problem-report.d.ts +16 -0
- package/dist/types/iden3comm/utils/contract-request.utils.d.ts +7 -0
- package/dist/types/proof/proof-service.d.ts +14 -2
- package/dist/types/storage/blockchain/onchain-zkp-verifier.d.ts +10 -3
- package/dist/types/storage/interfaces/onchain-zkp-verifier.d.ts +18 -1
- package/dist/types/verifiable/constants.d.ts +3 -0
- package/package.json +3 -2
|
@@ -23,7 +23,9 @@ exports.VerifiableConstants = Object.freeze({
|
|
|
23
23
|
IDEN3_DISPLAY_METHOD: 'https://schema.iden3.io/core/jsonld/displayMethod.jsonld',
|
|
24
24
|
// JSONLDSchemaW3CCredential2018 is a schema for context with VerifiableCredential type
|
|
25
25
|
W3C_CREDENTIAL_2018: 'https://www.w3.org/2018/credentials/v1',
|
|
26
|
-
W3C_VC_DOCUMENT_2018: `{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","VerifiableCredential":{"@id":"https://www.w3.org/2018/credentials#VerifiableCredential","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","credentialSchema":{"@id":"cred:credentialSchema","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","JsonSchemaValidator2018":"cred:JsonSchemaValidator2018"}},"credentialStatus":{"@id":"cred:credentialStatus","@type":"@id"},"credentialSubject":{"@id":"cred:credentialSubject","@type":"@id"},"evidence":{"@id":"cred:evidence","@type":"@id"},"expirationDate":{"@id":"cred:expirationDate","@type":"xsd:dateTime"},"holder":{"@id":"cred:holder","@type":"@id"},"issued":{"@id":"cred:issued","@type":"xsd:dateTime"},"issuer":{"@id":"cred:issuer","@type":"@id"},"issuanceDate":{"@id":"cred:issuanceDate","@type":"xsd:dateTime"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"},"refreshService":{"@id":"cred:refreshService","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","ManualRefreshService2018":"cred:ManualRefreshService2018"}},"termsOfUse":{"@id":"cred:termsOfUse","@type":"@id"},"validFrom":{"@id":"cred:validFrom","@type":"xsd:dateTime"},"validUntil":{"@id":"cred:validUntil","@type":"xsd:dateTime"}}},"VerifiablePresentation":{"@id":"https://www.w3.org/2018/credentials#VerifiablePresentation","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","sec":"https://w3id.org/security#","holder":{"@id":"cred:holder","@type":"@id"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"},"verifiableCredential":{"@id":"cred:verifiableCredential","@type":"@id","@container":"@graph"}}},"EcdsaSecp256k1Signature2019":{"@id":"https://w3id.org/security#EcdsaSecp256k1Signature2019","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"EcdsaSecp256r1Signature2019":{"@id":"https://w3id.org/security#EcdsaSecp256r1Signature2019","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"Ed25519Signature2018":{"@id":"https://w3id.org/security#Ed25519Signature2018","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"RsaSignature2018":{"@id":"https://w3id.org/security#RsaSignature2018","@context":{"@version":1.1,"@protected":true,"challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"proof":{"@id":"https://w3id.org/security#proof","@type":"@id","@container":"@graph"}}}
|
|
26
|
+
W3C_VC_DOCUMENT_2018: `{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","VerifiableCredential":{"@id":"https://www.w3.org/2018/credentials#VerifiableCredential","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","credentialSchema":{"@id":"cred:credentialSchema","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","JsonSchemaValidator2018":"cred:JsonSchemaValidator2018"}},"credentialStatus":{"@id":"cred:credentialStatus","@type":"@id"},"credentialSubject":{"@id":"cred:credentialSubject","@type":"@id"},"evidence":{"@id":"cred:evidence","@type":"@id"},"expirationDate":{"@id":"cred:expirationDate","@type":"xsd:dateTime"},"holder":{"@id":"cred:holder","@type":"@id"},"issued":{"@id":"cred:issued","@type":"xsd:dateTime"},"issuer":{"@id":"cred:issuer","@type":"@id"},"issuanceDate":{"@id":"cred:issuanceDate","@type":"xsd:dateTime"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"},"refreshService":{"@id":"cred:refreshService","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","ManualRefreshService2018":"cred:ManualRefreshService2018"}},"termsOfUse":{"@id":"cred:termsOfUse","@type":"@id"},"validFrom":{"@id":"cred:validFrom","@type":"xsd:dateTime"},"validUntil":{"@id":"cred:validUntil","@type":"xsd:dateTime"}}},"VerifiablePresentation":{"@id":"https://www.w3.org/2018/credentials#VerifiablePresentation","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","sec":"https://w3id.org/security#","holder":{"@id":"cred:holder","@type":"@id"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"},"verifiableCredential":{"@id":"cred:verifiableCredential","@type":"@id","@container":"@graph"}}},"EcdsaSecp256k1Signature2019":{"@id":"https://w3id.org/security#EcdsaSecp256k1Signature2019","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"EcdsaSecp256r1Signature2019":{"@id":"https://w3id.org/security#EcdsaSecp256r1Signature2019","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"Ed25519Signature2018":{"@id":"https://w3id.org/security#Ed25519Signature2018","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"RsaSignature2018":{"@id":"https://w3id.org/security#RsaSignature2018","@context":{"@version":1.1,"@protected":true,"challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"proof":{"@id":"https://w3id.org/security#proof","@type":"@id","@container":"@graph"}}}`,
|
|
27
|
+
IDEN3_PROOFS_DEFINITION_DOCUMENT: `{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","Iden3SparseMerkleTreeProof":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3SparseMerkleTreeProof","@context":{"@version":1.1,"@protected":true,"@propagate":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","@vocab":"https://schema.iden3.io/core/vocab/Iden3SparseMerkleTreeProof.md#","xsd":"http://www.w3.org/2001/XMLSchema#","mtp":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#SparseMerkleTreeProof","@type":"SparseMerkleTreeProof"},"coreClaim":{"@id":"coreClaim","@type":"xsd:string"},"issuerData":{"@id":"issuerData","@context":{"@version":1.1,"state":{"@id":"state","@context":{"txId":{"@id":"txId","@type":"xsd:string"},"blockTimestamp":{"@id":"blockTimestamp","@type":"xsd:integer"},"blockNumber":{"@id":"blockNumber","@type":"xsd:integer"},"rootOfRoots":{"@id":"rootOfRoots","@type":"xsd:string"},"claimsTreeRoot":{"@id":"claimsTreeRoot","@type":"xsd:string"},"revocationTreeRoot":{"@id":"revocationTreeRoot","@type":"xsd:string"},"authCoreClaim":{"@id":"authCoreClaim","@type":"xsd:string"},"value":{"@id":"value","@type":"xsd:string"}}}}}}},"SparseMerkleTreeProof":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#SparseMerkleTreeProof","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","smt-proof-vocab":"https://schema.iden3.io/core/vocab/SparseMerkleTreeProof.md#","xsd":"http://www.w3.org/2001/XMLSchema#","existence":{"@id":"smt-proof-vocab:existence","@type":"xsd:boolean"},"revocationNonce":{"@id":"smt-proof-vocab:revocationNonce","@type":"xsd:number"},"siblings":{"@id":"smt-proof-vocab:siblings","@container":"@list"},"nodeAux":"@nest","hIndex":{"@id":"smt-proof-vocab:hIndex","@nest":"nodeAux","@type":"xsd:string"},"hValue":{"@id":"smt-proof-vocab:hValue","@nest":"nodeAux","@type":"xsd:string"}}},"BJJSignature2021":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#BJJSignature2021","@context":{"@version":1.1,"@protected":true,"id":"@id","@vocab":"https://schema.iden3.io/core/vocab/BJJSignature2021.md#","@propagate":true,"type":"@type","xsd":"http://www.w3.org/2001/XMLSchema#","coreClaim":{"@id":"coreClaim","@type":"xsd:string"},"issuerData":{"@id":"issuerData","@context":{"@version":1.1,"authCoreClaim":{"@id":"authCoreClaim","@type":"xsd:string"},"mtp":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#SparseMerkleTreeProof","@type":"SparseMerkleTreeProof"},"revocationStatus":{"@id":"revocationStatus","@type":"@id"},"state":{"@id":"state","@context":{"@version":1.1,"rootOfRoots":{"@id":"rootOfRoots","@type":"xsd:string"},"claimsTreeRoot":{"@id":"claimsTreeRoot","@type":"xsd:string"},"revocationTreeRoot":{"@id":"revocationTreeRoot","@type":"xsd:string"},"value":{"@id":"value","@type":"xsd:string"}}}}},"signature":{"@id":"signature","@type":"https://w3id.org/security#multibase"},"domain":"https://w3id.org/security#domain","creator":{"@id":"creator","@type":"http://www.w3.org/2001/XMLSchema#string"},"challenge":"https://w3id.org/security#challenge","created":{"@id":"created","@type":"http://www.w3.org/2001/XMLSchema#dateTime"},"expires":{"@id":"https://w3id.org/security#expiration","@type":"http://www.w3.org/2001/XMLSchema#dateTime"},"nonce":"https://w3id.org/security#nonce","proofPurpose":{"@id":"https://w3id.org/security#proofPurpose","@type":"@vocab","@context":{"@protected":true,"id":"@id","type":"@type","assertionMethod":{"@id":"https://w3id.org/security#assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"https://w3id.org/security#authenticationMethod","@type":"@id","@container":"@set"},"capabilityInvocation":{"@id":"https://w3id.org/security#capabilityInvocationMethod","@type":"@id","@container":"@set"},"capabilityDelegation":{"@id":"https://w3id.org/security#capabilityDelegationMethod","@type":"@id","@container":"@set"},"keyAgreement":{"@id":"https://w3id.org/security#keyAgreementMethod","@type":"@id","@container":"@set"}}},"proofValue":{"@id":"https://w3id.org/security#proofValue","@type":"https://w3id.org/security#multibase"},"verificationMethod":{"@id":"https://w3id.org/security#verificationMethod","@type":"@id"}}},"Iden3ReverseSparseMerkleTreeProof":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3ReverseSparseMerkleTreeProof","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","iden3-reverse-sparse-merkle-tree-proof-vocab":"https://schema.iden3.io/core/vocab/Iden3ReverseSparseMerkleTreeProof.md#","revocationNonce":"iden3-reverse-sparse-merkle-tree-proof-vocab:revocationNonce","statusIssuer":{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type"},"@id":"iden3-reverse-sparse-merkle-tree-proof-vocab:statusIssuer"}}},"Iden3commRevocationStatusV1.0":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3commRevocationStatusV1.0","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","iden3-comm-revocation-statusV1.0-vocab":"https://schema.iden3.io/core/vocab/Iden3commRevocationStatusV1.0.md#","revocationNonce":"iden3-comm-revocation-statusV1.0-vocab:revocationNonce","statusIssuer":{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type"},"@id":"iden3-comm-revocation-statusV1.0-vocab:statusIssuer"}}},"Iden3OnchainSparseMerkleTreeProof2023":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3OnchainSparseMerkleTreeProof2023","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","iden3-onchain-sparse-merkle-tree-proof-2023-vocab":"https://schema.iden3.io/core/vocab/Iden3OnchainSparseMerkleTreeProof2023.md#","revocationNonce":"iden3-onchain-sparse-merkle-tree-proof-2023-vocab:revocationNonce","statusIssuer":{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type"},"@id":"iden3-onchain-sparse-merkle-tree-proof-2023-vocab:statusIssuer"}}},"JsonSchema2023":"https://www.w3.org/ns/credentials#JsonSchema2023","Iden3RefreshService2023":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3RefreshService2023"}}`,
|
|
28
|
+
IDEN3_DISPLAY_METHOD_DEFINITION_DOCUMENT: `{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","displayMethod":{"@id":"https://schema.iden3.io/core/vocab/displayMethod.md#displayMethod","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","Iden3BasicDisplayMethodV1":"https://schema.iden3.io/core/vocab/displayMethod.md#Iden3BasicDisplayMethodV1"}}}}`
|
|
27
29
|
},
|
|
28
30
|
// JsonSchema2023 JSON schema for verification of Iden3Credential
|
|
29
31
|
JSON_SCHEMA_VALIDATOR: 'JsonSchema2023',
|
|
@@ -38,7 +40,8 @@ exports.VerifiableConstants = Object.freeze({
|
|
|
38
40
|
AUTH_BJJ_CREDENTIAL_SCHEMA_JSON_URL: 'https://schema.iden3.io/core/json/auth.json',
|
|
39
41
|
AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD_URL: 'https://schema.iden3.io/core/jsonld/auth.jsonld',
|
|
40
42
|
AUTH_BJJ_CREDENTIAL_TYPE: 'AuthBJJCredential',
|
|
41
|
-
AUTH_BJJ_CREDENTIAL_SCHEMA_JSON: `{"$schema":"http://json-schema.org/draft-07/schema#","$metadata":{"uris":{"jsonLdContext":"https://schema.iden3.io/core/jsonld/auth.jsonld","jsonSchema":"https://schema.iden3.io/core/json/auth.json"},"serialization":{"indexDataSlotA":"x","indexDataSlotB":"y"}},"type":"object","required":["@context","id","type","issuanceDate","credentialSubject","credentialSchema","credentialStatus","issuer"],"properties":{"@context":{"type":["string","array","object"]},"id":{"type":"string"},"type":{"type":["string","array"],"items":{"type":"string"}},"issuer":{"type":["string","object"],"format":"uri","required":["id"],"properties":{"id":{"type":"string","format":"uri"}}},"issuanceDate":{"type":"string","format":"date-time"},"expirationDate":{"type":"string","format":"date-time"},"credentialSchema":{"type":"object","required":["id","type"],"properties":{"id":{"type":"string","format":"uri"},"type":{"type":"string"}}},"credentialSubject":{"type":"object","required":["x","y"],"properties":{"id":{"title":"Credential Subject ID","type":"string","format":"uri"},"x":{"type":"string"},"y":{"type":"string"}}}}}
|
|
43
|
+
AUTH_BJJ_CREDENTIAL_SCHEMA_JSON: `{"$schema":"http://json-schema.org/draft-07/schema#","$metadata":{"uris":{"jsonLdContext":"https://schema.iden3.io/core/jsonld/auth.jsonld","jsonSchema":"https://schema.iden3.io/core/json/auth.json"},"serialization":{"indexDataSlotA":"x","indexDataSlotB":"y"}},"type":"object","required":["@context","id","type","issuanceDate","credentialSubject","credentialSchema","credentialStatus","issuer"],"properties":{"@context":{"type":["string","array","object"]},"id":{"type":"string"},"type":{"type":["string","array"],"items":{"type":"string"}},"issuer":{"type":["string","object"],"format":"uri","required":["id"],"properties":{"id":{"type":"string","format":"uri"}}},"issuanceDate":{"type":"string","format":"date-time"},"expirationDate":{"type":"string","format":"date-time"},"credentialSchema":{"type":"object","required":["id","type"],"properties":{"id":{"type":"string","format":"uri"},"type":{"type":"string"}}},"credentialSubject":{"type":"object","required":["x","y"],"properties":{"id":{"title":"Credential Subject ID","type":"string","format":"uri"},"x":{"type":"string"},"y":{"type":"string"}}}}}`,
|
|
44
|
+
AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD: `{"@context":[{"@version":1.1,"@protected":true,"id":"@id","type":"@type","AuthBJJCredential":{"@id":"https://schema.iden3.io/core/jsonld/auth.jsonld#AuthBJJCredential","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","iden3_serialization":"iden3:v1:slotIndexA=x&slotIndexB=y","xsd":"http://www.w3.org/2001/XMLSchema#","auth-vocab":"https://schema.iden3.io/core/vocab/auth.md#","x":{"@id":"auth-vocab:x","@type":"xsd:positiveInteger"},"y":{"@id":"auth-vocab:y","@type":"xsd:positiveInteger"}}},"Iden3StateInfo2023":{"@id":"https://schema.iden3.io/core/jsonld/auth.jsonld#Iden3StateInfo2023","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","xsd":"http://www.w3.org/2001/XMLSchema#","@vocab":"https://schema.iden3.io/core/vocab/state-info.md#","@propagate":true,"stateContractAddress":{"@id":"stateContractAddress","@type":"xsd:string"},"published":{"@id":"published","@type":"xsd:boolean"},"info":{"@id":"info","@type":"@id","@context":{"@protected":true,"id":{"@id":"id","@type":"xsd:string"},"state":{"@id":"state","@type":"xsd:string"},"replacedByState":{"@id":"replacedByState","@type":"xsd:string"},"createdAtTimestamp":{"@id":"createdAtTimestamp","@type":"xsd:string"},"replacedAtTimestamp":{"@id":"replacedAtTimestamp","@type":"xsd:string"},"createdAtBlock":{"@id":"createdAtBlock","@type":"xsd:string"},"replacedAtBlock":{"@id":"replacedAtBlock","@type":"xsd:string"}}},"global":{"@id":"global","@type":"@id","@context":{"@protected":true,"sec":"https://w3id.org/security#","root":{"@id":"root","@type":"xsd:string"},"replacedByRoot":{"@id":"replacedByRoot","@type":"xsd:string"},"createdAtTimestamp":{"@id":"createdAtTimestamp","@type":"xsd:string"},"replacedAtTimestamp":{"@id":"replacedAtTimestamp","@type":"xsd:string"},"createdAtBlock":{"@id":"createdAtBlock","@type":"xsd:string"},"replacedAtBlock":{"@id":"replacedAtBlock","@type":"xsd:string"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"}}}}}}]}`
|
|
42
45
|
}
|
|
43
46
|
});
|
|
44
47
|
/**
|
|
@@ -47,7 +47,9 @@ export const PROTOCOL_MESSAGE_TYPE = Object.freeze({
|
|
|
47
47
|
// DiscoveryProtocolQueriesMessageType is type for didcomm discovery protocol queries
|
|
48
48
|
DISCOVERY_PROTOCOL_QUERIES_MESSAGE_TYPE: `${DIDCOMM_PROTOCOL}discover-features/2.0/queries`,
|
|
49
49
|
// DiscoveryProtocolDiscloseMessageType is type for didcomm discovery protocol disclose
|
|
50
|
-
DISCOVERY_PROTOCOL_DISCLOSE_MESSAGE_TYPE: `${DIDCOMM_PROTOCOL}discover-features/2.0/disclose
|
|
50
|
+
DISCOVERY_PROTOCOL_DISCLOSE_MESSAGE_TYPE: `${DIDCOMM_PROTOCOL}discover-features/2.0/disclose`,
|
|
51
|
+
// ProblemReportMessageType is type for didcomm problem report
|
|
52
|
+
PROBLEM_REPORT_MESSAGE_TYPE: `${DIDCOMM_PROTOCOL}report-problem/2.0/problem-report`
|
|
51
53
|
});
|
|
52
54
|
/**
|
|
53
55
|
* Media types for iden3 comm communication protocol
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { getRandomBytes } from '@iden3/js-crypto';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { AuthMethod } from '../types';
|
|
3
|
+
import { bytesToHex, mergeObjects } from '../../utils';
|
|
4
|
+
import { BytesHelper, DID, getUnixTimestamp } from '@iden3/js-iden3-core';
|
|
5
|
+
import { CircuitId } from '../../circuits';
|
|
6
|
+
import { AcceptJwsAlgorithms, defaultAcceptProfile, MediaType } from '../constants';
|
|
7
|
+
import { packZkpProof, prepareZkpProof } from '../utils';
|
|
4
8
|
/**
|
|
5
9
|
* Groups the ZeroKnowledgeProofRequest objects based on their groupId.
|
|
6
10
|
* Returns a Map where the key is the groupId and the value is an object containing the query and linkNonce.
|
|
@@ -80,6 +84,59 @@ export const processZeroKnowledgeProofRequests = async (to, requests, from, proo
|
|
|
80
84
|
}
|
|
81
85
|
return zkpResponses;
|
|
82
86
|
};
|
|
87
|
+
/**
|
|
88
|
+
* Processes auth proof requests.
|
|
89
|
+
*
|
|
90
|
+
* @param to - The identifier of the recipient.
|
|
91
|
+
* @param proofService - The proof service.
|
|
92
|
+
* @param opts - Additional options for processing the requests.
|
|
93
|
+
* @returns A promise that resolves to an auth proof response.
|
|
94
|
+
*/
|
|
95
|
+
export const processProofAuth = async (to, proofService, opts) => {
|
|
96
|
+
if (!opts.acceptProfile) {
|
|
97
|
+
opts.acceptProfile = defaultAcceptProfile;
|
|
98
|
+
}
|
|
99
|
+
if (!opts.skipRevocation) {
|
|
100
|
+
opts.skipRevocation = true;
|
|
101
|
+
}
|
|
102
|
+
switch (opts.acceptProfile.env) {
|
|
103
|
+
case MediaType.ZKPMessage:
|
|
104
|
+
if (!opts.acceptProfile.circuits) {
|
|
105
|
+
throw new Error('Circuit not specified in accept profile');
|
|
106
|
+
}
|
|
107
|
+
for (const circuitId of opts.acceptProfile.circuits) {
|
|
108
|
+
if (!opts.supportedCircuits.includes(circuitId)) {
|
|
109
|
+
throw new Error(`Circuit ${circuitId} is not supported`);
|
|
110
|
+
}
|
|
111
|
+
const zkpRes = await proofService.generateAuthProof(circuitId, to, { challenge: opts.challenge, skipRevocation: opts.skipRevocation });
|
|
112
|
+
switch (circuitId) {
|
|
113
|
+
case CircuitId.AuthV2: {
|
|
114
|
+
const preparedZkpProof = prepareZkpProof(zkpRes.proof);
|
|
115
|
+
const zkProofEncoded = packZkpProof(zkpRes.pub_signals, preparedZkpProof.a, preparedZkpProof.b, preparedZkpProof.c);
|
|
116
|
+
return {
|
|
117
|
+
authMethod: AuthMethod.AUTHV2,
|
|
118
|
+
proof: zkProofEncoded
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
throw new Error(`Auth method is not supported`);
|
|
124
|
+
case MediaType.SignedMessage:
|
|
125
|
+
if (!opts.acceptProfile.alg || opts.acceptProfile.alg.length === 0) {
|
|
126
|
+
throw new Error('Algorithm not specified');
|
|
127
|
+
}
|
|
128
|
+
if (opts.acceptProfile.alg[0] === AcceptJwsAlgorithms.ES256KR) {
|
|
129
|
+
const ethIdProof = packEthIdentityProof(to);
|
|
130
|
+
return {
|
|
131
|
+
authMethod: AuthMethod.ETH_IDENTITY,
|
|
132
|
+
proof: ethIdProof
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
throw new Error(`Algorithm ${opts.acceptProfile.alg[0]} not supported`);
|
|
136
|
+
default:
|
|
137
|
+
throw new Error('Accept env not supported');
|
|
138
|
+
}
|
|
139
|
+
};
|
|
83
140
|
/**
|
|
84
141
|
* Verifies that the expires_time field of a message is not in the past. Throws an error if it is.
|
|
85
142
|
*
|
|
@@ -90,3 +147,6 @@ export const verifyExpiresTime = (message) => {
|
|
|
90
147
|
throw new Error('Message expired');
|
|
91
148
|
}
|
|
92
149
|
};
|
|
150
|
+
export const packEthIdentityProof = (did) => {
|
|
151
|
+
return `0x${bytesToHex(BytesHelper.intToBytes(DID.idFromDID(did).bigInt()))}`;
|
|
152
|
+
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { CircuitId } from '../../circuits/models';
|
|
2
|
-
import { PROTOCOL_MESSAGE_TYPE } from '../constants';
|
|
2
|
+
import { defaultAcceptProfile, PROTOCOL_MESSAGE_TYPE, ProtocolVersion } from '../constants';
|
|
3
3
|
import { DID, ChainIds, getUnixTimestamp } from '@iden3/js-iden3-core';
|
|
4
4
|
import { FunctionSignatures } from '../../storage';
|
|
5
|
-
import { processZeroKnowledgeProofRequests, verifyExpiresTime } from './common';
|
|
5
|
+
import { processProofAuth, processZeroKnowledgeProofRequests, verifyExpiresTime } from './common';
|
|
6
6
|
import { AbstractMessageHandler } from './message-handler';
|
|
7
|
+
import { parseAcceptProfile } from '../utils';
|
|
7
8
|
/**
|
|
8
9
|
*
|
|
9
10
|
* Allows to process ContractInvokeRequest protocol message
|
|
@@ -19,6 +20,7 @@ export class ContractRequestHandler extends AbstractMessageHandler {
|
|
|
19
20
|
* @param {IPackageManager} _packerMgr - package manager to unpack message envelope
|
|
20
21
|
* @param {IProofService} _proofService - proof service to verify zk proofs
|
|
21
22
|
* @param {IOnChainZKPVerifier} _zkpVerifier - zkp verifier to submit response
|
|
23
|
+
* @param {IOnChainVerifierMultiQuery} _verifierMultiQuery - verifier multi-query to submit response
|
|
22
24
|
*
|
|
23
25
|
*/
|
|
24
26
|
constructor(_packerMgr, _proofService, _zkpVerifier) {
|
|
@@ -30,7 +32,12 @@ export class ContractRequestHandler extends AbstractMessageHandler {
|
|
|
30
32
|
CircuitId.AuthV2,
|
|
31
33
|
CircuitId.AtomicQueryMTPV2OnChain,
|
|
32
34
|
CircuitId.AtomicQuerySigV2OnChain,
|
|
33
|
-
CircuitId.AtomicQueryV3OnChain
|
|
35
|
+
CircuitId.AtomicQueryV3OnChain,
|
|
36
|
+
// Now we support off-chain circuits on-chain
|
|
37
|
+
// TODO: We need to create validators for them
|
|
38
|
+
CircuitId.AuthV2,
|
|
39
|
+
CircuitId.AtomicQueryV3,
|
|
40
|
+
CircuitId.LinkedMultiQuery10
|
|
34
41
|
];
|
|
35
42
|
}
|
|
36
43
|
async handle(message, ctx) {
|
|
@@ -66,19 +73,64 @@ export class ContractRequestHandler extends AbstractMessageHandler {
|
|
|
66
73
|
});
|
|
67
74
|
const methodId = message.body.transaction_data.method_id.replace('0x', '');
|
|
68
75
|
switch (methodId) {
|
|
69
|
-
case FunctionSignatures.SubmitZKPResponseV2:
|
|
70
|
-
|
|
76
|
+
case FunctionSignatures.SubmitZKPResponseV2: {
|
|
77
|
+
const txHashZkpResponsesMap = await this._zkpVerifier.submitZKPResponseV2(ethSigner, message.body.transaction_data, zkpResponses);
|
|
78
|
+
const response = new Map();
|
|
79
|
+
for (const [txHash, zkpResponses] of txHashZkpResponsesMap) {
|
|
80
|
+
response.set(txHash, { responses: zkpResponses });
|
|
81
|
+
}
|
|
82
|
+
return response;
|
|
83
|
+
}
|
|
71
84
|
case FunctionSignatures.SubmitZKPResponseV1: {
|
|
72
85
|
const txHashZkpResponseMap = await this._zkpVerifier.submitZKPResponse(ethSigner, message.body.transaction_data, zkpResponses);
|
|
73
86
|
const response = new Map();
|
|
74
87
|
for (const [txHash, zkpResponse] of txHashZkpResponseMap) {
|
|
75
|
-
response.set(txHash, [zkpResponse]);
|
|
88
|
+
response.set(txHash, { responses: [zkpResponse] });
|
|
76
89
|
}
|
|
77
90
|
return response;
|
|
78
91
|
}
|
|
92
|
+
case FunctionSignatures.SubmitResponse: {
|
|
93
|
+
// We need to
|
|
94
|
+
// 1. Generate auth proof from message.body.accept -> authResponse
|
|
95
|
+
// 2. Generate proofs for each query in scope -> zkpResponses
|
|
96
|
+
// Build auth response from accept
|
|
97
|
+
if (!message.to) {
|
|
98
|
+
throw new Error(`failed message. empty 'to' field`);
|
|
99
|
+
}
|
|
100
|
+
// Get first supported accept profile and pass it to processProofAuth
|
|
101
|
+
const acceptProfile = this.getFirstSupportedProfile(PROTOCOL_MESSAGE_TYPE.CONTRACT_INVOKE_REQUEST_MESSAGE_TYPE, message.body.accept);
|
|
102
|
+
const identifier = DID.parse(message.to);
|
|
103
|
+
const authResponse = await processProofAuth(identifier, this._proofService, {
|
|
104
|
+
supportedCircuits: this._supportedCircuits,
|
|
105
|
+
acceptProfile,
|
|
106
|
+
challenge: challenge,
|
|
107
|
+
skipRevocation: true
|
|
108
|
+
});
|
|
109
|
+
return this._zkpVerifier.submitResponse(ethSigner, message.body.transaction_data, authResponse, zkpResponses);
|
|
110
|
+
}
|
|
79
111
|
default:
|
|
80
|
-
throw new Error(`Not supported method id. Only '${FunctionSignatures.SubmitZKPResponseV1} and ${FunctionSignatures.
|
|
112
|
+
throw new Error(`Not supported method id. Only '${FunctionSignatures.SubmitZKPResponseV1}, ${FunctionSignatures.SubmitZKPResponseV2} and ${FunctionSignatures.SubmitResponse} are supported.'`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
getFirstSupportedProfile(responseType, profile) {
|
|
116
|
+
if (profile?.length) {
|
|
117
|
+
for (const acceptProfileString of profile) {
|
|
118
|
+
// 1. check protocol version
|
|
119
|
+
const acceptProfile = parseAcceptProfile(acceptProfileString);
|
|
120
|
+
const responseTypeVersion = Number(responseType.split('/').at(-2));
|
|
121
|
+
if (acceptProfile.protocolVersion !== ProtocolVersion.V1 ||
|
|
122
|
+
(acceptProfile.protocolVersion === ProtocolVersion.V1 &&
|
|
123
|
+
(responseTypeVersion < 1 || responseTypeVersion >= 2))) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// 2. check packer support
|
|
127
|
+
if (this._packerMgr.isProfileSupported(acceptProfile.env, acceptProfileString)) {
|
|
128
|
+
return acceptProfile;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
81
131
|
}
|
|
132
|
+
// if we don't have supported profiles, we use default
|
|
133
|
+
return defaultAcceptProfile;
|
|
82
134
|
}
|
|
83
135
|
/**
|
|
84
136
|
* unpacks contract-invoke request
|
|
@@ -100,7 +152,7 @@ export class ContractRequestHandler extends AbstractMessageHandler {
|
|
|
100
152
|
* @private
|
|
101
153
|
* @beta
|
|
102
154
|
* @param {ContractInvokeRequest} request - ContractInvokeRequest
|
|
103
|
-
* @param { Map<string,
|
|
155
|
+
* @param { Map<string, ZeroKnowledgeInvokeResponse>} responses - map tx hash to array of ZeroKnowledgeInvokeResponse
|
|
104
156
|
* @returns `Promise<ContractInvokeResponse>`
|
|
105
157
|
*/
|
|
106
158
|
async createContractInvokeResponse(request, txHashToZkpResponseMap) {
|
|
@@ -117,12 +169,17 @@ export class ContractRequestHandler extends AbstractMessageHandler {
|
|
|
117
169
|
created_time: getUnixTimestamp(new Date())
|
|
118
170
|
};
|
|
119
171
|
for (const [txHash, zkpResponses] of txHashToZkpResponseMap) {
|
|
120
|
-
for (const zkpResponse of zkpResponses) {
|
|
172
|
+
for (const zkpResponse of zkpResponses.responses) {
|
|
121
173
|
contractInvokeResponse.body.scope.push({
|
|
122
174
|
txHash,
|
|
123
175
|
...zkpResponse
|
|
124
176
|
});
|
|
125
177
|
}
|
|
178
|
+
contractInvokeResponse.body = {
|
|
179
|
+
...contractInvokeResponse.body,
|
|
180
|
+
crossChainProofs: zkpResponses.crossChainProofs ?? [],
|
|
181
|
+
authProofs: zkpResponses.authProofs ?? []
|
|
182
|
+
};
|
|
126
183
|
}
|
|
127
184
|
return contractInvokeResponse;
|
|
128
185
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as uuid from 'uuid';
|
|
2
|
+
import { MediaType, PROTOCOL_MESSAGE_TYPE } from '../constants';
|
|
3
|
+
/**
|
|
4
|
+
* @beta
|
|
5
|
+
* createProblemReportMessage is a function to create didcomm protocol problem report message
|
|
6
|
+
* @param pthid - parent thread id
|
|
7
|
+
* @param code - problem report code
|
|
8
|
+
* @param opts - problem report options
|
|
9
|
+
* @returns `ProblemReportMessage`
|
|
10
|
+
*/
|
|
11
|
+
export function createProblemReportMessage(pthid, code, opts) {
|
|
12
|
+
const uuidv4 = uuid.v4();
|
|
13
|
+
return {
|
|
14
|
+
id: uuidv4,
|
|
15
|
+
pthid: pthid,
|
|
16
|
+
typ: MediaType.PlainMessage,
|
|
17
|
+
type: PROTOCOL_MESSAGE_TYPE.PROBLEM_REPORT_MESSAGE_TYPE,
|
|
18
|
+
ack: opts?.ack,
|
|
19
|
+
body: {
|
|
20
|
+
code: code,
|
|
21
|
+
comment: opts?.comment,
|
|
22
|
+
args: opts?.args,
|
|
23
|
+
escalate_to: opts?.escalate_to
|
|
24
|
+
},
|
|
25
|
+
from: opts?.from,
|
|
26
|
+
to: opts?.to
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -8,6 +8,7 @@ export * from './protocol/proposal-request';
|
|
|
8
8
|
export * from './protocol/payment';
|
|
9
9
|
export * from './protocol/accept-profile';
|
|
10
10
|
export * from './protocol/discovery-protocol';
|
|
11
|
+
export * from './protocol/problem-report';
|
|
11
12
|
export * from './packer';
|
|
12
13
|
export * from './models';
|
|
13
14
|
export * from './packageManager';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { keccak256 } from 'ethers';
|
|
1
|
+
import { ethers, keccak256 } from 'ethers';
|
|
2
2
|
import { byteEncoder, hexToBytes, isEthereumIdentity } from '../../utils';
|
|
3
3
|
import { CircuitId } from '../../circuits';
|
|
4
4
|
import { Hex } from '@iden3/js-crypto';
|
|
@@ -52,3 +52,16 @@ export async function prepareAuthV2ZeroKnowledgeResponse(address, senderDid, pro
|
|
|
52
52
|
}
|
|
53
53
|
];
|
|
54
54
|
}
|
|
55
|
+
export const packZkpProof = (inputs, a, b, c) => {
|
|
56
|
+
return new ethers.AbiCoder().encode(['uint256[] inputs', 'uint256[2]', 'uint256[2][2]', 'uint256[2]'], [inputs, a, b, c]);
|
|
57
|
+
};
|
|
58
|
+
export const prepareZkpProof = (proof) => {
|
|
59
|
+
return {
|
|
60
|
+
a: proof.pi_a.slice(0, 2),
|
|
61
|
+
b: [
|
|
62
|
+
[proof.pi_b[0][1], proof.pi_b[0][0]],
|
|
63
|
+
[proof.pi_b[1][1], proof.pi_b[1][0]]
|
|
64
|
+
],
|
|
65
|
+
c: proof.pi_c.slice(0, 2)
|
|
66
|
+
};
|
|
67
|
+
};
|
|
@@ -128,6 +128,32 @@ export class ProofService {
|
|
|
128
128
|
pub_signals
|
|
129
129
|
};
|
|
130
130
|
}
|
|
131
|
+
/** {@inheritdoc IProofService.generateAuthProof} */
|
|
132
|
+
async generateAuthProof(circuitId, identifier, opts) {
|
|
133
|
+
if (!opts) {
|
|
134
|
+
opts = {
|
|
135
|
+
skipRevocation: false,
|
|
136
|
+
challenge: 0n
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
let zkProof;
|
|
140
|
+
switch (circuitId) {
|
|
141
|
+
case CircuitId.AuthV2:
|
|
142
|
+
{
|
|
143
|
+
const challenge = opts.challenge
|
|
144
|
+
? BytesHelper.intToBytes(opts.challenge).reverse()
|
|
145
|
+
: new Uint8Array(32);
|
|
146
|
+
zkProof = await this.generateAuthV2Proof(challenge, identifier);
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
circuitId: circuitId,
|
|
150
|
+
proof: zkProof.proof,
|
|
151
|
+
pub_signals: zkProof.pub_signals
|
|
152
|
+
};
|
|
153
|
+
default:
|
|
154
|
+
throw new Error(`CircuitId ${circuitId} is not supported`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
131
157
|
/** {@inheritdoc IProofService.transitState} */
|
|
132
158
|
async transitState(did, oldTreeState, isOldStateGenesis, stateStorage, // for compatibility with previous versions we leave this parameter
|
|
133
159
|
ethSigner) {
|
|
@@ -7,12 +7,27 @@ import { VerifiableConstants } from '../../verifiable';
|
|
|
7
7
|
* @returns Promise<DocumentLoader>
|
|
8
8
|
*/
|
|
9
9
|
const doc = JSON.parse(VerifiableConstants.JSONLD_SCHEMA.W3C_VC_DOCUMENT_2018);
|
|
10
|
+
const docIden3Proofs = JSON.parse(VerifiableConstants.JSONLD_SCHEMA.IDEN3_PROOFS_DEFINITION_DOCUMENT);
|
|
11
|
+
const docIden3DisplayMethod = JSON.parse(VerifiableConstants.JSONLD_SCHEMA.IDEN3_DISPLAY_METHOD_DEFINITION_DOCUMENT);
|
|
12
|
+
const docIden3AuthBJJ = JSON.parse(VerifiableConstants.AUTH.AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD);
|
|
10
13
|
export const cacheLoader = (opts) => {
|
|
11
14
|
const cache = new Map();
|
|
12
15
|
cache.set(VerifiableConstants.JSONLD_SCHEMA.W3C_CREDENTIAL_2018, {
|
|
13
16
|
document: doc,
|
|
14
17
|
documentUrl: VerifiableConstants.JSONLD_SCHEMA.W3C_CREDENTIAL_2018
|
|
15
18
|
});
|
|
19
|
+
cache.set(VerifiableConstants.JSONLD_SCHEMA.IDEN3_CREDENTIAL, {
|
|
20
|
+
document: docIden3Proofs,
|
|
21
|
+
documentUrl: VerifiableConstants.JSONLD_SCHEMA.IDEN3_PROOFS_DEFINITION_DOCUMENT
|
|
22
|
+
});
|
|
23
|
+
cache.set(VerifiableConstants.JSONLD_SCHEMA.IDEN3_DISPLAY_METHOD, {
|
|
24
|
+
document: docIden3DisplayMethod,
|
|
25
|
+
documentUrl: VerifiableConstants.JSONLD_SCHEMA.IDEN3_DISPLAY_METHOD_DEFINITION_DOCUMENT
|
|
26
|
+
});
|
|
27
|
+
cache.set(VerifiableConstants.AUTH.AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD_URL, {
|
|
28
|
+
document: docIden3AuthBJJ,
|
|
29
|
+
documentUrl: VerifiableConstants.AUTH.AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD
|
|
30
|
+
});
|
|
16
31
|
return async (url) => {
|
|
17
32
|
let remoteDoc = cache.get(url);
|
|
18
33
|
if (remoteDoc) {
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { JsonRpcProvider, Contract, ethers } from 'ethers';
|
|
2
2
|
import abi from './abi/ZkpVerifier.json';
|
|
3
|
+
//import { UniversalVerifier } from '@iden3/universal-verifier-v2-abi';
|
|
4
|
+
import { IVerifierABI } from '@iden3/universal-verifier-v2-abi';
|
|
3
5
|
import { TransactionService } from '../../blockchain';
|
|
4
6
|
import { chainIDfromDID, DID, Id } from '@iden3/js-iden3-core';
|
|
5
7
|
import { AtomicQueryMTPV2OnChainPubSignals, AtomicQuerySigV2OnChainPubSignals, AtomicQueryV3OnChainPubSignals, AuthV2PubSignals, CircuitId } from '../../circuits';
|
|
6
8
|
import { byteEncoder, DIDDocumentSignature, resolveDidDocument } from '../../utils';
|
|
7
9
|
import { poseidon } from '@iden3/js-crypto';
|
|
8
10
|
import { Hash } from '@iden3/js-merkletree';
|
|
11
|
+
import { packZkpProof, prepareZkpProof } from '../../iden3comm/utils';
|
|
9
12
|
const maxGasLimit = 10000000n;
|
|
10
13
|
/**
|
|
11
14
|
* Supported function signature for SubmitZKPResponse
|
|
@@ -20,6 +23,8 @@ export var FunctionSignatures;
|
|
|
20
23
|
FunctionSignatures["SubmitZKPResponseV1"] = "b68967e2";
|
|
21
24
|
//function submitZKPResponseV2(tuple[](uint64 requestId,bytes zkProof,bytes data),bytes crossChainProof)
|
|
22
25
|
FunctionSignatures["SubmitZKPResponseV2"] = "ade09fcd";
|
|
26
|
+
//function submitResponse(tuple(string authMethod,bytes proof),tuple(uint256 requestId,bytes proof,bytes metadata)[],bytes crossChainProof)
|
|
27
|
+
FunctionSignatures["SubmitResponse"] = "06c86a91";
|
|
23
28
|
})(FunctionSignatures || (FunctionSignatures = {}));
|
|
24
29
|
/**
|
|
25
30
|
* OnChainZKPVerifier is a class that allows to interact with the OnChainZKPVerifier contract
|
|
@@ -45,16 +50,8 @@ export class OnChainZKPVerifier {
|
|
|
45
50
|
}
|
|
46
51
|
const requestID = zkProofResponse.id;
|
|
47
52
|
const inputs = zkProofResponse.pub_signals;
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
inputs,
|
|
51
|
-
zkProofResponse.proof.pi_a.slice(0, 2),
|
|
52
|
-
[
|
|
53
|
-
[zkProofResponse.proof.pi_b[0][1], zkProofResponse.proof.pi_b[0][0]],
|
|
54
|
-
[zkProofResponse.proof.pi_b[1][1], zkProofResponse.proof.pi_b[1][0]]
|
|
55
|
-
],
|
|
56
|
-
zkProofResponse.proof.pi_c.slice(0, 2)
|
|
57
|
-
];
|
|
53
|
+
const preparedZkpProof = prepareZkpProof(zkProofResponse.proof);
|
|
54
|
+
const payload = [requestID, inputs, preparedZkpProof.a, preparedZkpProof.b, preparedZkpProof.c];
|
|
58
55
|
return payload;
|
|
59
56
|
}
|
|
60
57
|
/**
|
|
@@ -152,6 +149,80 @@ export class OnChainZKPVerifier {
|
|
|
152
149
|
const { txnHash } = await transactionService.sendTransactionRequest(ethSigner, request);
|
|
153
150
|
return new Map().set(txnHash, zkProofResponses);
|
|
154
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* {@inheritDoc IOnChainVerifierMultiQuery.submitResponse}
|
|
154
|
+
*/
|
|
155
|
+
async submitResponse(ethSigner, txData, authResponse, responses) {
|
|
156
|
+
const chainConfig = this._configs.find((i) => i.chainId == txData.chain_id);
|
|
157
|
+
if (!chainConfig) {
|
|
158
|
+
throw new Error(`config for chain id ${txData.chain_id} was not found`);
|
|
159
|
+
}
|
|
160
|
+
if (txData.method_id.replace('0x', '') !== FunctionSignatures.SubmitResponse) {
|
|
161
|
+
throw new Error(`submitResponse function doesn't implement requested method id. Only '0x${FunctionSignatures.SubmitResponse}' is supported.`);
|
|
162
|
+
}
|
|
163
|
+
if (!this._opts?.didResolverUrl) {
|
|
164
|
+
throw new Error(`did resolver url required for crosschain verification`);
|
|
165
|
+
}
|
|
166
|
+
const provider = new JsonRpcProvider(chainConfig.url, chainConfig.chainId);
|
|
167
|
+
ethSigner = ethSigner.connect(provider);
|
|
168
|
+
const txDataArgs = await this.prepareTxArgsSubmit(txData, authResponse, responses);
|
|
169
|
+
const feeData = await provider.getFeeData();
|
|
170
|
+
const maxFeePerGas = chainConfig.maxFeePerGas
|
|
171
|
+
? BigInt(chainConfig.maxFeePerGas)
|
|
172
|
+
: feeData.maxFeePerGas;
|
|
173
|
+
const maxPriorityFeePerGas = chainConfig.maxPriorityFeePerGas
|
|
174
|
+
? BigInt(chainConfig.maxPriorityFeePerGas)
|
|
175
|
+
: feeData.maxPriorityFeePerGas;
|
|
176
|
+
const verifierContract = new Contract(txData.contract_address, IVerifierABI);
|
|
177
|
+
const txRequestData = await verifierContract.submitResponse.populateTransaction(...txDataArgs);
|
|
178
|
+
const request = {
|
|
179
|
+
to: txData.contract_address,
|
|
180
|
+
data: txRequestData.data,
|
|
181
|
+
maxFeePerGas,
|
|
182
|
+
maxPriorityFeePerGas
|
|
183
|
+
};
|
|
184
|
+
let gasLimit;
|
|
185
|
+
try {
|
|
186
|
+
gasLimit = await ethSigner.estimateGas(request);
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
gasLimit = maxGasLimit;
|
|
190
|
+
}
|
|
191
|
+
request.gasLimit = gasLimit;
|
|
192
|
+
const transactionService = new TransactionService(provider);
|
|
193
|
+
const { txnHash } = await transactionService.sendTransactionRequest(ethSigner, request);
|
|
194
|
+
// return multiple responses for all the responses (single and grouped)
|
|
195
|
+
return new Map().set(txnHash, {
|
|
196
|
+
responses: responses,
|
|
197
|
+
authProofs: [authResponse],
|
|
198
|
+
crossChainProofs: [txDataArgs[2]]
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
static async prepareTxArgsSubmit(resolverUrl, txData, authResponse, responses) {
|
|
202
|
+
if (txData.method_id.replace('0x', '') !== FunctionSignatures.SubmitResponse) {
|
|
203
|
+
throw new Error(`submit cross chain doesn't implement requested method id. Only '0x${FunctionSignatures.SubmitResponse}' is supported.`);
|
|
204
|
+
}
|
|
205
|
+
const gistUpdateArr = [];
|
|
206
|
+
const stateUpdateArr = [];
|
|
207
|
+
const payloadResponses = [];
|
|
208
|
+
// Process all the responses
|
|
209
|
+
for (const zkProof of responses) {
|
|
210
|
+
const { requestID, zkProofEncoded, metadata } = await this._processProof(zkProof);
|
|
211
|
+
payloadResponses.push({
|
|
212
|
+
requestId: requestID,
|
|
213
|
+
proof: zkProofEncoded,
|
|
214
|
+
metadata: metadata
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
const crossChainProofs = this.packCrossChainProofs(gistUpdateArr, stateUpdateArr);
|
|
218
|
+
return [authResponse, payloadResponses, crossChainProofs];
|
|
219
|
+
}
|
|
220
|
+
async prepareTxArgsSubmit(txData, authResponse, responses) {
|
|
221
|
+
if (!this._opts?.didResolverUrl) {
|
|
222
|
+
throw new Error(`did resolver url required for crosschain verification`);
|
|
223
|
+
}
|
|
224
|
+
return OnChainZKPVerifier.prepareTxArgsSubmit(this._opts.didResolverUrl, txData, authResponse, responses);
|
|
225
|
+
}
|
|
155
226
|
static getCrossChainResolvers(source, txDataChainId, type, didResolverUrl) {
|
|
156
227
|
return [
|
|
157
228
|
...new Set(source.map((info) => JSON.stringify({
|
|
@@ -193,10 +264,8 @@ export class OnChainZKPVerifier {
|
|
|
193
264
|
});
|
|
194
265
|
continue;
|
|
195
266
|
}
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
[zkProof.proof.pi_b[1][1], zkProof.proof.pi_b[1][0]]
|
|
199
|
-
], zkProof.proof.pi_c.slice(0, 2));
|
|
267
|
+
const preparedZkpProof = prepareZkpProof(zkProof.proof);
|
|
268
|
+
const zkProofEncoded = packZkpProof(inputs, preparedZkpProof.a, preparedZkpProof.b, preparedZkpProof.c);
|
|
200
269
|
const stateInfo = this.getOnChainGistRootStatePubSignals(proofCircuitId, inputs);
|
|
201
270
|
const chainId = txData.chain_id;
|
|
202
271
|
const gistUpdateResolutions = this.getCrossChainResolvers(stateInfo.gists, chainId, 'gist', resolverUrl);
|
|
@@ -239,8 +308,30 @@ export class OnChainZKPVerifier {
|
|
|
239
308
|
}
|
|
240
309
|
return OnChainZKPVerifier.prepareTxArgsSubmitV2(this._opts.didResolverUrl, txData, zkProofResponses);
|
|
241
310
|
}
|
|
242
|
-
static
|
|
243
|
-
|
|
311
|
+
static async _processProof(zkProof) {
|
|
312
|
+
const requestID = zkProof.id;
|
|
313
|
+
const inputs = zkProof.pub_signals;
|
|
314
|
+
if (!this._supportedCircuits.includes(zkProof.circuitId)) {
|
|
315
|
+
throw new Error(`Circuit ${zkProof.circuitId} not supported by OnChainZKPVerifier`);
|
|
316
|
+
}
|
|
317
|
+
const preparedZkpProof = prepareZkpProof(zkProof.proof);
|
|
318
|
+
const zkProofEncoded = packZkpProof(inputs, preparedZkpProof.a, preparedZkpProof.b, preparedZkpProof.c);
|
|
319
|
+
const metadataArr = [];
|
|
320
|
+
if (zkProof.vp) {
|
|
321
|
+
for (const key in zkProof.vp.verifiableCredential.credentialSubject) {
|
|
322
|
+
if (key === '@type') {
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
const metadataValue = poseidon.hashBytes(byteEncoder.encode(JSON.stringify(zkProof.vp.verifiableCredential.credentialSubject[key])));
|
|
326
|
+
const bytesValue = byteEncoder.encode(metadataValue.toString());
|
|
327
|
+
metadataArr.push({
|
|
328
|
+
key,
|
|
329
|
+
value: bytesValue
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const metadata = metadataArr.length ? this.packMetadatas(metadataArr) : '0x';
|
|
334
|
+
return { requestID, zkProofEncoded, metadata };
|
|
244
335
|
}
|
|
245
336
|
static packCrossChainProofs(gistUpdateArr, stateUpdateArr) {
|
|
246
337
|
const proofs = [];
|