Indy部署及開發(fā)

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)行截圖:


    2020-04-22 15-18-08屏幕截圖.png
  • Indy-Node詳細(xì)部署

    請參考:

    ? https://hyperledger-indy.readthedocs.io/projects/node/en/latest/start-nodes.html#scripts-for-initialization

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è)包含新建的 DIDNonce 的連接請求,并把請求發(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猖任,VerkeyNonce

    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']
    
  • StewardFaber 的 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è)組:

    1. 屬性值將會(huì)被透漏的
    2. 屬性值將不會(huì)被透漏的
    3. 對于創(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)
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亡资,一起剝皮案震驚了整個(gè)濱河市澜共,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锥腻,老刑警劉巖咳胃,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旷太,居然都是意外死亡展懈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門供璧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來存崖,“玉大人,你說我怎么就攤上這事睡毒±淳澹” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵演顾,是天一觀的道長供搀。 經(jīng)常有香客問我,道長钠至,這世上最難降的妖魔是什么葛虐? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮棉钧,結(jié)果婚禮上屿脐,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好的诵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布万栅。 她就那樣靜靜地躺著,像睡著了一般西疤。 火紅的嫁衣襯著肌膚如雪烦粒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天代赁,我揣著相機(jī)與錄音扰她,去河邊找鬼。 笑死管跺,一個(gè)胖子當(dāng)著我的面吹牛义黎,可吹牛的內(nèi)容都是我干的禾进。 我是一名探鬼主播豁跑,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泻云!你這毒婦竟也來了艇拍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤宠纯,失蹤者是張志新(化名)和其女友劉穎卸夕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婆瓜,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡快集,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了廉白。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片个初。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猴蹂,靈堂內(nèi)的尸體忽然破棺而出院溺,到底是詐尸還是另有隱情,我是刑警寧澤磅轻,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布珍逸,位于F島的核電站,受9級特大地震影響聋溜,放射性物質(zhì)發(fā)生泄漏谆膳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一撮躁、第九天 我趴在偏房一處隱蔽的房頂上張望摹量。 院中可真熱鬧,春花似錦、人聲如沸缨称。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睦尽。三九已至器净,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間当凡,已是汗流浹背山害。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沿量,地道東北人浪慌。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像朴则,于是被迫代替她去往敵國和親权纤。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354