Indy部署及開發(fā)
1、開發(fā)環(huán)境
? 開發(fā)基于indy-sdk
,其支持的系統(tǒng)有 Ubuntu (1604、1804)暂吉、Windows胖秒、IOS、Android慕的、Centos阎肝、MacOS,支持的語言和平臺有Java肮街、Python风题、IOS、Nodejs嫉父、.Net沛硅、Rust。
? 這里我將使用 Ubuntu18.04 作為開發(fā)環(huán)境绕辖,使用Python進(jìn)行開發(fā)測試摇肌。
? 環(huán)境不同請參考:https://github.com/hyperledger/indy-sdk/blob/master/README.md#how-to-start-local-nodes-pool-with-docker
安裝Docker(略)
-
安裝libindy
環(huán)境不同參考上面鏈接
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CE7709D068DB5E88 sudo add-apt-repository "deb https://repo.sovrin.org/sdk/deb bionic master" sudo apt-get update sudo apt-get install -y libindy
-
安裝libvcx
環(huán)境不同請參考:https://github.com/hyperledger/indy-sdk/tree/master/vcx
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CE7709D068DB5E88 sudo add-apt-repository "deb https://repo.sovrin.org/sdk/deb bionic master" sudo apt-get update sudo apt-get install -y libvcx
-
下載indy-sdk
git clone https://github.com/hyperledger/indy-sdk.git
-
安裝Python依賴
注意:應(yīng)使用Python3 !
pip3 install python3-indy asyncio
可以執(zhí)行下面命令檢測依賴是否正常(提示連接超時(shí)為正常現(xiàn)象)
# 當(dāng)前目錄:indy-sdk cd samples/python python3 -m src.main
-
在本地主機(jī)上啟動(dòng)測試pool
其他啟動(dòng)方式清參考上面第一個(gè)鏈接中的文檔
docker build -f ci/indy-pool.dockerfile -t indy_pool . docker run -itd -p 9701-9708:9701-9708 indy_pool
-
運(yùn)行Sample進(jìn)行測試
依賴于上面測試pool仪际,正常運(yùn)行則說明環(huán)境沒問題
# 當(dāng)前目錄:indy-sdk cd samples/python python3 -m src.main
成功運(yùn)行截圖:
-
Indy-Node詳細(xì)部署
請參考:
2围小、開發(fā)指南(Python)
具體請參考:
? https://digitid.cn/hyperledger/indy/indy-walkthrough
? https://github.com/hyperledger/indy-sdk/tree/master/docs/how-tos
相關(guān)完整代碼:
? https://github.com/hyperledger/indy-sdk/blob/master/samples/python/src/getting_started.py
1)steward agent 連接pool
pool_name = 'pool1'
pool_genesis_txn_path = get_pool_genesis_txn_path(pool_name)
#get_pool_genesis_txn_path在utils.py定義,創(chuàng)世交易
pool_config = json.dumps({"genesis_txn": str(pool_genesis_txn_path)})
await pool.create_pool_ledger_config(pool_name, pool_config)
#創(chuàng)建一個(gè)已命名的 pool configuration
pool_handle = await pool.open_pool_ledger(pool_name, None)
#連接在這個(gè) configuration 里提到的 nodes pool
2) steward agent 創(chuàng)建錢包和DID
steward agent 應(yīng)該取得在賬本上以 steward角色記錄的擁有對應(yīng)的 NYM transactions 的 DID 的 ownership树碱。
steward_wallet_name = 'sovrin_steward_wallet'
await wallet.create_wallet(pool_name, steward_wallet_name, None, None, None)
#創(chuàng)建一個(gè)已命名錢包
steward_wallet = await wallet.open_wallet(steward_wallet_name, None, None)
#打開/連接錢包
steward_did_info = {'seed': '000000000000000000000000Steward1'}
(steward_did, steward_key) = await did.create_and_store_my_did(steward_wallet, json.dumps(steward_did_info))
#指定seed生成didi和verkey
3)第三方機(jī)構(gòu)連接 steward agent
? 每個(gè)連接實(shí)際上應(yīng)該是一個(gè) Pairwise-Unique Identifiers(DIDs)對(pair)肯适。一個(gè) DID 是由與之連接的一方所有,第二個(gè)應(yīng)該是另一方所有成榜。
? 雙方都知道兩個(gè) DIDs 并且知道這個(gè)對兒描述的是什么連接框舔。
? 他們之間的關(guān)系是不會(huì)共享給其他人的,對于這兩方來說赎婚,每一個(gè) pairwise 關(guān)系都會(huì)使用不同的 DIDs雨饺,并且每個(gè) DID 都是唯一的。
? 我們將建立連接的這個(gè)過程稱為 Onboarding惑淳。
? 以下以faber學(xué)校與steward連接為例:
-
Steward 在它的錢包中創(chuàng)建了一個(gè)新的 DID额港,并且這個(gè) DID 僅僅會(huì)被用于同 Faber 之間的互動(dòng)。
(steward_faber_did, steward_faber_key) = await did.create_and_store_my_did(steward_wallet, "{}")
-
Steward 將對應(yīng)的
NYM
transaction 發(fā)送到賬本中歧焦,創(chuàng)建并發(fā)送 NYM 請求移斩。nym_request = await ledger.build_nym_request(steward_did, steward_faber_did, steward_faber_key, None, role) await ledger.sign_and_submit_request(pool_handle, steward_wallet, steward_did, nym_request)
-
Steward 創(chuàng)建了一個(gè)包含新建的
DID
和Nonce
的連接請求,并把請求發(fā)送給Faber绢馍。connection_request = { 'did': steward_faber_did, 'nonce': 123456789 }
Faber 接受請求
-
Faber 創(chuàng)建對應(yīng)DID向瓷,這個(gè) DID 僅僅會(huì)被用于同 Steward 進(jìn)行安全的交互。
如果Faber沒有錢包會(huì)先創(chuàng)建錢包:
await wallet.create_wallet(pool_name, 'faber_wallet', None, None, None) faber_wallet = await wallet.open_wallet('faber_wallet', None, None)
創(chuàng)建DID:
(faber_steward_did, faber_steward_key) = await did.create_and_store_my_did(faber_wallet, "{}")
-
Faber 創(chuàng)建了一個(gè)連接反饋(connection response)舰涌,這個(gè)反饋包含了來自于接收到的連接請求的新創(chuàng)建的
DID
猖任,Verkey
和Nonce
。connection_response = json.dumps({ 'did': faber_steward_did, 'verkey': faber_steward_key, 'nonce': connection_request['nonce'] })
-
Faber 向賬本請求 Steward 的 DID 的 Verification key瓷耙。
steward_faber_verkey = await did.key_for_did(pool_handle, faber_wallet, connection_request['did'])
-
Faber 使用 Steward verkey 將連接的 response 進(jìn)行了匿名的加密朱躺。
anoncrypted_connection_response = await crypto.anon_crypt(steward_faber_verkey, connection_response.encode('utf-8'))
Faber 將匿名加密過的連接 response 發(fā)送給 Steward刁赖。
-
Steward 匿名地將這個(gè)連接 response 進(jìn)行解密。
decrypted_connection_response = \ (await crypto.anon_decrypt(steward_wallet, steward_faber_key, anoncrypted_connection_response)).decode("utf-8")
-
Steward 通過對比 Nonce 來對 Feber 進(jìn)行授權(quán)长搀。
assert connection_request['nonce'] == decrypted_connection_response['nonce']
-
Steward 將 Faber 的 DID 的
NYM
transaction 發(fā)送給賬本宇弛。nym_request = await ledger.build_nym_request(steward_did, decrypted_connection_response['did'], decrypted_connection_response['verkey'], None, role) await ledger.sign_and_submit_request(pool_handle, steward_wallet, steward_did, nym_request)
Faber 成功跟 Steward 建立了連接
4)第三方機(jī)構(gòu)創(chuàng)建DID,發(fā)送給Steward進(jìn)行驗(yàn)證
第三方機(jī)構(gòu)依舊以Faber為例:
-
Faber 在它的錢包中創(chuàng)建了一個(gè)新的 DID源请。
(faber_did, faber_key) = await did.create_and_store_my_did(faber_wallet, "{}")
-
Faber 準(zhǔn)備了一個(gè)將要包含這個(gè)新創(chuàng)建的 DID 以及 verkey 的消息枪芒。
# Faber Agent faber_did_info_json = json.dumps({ 'did': faber_did, 'verkey': faber_key })
-
Faber 對消息進(jìn)行授權(quán)及加密,這個(gè)是對 authenticated-encryption schema 的一個(gè)實(shí)現(xiàn)谁尸。
? 被授權(quán)的加密被設(shè)計(jì)用來向指定的接收者發(fā)送一個(gè)對接收者比較特別的機(jī)密的消息舅踪。發(fā)送者可以使用接收者的公鑰(verkey)和它的密鑰(signing)計(jì)算出一個(gè)共享的安全密鑰。接收者使用發(fā)送者的公鑰(verkey)和它的密鑰(signing)能夠計(jì)算出完全一致的共享的安全密鑰良蛮。這個(gè)共享的密鑰(secret key)可以在最終解密前可以用來驗(yàn)證被加密過的消息并沒有被篡改過硫朦。
authcrypted_faber_did_info_json = \ await crypto.auth_crypt(faber_wallet, faber_steward_key, steward_faber_key, faber_did_info_json.encode('utf-8'))
Faber 將加密過的消息發(fā)送給 Steward。
-
Steward 將接收到的消息進(jìn)行解密背镇。
sender_verkey, authdecrypted_faber_did_info_json = \ await crypto.auth_decrypt(steward_handle, steward_faber_key, authcrypted_faber_did_info_json) faber_did_info = json.loads(authdecrypted_faber_did_info_json)
-
Steward 請求 Faber 的 DID 的確認(rèn)密鑰(verification key)咬展。
faber_verkey = await did.key_for_did(pool_handle, from_wallet, faber_did_info['did'])
-
Steward 通過對比消息發(fā)送者的 Verkey 和從賬本中獲得的 Faber 的 Verkey 來給 Faber 授權(quán)(相同的情況下)。
assert sender_verkey == faber_verkey
-
Steward 會(huì)以
TRUST ANCHOR
的角色將對應(yīng)的 NYM transaction 發(fā)送給賬本瞒斩。nym_request = await ledger.build_nym_request(steward_did, decrypted_faber_did_info_json['did'], decrypted_faber_did_info_json['verkey'], None, 'TRUST_ANCHOR') await ledger.sign_and_submit_request(pool_handle, steward_wallet, steward_did, nym_request)
5)設(shè)置 Credential Schemas
? 憑證的數(shù)據(jù)模板破婆。指憑證架構(gòu)的整體,包括元數(shù)據(jù)和JSON架構(gòu)胸囱。
? 它描述了一個(gè)特定的 Credential 可以包含的屬性列表祷舀,是頒發(fā)憑證的前提。(已存在的不能被更新)
一個(gè) Credential Schema 可以被任何的 Trust Anchor 創(chuàng)建并存儲(chǔ)到賬本中烹笔。
? 例如:
{
"id": "1",
"name": "gvt",
"version": "1.0",
"ver": "1.0",
"attrNames": ["age", "sex", "height", "name"]
}
? 下邊就是 政府(Government) 是如何創(chuàng)建和發(fā)布成績單的 Credential Schema 到賬本中的:
-
Trust Anchor 來創(chuàng)建一個(gè) Credential Schema裳扯,這個(gè)會(huì)返回新生成的 Credential Schema。
(transcript_schema_id, transcript_schema) = \ await anoncreds.issuer_create_schema(government_did, 'Transcript', '1.2', json.dumps(['first_name', 'last_name', 'degree', 'status', 'year', 'average', 'ssn']))
-
Trust Anchor 創(chuàng)建 Schema 請求谤职,發(fā)送新創(chuàng)建的請求饰豺,以此將對應(yīng)的 Schema transaction 發(fā)送給賬本。
schema_request = await ledger.build_schema_request(government_did, transcript_schema) await ledger.sign_and_submit_request(pool_handle, government_wallet, government_did, schema_request)
-
用同樣的方式允蜈,政府創(chuàng)建并發(fā)布了 Job-Certificate Credential Schema 到賬本中:
(job_certificate_schema_id, job_certificate_schema) = \ await anoncreds.issuer_create_schema(government_did, 'Job-Certificate', '0.2', json.dumps(['first_name', 'last_name', 'salary', 'employee_status', 'experience'])) schema_request = await ledger.build_schema_request(government_did, json.dumps(to the Ledger)) await ledger.sign_and_submit_request(pool_handle, government_wallet, government_did, schema_request)
到目前為止冤吨,由政府發(fā)布的 成績單(Transcript) 和 工作證明(Job-Certificate) Credential Schemas 已經(jīng)被發(fā)布在了賬本上。
6)設(shè)置 Credential Definition
? 這引用了上面的 Credential Schemas饶套,并宣布誰將使用該架構(gòu)發(fā)行憑據(jù)(在這種情況下漩蟆,我們的信任錨身份),他們計(jì)劃使用哪種簽名方法(“ CL” =“ Camenisch Lysyanskya” 妓蛮,是indy用于零知識證明的默認(rèn)方法)怠李,它們計(jì)劃如何處理吊銷,等等。(已存在的不能被更新)
? 一個(gè) Credential Definition 可以被任何 Trust Anchor 創(chuàng)建并保存到賬本中捺癞。
? 這里夷蚊,F(xiàn)aber 大學(xué)創(chuàng)建并發(fā)布了一個(gè)有關(guān)已知的 Transacript Credential Schema 的 Credential Definition 到賬本中。
-
Trust Anchor 從賬本中獲得指定的 Credential Schema翘簇。
get_schema_request = await ledger.build_get_schema_request(faber_did, transcript_schema_id) get_schema_response = await ledger.submit_request(pool_handle, get_schema_request) (transcript_schema_id, transcript_schema) = await ledger.parse_get_schema_response(get_schema_response)
-
Trust Anchor 創(chuàng)建Credential Definition。對于這個(gè) Credential Schema 的私有的 Credential Definition 部分也將會(huì)被存儲(chǔ)在錢包中儿倒,但是是不可能直接讀取出來的版保。
(faber_transcript_cred_def_id, faber_transcript_cred_def_json) = \ await anoncreds.issuer_create_and_store_credential_def(faber_wallet, faber_did, transcript_schema, 'TAG1', 'CL', '{"support_revocation": false}')
-
Trust Anchor 將對應(yīng)的
CredDef
transaction 發(fā)送到賬本中。cred_def_request = await ledger.build_cred_def_request(faber_did, faber_transcript_cred_def_json) await ledger.sign_and_submit_request(pool_handle, faber_wallet, faber_did, cred_def_request)
-
同樣的方式夫否,Acem 公司 為這個(gè)已知的 Job-Certificate Credential Schema 創(chuàng)建并發(fā)布了一個(gè) Credential Definition 到賬本中彻犁。
# Acme Agent get_schema_request = await ledger.build_get_schema_request(acme_did, job_certificate_schema_id) get_schema_response = await ledger.submit_request(pool_handle, get_schema_request) (job_certificate_schema_id, job_certificate_schema) = await ledger.parse_get_schema_response(get_schema_response) (acme_job_certificate_cred_def_id, acme_job_certificate_cred_def_json) = \ await anoncreds.issuer_create_and_store_credential_def(acme_wallet, acme_did, job_certificate_schema, 'TAG1', 'CL', '{"support_revocation": false}') cred_def_request = await ledger.build_cred_def_request(acme_did, acme_job_certificate_cred_def_json) await ledger.sign_and_submit_request(pool_handle, acme_wallet, acme_did, cred_def_request)
到目前為止,我們已經(jīng)有了一個(gè)由 Acem 公司 發(fā)布的關(guān)于 Job-Certificate Credential Schema 的 Credential Definition凰慈,和一個(gè)由 Faber 大學(xué) 發(fā)布的有關(guān) Transcript Credential Schema 的 Credential Definition汞幢。
7)獲取Credential
? 一個(gè) credential 是有關(guān)一個(gè)身份的部分信息 – 一個(gè)名字,年齡微谓,信用積分…這些信息都應(yīng)該是真實(shí)的森篷。
? Credential 是由一個(gè)發(fā)行方提供的。
? 這里以Alice成績單獲取為例豺型,Alice畢業(yè)于Faber學(xué)校仲智。
-
Faber為Alice創(chuàng)建了一個(gè)發(fā)行 成績單 Credential 的一個(gè) Credential Offer。
# Faber Agent transcript_cred_offer_json = await anoncreds.issuer_create_credential_offer(faber_wallet, faber_transcript_cred_def_id)
-
Alice 想要查看這個(gè) 成績單 Credential 所包含的屬性姻氨。
# Alice Agent get_schema_request = await ledger.build_get_schema_request(alice_faber_did, transcript_cred_offer['schema_id']) get_schema_response = await ledger.submit_request(pool_handle, get_schema_request) transcript_schema = await ledger.parse_get_schema_response(get_schema_response) print(transcript_schema['data']) # Transcript Schema: { 'name': 'Transcript', 'version': '1.2', 'attr_names': ['first_name', 'last_name', 'degree', 'status', 'year', 'average', 'ssn'] }
-
創(chuàng)建一個(gè) Master Secret是獲取成績單的前提钓辆。
注意:一個(gè) Master Secret 是一個(gè)供證明人使用的關(guān)于私有數(shù)據(jù)的 item,用來保證一個(gè) credential 能夠唯一地應(yīng)用于自己肴焊。Master Secret 是一個(gè) input前联,這個(gè) input 合并了來自于多個(gè) Credentials 的數(shù)據(jù),用來證明這些 Credentials 有一個(gè)通用的主題(common subject)(證明者)娶眷。一個(gè) Master Secret 應(yīng)該只有證明者自己知道似嗤。
# Alice Agent alice_master_secret_id = await anoncreds.prover_create_master_secret(alice_wallet, None)
-
Alice 還需要得到對應(yīng)于在 成績單 Credential Offer 中的
cred_def_id
的 Credential Definition。# Alice Agent get_cred_def_request = await ledger.build_get_cred_def_request(alice_faber_did, transcript_cred_offer['cred_def_id']) get_cred_def_response = await ledger.submit_request(pool_handle, get_cred_def_request) faber_transcript_cred_def = await ledger.parse_get_cred_def_response(get_cred_def_response)
-
Alice 已經(jīng)有了用于創(chuàng)建一個(gè)有關(guān)發(fā)行 Faber 大學(xué)成績單 Credential 的請求的所有信息届宠。
# Alice Agent (transcript_cred_request_json, transcript_cred_request_metadata_json) = \ await anoncreds.prover_create_credential_req(alice_wallet, alice_faber_did, transcript_cred_offer_json, faber_transcript_cred_def, alice_master_secret_id)
-
Faber 大學(xué) 為這個(gè) 成績單 Credential Schema 中的每個(gè)屬性準(zhǔn)備 raw 和 encoded 值双谆。Faber 大學(xué)為 Alice 創(chuàng)建了 成績單 Credential。
# Faber Agent # note that encoding is not standardized by Indy except that 32-bit integers are encoded as themselves. IS-786 transcript_cred_values = json.dumps({ "first_name": {"raw": "Alice", "encoded": "1139481716457488690172217916278103335"}, "last_name": {"raw": "Garcia", "encoded": "5321642780241790123587902456789123452"}, "degree": {"raw": "Bachelor of Science, Marketing", "encoded": "12434523576212321"}, "status": {"raw": "graduated", "encoded": "2213454313412354"}, "ssn": {"raw": "123-45-6789", "encoded": "3124141231422543541"}, "year": {"raw": "2015", "encoded": "2015"}, "average": {"raw": "5", "encoded": "5"} }) transcript_cred_json, _, _ = \ await anoncreds.issuer_create_credential(faber_wallet, transcript_cred_offer_json, transcript_cred_request_json, transcript_cred_values, None, None)
-
現(xiàn)在席揽,成績單 Credential 已經(jīng)被發(fā)行出來了顽馋。Alice 將它保存在了自己的錢包中。
# Alice Agent await anoncreds.prover_store_credential(alice_wallet, None, transcript_cred_request_json, transcript_cred_request_metadata_json, transcript_cred_json, faber_transcript_cred_def, None)
8)為其他第三方機(jī)構(gòu)提供證明
這里以Alice申請工作為例幌羞,Alice需要為Acme Corp提供**工作申請表(Job Application)**寸谜,這個(gè)申請表中要求一個(gè)名字、學(xué)歷属桦、狀態(tài)熊痴、SSN 和是否滿足在校平均分?jǐn)?shù)的一些條件他爸。
? Job-Application Proof Request如下:(屬性部分是不可證實(shí)的)
# Acme Agent
job_application_proof_request_json = json.dumps({
'nonce': '1432422343242122312411212',
'name': 'Job-Application',
'version': '0.1',
'requested_attributes': {
'attr1_referent': {
'name': 'first_name'
},
'attr2_referent': {
'name': 'last_name'
},
'attr3_referent': {
'name': 'degree',
'restrictions': [{'cred_def_id': faber_transcript_cred_def_id}]
},
'attr4_referent': {
'name': 'status',
'restrictions': [{'cred_def_id': faber_transcript_cred_def_id}]
},
'attr5_referent': {
'name': 'ssn',
'restrictions': [{'cred_def_id': faber_transcript_cred_def_id}]
},
'attr6_referent': {
'name': 'phone_number'
}
},
'requested_predicates': {
'predicate1_referent': {
'name': 'average',
'p_type': '>=',
'p_value': 4,
'restrictions': [{'cred_def_id': faber_transcript_cred_def_id}]
}
}
})
-
顯示 Alice 可以用來創(chuàng)建 Job-Application Proof 請求的 Proof 的 Credentials
# Alice Agent creds_for_job_application_proof_request = json.loads( await anoncreds.prover_get_credentials_for_proof_req(alice_wallet, job_application_proof_request_json))
Alice 只有一項(xiàng) credential 滿足 Job Application 的 proof 要求。
# Alice Agent { 'referent': 'Transcript Credential Referent', 'attrs': { 'first_name': 'Alice', 'last_name': 'Garcia', 'status': 'graduated', 'degree': 'Bachelor of Science, Marketing', 'ssn': '123-45-6789', 'year': '2015', 'average': '5' }, 'schema_id': job_certificate_schema_id, 'cred_def_id': faber_transcript_cred_def_id, 'rev_reg_id': None, 'cred_rev_id': None }
現(xiàn)在 Alice 可以將這些屬性分為三個(gè)組:
- 屬性值將會(huì)被透漏的
- 屬性值將不會(huì)被透漏的
- 對于創(chuàng)建可證實(shí)的 proof 不需要的屬性
對于這個(gè) Job-Application Proof Request果善,Alice 將屬性按照下邊的方式分組:
# Alice Agent job_application_requested_creds_json = json.dumps({ 'self_attested_attributes': { 'attr1_referent': 'Alice', 'attr2_referent': 'Garcia', 'attr6_referent': '123-45-6789' }, 'requested_attributes': { 'attr3_referent': {'cred_id': cred_for_attr3['referent'], 'revealed': True}, 'attr4_referent': {'cred_id': cred_for_attr4['referent'], 'revealed': True}, 'attr5_referent': {'cred_id': cred_for_attr5['referent'], 'revealed': True}, }, 'requested_predicates': {'predicate1_referent': {'cred_id': cred_for_predicate1['referent']}} })
Alice 必須為每一個(gè)使用的 Credential 取得 Credential Schema 和對應(yīng)的 Credential Definition诊笤,就像在創(chuàng)建 Credential 請求時(shí)候的步驟一樣。
-
現(xiàn)在 Alice 有了創(chuàng)建 Acme Job-Application 創(chuàng)建 Proof Request 的 Proof 的所有信息巾陕。
# Alice Agent apply_job_proof_json = \ await anoncreds.prover_create_proof(alice_wallet, job_application_proof_request_json, job_application_requested_creds_json, alice_master_secret_id, schemas_json, cred_defs_json, revoc_states_json)
-
當(dāng) Acme 公司 收到了這個(gè) Proof 的時(shí)候讨跟,他們看到的應(yīng)該是下邊的結(jié)構(gòu):
# Acme Agent { 'requested_proof': { 'revealed_attrs': { 'attr4_referent': {'sub_proof_index': 0, 'raw':'graduated', 'encoded':'2213454313412354'}, 'attr5_referent': ['sub_proof_index': 0, 'raw':'123-45-6789', 'encoded':'3124141231422543541'}, 'attr3_referent': ['sub_proof_index': 0, 'raw':'Bachelor of Science, Marketing', 'encoded':'12434523576212321'} }, 'self_attested_attrs': { 'attr1_referent': 'Alice', 'attr2_referent': 'Garcia', 'attr6_referent': '123-45-6789' }, 'unrevealed_attrs': {}, 'predicates': { 'predicate1_referent': {'sub_proof_index': 0} } }, 'proof' : [] # Validity Proof that Acme can check 'identifiers' : [ # Identifiers of credentials were used for Proof building { 'schema_id': job_certificate_schema_id, 'cred_def_id': faber_transcript_cred_def_id, 'rev_reg_id': None, 'timestamp': None } } }
-
Acem 得到了所有所需的屬性。現(xiàn)在 Acem 想要校驗(yàn)這個(gè) Validity Proof鄙煤。
? Acem 必須要獲得在 Proof 中提及的每個(gè) identifier 的 Credential Schema 和相對應(yīng)的 Credential Definition晾匠,就像 Alice 之前做的一樣。現(xiàn)在 Acme 有了驗(yàn)證來自于 Alice 的 Job-Application Proof 的所有信息梯刚。
# Acme Agent assert await anoncreds.verifier_verify_proof(job_application_proof_request_json, apply_job_proof_json, schemas_json, cred_defs_json, revoc_ref_defs_json, revoc_regs_json)
-
假設(shè)這個(gè)申請表被接受了并且 Alice 最終得到了這份工作凉馆。Acem 為 Alice 創(chuàng)建了一個(gè)新的 Credential Offer。
# Acme Agent job_certificate_cred_offer_json = await anoncreds.issuer_create_credential_offer(acme_wallet, acme_job_certificate_cred_def_id)