diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 2524652..85d0487 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -14,31 +14,15 @@ version: "3" services: ##### Bob Services ##### - # wallet-db - # a postgres database where agent data will be persisted unless you run ./manage down - # ./manage stop with stop the containers but persist the database volumes - bob-wallet-db: - image: postgres:11 - container_name: bob-wallet-db - command: postgres -c listen_addresses='*' - # env file defines - env_file: - - playground/bob/.env - # This creates the data base tables if not present. See resources/init.sql # - volumes: - - ./resources/init.sql:/docker-entrypoint-initdb.d/init.sql - networks: - - bob-domain - tty: true ### agent - # This is bob's ACA-Py instance + # This is holder's ACA-Py instance # See dockerfiles/Dockerfile.agent - bob-agent: + holder-agent: build: context: . dockerfile: dockerfiles/Dockerfile.agent.prod env_file: - - playground/bob/.env + - playground/holder/.env ## These map from ports defined in the .env file to unique ports on your machine ## YOUR_MACHINE:DOCKER_SERVICE ports: @@ -46,77 +30,154 @@ services: - 4020:3020 # ADMIN_PORT - 4021:3021 - depends_on: - - bob-wallet-db + volumes: + - ./playground/holder/logs:/home/indy/logs networks: - - bob-domain + - indy-network ### business-logic # This is where you will create notebooks to interact with your agent # This uses the aries-cloudcontroller pip package. # See dockerfiles/Dockerfile.controller # All business logic share a common set of code recipes to get you started - bob-business-logic: + holder-business-logic: build: context: . dockerfile: dockerfiles/Dockerfile.controller env_file: - - playground/bob/.env + - playground/holder/.env depends_on: - - bob-agent - networks: - - bob-domain + - holder-agent volumes: - - ./playground/bob/notebooks:/workspace + - ./playground/holder/notebooks:/workspace - ./recipes:/workspace/recipes - ./libs:/workspace/libs + networks: + - indy-network ports: # Jupyter Notebook port - always map from 8888 to any available port - 8889:8888 # WEBHOOK_PORT - 4010:3010 + prover-agent: + build: + context: . + dockerfile: dockerfiles/Dockerfile.agent.prod + env_file: + - playground/prover/.env + ports: + # HTTP_PORT + - 5020:3020 + # ADMIN_PORT + - 5021:3021 + volumes: + - ./playground/prover/logs:/home/indy/logs + networks: + - indy-network + prover-business-logic: + build: + context: . + dockerfile: dockerfiles/Dockerfile.controller + env_file: + - playground/prover/.env + depends_on: + - prover-agent + networks: + - indy-network + volumes: + - ./playground/prover/notebooks:/workspace + - ./recipes:/workspace/recipes + ports: + - 8890:8888 + # WEBHOOK_PORT + - 5010:3010 ######################################################################### #### Alice Services - alice-wallet-db: + issuer-wallet-db: image: postgres:11 - container_name: alice-wallet-db + container_name: issuer-wallet-db command: postgres -c listen_addresses='*' env_file: - - playground/alice/.env + - playground/issuer/.env volumes: - ./resources/init.sql:/docker-entrypoint-initdb.d/init.sql - networks: - - alice-domain tty: true - alice-agent: + networks: + - indy-network + issuer-agent: build: context: . dockerfile: dockerfiles/Dockerfile.agent.prod env_file: - - playground/alice/.env + - playground/issuer/.env ports: - 3020:3020 - 3021:3021 - depends_on: - - alice-wallet-db + volumes: + - ./playground/issuer/logs:/home/indy/logs networks: - - alice-domain - alice-business-logic: + - indy-network + depends_on: + - issuer-wallet-db + issuer-business-logic: build: context: . dockerfile: dockerfiles/Dockerfile.controller env_file: - - playground/alice/.env + - playground/issuer/.env depends_on: - - alice-agent + - issuer-agent networks: - - alice-domain + - indy-network volumes: - - ./playground/alice/notebooks:/workspace + - ./playground/issuer/notebooks:/workspace - ./recipes:/workspace/recipes - ./libs:/workspace/libs ports: - "8888:8888" - 3010:3010 + verifier-wallet-db: + image: postgres:11 + container_name: verifier-wallet-db + command: postgres -c listen_addresses='*' + env_file: + - playground/verifier/.env + volumes: + - ./resources/init.sql:/docker-entrypoint-initdb.d/init.sql + tty: true + networks: + - indy-network + verifier-agent: + build: + context: . + dockerfile: dockerfiles/Dockerfile.agent.prod + env_file: + - playground/verifier/.env + ports: + - 6020:3020 + - 6021:3021 + volumes: + - ./playground/verifier/logs:/home/indy/logs + networks: + - indy-network + depends_on: + - verifier-wallet-db + verifier-business-logic: + build: + context: . + dockerfile: dockerfiles/Dockerfile.controller + env_file: + - playground/verifier/.env + depends_on: + - verifier-agent + networks: + - indy-network + volumes: + - ./playground/verifier/notebooks:/workspace + - ./recipes:/workspace/recipes + - ./libs:/workspace/libs + ports: + - "8891:8888" + - 6010:3010 # #### ACTOR TEMPLATE SERVICES - Uncomment and edit as appropriate ###### # actor-wallet-db: # image: postgres:11 @@ -164,23 +225,21 @@ services: # - :3010 ##### UNCOMMENT FOR A TAILS SERVER ###### # Note - for revocation to work you will have to make additional changes to the env files -# tails-server: -# env_file: -# - playground/alice/.env -# build: -# context: https://github.com/bcgov/indy-tails-server.git -# dockerfile: docker/Dockerfile.tails-server -# ports: -# - 6543:6543 -# networks: -# - demo-participant-domain -# - hlgf-domain -# command: > -# tails-server -# --host 0.0.0.0 -# --port 6543 -# --storage-path /tmp/tails-files -# --log-level INFO + tails-server: + env_file: + - playground/issuer/.env + build: + context: https://github.com/bcgov/indy-tails-server.git + dockerfile: docker/Dockerfile.tails-server + ports: + - 6543:6543 + networks: + - indy-network + command: > + tails-server + --host 0.0.0.0 + --port 6543 + --storage-path /tmp/tails-files + --log-level INFO networks: - alice-domain: - bob-domain: + indy-network: diff --git a/docker-compose.yml b/docker-compose.yml index bb4e36d..c6e7766 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,15 +1,15 @@ ###################################################################################### ############# Aries ACA-Py ACC-Py Jupyter Playground Configuration ############### ###################################################################################### -##### The example configuration defines services for two actors: Alice and Bob ##### -##### A template for the set of actor actor is provided below these ##### +##### The example configuration defines services for two provers: Alice and Bob ##### +##### A template for the set of prover prover is provided below these ##### ##### Uncomment and customise as you like ##### -##### You will need to create a folder under playground for this actor ##### -##### Copy the template playground/actor folder to get started ##### +##### You will need to create a folder under playground for this prover ##### +##### Copy the template playground/prover folder to get started ##### ##### This contains an empty notebooks folder and a template dummy.env file ##### ##### The notebooks folder will be mounted in the jupyter workspace ##### ##### You need to customise the dummy.env file and rename it to .env ##### -##### Change any variables enclosed with < > e.g. ENV= ##### +##### Change any variables enclosed with < > e.g. ENV= ##### ##### You do not need to change the ports - each agent runs on it's own container #### ##### Make sure you map the ports in the env file to unique ports on your machine #### ##### All the docker services use this file ##### @@ -18,41 +18,25 @@ version: "3" services: ##### Bob Services ##### - # wallet-db - # a postgres database where agent data will be persisted unless you run ./manage down - # ./manage stop with stop the containers but persist the database volumes - bob-wallet-db: - image: postgres:11 - container_name: bob-wallet-db - command: postgres -c listen_addresses='*' - # env file defines - env_file: - - playground/bob/.env - # This creates the data base tables if not present. See resources/init.sql # - volumes: - - ./resources/init.sql:/docker-entrypoint-initdb.d/init.sql - networks: - - bob-domain - tty: true #### ngrok # Use if wish to expose agent to public. E.g. so mobile wallets can access # - ngrok-bob: + ngrok-holder: image: wernight/ngrok env_file: - - playground/bob/.env - ## You must make sure this points to your agent service. e.g. bob-agent:HTTP_PORT - command: ngrok http bob-agent:3020 --log stdout + - playground/holder/.env + ## You must make sure this points to your agent service. e.g. holder-agent:HTTP_PORT + command: ngrok http holder-agent:3020 --log stdout networks: - - bob-domain + - holder-domain ### agent - # This is bob's ACA-Py instance + # This is holder's ACA-Py instance # See dockerfiles/Dockerfile.agent - bob-agent: + holder-agent: build: context: . dockerfile: dockerfiles/Dockerfile.agent env_file: - - playground/bob/.env + - playground/holder/.env ## These map from ports defined in the .env file to unique ports on your machine ## YOUR_MACHINE:DOCKER_SERVICE ports: @@ -60,27 +44,27 @@ services: - 4020:3020 # ADMIN_PORT - 4021:3021 - depends_on: - - bob-wallet-db + volumes: + - ./playground/holder/logs:/home/indy/logs networks: - - bob-domain + - holder-domain ### business-logic # This is where you will create notebooks to interact with your agent # This uses the aries-cloudcontroller pip package. # See dockerfiles/Dockerfile.controller # All business logic share a common set of code recipes to get you started - bob-business-logic: + holder-business-logic: build: context: . dockerfile: dockerfiles/Dockerfile.controller env_file: - - playground/bob/.env + - playground/holder/.env depends_on: - - bob-agent + - holder-agent networks: - - bob-domain + - holder-domain volumes: - - ./playground/bob/notebooks:/workspace + - ./playground/holder/notebooks:/workspace - ./recipes:/workspace/recipes - ./libs:/workspace/libs ports: @@ -90,123 +74,113 @@ services: - 4010:3010 ######################################################################### #### Alice Services - alice-wallet-db: + issuer-wallet-db: image: postgres:11 - container_name: alice-wallet-db + container_name: issuer-wallet-db command: postgres -c listen_addresses='*' env_file: - - playground/alice/.env + - playground/issuer/.env volumes: - ./resources/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - - alice-domain + - issuer-domain tty: true - ngrok-alice: + ngrok-issuer: image: wernight/ngrok env_file: - - playground/alice/.env - command: ngrok http alice-agent:3020 --log stdout + - playground/issuer/.env + command: ngrok http issuer-agent:3020 --log stdout networks: - - alice-domain - alice-agent: + - issuer-domain + issuer-agent: build: context: . dockerfile: dockerfiles/Dockerfile.agent env_file: - - playground/alice/.env + - playground/issuer/.env ports: - 3020:3020 - 3021:3021 + volumes: + - ./playground/issuer/logs:/home/indy/logs depends_on: - - alice-wallet-db + - issuer-wallet-db networks: - - alice-domain - alice-business-logic: + - issuer-domain + issuer-business-logic: build: context: . dockerfile: dockerfiles/Dockerfile.controller env_file: - - playground/alice/.env + - playground/issuer/.env depends_on: - - alice-agent + - issuer-agent networks: - - alice-domain + - issuer-domain volumes: - - ./playground/alice/notebooks:/workspace + - ./playground/issuer/notebooks:/workspace - ./recipes:/workspace/recipes - ./libs:/workspace/libs ports: - "8888:8888" - 3010:3010 # #### ACTOR TEMPLATE SERVICES - Uncomment and edit as appropriate ###### -# actor-wallet-db: -# image: postgres:11 -# container_name: actor-wallet-db -# command: postgres -c listen_addresses='*' -# # env file defines -# env_file: -# - playground/actor/.env -# volumes: -# - ./resources/init.sql:/docker-entrypoint-initdb.d/init.sql -# networks: -# - actor-domain -# tty: true -# ngrok-actor: -# image: wernight/ngrok -# command: ngrok http actor-agent:3020 --log stdout -# networks: -# - actor-domain -# actor-agent: -# build: -# context: . -# dockerfile: dockerfiles/Dockerfile.agent -# env_file: -# - playground/actor/.env -# ports: -# # HTTP_PORT -# - :3020 -# # ADMIN_PORT -# - :3021 -# depends_on: -# - actor-wallet-db -# networks: -# - actor-domain -# actor-business-logic: -# build: -# context: . -# dockerfile: dockerfiles/Dockerfile.controller -# env_file: -# - playground/actor/.env -# depends_on: -# - actor-agent -# networks: -# - actor-domain -# volumes: -# - ./playground/actor/notebooks:/workspace -# - ./recipes:/workspace/recipes -# ports: -# - 8890:8888 -# # WEBHOOK_PORT -# - :3010 + ngrok-prover: + image: wernight/ngrok + command: ngrok http prover-agent:3020 --log stdout + networks: + - prover-domain + prover-agent: + build: + context: . + dockerfile: dockerfiles/Dockerfile.agent + env_file: + - playground/prover/.env + ports: + # HTTP_PORT + - 5020:3020 + # ADMIN_PORT + - 5021:3021 + networks: + - prover-domain + prover-business-logic: + build: + context: . + dockerfile: dockerfiles/Dockerfile.controller + env_file: + - playground/prover/.env + depends_on: + - prover-agent + networks: + - prover-domain + volumes: + - ./playground/prover/notebooks:/workspace + - ./recipes:/workspace/recipes + ports: + - 8890:8888 + # WEBHOOK_PORT + - 5010:3010 ##### UNCOMMENT FOR A TAILS SERVER ###### # Note - for revocation to work you will have to make additional changes to the env files -# tails-server: -# env_file: -# - playground/alice/.env -# build: -# context: https://github.com/bcgov/indy-tails-server.git -# dockerfile: docker/Dockerfile.tails-server -# ports: -# - 6543:6543 -# networks: -# - alice-domain -# - bob-domain -# command: > -# tails-server -# --host 0.0.0.0 -# --port 6543 -# --storage-path /tmp/tails-files -# --log-level INFO + tails-server: + env_file: + - playground/issuer/.env + build: + context: https://github.com/bcgov/indy-tails-server.git + dockerfile: docker/Dockerfile.tails-server + ports: + - 6543:6543 + networks: + - issuer-domain + - holder-domain + - prover-domain + command: > + tails-server + --host 0.0.0.0 + --port 6543 + --storage-path /tmp/tails-files + --log-level INFO networks: - alice-domain: - bob-domain: + issuer-domain: + holder-domain: + prover-domain: diff --git a/dockerfiles/Dockerfile.agent.prod b/dockerfiles/Dockerfile.agent.prod index ab68935..f89652c 100644 --- a/dockerfiles/Dockerfile.agent.prod +++ b/dockerfiles/Dockerfile.agent.prod @@ -13,6 +13,8 @@ RUN chmod +x ./jq COPY scripts/startup-prod.sh startup.sh RUN chmod +x ./startup.sh +ADD resources/von-local-genesis-txns von-local-genesis-txns + USER $user diff --git a/issuance-aries-timings.txt b/issuance-aries-timings.txt new file mode 100644 index 0000000..8ad2eea --- /dev/null +++ b/issuance-aries-timings.txt @@ -0,0 +1,22 @@ +ConnectionManager.get_connection_targets 36867.60030 0.00087 +credential_exchange_send 36867.34896 0.26516 +credential_exchange_send 36867.35232 0.26522 +outbound-http:POST 36867.60077 0.05439 +PackWireFormat.pack 36867.62142 0.17722 +outbound-http:POST 36867.81434 0.16355 +PackWireFormat.unpack 36868.12120 0.00878 +ConnectionManager.find_inbound_connection 36868.13506 0.00519 +outbound-http:POST 36868.44580 0.01124 +ConnectionManager.get_connection_targets 36868.83577 0.00132 +Conductor.outbound_message_router 36868.81339 0.02391 +CredentialRequestHandler.handle 36868.14040 0.69736 +Dispatcher.handle_message 36868.13546 0.70763 +outbound-http:POST 36868.83672 0.05341 +PackWireFormat.pack 36868.84366 0.21533 +outbound-http:POST 36869.07309 0.20084 +PackWireFormat.unpack 36869.76008 0.00449 +ConnectionManager.find_inbound_connection 36869.76772 0.00534 +CredentialAckHandler.handle 36869.77318 0.39305 +Dispatcher.handle_message 36869.76516 0.40170 +outbound-http:POST 36870.16255 0.00876 + diff --git a/libs/performance_service/__init__.py b/libs/performance_service/__init__.py index e69de29..989d951 100644 --- a/libs/performance_service/__init__.py +++ b/libs/performance_service/__init__.py @@ -0,0 +1 @@ +from .performance_service import PerformanceService \ No newline at end of file diff --git a/libs/performance_service/performance_service.py b/libs/performance_service/performance_service.py index e69de29..3616a86 100644 --- a/libs/performance_service/performance_service.py +++ b/libs/performance_service/performance_service.py @@ -0,0 +1,132 @@ +import time +import asyncio +import nest_asyncio +from termcolor import colored +nest_asyncio.apply() +import json + +class PerformanceService: + + def __init__(self, agent_controller, iterations: int = 100): + self.iterations = iterations + self.agent_controller = agent_controller + + self.agent_listeners = [ + {"topic": "issue_credential", "handler": self._issuer_handler}, + {"topic": "present_proof", "handler": self._verifier_handler}, + {"topic": "connections", "handler": self._connections_handler}, + ] + self.agent_controller.register_listeners(self.agent_listeners, defaults=True) + + self.experiments = [] + self.timing_future = None + + def new_experiment(self, name): + experiment = {"name": name, "results": []} + self.experiments.append(experiment) + return experiment + + async def run_issuance(self, experiment, test, connection_id): + + result = {"name" : test["name"], "timings": []} + + + schema_id = test['schema_id'] + cred_def_id = test['cred_def_id'] + attributes = test['attributes'] + sum = 0 + for x in range(self.iterations): + self.timing_future = asyncio.Future() + start_time = time.perf_counter() + await self.agent_controller.issuer.send_credential(connection_id, schema_id, cred_def_id, attributes) + + await self.timing_future + elapsed_time = time.perf_counter() - start_time + result["timings"].append(elapsed_time) + sum += elapsed_time + + # print(f"Elapsed time: {elapsed_time:0.5f} seconds") + + average = sum / self.iterations + # print("Timings : ", result["timings"]) + print("Average : ", average) + + result["average"] = average + + experiment["results"].append(result) + + + async def run_verification(self, experiment, test, connection_id): + result = {"name" : test["name"], "timings": []} + + proof_request_json = { + "comment": "some optional comment", + "connection_id": connection_id, + "proof_request": test["proof_request"], + # Do you want your agent to trace this request (for debugging) + "trace": False + } + sum = 0 + for x in range(self.iterations): + self.timing_future = asyncio.Future() + start_time = time.perf_counter() + await self.agent_controller.proofs.send_request(proof_request_json) + + await self.timing_future + elapsed_time = time.perf_counter() - start_time + result["timings"].append(elapsed_time) + sum += elapsed_time + + average = sum / self.iterations + # print("Timings : ", result["timings"]) + print("Average : ", average) + + result["average"] = average + + experiment["results"].append(result) + + + def save_experiments(self): + for experiment in self.experiments: + + file_name = experiment["name"] + ".txt" + + with open(file_name, 'w') as outfile: + json.dump(experiment, outfile) + + + + + + def load_experiment_from_file(self, file_name): + + with open(file_name) as json_file: + data = json.load(json_file) + self.experiments.append(data) + + + + + def _verifier_handler(self, payload): + state = payload['state'] + + if state == "verified": + self.timing_future.set_result(True) + + + def _issuer_handler(self, payload): + state = payload['state'] + ## YOUR LOGIC HERE + if state == "credential_acked": + # print(self.issuance_future) + self.timing_future.set_result(True) + + def _connections_handler(self, payload): + state = payload['state'] + connection_id = payload["connection_id"] + their_role = payload["their_role"] + routing_state = payload["routing_state"] + + if state == "active": + # Your business logic + print(colored("Connection ID: {0} is now active.".format(connection_id), "green", attrs=["bold"])) \ No newline at end of file diff --git a/manage.sh b/manage.sh index 39aa1ca..40fbebb 100755 --- a/manage.sh +++ b/manage.sh @@ -64,14 +64,19 @@ EOF # ----------------------------------------------------------------------------------------------------------------- # Default Settings: # ----------------------------------------------------------------------------------------------------------------- -DEFAULT_CONTAINERS="bob-wallet-db ngrok-bob bob-agent bob-business-logic - alice-wallet-db ngrok-alice alice-agent alice-business-logic" - # tails-server " - -PRODUCTION_CONTAINERS="bob-wallet-db bob-agent bob-business-logic - alice-wallet-db alice-agent alice-business-logic" - -# DEFAULT_CONTAINERS="bob-agent alice-agent" +DEFAULT_CONTAINERS="ngrok-holder holder-agent holder-business-logic + ngrok-prover prover-agent prover-business-logic + issuer-wallet-db ngrok-issuer issuer-agent issuer-business-logic + verifier-wallet-db verifier-agent verifier-business-logic + tails-server" + +PRODUCTION_CONTAINERS="holder-agent holder-business-logic + prover-agent prover-business-logic + issuer-wallet-db issuer-agent issuer-business-logic + verifier-wallet-db verifier-agent verifier-business-logic + tails-server" + +# DEFAULT_CONTAINERS="holder-agent issuer-agent" # ----------------------------------------------------------------------------------------------------------------- # Functions: # ----------------------------------------------------------------------------------------------------------------- diff --git a/playground/holder/example.env b/playground/holder/example.env index 33499ce..fc508a3 100644 --- a/playground/holder/example.env +++ b/playground/holder/example.env @@ -3,17 +3,17 @@ # Replace these with real values when deploying to a real environment # For postgres DB which hosts the wallets -WALLET_DB_HOST=bob-wallet-db -WALLET_DB_PORT=5432 -WALLET_DB_USER=postgres -WALLET_DB_PASS=dbpass -WALLET_DB_ADMIN_USER=postgres -WALLET_DB_ADMIN_PASS=dbpass +#WALLET_DB_HOST=holder-wallet-db +#WALLET_DB_PORT=5432 +#WALLET_DB_USER=postgres +#WALLET_DB_PASS=dbpass +#WALLET_DB_ADMIN_USER=postgres +#WALLET_DB_ADMIN_PASS=dbpass # These values are only used locally by docker-compose to set up the DB container - should match values above -POSTGRES_PASSWORD=dbpass -POSTGRES_USER=postgres -POSTGRES_DB=bob_wallet +#POSTGRES_PASSWORD=dbpass +#POSTGRES_USER=postgres +#POSTGRES_DB=holder_wallet # for tails server # ACAPY_TAILS_SERVER_BASE_URL=http://tails-server:6543 @@ -22,26 +22,24 @@ POSTGRES_DB=bob_wallet HTTP_PORT=3020 WEBHOOK_PORT=3010 ADMIN_PORT=3021 -ADMIN_URL=http://bob-agent:3021 +ADMIN_URL=http://holder-agent:3021 ACAPY_OUTBOUND_TRANSPORT=http ACAPY_ADMIN=[0.0.0.0,3021] # Only used if run ./manage production # Typically you will want to update 0.0.0.0 to some public IP -ACAPY_ENDPOINT=http://0.0.0.0:4020 +ACAPY_ENDPOINT=http://holder-agent:3020 -ACAPY_WEBHOOK_URL=http://bob-business-logic:3010 +ACAPY_WEBHOOK_URL=http://holder-business-logic:3010 ACAPY_ADMIN_API_KEY=adminApiKey -ACAPY_LABEL=Bob +ACAPY_LABEL=Holder ACAPY_WALLET_NAME=Bob_Name -ACAPY_WALLET_KEY=bob_key +ACAPY_WALLET_KEY=holder_key ACAPY_WALLET_TYPE=indy -ACAPY_WALLET_STORAGE_TYPE=postgres_storage -# ACAPY_WALLET_SEED=0000000000000000000000000BobAny1 -ACAPY_WALLET_STORAGE_CONFIG={"url":"bob-wallet-db:5432","wallet_scheme":"MultiWalletSingleTable"} -ACAPY_WALLET_STORAGE_CREDS={"account":"postgres","password":"dbpass","admin_account":"postgres","admin_password":"dbpass"} -ACAPY_WALLET_LOCAL_DID=true -ACAPY_LOG_LEVEL=info + +#ACAPY_WALLET_STORAGE_TYPE=postgres_storage +#ACAPY_WALLET_STORAGE_CONFIG={"url":"holder-wallet-db:5432","wallet_scheme":"MultiWalletSingleTable"} +#ACAPY_WALLET_STORAGE_CREDS={"account":"postgres","password":"dbpass","admin_account":"postgres","admin_password":"dbpass"} ACAPY_AUTO_PROVISION=true @@ -58,7 +56,7 @@ ACAPY_GENESIS_URL=https://raw.githubusercontent.com/sovrin-foundation/sovrin/mas # ACAPY_MULTITENANT_JWT_SECRET=jwtSecret # Name of ngrok container if exposing agent endpoint over ngrok -NGROK_NAME= ngrok-bob +NGROK_NAME= ngrok-holder # Optional Helper Configurations - See https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/config/argparse.py @@ -66,11 +64,27 @@ ACAPY_AUTO_ACCEPT_INVITES=true ACAPY_AUTO_ACCEPT_REQUESTS=true ACAPY_AUTO_PING_CONNECTION=true ACAPY_AUTO_RESPOND_MESSAGES=true -ACAPY_AUTO_RESPOND_CREDENTIAL_PROPOSAL=false -ACAPY_AUTO_RESPOND_CREDENTIAL_OFFER=false -ACAPY_AUTO_RESPOND_CREDENTIAL_REQUEST=false -ACAPY_AUTO_RESPOND_PRESENTATION_PROPOSAL=false -ACAPY_AUTO_RESPOND_PRESENTATION_REQUEST=false -ACAPY_AUTO_STORE_CREDENTIAL=false -ACAPY_AUTO_VERIFY_PRESENTATION=false -ACAPY_PRESERVE_EXCHANGE_RECORDS=true \ No newline at end of file +ACAPY_AUTO_RESPOND_CREDENTIAL_PROPOSAL=true +ACAPY_AUTO_RESPOND_CREDENTIAL_OFFER=true +ACAPY_AUTO_RESPOND_CREDENTIAL_REQUEST=true +ACAPY_AUTO_RESPOND_PRESENTATION_PROPOSAL=true +ACAPY_AUTO_RESPOND_PRESENTATION_REQUEST=true +ACAPY_AUTO_STORE_CREDENTIAL=true +ACAPY_AUTO_VERIFY_PRESENTATION=true +ACAPY_PRESERVE_EXCHANGE_RECORDS=true + + +# Optional Trace Arguments +# ACAPY_TRACE=true +# ACAPY_TRACE_TARGET=log +# ACAPY_TRACE_LABEL=Issuer + +# Timing arguments +ACAPY_TIMING=true +ACAPY_TIMING_LOG=/home/indy/logs/timing.txt + +# Debug Arguments +ACAPY_DEBUG=true + +ACAPY_LOG_LEVEL=debug +# ACAPY_LOG_FILE=/home/indy/logs/agent_logs.txt \ No newline at end of file diff --git a/playground/holder/notebooks/Bob.ipynb b/playground/holder/notebooks/Bob.ipynb deleted file mode 100644 index f0f4382..0000000 --- a/playground/holder/notebooks/Bob.ipynb +++ /dev/null @@ -1,760 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "b8f7c3ad", - "metadata": {}, - "source": [ - "# Bob \n", - "\n", - "## Example based on the inviter_template" - ] - }, - { - "cell_type": "markdown", - "id": "559a41c9", - "metadata": {}, - "source": [ - "### Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "e95cd76a", - "metadata": {}, - "outputs": [], - "source": [ - "from aries_cloudcontroller import AriesAgentController\n", - "import os\n", - "from termcolor import colored" - ] - }, - { - "cell_type": "markdown", - "id": "60bfda66", - "metadata": {}, - "source": [ - "### Initialise the Agent Controller" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "ae5f88bc", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initialising a controller with admin api at http://bob-agent:3021 and an api key of adminApiKey\n" - ] - } - ], - "source": [ - "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", - "admin_url = os.getenv(\"ADMIN_URL\")\n", - "\n", - "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", - "agent_controller = AriesAgentController(admin_url,api_key)" - ] - }, - { - "cell_type": "markdown", - "id": "5cd59406", - "metadata": {}, - "source": [ - "### Start a Webhook Server" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "4bfa8231", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Listening for webhooks from agent at http://0.0.0.0:3010\n" - ] - } - ], - "source": [ - "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", - "webhook_host = \"0.0.0.0\"\n", - "\n", - "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", - "\n", - "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" - ] - }, - { - "cell_type": "markdown", - "id": "78da0ebb", - "metadata": {}, - "source": [ - "## Register Agent Event Listeners\n", - "\n", - "You can see some examples within the webhook_listeners recipe. Copy any relevant cells across and customise as needed." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "714b334b", - "metadata": {}, - "outputs": [], - "source": [ - "listeners = []\n", - "\n", - "# Receive connection messages\n", - "def connections_handler(payload):\n", - " state = payload['state']\n", - " connection_id = payload[\"connection_id\"]\n", - " their_role = payload[\"their_role\"]\n", - " routing_state = payload[\"routing_state\"]\n", - " \n", - " print(\"----------------------------------------------------------\")\n", - " print(\"Connection Webhook Event Received\")\n", - " print(\"Connection ID : \", connection_id)\n", - " print(\"State : \", state)\n", - " print(\"Routing State : \", routing_state)\n", - " print(\"Their Role : \", their_role)\n", - " print(\"----------------------------------------------------------\")\n", - "\n", - " if state == \"invitation\":\n", - " # Your business logic\n", - " print(\"invitation\")\n", - " elif state == \"request\":\n", - " # Your business logic\n", - " print(\"request\")\n", - "\n", - " elif state == \"response\":\n", - " # Your business logic\n", - " print(\"response\")\n", - " elif state == \"active\":\n", - " # Your business logic\n", - " print(colored(\"Connection ID: {0} is now active.\".format(connection_id), \"green\", attrs=[\"bold\"]))\n", - "\n", - "\n", - "\n", - "connection_listener = {\n", - " \"handler\": connections_handler,\n", - " \"topic\": \"connections\"\n", - "}\n", - "\n", - "listeners.append(connection_listener)\n", - "\n", - "## YOUR LISTENERS HERE\n", - "def holder_handler(payload):\n", - " connection_id = payload['connection_id']\n", - " exchange_id = payload['credential_exchange_id']\n", - " state = payload['state']\n", - " role = payload['role']\n", - " print(\"\\n---------------------------------------------------\\n\")\n", - " print(\"Handle Issue Credential Webhook\")\n", - " print(f\"Connection ID : {connection_id}\")\n", - " print(f\"Credential exchange ID : {exchange_id}\")\n", - " print(\"Agent Protocol Role : \", role)\n", - " print(\"Protocol State : \", state )\n", - " print(\"\\n---------------------------------------------------\\n\")\n", - " print(\"Handle Credential Webhook Payload\")\n", - " \n", - " if state == \"offer_received\":\n", - " print(\"Credential Offer Recieved\")\n", - " proposal = payload[\"credential_proposal_dict\"]\n", - " print(\"The proposal dictionary is likely how you would understand and display a credential offer in your application\")\n", - " print(\"\\n\", proposal)\n", - " print(\"\\n This includes the set of attributes you are being offered\")\n", - " attributes = proposal['credential_proposal']['attributes']\n", - " print(attributes)\n", - " ## YOUR LOGIC HERE\n", - " elif state == \"request_sent\":\n", - " print(\"\\nA credential request object contains the commitment to the agents master secret using the nonce from the offer\")\n", - " ## YOUR LOGIC HERE\n", - " elif state == \"credential_received\":\n", - " print(\"Received Credential\")\n", - " ## YOUR LOGIC HERE\n", - " elif state == \"credential_acked\":\n", - " ## YOUR LOGIC HERE\n", - " credential = payload[\"credential\"]\n", - " print(\"Credential Stored\\n\")\n", - " print(credential)\n", - " \n", - " print(\"\\nThe referent acts as the identifier for retrieving the raw credential from the wallet\")\n", - " # Note: You would probably save this in your application database\n", - " credential_referent = credential[\"referent\"]\n", - " print(\"Referent\", credential_referent)\n", - " \n", - "holder_listener = {\n", - " \"topic\": \"issue_credential\",\n", - " \"handler\": holder_handler\n", - "}\n", - "\n", - "listeners.append(holder_listener)\n", - "\n", - "def prover_proof_handler(payload):\n", - " role = payload[\"role\"]\n", - " connection_id = payload[\"connection_id\"]\n", - " pres_ex_id = payload[\"presentation_exchange_id\"]\n", - " state = payload[\"state\"]\n", - " print(\"\\n---------------------------------------------------------------------\\n\")\n", - " print(\"Handle present-proof\")\n", - " print(\"Connection ID : \", connection_id)\n", - " print(\"Presentation Exchange ID : \", pres_ex_id)\n", - " print(\"Protocol State : \", state)\n", - " print(\"Agent Role : \", role)\n", - " print(\"Initiator : \", payload[\"initiator\"])\n", - " print(\"\\n---------------------------------------------------------------------\\n\")\n", - " \n", - " \n", - " if state == \"request_received\":\n", - " presentation_request = payload[\"presentation_request\"]\n", - " print(\"Recieved Presentation Request\\n\")\n", - " print(\"\\nRequested Attributes - Note the restrictions. These limit the credentials we could respond with\\n\")\n", - " print(presentation_request[\"requested_attributes\"])\n", - " elif state == \"presentation_sent\":\n", - " print(\"Presentation Sent\\n\")\n", - " \n", - " elif state == \"presentation_acked\":\n", - " print(\"Presentation has been acknowledged by the Issuer\")\n", - " \n", - "prover_listener = {\n", - " \"topic\": \"present_proof\",\n", - " \"handler\": prover_proof_handler\n", - "}\n", - "\n", - "listeners.append(prover_listener)\n", - "\n", - "agent_controller.register_listeners(listeners)" - ] - }, - { - "cell_type": "markdown", - "id": "f9279e3e", - "metadata": {}, - "source": [ - "## Create Invitation\n", - "\n", - "Note the current arguments specified are in their default configurations. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "ecf79c8b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "----------------------------------------------------------\n", - "Connection Webhook Event Received\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "State : invitation\n", - "Routing State : none\n", - "Their Role : invitee\n", - "----------------------------------------------------------\n", - "invitation\n" - ] - } - ], - "source": [ - "# Alias for invited connection\n", - "alias = None\n", - "auto_accept = False\n", - "# Use public DID?\n", - "public = \"false\"\n", - "# Should this invitation be usable by multiple invitees?\n", - "multi_use = \"false\"\n", - "\n", - "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", - "# Is equivalent to above. Arguments are optionally\n", - "# invitation_response = await agent_controller.connections.create_invitation()\n", - "\n", - "\n", - "\n", - "# You probably want to keep this somewhere so you can enage in other protocols with this connection.\n", - "connection_id = invitation_response[\"connection_id\"]\n" - ] - }, - { - "cell_type": "markdown", - "id": "867a09f4", - "metadata": {}, - "source": [ - "## Share Invitation Object with External Agent\n", - "\n", - "Typically in this jupyter notebook playground that involves copying it across to another agent's business logic notebook where they are the invitee. (see invitee_template recipe)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "d70d2f74", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': 'e743b38b-fab7-4315-92a7-1b7b6cab0f95', 'recipientKeys': ['36CZQj9EpiGbPG926PU7GrnApdqJgpGE91dKQHWHEzZS'], 'serviceEndpoint': 'https://588d5381c2e8.ngrok.io', 'label': 'Bob'}\n", - "----------------------------------------------------------\n", - "Connection Webhook Event Received\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "State : request\n", - "Routing State : none\n", - "Their Role : invitee\n", - "----------------------------------------------------------\n", - "request\n", - "----------------------------------------------------------\n", - "Connection Webhook Event Received\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "State : response\n", - "Routing State : none\n", - "Their Role : invitee\n", - "----------------------------------------------------------\n", - "response\n", - "----------------------------------------------------------\n", - "Connection Webhook Event Received\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "State : active\n", - "Routing State : none\n", - "Their Role : invitee\n", - "----------------------------------------------------------\n", - "\u001b[1m\u001b[32mConnection ID: e1020f06-707f-4d5a-9105-fab533993cc9 is now active.\u001b[0m\n", - "\n", - "---------------------------------------------------\n", - "\n", - "Handle Issue Credential Webhook\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "Credential exchange ID : 8239ca76-6c91-441d-84cf-6725d7deb9ad\n", - "Agent Protocol Role : holder\n", - "Protocol State : offer_received\n", - "\n", - "---------------------------------------------------\n", - "\n", - "Handle Credential Webhook Payload\n", - "Credential Offer Recieved\n", - "The proposal dictionary is likely how you would understand and display a credential offer in your application\n", - "\n", - " {'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/propose-credential', '@id': 'a7067f12-655d-4a27-8fe1-ecea57b3833f', 'comment': 'create automated credential exchange', 'credential_proposal': {'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview', 'attributes': [{'name': 'example', 'value': 'sOME DATA'}]}, 'cred_def_id': 'J1y6c8mp32uBxVHkRiLM71:3:CL:216776:default', 'schema_id': 'J1y6c8mp32uBxVHkRiLM71:2:aca-acc-jupyter-plyaground:0.0.1'}\n", - "\n", - " This includes the set of attributes you are being offered\n", - "[{'name': 'example', 'value': 'sOME DATA'}]\n" - ] - } - ], - "source": [ - "invitation = invitation_response[\"invitation\"]\n", - "## Copy this output\n", - "print(invitation)" - ] - }, - { - "cell_type": "markdown", - "id": "6651ce03", - "metadata": {}, - "source": [ - "## Request Credential From Offer\n", - "\n", - "Note: Your agent will automatically respond if ACAPY_AUTO_RESPOND_CREDENTIAL_OFFER=true flag is set in .env file of agent. Default is false.\n", - "\n", - "To respond to an offer you must identify the offer using the credential_exchange_id generated for it. This is available from within the issue-credential holder handler. You could add custom logic in this loop `elif state == \"request\":` to handle this.\n", - "\n", - "However, we will fetch the credential exchange records and **assume** this agent only has one record. Customise accordingly.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "458730bf", - "metadata": {}, - "outputs": [], - "source": [ - "# thread_id=None\n", - "state = \"offer_received\"\n", - "\n", - "records_response = await agent_controller.issuer.get_records(connection_id=connection_id, state=state)\n", - "record = records_response[\"results\"][0]\n", - "record_id = record[\"credential_exchange_id\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "c39a64bc", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'auto_offer': False,\n", - " 'credential_definition_id': 'J1y6c8mp32uBxVHkRiLM71:3:CL:216776:default',\n", - " 'updated_at': '2021-05-28 14:41:26.979185Z',\n", - " 'credential_offer': {'schema_id': 'J1y6c8mp32uBxVHkRiLM71:2:aca-acc-jupyter-plyaground:0.0.1',\n", - " 'cred_def_id': 'J1y6c8mp32uBxVHkRiLM71:3:CL:216776:default',\n", - " 'key_correctness_proof': {'c': '26568154636499869643125346823927596266547137382452507723994771661464927461630',\n", - " 'xz_cap': '292610398918993877840190318700101332699221500004089834828434691399675262094729498497626580957992178887382143522009189208396192249781874559044272999820818400645911652335865675216639340319902936489166644562503244541911200855936418869397908508304273263690541015300552335965524724199907640425885257498952774334409331711812587017581220782975306113211647277697567877810032245957706583799448858394732912645113640605480139326535579950253276279052934969975046168675356123671580039248170082187663552035085322781434364595712317776412307897699335449017148315929388840250049460327321648319391177866221606400958580978557249147010042640849677525524891880408998931570951345879777497219175544477450691361886681',\n", - " 'xr_cap': [['master_secret',\n", - " '610039380775204380021524158128378523144887579448331536338158554046167344003883564532389091806351556758970450523051843403184987158184110656030801926050801217794104216260468453400629266501024685175798144790534259796916794590742876171463312498264205879632513979481297319002747278851878377593212851251932452318390127971744380311779434052798797923933355312889941678557214485152906393936981126515823885267230826074304581670365373922778003458303780442303331307486626781159022357584815619833241269104279005545172196823537189538975244355767190089227551735434944620331447584720180146412579996580716317529381458548096040227458321442033815406600570395028092473646343559469537798507418715917861367913606159'],\n", - " ['example',\n", - " '140645137980204922308258393605200051303533287305465984861466607608491806087775960474821925587539944094665344961851213477878122036526739772804287698536401703865286566171056314365360217174901680162097726256612114524341421218309680965632606669123538397594651628604064800740518839444003588312584888692187453075298956957337097762852927658629152175726330280638624102930190407067150746586336530468219833909971742665162922985026413460907704885294681308823586467315916979122606453593131684496302696678862169232447087569990966121019485894275633376723024515604026286483810600599899062146971322575382853359084956578233908277685378407234671523667353341304488318941469165965547292573307452857575248360277392']]},\n", - " 'nonce': '1052250080583531008926454'},\n", - " 'connection_id': 'e1020f06-707f-4d5a-9105-fab533993cc9',\n", - " 'initiator': 'external',\n", - " 'credential_proposal_dict': {'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/propose-credential',\n", - " '@id': 'a7067f12-655d-4a27-8fe1-ecea57b3833f',\n", - " 'comment': 'create automated credential exchange',\n", - " 'credential_proposal': {'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview',\n", - " 'attributes': [{'name': 'example', 'value': 'sOME DATA'}]},\n", - " 'cred_def_id': 'J1y6c8mp32uBxVHkRiLM71:3:CL:216776:default',\n", - " 'schema_id': 'J1y6c8mp32uBxVHkRiLM71:2:aca-acc-jupyter-plyaground:0.0.1'},\n", - " 'thread_id': '36ef7eb2-52b7-47a3-8c07-cdfd03986edc',\n", - " 'role': 'holder',\n", - " 'credential_request_metadata': {'master_secret_blinding_data': {'v_prime': '36029840686633580236086634985342910431902975341570982080399370784902071103951070740892608800749510062320814275522812214506329308622424709903678354320901688965682296314870219180780363284319203820354513128400570887118095472353424811643405246782039577076178243490398294533102027271846264943573823976268264130244225488719853890750090114937225062381366159794768897901699086106922203903508993699374152751068582642618071011607881975821296483999370016201886521166003820654500900404703410302815460877476915505730785000061449348942098541278407809977429269932198573717951803886782598576505045577322269117334954710460168958014246640351880633244205071697',\n", - " 'vr_prime': None},\n", - " 'nonce': '996798374021483717021950',\n", - " 'master_secret_name': 'Bob_Name'},\n", - " 'credential_request': {'prover_did': 'SbpdiFKcCkpaY4LZP817UU',\n", - " 'cred_def_id': 'J1y6c8mp32uBxVHkRiLM71:3:CL:216776:default',\n", - " 'blinded_ms': {'u': '83389786294931947815395566094452820793905620017293068786271640421337603486321166748535667920371661945851608217398139481931088745631160489626376941669065986768381590780119086907642591490099730768188318636065065505366069930196921850592300727780714674450729766201519146258089507939134569847362105845911622678234073943334773305670639374642794576431714879540549156233992024984273860063507302757048694191495437622547787281754908047228836104380612151681449242233592031343871296874389003922053396872138937081537722997114558250399363338562174112927057114130485687556234160658520106829603929879691023076032508316473848344832305',\n", - " 'ur': None,\n", - " 'hidden_attributes': ['master_secret'],\n", - " 'committed_attributes': {}},\n", - " 'blinded_ms_correctness_proof': {'c': '31480104633311978395263897924069792774941263210397201556187766373654998890289',\n", - " 'v_dash_cap': '1134223154736786202242437954268399230179933493435653539798117395011560263683696246619658938177849221847740060248904653372575452677084929260109491515187138007339737831534330601501534210182694982123426751415196143803545981980899426014161538301328706172557499580370435666095437127272959707664824124034892436835476745400144374451093442236983722926823199366038162443613025551872350968868554330848628673996088464310064995085802169967274444120560382259011920148430814696211734358671390001973870830471826631931728691166150915139708513101762698273882328358645453643872776440142153029974350721840073663410259601156742162284842858723650527623095834945921672022617535869303420662492833159550613879941282076499421762464333117561047',\n", - " 'm_caps': {'master_secret': '4695339098267747493932821779195835011104157858909334155729236949708852961960762754572082446785326399963991574157816872956888019493137870190733329954339908205224673404171265926839'},\n", - " 'r_caps': {}},\n", - " 'nonce': '996798374021483717021950'},\n", - " 'auto_issue': False,\n", - " 'state': 'request_sent',\n", - " 'trace': False,\n", - " 'created_at': '2021-05-28 14:39:59.178603Z',\n", - " 'credential_exchange_id': '8239ca76-6c91-441d-84cf-6725d7deb9ad',\n", - " 'auto_remove': False,\n", - " 'schema_id': 'J1y6c8mp32uBxVHkRiLM71:2:aca-acc-jupyter-plyaground:0.0.1'}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "---------------------------------------------------\n", - "\n", - "Handle Issue Credential Webhook\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "Credential exchange ID : 8239ca76-6c91-441d-84cf-6725d7deb9ad\n", - "Agent Protocol Role : holder\n", - "Protocol State : request_sent\n", - "\n", - "---------------------------------------------------\n", - "\n", - "Handle Credential Webhook Payload\n", - "\n", - "A credential request object contains the commitment to the agents master secret using the nonce from the offer\n", - "\n", - "---------------------------------------------------\n", - "\n", - "Handle Issue Credential Webhook\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "Credential exchange ID : 8239ca76-6c91-441d-84cf-6725d7deb9ad\n", - "Agent Protocol Role : holder\n", - "Protocol State : credential_received\n", - "\n", - "---------------------------------------------------\n", - "\n", - "Handle Credential Webhook Payload\n", - "Received Credential\n", - "\n", - "---------------------------------------------------------------------\n", - "\n", - "Handle present-proof\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "Presentation Exchange ID : e76159d5-1960-4223-989d-30b189c11601\n", - "Protocol State : request_received\n", - "Agent Role : prover\n", - "Initiator : external\n", - "\n", - "---------------------------------------------------------------------\n", - "\n", - "Recieved Presentation Request\n", - "\n", - "\n", - "Requested Attributes - Note the restrictions. These limit the credentials we could respond with\n", - "\n", - "{'0_example_uuid': {'name': 'example', 'restrictions': [{'schema_id': 'J1y6c8mp32uBxVHkRiLM71:2:aca-acc-jupyter-plyaground:0.0.1', 'cred_def_id': 'J1y6c8mp32uBxVHkRiLM71:3:CL:216776:default'}]}}\n" - ] - } - ], - "source": [ - "response = await agent_controller.issuer.send_request_for_record(record_id)" - ] - }, - { - "cell_type": "markdown", - "id": "e0c96798", - "metadata": {}, - "source": [ - "## Store Received Credential\n", - "\n", - "This will be done automatically if the ACAPY_AUTO_STORE_CREDENTIAL=true flag is set in the .env file for this agent. Default is false.\n", - "\n", - "Again you could handle this in your holder handler function in the `elif state == \"credential_received\":` loop." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "12fb2b88", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "---------------------------------------------------\n", - "\n", - "Handle Issue Credential Webhook\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "Credential exchange ID : 8239ca76-6c91-441d-84cf-6725d7deb9ad\n", - "Agent Protocol Role : holder\n", - "Protocol State : credential_acked\n", - "\n", - "---------------------------------------------------\n", - "\n", - "Handle Credential Webhook Payload\n", - "Credential Stored\n", - "\n", - "{'referent': 'Some Example Credential Identifier', 'attrs': {'example': 'sOME DATA'}, 'schema_id': 'J1y6c8mp32uBxVHkRiLM71:2:aca-acc-jupyter-plyaground:0.0.1', 'cred_def_id': 'J1y6c8mp32uBxVHkRiLM71:3:CL:216776:default', 'rev_reg_id': None, 'cred_rev_id': None}\n", - "\n", - "The referent acts as the identifier for retrieving the raw credential from the wallet\n", - "Referent Some Example Credential Identifier\n" - ] - } - ], - "source": [ - "# Optionally specify an identifier to uniquely identify this credential within your agents wallet.\n", - "# You would likely want to save this somewhere.\n", - "# If not set a random one will be generated for you\n", - "credential_id = \"Some Example Credential Identifier\"\n", - "\n", - "store_cred_response = await agent_controller.issuer.store_credential(record_id, credential_id)" - ] - }, - { - "cell_type": "markdown", - "id": "a64be40b", - "metadata": {}, - "source": [ - "## Fetch Presentation Records\n", - "\n", - "Before you can present a presentation, you must identify the presentation record which you wish to respond to with a presentation. This could also be done through the present_proof listeners which have access to a presentation record in the payload." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "2af60574", - "metadata": {}, - "outputs": [], - "source": [ - "# Optional Query parameters\n", - "verifier_connection_id = connection_id\n", - "thread_id=None\n", - "state = \"request_received\"\n", - "role = \"prover\"\n", - "\n", - "proof_records_response = await agent_controller.proofs.get_records(verifier_connection_id, thread_id, state, role)\n", - "\n", - "# We fetch the first record from the response. You may want to customise this further\n", - "presentation_record = proof_records_response[\"results\"][0]\n", - "presentation_exchange_id = presentation_record[\"presentation_exchange_id\"]" - ] - }, - { - "cell_type": "markdown", - "id": "12020761", - "metadata": {}, - "source": [ - "## Search For Available Credentials to Construct Presentation From\n", - "\n", - "The presentation record can be used to query your agents wallet and return all credentials that could be used to construct valid presentation" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "1fcce13d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Credentials stored that could be used to satisfy the request. In some situations you applications may have a choice which credential to reveal\n", - "\n", - "Attribute {'name': 'example', 'restrictions': [{'schema_id': 'J1y6c8mp32uBxVHkRiLM71:2:aca-acc-jupyter-plyaground:0.0.1', 'cred_def_id': 'J1y6c8mp32uBxVHkRiLM71:3:CL:216776:default'}]} can be satisfied by Credential with Referent Some Example Credential Identifier\n", - "\n", - "Generate the proof\n", - "{'requested_predicates': {}, 'requested_attributes': {'0_example_uuid': {'cred_id': 'Some Example Credential Identifier', 'revealed': True}}, 'self_attested_attributes': {}}\n" - ] - } - ], - "source": [ - "# select credentials to provide for the proof\n", - "credentials = await agent_controller.proofs.get_presentation_credentials(presentation_exchange_id)\n", - "print(\"Credentials stored that could be used to satisfy the request. In some situations you applications may have a choice which credential to reveal\\n\")\n", - "\n", - "attribute_by_reft = {}\n", - "revealed = {}\n", - "self_attested = {}\n", - "predicates = {}\n", - "\n", - "\n", - "# Note we are working on a friendlier api to abstract this away\n", - "\n", - "if credentials:\n", - " for credential in credentials:\n", - "\n", - " for attribute_reft in credential[\"presentation_referents\"]:\n", - " if attribute_reft not in attribute_by_reft:\n", - " attribute_by_reft[attribute_reft] = credential\n", - "\n", - "for (key, value) in attribute_by_reft.items():\n", - " print(f\"Attribute {presentation_record['presentation_request']['requested_attributes'][key]} can be satisfied by Credential with Referent -- {value['cred_info']['referent']}\")\n", - " \n", - "for attribute_reft in presentation_record[\"presentation_request\"][\"requested_attributes\"]:\n", - " if attribute_reft in attribute_by_reft:\n", - " revealed[attribute_reft] = {\n", - " \"cred_id\": attribute_by_reft[attribute_reft][\"cred_info\"][\n", - " \"referent\"\n", - " ],\n", - " \"revealed\": True,\n", - " }\n", - "\n", - "\n", - "print(\"\\nGenerate the proof\")\n", - "presentation = {\n", - " \"requested_predicates\": predicates,\n", - " \"requested_attributes\": revealed,\n", - " \"self_attested_attributes\": self_attested,\n", - "}\n", - "print(presentation)" - ] - }, - { - "cell_type": "markdown", - "id": "4baf7213", - "metadata": {}, - "source": [ - "## Send Presentation\n", - "\n", - "A presentation is sent in represent to a presentation record that has previously been created." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "cde32420", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "---------------------------------------------------------------------\n", - "\n", - "Handle present-proof\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "Presentation Exchange ID : 8834600c-d130-4138-b1f8-a0d707284e8a\n", - "Protocol State : presentation_sent\n", - "Agent Role : prover\n", - "Initiator : external\n", - "\n", - "---------------------------------------------------------------------\n", - "\n", - "The Presentation object is a bit overwhelming. Let's look at it in detail\n", - "\n", - "\n", - "---------------------------------------------------------------------\n", - "\n", - "Handle present-proof\n", - "Connection ID : e1020f06-707f-4d5a-9105-fab533993cc9\n", - "Presentation Exchange ID : 8834600c-d130-4138-b1f8-a0d707284e8a\n", - "Protocol State : presentation_acked\n", - "Agent Role : prover\n", - "Initiator : external\n", - "\n", - "---------------------------------------------------------------------\n", - "\n", - "Presentation has been acknowledged by the Issuer\n" - ] - } - ], - "source": [ - "presentation_response = await agent_controller.proofs.send_presentation(presentation_exchange_id, presentation)" - ] - }, - { - "cell_type": "markdown", - "id": "2d2018ac", - "metadata": {}, - "source": [ - "## Terminate Controller\n", - "\n", - "Whenever you have finished with this notebook, be sure to terminate the controller. This is especially important if your business logic runs across multiple notebooks." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "772f0d4e", - "metadata": {}, - "outputs": [], - "source": [ - "await agent_controller.terminate()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "755b60e1", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/playground/holder/notebooks/holder.ipynb b/playground/holder/notebooks/holder.ipynb new file mode 100644 index 0000000..9a57593 --- /dev/null +++ b/playground/holder/notebooks/holder.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1e44d0f1", + "metadata": {}, + "source": [ + "# ACA-Py & ACC-Py Basic Template\n", + "\n", + "## Copy this template into the root folder of your notebook workspace to get started" + ] + }, + { + "cell_type": "markdown", + "id": "8a6d755c", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "67fbc0d6", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "import os\n", + "from termcolor import colored\n", + "\n", + "from aiohttp import ClientSession" + ] + }, + { + "cell_type": "markdown", + "id": "f0d40689", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7950aa0f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://holder-agent:3021 and an api key of adminApiKey\n" + ] + } + ], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)" + ] + }, + { + "cell_type": "markdown", + "id": "1968636c", + "metadata": {}, + "source": [ + "### Start a Webhook Server" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ea80e783", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Listening for webhooks from agent at http://0.0.0.0:3010\n" + ] + } + ], + "source": [ + "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", + "webhook_host = \"0.0.0.0\"\n", + "\n", + "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", + "\n", + "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "289e9bcc", + "metadata": {}, + "outputs": [], + "source": [ + "listeners = []\n", + "\n", + "# Receive connection messages\n", + "def connections_handler(payload):\n", + " state = payload['state']\n", + " connection_id = payload[\"connection_id\"]\n", + " their_role = payload[\"their_role\"]\n", + " routing_state = payload[\"routing_state\"]\n", + " \n", + " print(\"----------------------------------------------------------\")\n", + " print(\"Connection Webhook Event Received\")\n", + " print(\"Connection ID : \", connection_id)\n", + " print(\"State : \", state)\n", + " print(\"Routing State : \", routing_state)\n", + " print(\"Their Role : \", their_role)\n", + " print(\"----------------------------------------------------------\")\n", + "\n", + " if state == \"invitation\":\n", + " # Your business logic\n", + " print(\"invitation\")\n", + " elif state == \"request\":\n", + " # Your business logic\n", + " print(\"request\")\n", + "\n", + " elif state == \"response\":\n", + " # Your business logic\n", + " print(\"response\")\n", + "\n", + " elif state == \"active\":\n", + " # Your business logic\n", + " print(colored(\"Connection ID: {0} is now active.\".format(connection_id), \"green\", attrs=[\"bold\"]))\n", + "\n", + "connection_listener = {\n", + " \"handler\": connections_handler,\n", + " \"topic\": \"connections\"\n", + "}\n", + "\n", + "listeners.append(connection_listener)\n", + "\n", + "agent_controller.register_listeners(listeners)" + ] + }, + { + "cell_type": "markdown", + "id": "f9e39077", + "metadata": {}, + "source": [ + "## Establish a Connection\n", + "\n", + "Must establish connection with issuer before being able to receive credential. Holder modeled as invitee in this case. See recipes/connection." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c3d38866", + "metadata": {}, + "outputs": [], + "source": [ + "invitation = {'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': '843d50e1-e861-4ec3-8620-25ae01b2f027', 'label': 'Issuer', 'serviceEndpoint': 'http://issuer-agent:3020', 'recipientKeys': ['8ZjDVHABDMxN973vYVhFifdoz9y3DZYL492aK3mUg1Vg']}" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1a57cd58", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 9525216f-16ac-4c1e-ad0f-793e629fdf64\n", + "State : invitation\n", + "Routing State : none\n", + "Their Role : inviter\n", + "----------------------------------------------------------\n", + "invitation\n", + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 9525216f-16ac-4c1e-ad0f-793e629fdf64\n", + "State : request\n", + "Routing State : none\n", + "Their Role : inviter\n", + "----------------------------------------------------------\n", + "request\n", + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 9525216f-16ac-4c1e-ad0f-793e629fdf64\n", + "State : response\n", + "Routing State : none\n", + "Their Role : inviter\n", + "----------------------------------------------------------\n", + "response\n", + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 9525216f-16ac-4c1e-ad0f-793e629fdf64\n", + "State : active\n", + "Routing State : none\n", + "Their Role : inviter\n", + "----------------------------------------------------------\n", + "\u001b[1m\u001b[32mConnection ID: 9525216f-16ac-4c1e-ad0f-793e629fdf64 is now active.\u001b[0m\n" + ] + } + ], + "source": [ + "auto_accept=False\n", + "alias=None\n", + "\n", + "invite_response = await agent_controller.connections.receive_invitation(invitation, alias, auto_accept)\n", + "connection_id = invite_response[\"connection_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e3b472dc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 1302de7b-7fe1-4141-bebf-e640a4f71ff7\n", + "State : invitation\n", + "Routing State : none\n", + "Their Role : invitee\n", + "----------------------------------------------------------\n", + "invitation\n" + ] + } + ], + "source": [ + "response = await agent_controller.connections.create_invitation()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "4bedb6ba", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': 'abf9fd65-8dae-4875-aea8-31c817bae08b', 'serviceEndpoint': 'http://127.0.0.1:4020', 'recipientKeys': ['Brxr7u7TotYCQJCeXK9BCRdNgi1yYRucLkTRi6siynHU'], 'label': 'Holder'}\n" + ] + } + ], + "source": [ + "print(response[\"invitation\"])" + ] + }, + { + "cell_type": "markdown", + "id": "c5e657ad", + "metadata": {}, + "source": [ + "## Request Credential From Offer\n", + "\n", + "Note: Your agent will automatically respond if ACAPY_AUTO_RESPOND_CREDENTIAL_OFFER=true flag is set in .env file of agent. Default is false.\n", + "\n", + "To respond to an offer you must identify the offer using the credential_exchange_id generated for it. This is available from within the issue-credential holder handler. You could add custom logic in this loop `elif state == \"request\":` to handle this.\n", + "\n", + "However, we will fetch the credential exchange records and **assume** this agent only has one record. Customise accordingly.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dbbbb8cb", + "metadata": {}, + "outputs": [], + "source": [ + "# Optional args\n", + "thread_id=None\n", + "state = \"offer_received\"\n", + "role = \"prover\"\n", + "\n", + "\n", + "records_response = await agent_controller.issuer.get_records(connection_id=connection_id,state=state)\n", + "record = records_response[\"results\"][0]\n", + "record_id = record[\"credential_exchange_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "931640ea", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.issuer.send_request_for_record(record_id)" + ] + }, + { + "cell_type": "markdown", + "id": "843c5055", + "metadata": {}, + "source": [ + "## Store Received Credential\n", + "\n", + "This will be done automatically if the ACAPY_AUTO_STORE_CREDENTIAL=true flag is set in the .env file for this agent. Default is false.\n", + "\n", + "Again you could handle this in your holder handler function in the `elif state == \"credential_received\":` loop." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a35e31a9", + "metadata": {}, + "outputs": [], + "source": [ + "# Optionally specify an identifier to uniquely identify this credential within your agents wallet.\n", + "# You would likely want to save this somewhere.\n", + "# If not set a random one will be generated for you\n", + "credential_id = \"\"\n", + "\n", + "store_cred_response = await agent_controller.issuer.store_credential(record_id, credential_id)" + ] + }, + { + "cell_type": "markdown", + "id": "d26ac9dd", + "metadata": {}, + "source": [ + "## Terminate Controller\n", + "\n", + "Whenever you have finished with this notebook, be sure to terminate the controller. This is especially important if your business logic runs across multiple notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c083bcb6", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/issuer/example.env b/playground/issuer/example.env new file mode 100644 index 0000000..0d8d88e --- /dev/null +++ b/playground/issuer/example.env @@ -0,0 +1,98 @@ + +# These are dummy values that can be used to get started quickly +# Replace these with real values when deploying to a real environment + +# For postgres DB which hosts the wallets +WALLET_DB_HOST=issuer-wallet-db +WALLET_DB_PORT=5432 +WALLET_DB_USER=postgres +WALLET_DB_PASS=dbpass +WALLET_DB_ADMIN_USER=postgres +WALLET_DB_ADMIN_PASS=dbpass + +# These values are only used locally by docker-compose to set up the DB container - should match values above +POSTGRES_PASSWORD=dbpass +POSTGRES_USER=postgres +POSTGRES_DB=issuer_wallet + +# for tails server +# ACAPY_TAILS_SERVER_BASE_URL=http://tails-server:6543 + +ACAPY_TAILS_SERVER_BASE_URL=https://tails-dev.vonx.io + +# for aca-py +HTTP_PORT=3020 +WEBHOOK_PORT=3010 +ADMIN_PORT=3021 +ADMIN_URL=http://issuer-agent:3021 +ACAPY_OUTBOUND_TRANSPORT=http +ACAPY_ADMIN=[0.0.0.0,3021] + +# Only used if run ./manage production +# Typically you will want to update 0.0.0.0 to some public IP +ACAPY_ENDPOINT=http://issuer-agent:3020 + +ACAPY_WEBHOOK_URL=http://issuer-business-logic:3010 +ACAPY_ADMIN_API_KEY=adminApiKey + +# DO NOT USE IN INSECURE MODE +# ACAPY_ADMIN_INSECURE_MODE=true + +ACAPY_LABEL=Issuer +ACAPY_WALLET_NAME=Alice_Name +ACAPY_WALLET_KEY=issuer_key +ACAPY_WALLET_TYPE=indy +ACAPY_WALLET_STORAGE_TYPE=postgres_storage +ACAPY_WALLET_SEED=0000000000000000000000IssuerAny1 +ACAPY_WALLET_STORAGE_CONFIG={"url":"issuer-wallet-db:5432","wallet_scheme":"MultiWalletSingleTable"} +ACAPY_WALLET_STORAGE_CREDS={"account":"postgres","password":"dbpass","admin_account":"postgres","admin_password":"dbpass"} +ACAPY_AUTO_PROVISION=true + + +## Local Network +ACAPY_GENESIS_FILE=/home/indy/von-local-genesis-txns + +# Sovrin StagingNet +ACAPY_GENESIS_URL=https://raw.githubusercontent.com/sovrin-foundation/sovrin/master/sovrin/pool_transactions_sandbox_genesis + + +# Multi-tenant Configuration +# ACAPY_MULTITENANT=true +# ACAPY_MULTITENANT_ADMIN=true +# ACAPY_MULTITENANT_JWT_SECRET=jwtSecret + + +# Name of ngrok container if exposing agent endpoint over ngrok +NGROK_NAME= ngrok-issuer + + + +# Optional Helper Configurations - See https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/config/argparse.py +ACAPY_AUTO_ACCEPT_INVITES=true +ACAPY_AUTO_ACCEPT_REQUESTS=true +ACAPY_AUTO_PING_CONNECTION=true +ACAPY_AUTO_RESPOND_MESSAGES=true +ACAPY_AUTO_RESPOND_CREDENTIAL_PROPOSAL=true +ACAPY_AUTO_RESPOND_CREDENTIAL_OFFER=true +ACAPY_AUTO_RESPOND_CREDENTIAL_REQUEST=true +ACAPY_AUTO_RESPOND_PRESENTATION_PROPOSAL=true +ACAPY_AUTO_RESPOND_PRESENTATION_REQUEST=true +ACAPY_AUTO_STORE_CREDENTIAL=true +ACAPY_AUTO_VERIFY_PRESENTATION=true +ACAPY_PRESERVE_EXCHANGE_RECORDS=true + + +# Optional Trace Arguments +# ACAPY_TRACE=true +# ACAPY_TRACE_TARGET=log +# ACAPY_TRACE_LABEL=Issuer + +# Timing arguments +ACAPY_TIMING=true +ACAPY_TIMING_LOG=/home/indy/logs/timing.txt + +# Debug Arguments +ACAPY_DEBUG=true + +ACAPY_LOG_LEVEL=debug +# ACAPY_LOG_FILE=/home/indy/logs/agent_logs.txt \ No newline at end of file diff --git a/playground/issuer/notebooks/0. init_issuer_schema.ipynb b/playground/issuer/notebooks/0. init_issuer_schema.ipynb new file mode 100644 index 0000000..6ca453a --- /dev/null +++ b/playground/issuer/notebooks/0. init_issuer_schema.ipynb @@ -0,0 +1,1489 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5608625e", + "metadata": {}, + "source": [ + "# Initialising Your Agent as an Issuing Authority\n", + "\n", + "See \"./recipes/issue_credential/issuer_initialisation.ipynb\" for template\n", + "\n", + "The steps include:\n", + "\n", + "* Writing your DID to the Sovrin StagingNet\n", + "* Accepting the Transaction Author Agreement\n", + "* Authoring schema to the ledger\n", + "* Authoring credential definitions for the schema this agent intends to issue\n", + "* Persisting Identifiers for use throughout the playground.\n", + "\n", + "It is recommended that this initialisation notebook be run **once**. If you are following the default docker-compose services then your agents wallet storage will be persisted in a postgres database as long as you run `./manage stop` rather than `./manage down`. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "5bbd383f", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ab4e9d9f", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "import os\n", + "from termcolor import colored" + ] + }, + { + "cell_type": "markdown", + "id": "d05994e7", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "319eb201", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://issuer-agent:3021 and an api key of adminApiKey\n" + ] + } + ], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)" + ] + }, + { + "cell_type": "markdown", + "id": "378f3e94", + "metadata": {}, + "source": [ + "## Write DID to the Public Ledger\n", + "\n", + "Note: if defined a ACAPY_WALLET_SEED value for your agent then this function will return a DID, but this DID still needs to be written to the ledger. If you did not define a seed you will need to create a DID first." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7dfecafb", + "metadata": {}, + "outputs": [], + "source": [ + "public_did_response = await agent_controller.wallet.get_public_did()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "fc3d1942", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DID {'did': 'H7zAaLJRZrdbPqbVMMfL5t', 'verkey': '9nbjpGCGWPQ3uV3Qr9r4w5fW1RW7gDiSv5Ni8bBYirAf', 'posture': 'public'}\n" + ] + } + ], + "source": [ + "if public_did_response[\"result\"]:\n", + " did_obj = public_did_response[\"result\"]\n", + "else:\n", + " create_did_response = await agent_controller.wallet.create_did()\n", + " did_obj = create_did_response['result']\n", + "print(\"DID\", did_obj)" + ] + }, + { + "cell_type": "markdown", + "id": "a9cea08b", + "metadata": {}, + "source": [ + "## Assign Agent Public DID if Not Set\n", + "\n", + "Will only be ran if ACAPY_WALLET_SEED not initially set." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "595eed43", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Successfully intialised agent with Public DID : H7zAaLJRZrdbPqbVMMfL5t\n" + ] + } + ], + "source": [ + "if did_obj[\"posture\"] != \"public\":\n", + " response = await agent_controller.wallet.assign_public_did(did_obj[\"did\"])\n", + "print(\"Successfully intialised agent with Public DID : \", did_obj[\"did\"])" + ] + }, + { + "cell_type": "markdown", + "id": "8323a5c4", + "metadata": {}, + "source": [ + "## Writing Schema\n" + ] + }, + { + "cell_type": "markdown", + "id": "4f4f94b6", + "metadata": {}, + "source": [ + "## Attribute Size Schema" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4ac9cb2a", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"size1\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"image\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "size1_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "686559f0", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"size2\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"image\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "size2_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5c48f834", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"size3\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"image\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "size3_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "1bca250b", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"size4\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"image\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "size4_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b09ce66c", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"size5\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"image\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "size5_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d4391761", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"size6\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"image\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "size6_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "614da241", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"size7\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"image\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "size7_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "markdown", + "id": "30d73b91", + "metadata": {}, + "source": [ + "## Attribute Number Schema" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a10680eb", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"one-attrib\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.2\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"1\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "one_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "eb0f2f28", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"five-attrib\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"1\", \"2\", \"3\", \"4\", \"5\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "five_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2148a0a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']\n" + ] + } + ], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"ten-attrib\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = []\n", + "\n", + "for x in range(1,11):\n", + " attributes.append(str(x))\n", + "\n", + "print(attributes)\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "ten_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "93ca3dc8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']\n" + ] + } + ], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"twenty-attrib\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = []\n", + "\n", + "for x in range(1,21):\n", + " attributes.append(str(x))\n", + "\n", + "print(attributes)\n", + "\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "twenty_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cccb39bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50']\n" + ] + } + ], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"fifty-attrib\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = []\n", + "\n", + "for x in range(1,51):\n", + " attributes.append(str(x))\n", + "\n", + "print(attributes)\n", + "\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "fifty_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6f7d2fe9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100']\n" + ] + } + ], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"hundred-attrib\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = []\n", + "\n", + "for x in range(1,101):\n", + " attributes.append(str(x))\n", + "\n", + "print(attributes)\n", + "\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "hundred_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "markdown", + "id": "be84e98c", + "metadata": {}, + "source": [ + "## Credential Number Schema" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "57aa900e", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"five-one\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"1\", \"2\", \"3\", \"4\", \"5\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "five1_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "62b6ebb9", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"five-two\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"1\", \"2\", \"3\", \"4\", \"5\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "five2_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "c42e8ee4", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"five-three\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"1\", \"2\", \"3\", \"4\", \"5\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "five3_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "2bce74df", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"five-four\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"1\", \"2\", \"3\", \"4\", \"5\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "five4_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "382333cd", + "metadata": {}, + "outputs": [], + "source": [ + "# Define you schema name - must be unique on the ledger\n", + "schema_name = \"five-five\"\n", + "# Can version the schema if you wish to update it\n", + "schema_version = \"0.0.1\"\n", + "# Define any list of attributes you wish to include in your schema\n", + "attributes = [\"1\", \"2\", \"3\", \"4\", \"5\"]\n", + "\n", + "response = await agent_controller.schema.write_schema(schema_name, attributes, schema_version)\n", + "five5_schema_id = response[\"schema_id\"]" + ] + }, + { + "cell_type": "markdown", + "id": "004d3f45", + "metadata": {}, + "source": [ + "## Writing Credential Definitions\n", + "\n", + "For all schema you intend to issue credentials against your agent must author a credential definition transaction to the public ledger. This specifies the public cryptographic material your agent will use to sign all credentials issued against a specific schema. \n", + "\n", + "Again uncomment and copy this cell as often as you need. Remebering to update the arguments in <> to specify your schema identifiers. Store each credential definition identifier in a unique variable." + ] + }, + { + "cell_type": "markdown", + "id": "eaf0e872", + "metadata": {}, + "source": [ + "## Credential Size definitions" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "32a44d61", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size1_schema_id, tag, support_revocation)\n", + "size1_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "07e95e44", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size1_schema_id, tag, support_revocation)\n", + "size1_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "50588230", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size2_schema_id, tag, support_revocation)\n", + "size2_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "3efdfcda", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size2_schema_id, tag, support_revocation)\n", + "size2_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "f5bba9f1", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size3_schema_id, tag, support_revocation)\n", + "size3_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "1478e994", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size3_schema_id, tag, support_revocation)\n", + "size3_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "1a9d27f3", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size4_schema_id, tag, support_revocation)\n", + "size4_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "0fa0c60f", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size4_schema_id, tag, support_revocation)\n", + "size4_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "b314c983", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size5_schema_id, tag, support_revocation)\n", + "size5_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "b5c77e6c", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size5_schema_id, tag, support_revocation)\n", + "size5_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "0eb9e78e", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size6_schema_id, tag, support_revocation)\n", + "size6_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "5b578e9a", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size6_schema_id, tag, support_revocation)\n", + "size6_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "b44059d6", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size7_schema_id, tag, support_revocation)\n", + "size7_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "765d3a16", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(size7_schema_id, tag, support_revocation)\n", + "size7_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "markdown", + "id": "34ae2932", + "metadata": {}, + "source": [ + "## Attribute Number Schema" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "e577881f", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(one_schema_id, tag, support_revocation)\n", + "one_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "12dd36ae", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(one_schema_id, tag, support_revocation)\n", + "one_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "81f57d6c", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five_schema_id, tag, support_revocation)\n", + "five_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "55c55f13", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five_schema_id, tag, support_revocation)\n", + "five_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "e4d778ef", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(ten_schema_id, tag, support_revocation)\n", + "ten_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "cd1210ce", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(ten_schema_id, tag, support_revocation)\n", + "ten_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "147843e5", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(twenty_schema_id, tag, support_revocation)\n", + "twenty_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "7907ec83", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(twenty_schema_id, tag, support_revocation)\n", + "twenty_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "d8e7bd50", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(fifty_schema_id, tag, support_revocation)\n", + "fifty_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "a369a2d8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(fifty_schema_id, tag, support_revocation)\n", + "fifty_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "27d91275", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(hundred_schema_id, tag, support_revocation)\n", + "hundred_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "6b8bd31d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(hundred_schema_id, tag, support_revocation)\n", + "hundred_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "markdown", + "id": "bd81fe10", + "metadata": {}, + "source": [ + "## Credential Number Definitions" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "7cdf4b2e", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five1_schema_id, tag, support_revocation)\n", + "five1_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "bd59b6d9", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five1_schema_id, tag, support_revocation)\n", + "five1_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "ede7cb33", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five2_schema_id, tag, support_revocation)\n", + "five2_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "1501180c", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five2_schema_id, tag, support_revocation)\n", + "five2_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "38079639", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five3_schema_id, tag, support_revocation)\n", + "five3_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "9fe3b1bb", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five3_schema_id, tag, support_revocation)\n", + "five3_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "6e4ff8ce", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five4_schema_id, tag, support_revocation)\n", + "five4_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "89f23989", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five4_schema_id, tag, support_revocation)\n", + "five4_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "623ff3e4", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"default\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = False\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five5_schema_id, tag, support_revocation)\n", + "five5_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "5d76adf1", + "metadata": {}, + "outputs": [], + "source": [ + "# Tag and group specific credential definitions\n", + "tag = \"revocable\"\n", + "\n", + "# Make Cred Def support revocation. Credentials issued using this definition will be able to be revoked.\n", + "support_revocation = True\n", + "\n", + "cred_def_response = await agent_controller.definitions.write_cred_def(five5_schema_id, tag, support_revocation)\n", + "five5_rev_cred_def_id = cred_def_response[\"credential_definition_id\"]" + ] + }, + { + "cell_type": "markdown", + "id": "cc66fab9", + "metadata": {}, + "source": [ + "## Persist Identifiers for use throughout other business logic notebooks associated with this agent\n", + "\n", + "The schema_id and cred_def_id value pairs are required whenever issuing credentials, and also can be used to constrain acceptable proof requests. In a real application these values might be stored in environment variables or most likely in a database. For notebooks we have found it easier to store as string values in a cell and then load these values into the jupyter store so that they can be fetched across multiple notebooks.\n", + "\n", + "As such you are recommended to print out each of the schema and cred def identifiers used by your agent and copy them across to **Alice.ipynb**. Your main business logic notebook where you should store them in a variable and save them to the jupyter store. Remember, you should only be running this notebook once so having this logic in here will not be useful.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "188b7dff", + "metadata": {}, + "outputs": [], + "source": [ + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "7cea7afd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "size1_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size1:0.0.1'\n", + "size1_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:default'\n", + "size1_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:revocable'\n", + "\n", + "size2_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size2:0.0.1'\n", + "size2_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:default'\n", + "size2_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:revocable'\n", + "\n", + "size3_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size3:0.0.1'\n", + "size3_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:default'\n", + "size3_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:revocable'\n", + "\n", + "size4_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size4:0.0.1'\n", + "size4_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:default'\n", + "size4_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:revocable'\n", + "\n", + "size5_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size5:0.0.1'\n", + "size5_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:default'\n", + "size5_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:revocable'\n", + "\n", + "size6_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size6:0.0.1'\n", + "size6_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:default'\n", + "size6_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:revocable'\n", + "\n", + "size7_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size7:0.0.1'\n", + "size7_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:14:default'\n", + "size7_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:14:revocable'\n", + "\n" + ] + } + ], + "source": [ + "print(f\"size1_schema_id='{size1_schema_id}'\")\n", + "print(f\"size1_cred_def_id='{size1_cred_def_id}'\")\n", + "print(f\"size1_rev_cred_def_id='{size1_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"size2_schema_id='{size2_schema_id}'\")\n", + "print(f\"size2_cred_def_id='{size2_cred_def_id}'\")\n", + "print(f\"size2_rev_cred_def_id='{size2_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"size3_schema_id='{size3_schema_id}'\")\n", + "print(f\"size3_cred_def_id='{size3_cred_def_id}'\")\n", + "print(f\"size3_rev_cred_def_id='{size3_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"size4_schema_id='{size4_schema_id}'\")\n", + "print(f\"size4_cred_def_id='{size4_cred_def_id}'\")\n", + "print(f\"size4_rev_cred_def_id='{size4_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"size5_schema_id='{size5_schema_id}'\")\n", + "print(f\"size5_cred_def_id='{size5_cred_def_id}'\")\n", + "print(f\"size5_rev_cred_def_id='{size5_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"size6_schema_id='{size6_schema_id}'\")\n", + "print(f\"size6_cred_def_id='{size6_cred_def_id}'\")\n", + "print(f\"size6_rev_cred_def_id='{size6_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"size7_schema_id='{size7_schema_id}'\")\n", + "print(f\"size7_cred_def_id='{size7_cred_def_id}'\")\n", + "print(f\"size7_rev_cred_def_id='{size7_rev_cred_def_id}'\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "597bef9e", + "metadata": {}, + "source": [ + "## Attribute Number Schema" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "86afe614", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "one_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:one-attrib:0.0.2'\n", + "one_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:default'\n", + "one_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:revocable'\n", + "\n", + "five_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-attrib:0.0.1'\n", + "five_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:default'\n", + "five_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:revocable'\n", + "\n", + "ten_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:ten-attrib:0.0.1'\n", + "ten_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:default'\n", + "ten_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:revocable'\n", + "\n", + "twenty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:twenty-attrib:0.0.1'\n", + "twenty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:default'\n", + "twenty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:revocable'\n", + "\n", + "fifty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:fifty-attrib:0.0.1'\n", + "fifty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:default'\n", + "fifty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:revocable'\n", + "\n", + "hundred_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:hundred-attrib:0.0.1'\n", + "hundred_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:default'\n", + "hundred_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:revocable'\n", + "\n" + ] + } + ], + "source": [ + "print(f\"one_schema_id='{one_schema_id}'\")\n", + "print(f\"one_cred_def_id='{one_cred_def_id}'\")\n", + "print(f\"one_rev_cred_def_id='{one_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"five_schema_id='{five_schema_id}'\")\n", + "print(f\"five_cred_def_id='{five_cred_def_id}'\")\n", + "print(f\"five_rev_cred_def_id='{five_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"ten_schema_id='{ten_schema_id}'\")\n", + "print(f\"ten_cred_def_id='{ten_cred_def_id}'\")\n", + "print(f\"ten_rev_cred_def_id='{ten_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"twenty_schema_id='{twenty_schema_id}'\")\n", + "print(f\"twenty_cred_def_id='{twenty_cred_def_id}'\")\n", + "print(f\"twenty_rev_cred_def_id='{twenty_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"fifty_schema_id='{fifty_schema_id}'\")\n", + "print(f\"fifty_cred_def_id='{fifty_cred_def_id}'\")\n", + "print(f\"fifty_rev_cred_def_id='{fifty_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"hundred_schema_id='{hundred_schema_id}'\")\n", + "print(f\"hundred_cred_def_id='{hundred_cred_def_id}'\")\n", + "print(f\"hundred_rev_cred_def_id='{hundred_rev_cred_def_id}'\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "a95cd9ab", + "metadata": {}, + "source": [ + "## Credential Number Identifiers" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "131db527", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "five1_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-one:0.0.1'\n", + "five1_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:21:default'\n", + "five1_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:21:revocable'\n", + "\n", + "five2_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-two:0.0.1'\n", + "five2_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:22:default'\n", + "five2_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:22:revocable'\n", + "\n", + "five3_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-three:0.0.1'\n", + "five3_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:23:default'\n", + "five3_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:23:revocable'\n", + "\n", + "five4_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-four:0.0.1'\n", + "five4_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:24:default'\n", + "five4_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:24:revocable'\n", + "\n", + "five5_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-five:0.0.1'\n", + "five5_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:25:default'\n", + "five5_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:25:revocable'\n", + "\n" + ] + } + ], + "source": [ + "print(f\"five1_schema_id='{five1_schema_id}'\")\n", + "print(f\"five1_cred_def_id='{five1_cred_def_id}'\")\n", + "print(f\"five1_rev_cred_def_id='{five1_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"five2_schema_id='{five2_schema_id}'\")\n", + "print(f\"five2_cred_def_id='{five2_cred_def_id}'\")\n", + "print(f\"five2_rev_cred_def_id='{five2_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"five3_schema_id='{five3_schema_id}'\")\n", + "print(f\"five3_cred_def_id='{five3_cred_def_id}'\")\n", + "print(f\"five3_rev_cred_def_id='{five3_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"five4_schema_id='{five4_schema_id}'\")\n", + "print(f\"five4_cred_def_id='{five4_cred_def_id}'\")\n", + "print(f\"five4_rev_cred_def_id='{five4_rev_cred_def_id}'\\n\")\n", + "\n", + "print(f\"five5_schema_id='{five5_schema_id}'\")\n", + "print(f\"five5_cred_def_id='{five5_cred_def_id}'\")\n", + "print(f\"five5_rev_cred_def_id='{five5_rev_cred_def_id}'\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "00661a9f", + "metadata": {}, + "source": [ + "## Terminate Controller\n" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "80a0c7d3", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39cf76c3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/issuer/notebooks/Attribute Number - Non Revocable.txt b/playground/issuer/notebooks/Attribute Number - Non Revocable.txt new file mode 100644 index 0000000..1f92070 --- /dev/null +++ b/playground/issuer/notebooks/Attribute Number - Non Revocable.txt @@ -0,0 +1 @@ +{"name": "Attribute Number - Non Revocable", "results": [{"name": "1", "timings": [1.1493155209991528, 0.962110725000457, 0.672470665000219, 0.6135750480007118, 0.7197355179996521, 0.7766650489993481, 0.9407587200003036, 0.5335133070002485, 0.6870989700000791, 0.5902091410007415, 0.5177240140001231, 0.5376352090006549, 0.5619780990000436, 0.5314605490002577, 0.6481184870008292, 0.5577170130000013, 0.6967134459991939, 0.668447723999634, 0.8738427250009408, 0.8067298830010259, 0.7627022579999903, 0.6925200789992232, 0.6866927209994174, 0.695038707999629, 0.6158319219994155, 0.5721728120006446, 1.056649207999726, 0.7351562370004103, 0.9091156249996857, 0.8254040899992106, 0.5529542089989263, 0.8745346340001561, 0.47798820800016983, 0.673626884999976, 0.9969546280008217, 0.9003587339993828, 1.0616961589985294, 1.0432518329998857, 0.7436099309998099, 0.7653071730001102, 0.7808205290002661, 0.8257175589988037, 1.0724270089995116, 0.9514392309993127, 0.8440241309999692, 0.7334719519985811, 0.5415905290010414, 0.6803970860000845, 0.5966810370009625, 0.6959676259994012, 0.9651596659987263, 0.7764679519987112, 0.8993015449996165, 0.5701125830000819, 0.796444887000689, 0.6547047389994987, 0.5529704090004088, 0.7849103420012398, 0.7007907719998911, 0.8853728939993744, 0.691041796000718, 0.6210845410005277, 0.930905998999151, 0.7956097520000185, 0.8564548859994829, 0.886709016000168, 0.6780268590009655, 0.992522538999765, 0.6489133310005855, 0.6103515430004336, 0.6955677749992901, 1.0753410990000702, 0.6197395819999656, 0.9133087840000371, 0.8881342540007608, 0.6018160250005167, 0.6195188620004046, 0.6862269220000599, 0.8519827210002404, 0.6492815950005024, 1.0020376770007715, 0.9432941650011344, 0.8420650890002435, 0.5530435569999099, 0.6428631799990399, 1.080015886000183, 0.8414853220001532, 0.8920492719989852, 0.8675685819998762, 0.9938180980007019, 0.41096683899922937, 0.7658791680005379, 0.9179994980004267, 0.7620875709999382, 0.9660257669984276, 0.8418542619983782, 0.6611201529995014, 0.7100936440001533, 0.5750911040013307, 0.8651886920015386], "average": 0.7644324375199903}, {"name": "5", "timings": [1.0103795140003058, 0.7442023490002612, 0.5081580750011199, 0.582013924000421, 0.8830253050000465, 0.7888972869986901, 0.9545756540010188, 0.8584493609996571, 0.659737125999527, 0.5301819360010995, 0.6487979510002333, 0.6414187990012579, 0.6143770139988192, 0.7186824239997804, 0.7754313730001741, 0.6626692010013358, 1.0447515480009315, 0.745545581999977, 0.670796619999237, 0.765680037000493, 0.6539584099991771, 0.8309948349997285, 0.8775051840002561, 0.69496256399907, 0.7358174419987336, 0.5311807630005205, 0.7125837150015286, 0.7429742889999034, 0.6068152199986798, 0.7674837199992908, 0.5903295380012423, 0.5905555879999156, 0.6914651949991821, 0.7912065149994305, 0.5204301070007205, 0.48075635300119757, 0.7391932800001086, 0.7724887569984276, 0.5791347979993589, 0.6818157130001055, 1.0421249359987996, 1.1679658090015437, 0.5905362499997864, 0.7726576050008589, 0.7284891899998911, 0.6267428770006518, 0.8379945229989971, 0.738415472998895, 0.5685986799999228, 0.965916291999747, 0.9135837269986951, 1.017550571999891, 0.9095084620003036, 0.7503842930000246, 0.7689358970001194, 0.9602247379989421, 0.6694604599997547, 0.6379877130002569, 0.6069129219995375, 0.8537493189996894, 0.8073173739994672, 0.6934897499995714, 0.8846981089991459, 0.7570994159996189, 0.493399364000652, 0.554660881000018, 0.5478053189999628, 0.6491762999994535, 0.7339010750001762, 0.7415479370010871, 0.6940284400006931, 0.7225198449996242, 0.8848739159984689, 0.5270714400012366, 0.6678112009994948, 0.651047233999634, 0.7964999110008648, 0.8070848799998203, 0.798962983999445, 1.240281264999794, 0.6273190020001493, 0.9601461190013652, 0.5901205699992715, 0.48910302799959027, 0.529064037000353, 0.5849327180003456, 0.8020941679988027, 0.8420311390000279, 0.6642566480004461, 0.6768036499997834, 0.7709138660011376, 0.6279534629993577, 0.685645324001598, 0.6619920860011916, 0.7048146730012377, 0.7344882159995905, 0.818604410998887, 0.6789530909991299, 0.5586669019994588, 0.5550705250007013], "average": 0.7274341308099792}, {"name": "10", "timings": [1.0805575889989996, 0.627183464999689, 0.8224035289986205, 1.0455845350006712, 0.5800987130005524, 0.7571054849995562, 0.8395882110016828, 0.6804986480001389, 0.6972344200003135, 0.985179782999694, 0.9690850099996169, 0.6041530299989972, 0.6968134230010037, 0.7755393959996582, 1.013400959000137, 0.6556203990003269, 0.6743525699985184, 0.7307085449992883, 0.8882375020002655, 0.6593394380015525, 0.7420412760002364, 0.9894335090011737, 0.6016307469999447, 0.7298328029992263, 0.964918088999184, 0.6629720979999547, 0.6396068560006825, 0.6869744889991125, 0.7713912959989102, 1.0080549779995636, 0.6483499180012586, 0.6984481229992525, 0.6969743139998172, 0.8969011770004727, 0.6545346829989285, 0.7776743070007797, 0.8909447480000381, 0.8062752480000199, 1.037264196000251, 0.9874902800002019, 0.8270269169988751, 0.7498425419998966, 1.1138676430000487, 1.1117677799993544, 1.050959239999429, 1.048066672999994, 0.7381741049994162, 0.6106432039996434, 0.6284117100003641, 0.538249735998761, 0.8156131649993767, 0.6061741409994283, 0.6421344399986992, 0.522702112000843, 0.6844102070008375, 0.7821954410010221, 0.759809581000809, 0.749686061999455, 0.5666381030005141, 0.8476465769999777, 0.6446324190001178, 0.7502960600013466, 0.796247646001575, 0.7089187609999499, 0.5939045579998492, 0.63625993200003, 0.7464560389998951, 0.7259226719997969, 0.967568793999817, 0.6033877059999213, 0.5460415630004718, 0.6529100500010827, 0.48840122100045846, 0.6232985450005799, 0.5602723350002634, 0.505888750001759, 0.728582619000008, 0.6514851940009976, 0.5760413369989692, 0.5699563660000422, 0.5955561620012304, 0.7133718650002265, 0.5797001709997858, 0.5371124580015021, 0.7583607619999384, 0.6820385719984188, 0.7445385200007877, 0.7323879260002286, 0.6867382170003111, 0.6643167580004956, 0.5681039589999273, 0.8200529059995461, 0.7963875220011687, 0.6936730540001008, 1.0249973789996147, 0.8886257249996561, 0.6419906860010087, 0.6800209909997648, 0.613656016999812, 0.5937057030005235], "average": 0.7416022508400602}, {"name": "20", "timings": [1.6870447740002419, 1.0619614429997455, 0.7593565679999301, 0.745034105000741, 0.6409546539998701, 0.7238262749997375, 0.8991460439992807, 0.982717065999168, 0.5917417880009452, 0.745819941001173, 1.002952823000669, 0.7380010570013837, 0.6756371899991791, 0.6709476649994031, 0.7916641140000138, 0.7707347980012855, 0.7825915869998425, 0.730681701001231, 0.7138087390012515, 0.7043878029999178, 0.6761642609999399, 0.6635777060000692, 0.6313715529995534, 0.8100534790009988, 0.5753366380013176, 0.5538720130007277, 0.6196205229989573, 0.6620581359984499, 0.7846460549990297, 0.6897403839993785, 0.7784476140004699, 1.002525992000301, 0.6727990700001101, 0.6582593279999855, 0.755371130999265, 0.6773363650008832, 0.6755077929992694, 0.6340017299989995, 0.7054300290001265, 0.7408244130001549, 0.8572814529998141, 1.0304203499999858, 0.6509073149991309, 1.1398827859993617, 0.6832189249998919, 0.8348601279994909, 0.9796756159994402, 0.7197146980015532, 0.7029902510003012, 1.001869091000117, 0.661878468001305, 0.6628953930012358, 0.7768995700007508, 0.9903191449993756, 0.749216644999251, 0.788665205000143, 0.9930577559989615, 1.0769610360002844, 0.8039462579999963, 0.5981117760002235, 0.7807388260007428, 0.7342858400006662, 0.6533284510005615, 0.8052760409991606, 0.7577772790009476, 0.6621230839991767, 0.880964069001493, 0.6754004780013929, 0.73880827100038, 0.7946509160010464, 0.9178217859989672, 0.7858854949990928, 0.7453665409993846, 0.6627942980012449, 0.8923954349993437, 1.3230173629999626, 1.0469314559995837, 1.0892899690006743, 1.5351302769995527, 1.078775862000839, 1.2549468919987703, 1.32594274999974, 1.0055539029999636, 1.4046381530006329, 0.8435507169997436, 1.3572081820002495, 1.6118979069997295, 1.0226389999988896, 1.3090770079998038, 1.2140595340006257, 1.7684976060008921, 1.0598277539993433, 1.5366368440008955, 1.4730875710010878, 1.4255820529997436, 1.4686354179993941, 1.3566769369990652, 1.25054283999998, 1.5120009399997798, 1.4289324900000793], "average": 0.9127942244900623}, {"name": "50", "timings": [2.4010022649999883, 1.3169092460011598, 0.9176615570013382, 1.0183448730003875, 0.8911920720001945, 0.8367188490010449, 0.9458918220007035, 0.966109647999474, 0.8939166590007517, 0.7397582690009585, 0.9655604970012064, 0.9076840260004246, 0.8912320970011933, 0.8948429730007774, 0.8994880680002098, 1.0653339350010356, 1.0614164800008439, 0.9419927950002602, 0.9887510130010924, 0.993282655999792, 0.8334224930003984, 1.144652060000226, 1.51797513999918, 1.3022560619992873, 1.2038775979999627, 1.3449318500006484, 1.2779412569998385, 1.177349616000356, 1.2031701200012321, 1.2231368090015167, 1.1539493489999586, 1.232202146000418, 1.2261487579999084, 1.263273948999995, 1.1709222509998654, 0.8922108970000409, 0.8595069589991908, 0.9720260369995231, 1.0004395199994178, 0.9314592909995554, 1.1078299840010004, 0.9540756789992884, 0.8615517420003016, 0.8731305199999042, 0.9450928589994874, 0.9686583989987412, 0.9891222559999733, 0.8798432719995617, 1.0233746720005001, 1.0049130089992104, 0.8889130349998595, 1.0279658090003068, 1.0384792810000363, 0.9131947650002985, 0.9229533719990286, 0.8345118969991745, 1.0123240080010873, 0.8306056609999359, 0.9885778530006064, 0.8530905049992725, 1.6569272780016036, 1.4749591569998302, 1.3472616110011586, 1.3040096959994116, 1.6182086869994237, 1.2884292650014686, 1.457455622999987, 1.3809483920013008, 1.1572465089993784, 1.1340676079998957, 1.3928949630007992, 1.793966080998871, 1.5926984629986691, 1.0692306220007595, 1.227168420000453, 1.0658789570006775, 1.3086305010001524, 1.2142271929988055, 1.4111023770001339, 1.6805918310001289, 1.3768254000005982, 1.3716491399991355, 1.308085607999601, 1.1265952069988998, 1.1357537629992294, 1.3074050750001334, 1.4791520859998855, 1.3963693880014034, 1.1265694390003773, 1.301482324999597, 1.2145063150001079, 1.281323823999628, 1.3074881050015392, 1.3533968319989071, 1.3251481259994762, 0.8629217670004437, 0.9994548369995755, 0.8547839420007222, 0.7554689909993613, 0.8581215839985816], "average": 1.1370455552801104}, {"name": "100", "timings": [2.882068683999023, 1.5258500240015564, 1.6368532030010101, 1.5668996360000165, 1.3810491410004033, 1.6114256379987637, 1.6650679570011562, 1.4603342820009857, 1.448333234000529, 1.6466306909987907, 1.3925879020007415, 1.5049913170005311, 1.322328682999796, 1.7492538730002707, 1.1303690669992648, 1.1262610760004463, 1.2706832780004333, 1.2252172340013203, 1.2006086359997425, 1.338671361998422, 1.1560417139990022, 1.1872416679998423, 1.353528240999367, 1.2661620669987315, 1.2389313700005005, 1.218025239999406, 1.2230096189996402, 1.2339471989998856, 1.3083883869985584, 1.514002485000674, 1.738011641000412, 1.6991511819996958, 1.5557581489993026, 1.5058152099991275, 1.5248674159993243, 1.367356638000274, 1.3243271840001398, 1.3922996340006648, 1.6931948470009957, 1.541745489999812, 1.598463037998954, 1.9559865949995583, 1.4011431769995397, 1.3530512259985699, 1.5715429289994063, 1.5456589660007012, 1.5672189130000334, 1.3762850069997512, 1.4107854399990174, 1.515433201999258, 1.4157070399996883, 1.407392806999269, 1.112077453000893, 1.1479920860001585, 1.43003415900057, 1.2764572930009308, 1.189901441000984, 1.26645518100122, 1.2205151180005487, 1.2161449169998377, 1.332046793999325, 1.160728871000174, 1.260278756999469, 1.07954684699871, 1.0820430429994303, 1.504512147999776, 1.6615701039991109, 1.5624398330000986, 1.6480960810004035, 1.622999606999656, 1.657199967001361, 1.596454451999307, 1.673511969998799, 1.533528630001456, 1.4866923000008683, 1.7614931860007346, 1.4265648950004106, 1.4545161299993197, 1.489673746000335, 1.6159365630010143, 1.4331433420011308, 1.7457496260012704, 1.4997731729999941, 1.459874268999556, 1.3869502510005987, 1.4916466340000625, 1.5193205060004402, 1.4913245429997914, 1.267179959000714, 1.0617709010002727, 1.0048527230010222, 1.3544563409996044, 1.1408206699998118, 1.2008078529997874, 1.1497318290003022, 1.1489602940000623, 1.6229086029998143, 1.767819086999225, 1.5317820550008037, 1.4586144269997021], "average": 1.4345285729700117}]} \ No newline at end of file diff --git a/playground/issuer/notebooks/Attribute Number - Revocable.txt b/playground/issuer/notebooks/Attribute Number - Revocable.txt new file mode 100644 index 0000000..577d09a --- /dev/null +++ b/playground/issuer/notebooks/Attribute Number - Revocable.txt @@ -0,0 +1 @@ +{"name": "Attribute Number - Revocable", "results": [{"name": "1", "timings": [1.661246329000278, 1.0745596030010347, 1.166244177000408, 0.7494734809988586, 0.9796466970001347, 0.8093378510002367, 1.2353430740004114, 1.1472928519997367, 1.1466977009986294, 0.8436907329996757, 1.1040064169992547, 1.2846404510000866, 0.9092380109996157, 1.0157633700000588, 1.0001512080016255, 0.9694075530005648, 0.9904622810008732, 0.9353298309997626, 0.934728352998718, 1.2331350399999792, 0.8137893240000267, 1.101848644999336, 1.0217676530010067, 1.2429551639997953, 1.055237157999727, 0.9266215640000155, 0.9832131559996924, 1.310446266999861, 1.0351536270009092, 1.388270992998514, 1.1682248789984442, 1.0848265580007137, 0.9168838929999765, 1.3052384499987966, 1.1225838760001352, 0.9250498820001667, 0.7515475210002478, 1.0913781090002885, 0.9175934150007379, 0.8808108889988944, 0.9921010409998416, 1.1871699019993684, 0.8663771520004957, 1.1012827709982957, 0.9251896810001199, 1.165768439999738, 1.3862670619982964, 0.8020171849984763, 0.8619361269993533, 0.9386682889999065, 0.9308726259987452, 0.9782614260002447, 0.8446336859997245, 1.1182183450000593, 0.934383286999946, 1.1779823770011717, 0.9967733080011385, 1.1917504190005275, 1.1550447560002794, 0.8258973159991001, 1.019429100000707, 1.1003707540003234, 1.0594186839989561, 1.2712012859992683, 0.9751472199986893, 0.9583004149990302, 0.9085057680003956, 1.2808530010006507, 1.000150035999468, 1.1053916139990179, 0.9908690709999064, 1.0775849120000203, 1.039239018000444, 1.0634537059995637, 1.276987134000592, 0.9596610030002921, 1.2606369870009075, 1.3027444290000858, 1.0483580620002613, 1.0843693210008496, 0.829638242999863, 1.0974228579998453, 0.9337664079994283, 1.3719659889993636, 1.210073607000595, 1.197201599001346, 1.0400572550006473, 1.0428069560002768, 1.1488705560004746, 1.111203383999964, 1.0276807360005478, 1.0500200299993594, 1.0465073529994697, 1.126728450999508, 1.1611231690003478, 0.9965374200000952, 0.8221389899990754, 1.2393748790000245, 0.9954326709994348, 1.1945514020007977], "average": 1.0604020470899196}, {"name": "5", "timings": [1.425847419001002, 1.0013251820000733, 1.010129569000128, 0.9411634699990827, 1.0048825989997567, 1.0412311039999622, 1.1545082240008924, 1.2174388639996323, 1.1277431349990366, 1.020928060001097, 0.9228593770003499, 0.962252356001045, 1.0337739450005756, 1.2276706820011896, 1.1444746969991684, 1.038762783000493, 1.150096379000388, 1.0383340080006747, 0.922444854000787, 1.0840144459998555, 0.9408558400009497, 1.0161600720002752, 1.1332590980000532, 0.9632059399991704, 0.9709078979994956, 0.9291374219992576, 0.9661215739997715, 1.0259533720000036, 1.167239761000019, 1.2110090879996278, 0.9720557639993785, 1.0464963100002933, 0.9742185159993824, 0.8254367569988972, 0.966462426000362, 1.0787643389994628, 1.0412837080002646, 1.1796551509996789, 1.0379237310007738, 0.9792953489995853, 0.9488781049985846, 1.2511657979994197, 0.8416054239987716, 1.0096069610008271, 0.9507245510012581, 0.9379451749991858, 0.8701560940007766, 1.3076478759994643, 1.0372436340003333, 1.089227476000815, 0.8809755980000773, 0.9279909559991211, 1.2601642129993706, 0.8630297090003296, 1.290821270999004, 0.906886480999674, 1.0133607719999418, 1.0825823420000233, 1.14199606800139, 1.161391202998857, 1.3734508699999424, 0.9647187330010638, 0.9870586739998544, 0.9538435979993665, 0.99833831900105, 1.2028703809992294, 1.0968219240003236, 0.9737523099993268, 1.0610183909993793, 1.0441519169999083, 0.8313014990017109, 0.9356125300000713, 1.0271236330008833, 0.9902448160009953, 1.001772028999767, 1.0593071469993447, 1.0434890010001254, 0.9855197910001152, 1.1443926400006603, 1.104195197000081, 1.214268269999593, 1.1644833119989926, 1.0592859950011189, 0.9013448149999022, 0.9857432749995496, 1.1218464109988417, 0.8994424110005639, 1.2554734380009904, 0.9368076009996003, 0.9523621890002687, 0.9884014320014103, 1.0079369169998245, 1.2083971009997185, 0.9011450649995822, 1.0674508330012031, 1.1154542160002165, 1.1191121880001447, 0.8841299329997128, 0.8792020029995911, 0.872826573000566], "average": 1.039828203540037}, {"name": "10", "timings": [1.391374339000322, 1.0572387689990137, 1.0546129929989547, 0.9780714249991433, 1.062370280000323, 1.0064666270009184, 1.389274322998972, 1.1368768899992574, 1.1418483950001246, 0.8977058370001032, 0.9196538780015544, 0.9353276820002066, 1.5949249369987228, 0.9305854119993455, 1.1981995650003228, 0.9927708039995196, 1.2926193170005718, 0.9589224999999715, 1.2654069800009893, 1.2161633690011513, 1.2132264710016898, 1.065588719000516, 1.1124730379997345, 1.1518458679984178, 0.8945380599998316, 0.8745817529998021, 1.111925554998379, 1.071628020999924, 1.025159419999909, 0.9139392209999642, 1.2243255869998393, 0.9307503389991325, 1.1088750889994117, 1.0792240910013788, 0.9227252620003128, 1.1044352749995596, 0.8558680200003437, 1.0377862959994673, 1.2343720989993017, 0.9778180900011648, 0.8987594869995519, 1.0954076889993303, 0.9342798620000394, 1.0012894020001113, 1.1224758879998262, 1.0785282919987367, 0.9513078020008834, 1.04086923199975, 0.9595220569990488, 0.9812595059993328, 0.9816667579998466, 0.9969285860006494, 0.9628537579992553, 1.0300009679995128, 1.1578095459990436, 1.005291011000736, 1.0471629710009438, 0.9614437210002507, 0.9367084660007094, 1.0594488469996577, 0.8809646780009643, 0.9298136800007342, 0.9564630200002284, 1.624669458000426, 1.0519852779998473, 0.928472249999686, 1.0246471379996365, 0.9525510069997836, 1.0821076319989515, 1.0324546820011165, 1.0471718270000565, 0.8831017779993999, 0.9453069200008031, 1.0793099610000354, 1.1303082489994267, 1.026857500000915, 0.8983332159987185, 0.9877026240010309, 1.0150287870001193, 1.150018431000717, 0.8848717239998223, 0.9730662210004084, 0.9522390780002752, 0.9137296360004257, 1.056048260001262, 1.3088167580008303, 0.9879092480005056, 1.0952708709992294, 0.953114268999343, 0.9563656499994977, 0.9566626680007175, 1.0511906270003237, 1.1387010790003842, 1.1576035399993998, 0.9470443999998679, 0.9943204290011636, 1.3074287669987825, 0.9526887169995462, 1.0496778000015183, 1.0611946360004367], "average": 1.0485972693900112}, {"name": "20", "timings": [2.6228086310002254, 1.0139019899997948, 1.0793776850005088, 1.5339578429993708, 1.0703737799994997, 0.9679523020004126, 1.0605754520001938, 1.1119464860003063, 1.3188290079997387, 1.1664875219994428, 1.1247974219986645, 1.208253725000759, 1.1947025370009214, 1.0430354670006636, 1.379307481000069, 1.115632719000132, 1.2609933469993848, 1.1236226559994975, 0.9920412350002152, 0.9917346219990577, 1.0613256999986334, 0.9351417130001209, 1.0126647260003665, 0.9370506329996715, 1.0754302379991714, 0.9617036170002393, 1.1728906389998883, 1.034521110001151, 1.0442371490007645, 1.2870522209996125, 1.5435867160013004, 1.370086127999457, 1.5953324960009923, 1.929271659000733, 1.6618323890015745, 1.3636920789995202, 1.6199971320002078, 1.7940210350006964, 1.664418434000254, 1.539558204000059, 1.7210967169994547, 1.6362604209989513, 1.3816913539994857, 1.558401510999829, 1.8258364889989025, 1.8023927150006784, 1.6712398830004531, 1.584281508999993, 1.7905870600006892, 1.8462182269995537, 1.507635324000148, 1.9489247120000073, 1.5705912449993775, 1.374148568000237, 1.2264425849989493, 1.2977463180013729, 1.0476484970004094, 1.2126016940001136, 1.0269478150003124, 1.1376138650011853, 1.3031935520011757, 1.3465676579999126, 1.2722204599995166, 1.14761668599931, 1.0677256680010032, 1.1381462789995567, 1.2432500289996824, 1.315883514998859, 1.0570904839987634, 1.1423456979991897, 1.028470613000536, 1.0181037050006125, 1.0025410870002815, 1.011080962000051, 1.0143557800001872, 1.0252016260001255, 0.9713005699995847, 1.033110588999989, 1.0168758120016719, 1.092859413000042, 2.0328211139985797, 1.6324428649986658, 1.445102836998558, 1.4314684319997468, 1.5535749810005655, 1.8512706620003883, 1.6337319369995384, 1.8284799859993655, 1.7939886309995927, 1.857967533000192, 1.426665781000338, 1.430455253999753, 2.031231128001309, 1.527048122999986, 1.5229429039991373, 1.6568208019998565, 2.0056873920002545, 1.878420344000915, 1.8041721739991772, 1.6563771050005016], "average": 1.3740106260799985}, {"name": "50", "timings": [2.544638348999797, 1.3816544019991852, 1.4650372479991347, 1.6278705759996228, 1.149008929998672, 1.2087448940001195, 1.2777726250005799, 1.3786625390002882, 1.464599154998723, 1.381469849999121, 1.1034279959985724, 1.3247420770003373, 1.3527126909993967, 1.2102999620001356, 1.2565965579997282, 1.282022371999119, 1.5607189490001474, 1.4411827710009675, 1.4598862570001074, 1.5108589319988823, 1.4708494630012865, 1.6434422210004414, 1.451289569000437, 1.4339652409998962, 1.4263176399999793, 1.4510045210008684, 1.3502049889993941, 1.4808447740015254, 1.371782001999236, 1.5690374599998904, 1.4597567279997747, 1.3399312889996509, 1.31509839499995, 1.152174910001122, 1.1825027550003142, 1.1911543260011968, 1.172236566999345, 1.140052040998853, 1.1475997870002175, 1.245500593999168, 1.0932235549989855, 1.1443418719991314, 1.373296890000347, 1.2682706790001248, 1.112787963998926, 1.2084158739999111, 1.3289742480010318, 1.2699979949993576, 1.2278577410015714, 1.17139180400045, 1.253809857998931, 1.2400283120005042, 1.2657760570000391, 1.4678963730002579, 1.2653973519991268, 1.2324904369997967, 1.344826713000657, 1.3195831009998074, 1.4802816520004853, 1.2242115099998045, 1.2201275890001853, 1.3733113709986355, 1.5184307220006303, 2.101026004000232, 1.562629897000079, 1.3853816020000522, 1.6278674290006165, 1.4270577679999406, 1.3552616840006522, 1.394686489000378, 1.4353737509991333, 1.4557486890007567, 1.4545328019994486, 1.4664841200010414, 1.4983825540002726, 1.3369444959989778, 1.3150667600002635, 1.3900289550001617, 1.3261323229999107, 1.478058034001151, 1.4054414549991634, 1.38041569500092, 1.1764695470010338, 1.08686105400011, 1.364353035000022, 1.345574580000175, 1.4074905199995555, 1.2235413460002746, 1.2241744530001597, 1.420370947000265, 1.2475616819992865, 1.2436153489998105, 1.166160808999848, 1.210783652999453, 1.15782991100059, 1.42771037500097, 1.780353586000274, 1.6377794529998937, 1.8607095870011108, 1.6860443669993401], "average": 1.3724528683499921}, {"name": "100", "timings": [3.6990666840010817, 2.2350431670001853, 2.1067556380003225, 1.8820593969994661, 1.647158584999488, 1.9838610669994523, 1.6741650519998075, 2.0985450410007616, 1.9024615150010504, 1.9704203430010239, 1.8470202070002415, 2.103771494001194, 1.7788692620015354, 1.4822312449996389, 1.5366173620004702, 1.7248556159993313, 1.5171182110007067, 1.442069533000904, 1.5126818750013626, 1.9569104149995837, 1.4542388289992232, 1.461566715999652, 1.4902914810008951, 1.6068639770001028, 1.6300981259992113, 1.5890687160008383, 1.8618393030010338, 1.9765718660000857, 1.980669732000024, 1.9310776649999752, 1.7419434280000132, 1.9984915399982128, 1.603787072999694, 2.0039581740002177, 1.9832290449994616, 1.8926063060007436, 1.943089776999841, 2.2211591269988276, 1.7452451980007027, 1.9882269950012414, 1.9751702320008917, 2.0667757779992826, 1.7426996350004629, 2.135676866999347, 1.802360867999596, 1.9704957249996369, 2.031689057999756, 1.8937501949985744, 1.8302746659992408, 2.073132004001309, 1.6189500969994697, 1.3756647879999946, 1.6196551820012246, 1.6398108979992685, 1.4840818130014668, 1.53452350400039, 1.6797294410007453, 1.819055751999258, 1.6963452259988117, 1.4548978170005284, 1.5104908869998326, 1.5519305420002638, 1.5730702969995036, 1.491253312000481, 1.507081266001478, 1.6007014459992206, 1.499963125001159, 1.5228698880000593, 1.5594852319991332, 1.8932636339995952, 1.805497548000858, 1.894769909000388, 1.8242789109990554, 2.070234729999356, 1.82528545400055, 1.8443114820001938, 1.9943774639996263, 1.8560863539987622, 1.8204140620000544, 1.8257723200003966, 1.6613437800006068, 1.7310296019986708, 1.8393854930000089, 1.7321286469996267, 1.3846940839994204, 1.3874679820000893, 1.5973883149999892, 1.657002433001253, 1.5274149849992682, 1.6186311519995797, 1.7149475649985106, 1.5637545760000648, 1.5580471639987081, 1.5297917150001012, 1.523161982999227, 1.7927730069986865, 1.5471254759995645, 1.548866545999772, 1.5113194299992756, 1.8749791250011185], "average": 1.7642283525200038}]} \ No newline at end of file diff --git a/playground/issuer/notebooks/Attribute Size - Non Revocable.txt b/playground/issuer/notebooks/Attribute Size - Non Revocable.txt new file mode 100644 index 0000000..e611749 --- /dev/null +++ b/playground/issuer/notebooks/Attribute Size - Non Revocable.txt @@ -0,0 +1 @@ +{"name": "Attribute Size - Non Revocable", "results": [{"name": "128B", "timings": [1.4990722920001645, 0.7753462979999313, 0.627869801000088, 0.6348853780000354, 0.9620403450007871, 0.8018073439998261, 0.5223190460001206, 1.0270793250001589, 0.9825512150000577, 0.7873802670001169, 0.4949126620003881, 0.7167353009999715, 0.532466943000145, 0.6171295340000142, 0.8427785960002439, 0.8185412789998736, 0.8671638390005683, 0.9625285649999569, 0.44735478700022213, 0.6696653949993561, 0.8787114569995538, 0.7176165410000976, 0.6326555559999179, 0.9770145379998212, 0.8141185429994948, 0.552763978999792, 0.4974369849996947, 0.6498744700002135, 0.8273481630003516, 0.6669411120001314, 0.5893547400000898, 0.8629553459995805, 1.101996684000369, 0.7874364079998486, 0.4601149800000712, 0.458025971999632, 0.913019347000045, 0.8216669080002248, 0.8751865909998742, 0.692640876999576, 0.622671554999215, 0.7799874920001457, 0.4649432119995254, 0.45114714600003936, 0.6533226900000955, 0.7607011910004076, 0.5664887029997772, 0.780168999000125, 0.6095270229998278, 0.7544905909999216, 0.6804932089999056, 0.5692341950007176, 0.6848866390000694, 0.7276854189994992, 0.8132157560003179, 0.5775083640000958, 0.5262906629995996, 0.9238448429996424, 0.8061652139995203, 0.607639799000026, 0.6455603460008206, 0.6205754000002344, 0.8578162459998566, 1.1296099520004645, 0.8230809839997164, 0.7894321100002344, 0.7057787180001469, 0.5333295130003535, 0.7929034170001614, 0.560876835000272, 0.691174171000057, 0.6158412330005376, 0.770806848000575, 0.9458728539993899, 0.7497067010008323, 0.6421267530004116, 0.9094964050000272, 0.751294367999435, 0.8605589240005429, 0.7375164310005857, 0.8504376580003736, 0.7713301379999393, 0.5112789439999688, 0.6016597919997366, 1.019502086999637, 0.7245303979998425, 0.6333597660004671, 0.5246797549998519, 0.5209610499996415, 0.8424000689992681, 0.821800187000008, 0.5559609299998556, 1.0484179900004165, 0.8639553729999534, 0.8998008980006489, 0.8432258980001279, 0.8012372949997371, 0.5971277170001486, 0.8377545419998569, 1.0902226200005316], "average": 0.7421992142800354}, {"name": "512B", "timings": [0.8495499339996968, 0.5394863470000928, 0.6210563549993822, 0.7812013009997827, 0.8913169360002939, 0.902684940000654, 0.6317856209998354, 0.9426647149994096, 0.4228230880007686, 0.7065709999997125, 0.7434981530004734, 0.9803893890002655, 0.6410010669997064, 0.6974028109998471, 0.7063624479997088, 0.7650132240005405, 0.6916537970000718, 0.8804015529995013, 0.9023977040005775, 0.948224511999797, 0.5790217249996203, 0.9851134800001091, 0.748929524000232, 0.5057001470004252, 0.8999023489996034, 1.010595894999824, 0.7607004299998152, 0.7197492960003729, 0.920733195000139, 0.8388756360000116, 0.4927528980006173, 0.6023876440003733, 0.9865594889997737, 1.1568467699999019, 1.0213065620000634, 0.7865648190008869, 0.8430712090002999, 0.5349135300002672, 0.6175348550004855, 0.5497409629997492, 0.6486143020001691, 0.5597915879998254, 0.5536330939994514, 0.642440304000047, 0.7187591319998319, 0.9346859659999609, 0.4193300380002256, 0.6480572460004623, 1.0339564219993918, 0.8232026000005135, 0.8063782859999264, 0.8001797189999706, 1.181310392999876, 0.5808147150000877, 0.6003326879999804, 0.6813052610004888, 0.577695367999695, 0.9695555919997787, 0.8651646849993995, 0.7526728049997473, 0.8662630590006302, 0.5249079539999002, 0.5417748059999212, 0.8259310059993368, 0.5938981330000388, 0.8256732080008078, 0.8105213570006526, 0.6263890110003558, 0.7151666119998481, 0.6184574589997283, 0.5084468020004351, 1.0654897510003138, 0.877548342999944, 0.8583542300002591, 0.7902589799996349, 0.9740770899998097, 0.6431766790001348, 0.5973258110007009, 0.7959873170002538, 0.6080466680004974, 0.9531874180001978, 0.8665987310005221, 0.6843268299999181, 0.7157141600000614, 0.6476442409993979, 0.6148952379999173, 0.9075596179991408, 1.0167667470004744, 0.8427763549998417, 0.9261611689998972, 1.009814799999731, 0.6285553770003389, 0.7360539760002212, 0.579359325999576, 0.6176247470002636, 0.7224184050000986, 0.6693609679996371, 1.0470978419998573, 0.9254779180000696, 0.4995126050007457], "average": 0.7588296626200463}, {"name": "1kB", "timings": [1.2470274609995613, 0.8446177209998496, 0.7316860060000181, 0.7687312810003277, 0.5723297289996481, 0.5166098669997155, 0.6844293140002264, 0.5291548049999619, 0.5687897990001147, 0.601050409999516, 0.7645874820000245, 0.762624371000129, 0.6447181710000223, 1.087299162999443, 0.540277690000039, 0.6753477060001387, 0.9314070930004164, 0.989110360000268, 0.8804716829999961, 0.6963057160000972, 0.47075748599945655, 0.6053637819995856, 0.4503138259997286, 0.725127853000231, 0.5324339720000353, 0.6153617230002055, 0.465534781000315, 0.45623507400068775, 0.5055707719993734, 0.5509392130006745, 0.510230135000711, 0.5207998579999185, 0.5079058139999688, 0.522431534000134, 0.5308119310002439, 0.462895388999641, 0.47178089099998033, 0.4476226639999368, 0.4644482699995933, 0.4235428990004948, 0.60847352699966, 0.4478444229998786, 0.5219000910001341, 0.4741496469996491, 0.48645756499990966, 0.5056408529999317, 0.4771647790003044, 0.45917293900038203, 0.46939322399975936, 0.4762061089995768, 0.5389627120002842, 0.5121194369994555, 0.6253790749997279, 0.45688401799998246, 0.5001545009999973, 0.5587537179999345, 0.476440471999922, 0.6592034449995481, 0.47701403700011724, 0.4872872219993951, 0.45746900599988294, 0.49947936099943036, 0.5872811460003504, 0.4984708640004101, 0.5356389790003959, 0.4903467799995269, 0.49987228299960407, 0.5024381949997405, 0.4801654029997735, 0.4755121779999172, 0.5630428039994513, 0.489046139000493, 0.7016565610001635, 0.5212137589996928, 0.6304929230000198, 0.8168240149998383, 0.6936419880003086, 0.5305327779997242, 0.8018172820002292, 0.6250183100000868, 0.7766704010000467, 0.543882835999284, 0.8271428210000522, 0.6810579800003325, 0.8336588450001727, 0.4941914129994984, 0.7344399419998808, 0.8057105660000161, 0.7697212769999169, 0.7305475209996075, 0.6218557040001542, 0.6550102239998523, 0.6327495499999714, 0.5325930029994197, 0.4744678119996024, 0.6797058000001925, 0.9656190289997539, 0.6014154729991787, 0.7152448119995825, 0.6335882700004731], "average": 0.60604519521994}, {"name": "16kB", "timings": [1.1632680169996092, 0.8525643960001617, 0.8587532860001375, 0.6742342699999426, 0.7638291100001879, 0.5651191580000159, 0.8669338839999909, 0.8666987730002802, 0.5984500140002638, 0.7584501150004144, 0.9390045879999889, 0.7832919200000106, 0.5870719719996487, 0.639707183999235, 0.6830263749998267, 0.8430655909996858, 0.8609183730004588, 0.716945353000483, 0.7029899750004915, 0.6765279629998986, 0.621553624999251, 0.7113578609996694, 0.7520682480007963, 0.869754133999777, 0.6436623139998119, 0.6313382010002897, 0.8543906499999139, 0.8880775240004368, 0.6991854910002075, 0.7162557090005066, 0.6405239209998399, 0.654323046999707, 0.5522359590004271, 0.6508695849997821, 0.618473659999836, 0.6226020820004123, 0.5709468790000756, 0.615879631000098, 0.959205330000259, 0.6477834560000701, 0.8526522310003202, 0.6547831179996138, 0.6585014989996125, 0.9375336109997079, 0.9247086329996819, 0.5942250250000143, 0.6928517700007433, 0.7483318679996955, 0.8051542140001402, 0.7698497330002283, 0.8130239750007604, 0.871673390000069, 0.7099386830004732, 0.7368300680000175, 0.6625325199993313, 0.5898701059995801, 0.5923421030001919, 0.6947341660006714, 0.6359422770001402, 0.6725345029999517, 0.7725898669996241, 0.6816862559999208, 0.6615215709998665, 0.7772497750002003, 0.7911060739997993, 0.6821541539993632, 0.8963702399996691, 0.5353467599998112, 0.6169465080001828, 0.6951986340000076, 0.6491007129998252, 0.7032804140008011, 0.6854872260000775, 0.6338176039998871, 0.6938662290003776, 0.673622768000314, 0.6969704009998168, 0.6112866220000797, 0.7481144929997754, 0.70315995799956, 0.6612778889993933, 0.8158549629997651, 0.9584783580003204, 0.7398881589997472, 0.6974772820003636, 0.6210835360006968, 0.6139634940000178, 0.672470204000092, 0.6064472659991225, 0.649559778999901, 0.5907397700002548, 0.6168603850001091, 0.5834679609997693, 0.6010581900000034, 0.7451721870002075, 0.8719413939998049, 0.6737394919991857, 0.7110686839996561, 0.6796995570002764, 0.6926333179999347], "average": 0.7165110925200042}, {"name": "64kB", "timings": [1.3580327789995863, 1.1286114069998803, 1.1322805300005712, 1.0400001889993291, 1.0947005429998171, 1.2211170489999859, 1.3363692859993535, 1.3037501600001633, 1.1670371199998044, 1.2015505830004258, 1.1884780050004338, 1.4496221590006826, 1.1835220010007106, 1.0770708600002763, 1.208894981999947, 1.146266378999826, 1.228906027999983, 1.1766046030006692, 1.268563737000477, 1.2068309910000607, 1.3109591660004298, 1.4550430280005457, 1.0786173110000163, 1.2687005570005567, 1.1046208120005758, 1.1603891249997105, 1.2578503590002583, 1.1836861629999476, 1.0576843620001455, 1.1302518450002026, 1.2545173939997767, 1.0647738400002709, 1.0508511509997334, 1.050634794999496, 1.144816136999907, 1.1042684829999416, 1.2372361910001928, 0.8975508109997463, 0.9930376970005454, 0.9397967309996602, 1.086754385999484, 1.143694313999731, 1.0212172089995875, 0.9868711919998532, 0.9611868989995855, 1.1483736419995694, 0.9558946060005837, 1.0313686199997392, 0.9633464499993352, 0.9256537170003867, 1.0764877779993185, 1.025048890999642, 1.1410304070004713, 1.1581314260001818, 1.015988940999705, 1.020693024999673, 1.0664302260001932, 0.9173400990002847, 1.006472923999354, 1.0808105799997065, 0.961403700000119, 0.9416209070004697, 0.9404223780002212, 1.004757100000461, 0.9996836979998989, 0.9399920730002123, 1.0959692380001798, 1.1677595359997213, 1.6409327110004597, 1.6385919389995252, 1.367752159999327, 1.2217999690001307, 1.1799986890000582, 1.4179452059997857, 1.198671863000527, 1.2041786959998717, 2.3243496699997195, 1.257709731000432, 1.1544555390000824, 1.1761653769999612, 1.131145209999886, 1.157232512000519, 1.549037675999898, 1.1305386829999406, 1.2631180899998071, 1.1048079199999847, 1.0712524209993717, 1.0998330239999632, 1.0692644100008692, 1.0159377959998892, 1.2428979070000423, 1.0401451879997694, 1.05166634500074, 1.0852289360000213, 1.0004120459998376, 0.956857728999239, 0.980716750999818, 0.8928617510000549, 1.0883568330000344, 1.0657958759993562], "average": 1.1442755796500024}, {"name": "128kB", "timings": [2.0093017659992256, 1.727802289000465, 1.9809377070005212, 1.7949001299994052, 1.9567318200006412, 2.0819956159994035, 1.659901689000435, 1.7953255820002596, 2.140603215999363, 1.753488895999908, 1.90820210199945, 1.6362036250002348, 1.8883414470001298, 1.8140284159999283, 1.6825134450000405, 1.7404940460000944, 1.8258411030001298, 1.8184933000002275, 1.793797493999591, 1.7971187789999021, 1.670808253999894, 1.653389977000188, 1.5450578620002489, 1.7995957000002818, 1.526222964000226, 1.635728846999882, 1.5762538339995444, 1.5991800969995893, 1.5875369610002963, 1.61116076899998, 1.6176865710003767, 1.7927598810001655, 1.6040045849995295, 1.523817360999601, 1.4959394699999393, 1.8226594560001104, 1.7877412730003925, 1.6368790910000826, 1.8346088429998417, 1.990656134999881, 1.6662442910001118, 1.6409522879994256, 1.8904543349999585, 2.2896773209995445, 1.6629578920001222, 1.7726664609999716, 2.089460436999616, 1.6959762669994234, 2.0048111309997694, 2.0563976659996115, 1.8565405150002334, 1.7989093810001577, 1.740588337999725, 1.9310308509993774, 1.7029087880000588, 1.744114652999997, 1.7302627239996582, 1.6937082459999147, 1.5170937000002596, 1.491273996000018, 1.9596238720005204, 1.677020621000338, 1.513074270999823, 1.5259204579997458, 1.441215008000654, 1.5869932330006122, 1.4107498980001765, 1.5464912040006311, 1.5183636589999878, 1.880768065000666, 1.607389162999425, 1.7316145670001788, 1.827234684999894, 1.7565861880002558, 1.7632688200001212, 1.7104006079998726, 2.259612652999749, 1.7179576730004555, 1.7380465480000566, 2.0860448220000762, 1.8131755370004612, 1.8766241459998128, 1.6798590210000839, 2.1813575349997336, 1.5929118419999213, 1.819138845999987, 1.8273124520001147, 1.987648146000538, 1.686373870999887, 1.901173154999924, 1.8666886210003213, 1.7341072199997143, 1.780773429999499, 1.9112472309998338, 1.8109081299999161, 1.5338771050001014, 1.6847447410000314, 1.7975287149993164, 1.6818155010005285, 1.4801116680000632], "average": 1.7599949260899939}, {"name": "256kB", "timings": [3.2608585369998764, 2.5351562850000846, 2.8154108600001564, 2.8911366789998283, 2.8864591170004132, 2.6529432710003675, 3.002737707999586, 2.478706832000171, 2.632857430000513, 2.822065950000251, 2.3896644509995895, 2.6920833429994673, 2.7787083240000356, 2.7094836599999326, 3.000825862000056, 2.7392699870006254, 2.654503566999665, 3.0349497930001235, 2.872828849999678, 2.8782275889998346, 2.5910486430002493, 2.80666931199994, 2.9420466709998436, 2.633801986000435, 2.9629274019998775, 2.527769545999945, 2.6667566330006593, 2.6694777820002855, 2.4941201519995957, 2.802516826000101, 2.5930108980001023, 2.669837075999567, 2.6575048240001706, 2.760198124999988, 2.9150657299996965, 2.7060951809999096, 2.9049870249991727, 2.6002340209997783, 2.804437512999357, 2.927791205000176, 2.7108006739999837, 3.180865449000521, 2.730656232000001, 3.4845346550000613, 2.7759841710003457, 2.6410253889998785, 2.8832988200001637, 2.6364493170003698, 3.2867865349999192, 2.596376837999742, 2.602137006000703, 2.890583678999974, 2.682937868999943, 2.942858489000173, 2.7292157729998507, 2.9116235150004286, 2.6283649500001047, 2.602158818999669, 2.8829157689997373, 2.587581630999921, 2.698564491999605, 2.5959859189997587, 2.4768849560005037, 2.8686908150002637, 2.635898451000685, 2.7793239920001724, 2.9027042059997257, 2.50888733300053, 2.724813673999961, 2.524046773000009, 2.575910194000244, 3.0899469039995893, 2.7883493230001477, 2.9953437289996145, 2.7975550339997426, 3.217077708999568, 2.9850428299996565, 2.5822148209999796, 3.271168287000364, 2.5126980900004128, 3.1005343850001736, 2.8127315539995834, 3.523176902999694, 2.9293527509998967, 2.781371599000522, 2.9916096739998466, 2.666148630999487, 2.9312586300002295, 2.8961089619997438, 2.7726654289999715, 2.624994286000401, 2.5567722530004175, 2.5955366150001282, 2.4387139869995735, 2.5378172660002747, 3.065625139999611, 2.471314897999946, 2.784902243000033, 2.843369217000145, 2.8902783789999376], "average": 2.7849772056000073}]} \ No newline at end of file diff --git a/playground/issuer/notebooks/Attribute Size - Revocable.txt b/playground/issuer/notebooks/Attribute Size - Revocable.txt new file mode 100644 index 0000000..eb81b90 --- /dev/null +++ b/playground/issuer/notebooks/Attribute Size - Revocable.txt @@ -0,0 +1 @@ +{"name": "Attribute Size - Revocable", "results": [{"name": "128B", "timings": [1.3299187180000445, 0.9590217850000045, 1.3995224190002773, 0.921847089000039, 1.0390215839997836, 0.8501716569999189, 1.1388632240004881, 1.041711290999956, 1.038468316000035, 0.810062506999202, 1.0837660030001643, 1.013253963000352, 0.9986711560004551, 1.0980006189993219, 0.8696488109999336, 1.0234369919999153, 1.0031485019999309, 0.9159205589994599, 1.138068000000203, 1.331850945000042, 0.8988521309993303, 1.1315997129995594, 1.0845035610000195, 0.8949300529993707, 1.1040968179995616, 1.0684772889999294, 0.8053263050005626, 1.164148536000539, 0.8229934580003828, 1.089273085000059, 1.1034955310005898, 0.8582700599999953, 1.045934629999465, 1.0801466210004946, 1.0668978160001643, 1.1755410289997599, 0.8875999089996185, 0.8173161039994739, 0.9117716699993252, 0.942498271999284, 0.9551072960002784, 0.9574946689999706, 0.882559826999568, 0.866317937000531, 1.040477402999386, 1.1860179499999504, 0.9947539840004538, 0.9211350119994677, 1.1740855030002422, 0.9473381460002201, 1.0134778289993847, 1.1951659900005325, 0.8749277569995684, 0.9198217060002207, 0.8896632129999489, 0.8784298149994356, 1.075590639999973, 0.9507140649993744, 0.9390250059996106, 0.8608442510003442, 1.1061475369997424, 0.8843251750004129, 1.1809028280003986, 0.9293651099997078, 0.9757358059996477, 1.4041139959999782, 0.8917016200002763, 0.9949638790003519, 0.8460893500005113, 1.2314531739993981, 0.9262184150002213, 1.0487991119998696, 0.7718912820000696, 0.8033433310001783, 0.8904655059996003, 1.0232871179996437, 1.03102934799972, 1.2405222130000766, 0.8241941650003355, 1.1630274059998555, 1.1517425510000976, 0.9326156400002219, 1.252106888000526, 0.855244508999931, 0.9201728759999241, 1.0373108399999182, 1.1097917920005784, 1.2484358830006386, 0.9235784380007317, 0.8142149380000774, 0.9733891750001931, 1.0672393989998454, 0.9703183740002714, 0.9288805039996078, 0.8621282089998203, 0.8469458580002538, 1.3610961100002896, 0.9415212009998868, 0.8498045599999386, 1.3172694060003778], "average": 1.010123782519986}, {"name": "512B", "timings": [1.2048522299992328, 0.9367181910001818, 1.343528561000312, 0.9349375219999274, 1.0671585529998993, 1.1393251300005431, 1.0771480430003066, 1.3389797090003412, 1.2127569309996034, 1.263581637000243, 0.864235061000727, 1.1467380779995437, 0.8599770179998814, 1.15377249499943, 0.9870504540003822, 1.0389512849997118, 1.0164750150006512, 1.1106961949999459, 1.2761511250000694, 1.3145137490000707, 1.054802818999633, 1.1056474249999155, 1.299858200000017, 1.1264825399994152, 1.1031201850000798, 1.1525254089992814, 0.8161539939992508, 1.0679035379998822, 0.9565501789993505, 1.0086865109997234, 1.2365775580001355, 0.8943968459998359, 0.9368744540006446, 0.9982686240000476, 1.0008155760006048, 0.8280510779995893, 1.265510666999944, 0.8842526479993467, 1.0588433479997548, 0.9625418679997892, 0.9587190599995665, 0.997825135000312, 0.9554818910000904, 0.771660589000021, 0.9853939909999099, 0.8816397319997122, 1.2406009669994091, 1.1506783790000554, 1.0312918830004492, 0.8975720620001084, 1.2391787070000646, 1.1240257280005608, 1.0261545980001756, 1.0633250680002675, 0.8402788819994385, 1.3102175409994743, 1.0614286320005704, 0.9175006189998385, 0.9080798029999642, 1.0512780779999957, 0.8371457250004823, 1.2326927459998842, 0.9457193729995197, 1.1582752740005162, 1.411780197000553, 0.9707822230002421, 1.2647080579999965, 1.0869449909996547, 1.0141338710000127, 1.231608621000305, 0.8829822600000625, 1.0868568980004056, 0.9042048510000313, 1.1093614119999984, 1.1238122380000277, 0.9571986629998719, 1.0129083829997398, 1.1200227219997032, 1.1971710289999464, 1.1216956509997544, 1.0222932979995676, 0.9874898529997154, 0.9882607210001879, 1.1114686199998687, 0.994716915999561, 0.8753365180000401, 0.9300478670002121, 0.893609491999996, 1.0474761630002831, 0.8874724449997302, 0.8669317420008156, 0.9406897500002742, 1.0536572210003214, 0.8417525080003543, 0.9659369479995803, 1.2280396420001125, 0.8780624890005129, 1.2438677869995445, 0.9362446729992371, 0.9340949930001443], "average": 1.04755196625998}, {"name": "1kB", "timings": [1.3098330840002745, 0.8954864600000292, 1.031165408000561, 0.8847605579994706, 0.9309886320006626, 1.262998157999391, 1.003871022999192, 0.8544792630000302, 0.8404239559995403, 1.153224202000274, 1.033047639999495, 0.9257187889998022, 1.07550073099992, 0.9747454729995297, 0.9720977249999123, 1.1570877889998883, 1.3217874550000488, 1.117209297000045, 0.9760932580002191, 1.128803835999861, 0.979525036999803, 1.1023967430000994, 1.2650311759998658, 0.8130740200003856, 1.303097285000149, 0.9719374760006758, 0.8893040809998638, 1.1151307059999453, 0.9322592630005602, 0.8459474430001137, 1.2189300709997042, 1.0589126060003764, 1.042701790999672, 1.029371288999755, 0.8801456000001053, 0.8533466120006779, 0.8145827029993598, 1.0455034209999212, 0.9639921600000889, 0.9434819529997185, 1.1637974530003703, 1.0290771400004814, 1.0142870390000098, 0.8272935020004297, 1.1210176989998217, 1.0897253820003243, 1.076326094000251, 0.8994978430000629, 1.1499650249998012, 1.2825078440000652, 1.0869071429997348, 0.8984574589994736, 0.8157348860004277, 1.1535756539997237, 1.2712089389997345, 1.0414529949994176, 0.9749789389998114, 0.9079381179999473, 0.8394527259997631, 0.926088045999677, 0.8619770599998446, 0.8066119959994467, 1.1045998330000657, 0.9614506110001457, 1.0627550039998823, 1.0948470599996654, 1.0611422870006209, 1.0247859080000126, 1.1297903969998515, 1.0253115430004982, 0.8811172800005806, 1.276542610999968, 0.844575936000183, 1.2350790560003588, 1.0197846549999667, 0.8335204389995852, 1.0723526709998623, 1.0748529330003294, 1.0386246799998844, 1.0823173779999706, 0.9827484360002927, 1.151096764000613, 0.9839673579999726, 0.9675013349997243, 0.930911558999469, 0.8772269700002653, 0.9074906349997036, 0.8657671789997039, 1.1217192929998419, 0.8623218450002241, 0.9799284059999991, 0.8033558380002432, 1.168868454999938, 1.1391933249997237, 0.9212997180002276, 0.9471602759995221, 1.1363378480000392, 1.1112318240002423, 0.7781424390004759, 0.9101883710000038], "average": 1.0152578131099927}, {"name": "16kB", "timings": [1.3510797979997733, 0.9879713899999842, 1.0878584659994885, 1.1426474320005582, 1.2887520449994554, 1.6074629610002376, 1.4278597820002688, 1.501446723999834, 1.6963446829995519, 1.4981987000001027, 1.5502844650000043, 2.1051797230002194, 1.697220883999762, 1.3858000720001655, 1.624562015000265, 1.361123398000018, 1.3567301499997484, 1.7170502310000302, 1.5214306349998878, 1.6939569999995001, 1.4105780760000926, 1.7202090900000258, 1.6949013089997607, 1.7697092500002327, 1.7186541560004116, 1.5509487419994912, 1.6964485020007487, 1.5239975929998764, 1.8330044109998198, 2.09330325800056, 2.1170764620001137, 2.110232714000631, 2.598678747000122, 1.1290166580001824, 0.9601604319996113, 0.9469213500005935, 0.9704783280003539, 0.9867827329999272, 0.9174046609996367, 0.8648804149997886, 0.8685409780000555, 0.8898689830002695, 1.0634464820004723, 0.9942515189995902, 0.9373107270002947, 1.0271001609999075, 0.9515673159994549, 1.1290565909994257, 1.0455006780002805, 1.3006218729997272, 0.9941173480001453, 0.9218047590002243, 0.9132494429995859, 0.9420109510001566, 0.8774260540003525, 1.0070395390002886, 1.1329034609998416, 1.4109160520001751, 1.7291065519993936, 1.59783742000036, 1.3570154909994017, 1.328053199000351, 1.6893834309994418, 1.5692905169998994, 1.384457525000471, 1.6087993779992757, 1.6877111020003213, 1.3581231400003162, 0.9372163840007488, 0.9669373870001436, 0.925530948999949, 0.890537860999757, 1.0122302919999129, 0.9178706899992903, 0.9450422230002005, 0.9480635520003489, 0.9669537069994476, 0.9090401789999305, 0.9198584929999924, 1.0470980359996247, 1.0680292540000664, 0.9495683519999147, 0.9267834069996752, 0.9935976899996604, 0.9438812739999776, 0.9594274229993971, 0.9336842290003915, 0.8910888259997591, 0.8920973759995832, 0.9724612179998076, 0.9539583499999935, 0.9164574859996719, 0.9502448120001645, 1.0660766069995589, 1.1253423170001042, 1.0200438080000822, 1.028143436999926, 1.0817149619997508, 1.089259146000586, 1.1130283900001814], "average": 1.251941262279979}, {"name": "64kB", "timings": [1.8781037660000948, 1.4807060260000071, 1.424563863000003, 1.6376209999998537, 1.4893010510004387, 1.6829615380001997, 1.6939540210005362, 1.57977448299971, 1.550514657000349, 1.59006285400028, 1.4439435849999427, 1.5169413240000722, 1.617803840000306, 1.5580821399998968, 1.4138343619997613, 1.487055884000256, 1.7463336179998805, 2.029817639000612, 2.109351890000653, 2.0521487850000995, 2.0400546459995894, 1.5998666389996288, 1.5819120100004511, 1.5145321370000602, 1.6646223170000667, 1.434128679999958, 1.5773548699999083, 1.4843247080007131, 1.5200997900001312, 1.4727793179999935, 1.4852303999996366, 1.611088349000056, 1.5047865030001049, 1.5423759430004793, 1.465803080999649, 1.4474599200002558, 2.8103746159995353, 1.9425309859998379, 1.7361243489995104, 1.8665191560003223, 1.7370318690000204, 1.5713355910002065, 1.5920665919993553, 1.923288032000528, 1.6947036680003293, 1.541710205000527, 1.492292027000076, 1.6371876570001405, 1.6428092450005352, 1.5642486829992777, 1.79558658499991, 1.6687281630001962, 1.8703097410007103, 1.7407682800003386, 1.5328707210001085, 1.592582264000157, 1.653830446000029, 1.6644222959994295, 1.7761998489995676, 1.8551883529999031, 1.634971470999517, 1.609969527999965, 1.4439873510000325, 1.5581944859995929, 1.4228943300004175, 1.426044417000412, 1.3362561420008205, 1.3713728620004986, 1.5605218729997432, 1.608352375999857, 1.4490948990005563, 1.628776112000196, 1.65889431999949, 1.6945500379997611, 1.7068456349998087, 1.6332531219995872, 1.8190798460000224, 1.575920010000118, 1.6723656860003757, 1.7060184880001543, 2.1927788270004385, 1.7564972310001394, 1.866260843999953, 1.8756902079994688, 1.8143568220002635, 1.9577122169994254, 1.539860118999968, 1.395374814999741, 1.3056206219998785, 1.396695563999856, 1.4882017390000328, 1.3982953630002157, 1.4411943449995306, 1.3757833010004106, 1.5260202530007518, 1.7328788699996949, 1.5152709570002116, 1.7209163810002792, 1.7262640879998798, 1.8650389659997018], "average": 1.6424007953500495}, {"name": "128kB", "timings": [2.485558877000585, 2.12105626399989, 2.0230857440001273, 1.886733720999473, 2.1497597739999037, 1.9473404589998609, 1.9864859789995535, 2.429555655000513, 2.355191657999967, 2.066135533000306, 2.3742472690000795, 2.688545318999786, 2.711057310999422, 2.275049933000446, 2.090050746999623, 2.3222699409998313, 2.085066829000425, 2.101325810999697, 2.0991918010004156, 2.2796864750007444, 1.9757541810004113, 2.17202791300042, 2.1503759189999982, 2.251515522999398, 2.0162665429998015, 1.9880628880000586, 2.2441455440002755, 2.0730104510003002, 1.849207094999656, 1.8611242019997007, 1.9831169429999136, 1.9146642030000294, 1.8638985569996294, 2.1239957640000284, 2.114303433000714, 2.128984951000348, 2.0987253249995774, 2.623607281000659, 2.3346607560006305, 2.240013741000439, 2.3513023590003286, 2.31147903999954, 2.1864298480004436, 2.4398947350000526, 2.41501405300005, 2.3518284020001374, 2.388556222000261, 2.224666821000028, 2.216360060000625, 2.3249661750005544, 2.3716225770003803, 2.1950595919997795, 2.125055997000345, 2.1209422519996224, 2.19198275799954, 2.432926167000005, 2.0513577990004705, 1.935998857999948, 2.1119932900001004, 1.9289439930007575, 2.032081375999951, 1.9568059990006077, 2.049654925000141, 1.9351651369997853, 1.864543020000383, 2.131644520000009, 2.14614824399996, 1.9968441989994972, 2.0371105200001693, 2.4454970790002335, 2.824798290000217, 2.7448706519999178, 2.2681210989994725, 2.227026243999717, 2.3231852280005114, 2.1246059140003126, 2.418849603000126, 2.039342256999589, 2.032958580000013, 2.3678473930003747, 2.1180973210002776, 2.165394028999799, 2.5133859840007062, 2.1818026930004635, 2.485040872999889, 2.3537872970000535, 2.235971371999767, 2.2235616100006155, 2.2345810170008917, 2.2406079729998964, 2.4189948399998684, 1.8400006689998918, 1.7614504679995662, 1.9212991679996776, 2.1793580250005107, 1.7211436020006659, 1.9701846719999594, 2.2108654599996953, 2.091751334000037, 2.181364050999946], "average": 2.1817698004800876}, {"name": "256kB", "timings": [3.6811194720003186, 3.147670442999697, 3.695189123000091, 3.298626494999553, 3.767893078999805, 3.4984616459996687, 3.417418629000167, 3.5415079479998894, 3.068335303999447, 3.4301369749991864, 3.4171075699996436, 3.3819450069995582, 3.146990903999722, 3.3248188870002195, 3.262768249999681, 3.3092957479993856, 3.472710320999795, 3.34990875099993, 3.2310241499999393, 3.453782575999867, 3.264948792000723, 2.716320124000049, 2.805061502999706, 2.6962058889994296, 2.75895256000058, 2.706095711000671, 2.702072168000086, 3.443513754000378, 3.366996673000358, 3.3475393870003245, 2.9024043480003456, 3.7874677870004234, 3.2421083660001386, 3.5723685599996315, 3.0211686980001105, 3.757523416999902, 3.123984637999456, 3.4631766849997803, 2.918789895000373, 3.4879900550004095, 2.9206078829993203, 3.827231903000211, 3.649917180999182, 3.874399068999992, 3.3199099190005654, 3.5603950320000877, 3.25551165700017, 3.575985882999703, 3.4857736590001878, 3.6060998689999906, 2.839968459999909, 3.2765346650003266, 2.8592416060000687, 2.846344175000013, 3.3366037179994237, 3.5943893579997166, 3.2748308059999545, 3.1776427240001794, 3.529635478000273, 4.12941627500004, 3.0992260610000812, 3.500190747000488, 3.228298177999932, 3.741311835000488, 3.145152378999228, 3.573422249000032, 3.0850911730003645, 3.3803172419993643, 3.097649833000105, 3.086401988000034, 3.281187991000479, 3.151628448000338, 3.263419492999674, 3.1492937519997213, 3.424925409000025, 3.1182147359995724, 3.6924974489993474, 3.2811247350000485, 2.9449523590001263, 3.0783116459997473, 3.2535930760004703, 2.6896645070000886, 3.0641918390001592, 3.2280216929993912, 3.3309060110004793, 3.5279480459994375, 4.060160365000229, 2.840854672000205, 3.1435627789996943, 3.329252552000071, 3.007479652999791, 3.552762301000257, 3.021331289000045, 3.9075531919997957, 3.204455353999947, 3.6846647049997046, 3.0456302870006766, 3.355525124000451, 3.4910861790003764, 3.2661253739997846], "average": 3.30249226308998}]} \ No newline at end of file diff --git a/playground/issuer/notebooks/attrib_number_issuance.ipynb b/playground/issuer/notebooks/attrib_number_issuance.ipynb new file mode 100644 index 0000000..cd14c05 --- /dev/null +++ b/playground/issuer/notebooks/attrib_number_issuance.ipynb @@ -0,0 +1,923 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1ccc72ea", + "metadata": {}, + "source": [ + "# ACA-Py & ACC-Py Basic Template\n", + "\n", + "## Copy this template into the root folder of your notebook workspace to get started" + ] + }, + { + "cell_type": "markdown", + "id": "c357c992", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c17f5370", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "import os\n", + "from termcolor import colored\n", + "import asyncio\n", + "import time\n", + "\n", + "from aiohttp import ClientSession\n", + "\n", + "from libs.performance_service import PerformanceService" + ] + }, + { + "cell_type": "markdown", + "id": "0fee342f", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5f43dfe8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://issuer-agent:3021 and an api key of adminApiKey\n" + ] + } + ], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)\n" + ] + }, + { + "cell_type": "markdown", + "id": "d6575761", + "metadata": {}, + "source": [ + "### Start a Webhook Server" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "72548ea0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Listening for webhooks from agent at http://0.0.0.0:3010\n" + ] + } + ], + "source": [ + "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", + "webhook_host = \"0.0.0.0\"\n", + "\n", + "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", + "\n", + "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" + ] + }, + { + "cell_type": "markdown", + "id": "8521f195", + "metadata": {}, + "source": [ + "## Store Issuing Schema and Cred Def Identifiers\n", + "\n", + "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", + "\n", + "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dec858fc", + "metadata": {}, + "outputs": [], + "source": [ + "one_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:one-attrib:0.0.2'\n", + "one_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:default'\n", + "one_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:revocable'\n", + "\n", + "five_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-attrib:0.0.1'\n", + "five_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:default'\n", + "five_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:revocable'\n", + "\n", + "ten_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:ten-attrib:0.0.1'\n", + "ten_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:default'\n", + "ten_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:revocable'\n", + "\n", + "twenty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:twenty-attrib:0.0.1'\n", + "twenty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:default'\n", + "twenty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:revocable'\n", + "\n", + "fifty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:fifty-attrib:0.0.1'\n", + "fifty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:default'\n", + "fifty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:revocable'\n", + "\n", + "hundred_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:hundred-attrib:0.0.1'\n", + "hundred_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:default'\n", + "hundred_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:revocable'\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c6930ef5", + "metadata": {}, + "source": [ + "## Init Performance Service" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0397bde1", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service = PerformanceService(agent_controller, iterations=100)" + ] + }, + { + "cell_type": "markdown", + "id": "327ece23", + "metadata": {}, + "source": [ + "## Establish Connection\n", + "\n", + "Before you can issue a credential you must first establish a connection across which the credential will be issued to a holder. (see recipes/connection)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "074a12b0", + "metadata": {}, + "outputs": [], + "source": [ + "# Alias for invited connection\n", + "alias = \"Friend\"\n", + "auto_accept = \"true\"\n", + "# Use public DID?\n", + "public = \"false\"\n", + "# Should this invitation be usable by multiple invitees?\n", + "multi_use = \"false\"\n", + "\n", + "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", + "# Is equivalent to above. Arguments are optionally\n", + "# invitation_response = await agent_controller.connections.create_invitation()\n", + "\n", + "\n", + "\n", + "# You will use this identifier to issue a credential across this connection\n", + "connection_id = invitation_response[\"connection_id\"]\n", + "\n", + "invitation = invitation_response[\"invitation\"]\n", + "## Copy this output\n", + "print(invitation)\n", + "print(connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "79d635d8", + "metadata": {}, + "outputs": [], + "source": [ + "connection_id = \"bf7d4d2b-1398-4079-a4fa-7cfecf815892\"" + ] + }, + { + "cell_type": "markdown", + "id": "64de428b", + "metadata": {}, + "source": [ + "# Attribute Number Experiment" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "62046ee8", + "metadata": {}, + "outputs": [], + "source": [ + "experiment = performance_service.new_experiment(\"Attribute Number - Non Revocable\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d1632ea1", + "metadata": {}, + "outputs": [], + "source": [ + "revocable_experiment = performance_service.new_experiment(\"Attribute Number - Revocable\")" + ] + }, + { + "cell_type": "markdown", + "id": "74cdbedc", + "metadata": {}, + "source": [ + "## Define Performance Test - One" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "63bbda2c", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"1\"\n", + "credential_attributes = [\n", + " {\"name\": \"1\", \"value\": 32*\"0\"},\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "9dc92529", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.7644324375199903\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": one_schema_id, \"cred_def_id\": one_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "463b1573", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.0604020470899196\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": one_schema_id, \"cred_def_id\": one_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "1c650c56", + "metadata": {}, + "source": [ + "## Define Performance Test - Five" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "285d2d4c", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"1\", \"value\": 32*\"0\"},\n", + " {\"name\": \"2\", \"value\": 32*\"0\"},\n", + " {\"name\": \"3\", \"value\": 32*\"0\"},\n", + " {\"name\": \"4\", \"value\": 32*\"0\"},\n", + " {\"name\": \"5\", \"value\": 32*\"0\"},\n", + "]\n", + "name = \"5\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c9543bee", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.7274341308099792\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "3e819c95", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.039828203540037\n" + ] + } + ], + "source": [ + "\n", + "test = {\"name\": name, \"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "67277483", + "metadata": {}, + "source": [ + "## Define Performance Test - Ten" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "5eebf5aa", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"1\", \"value\": 32*\"0\"},\n", + " {\"name\": \"2\", \"value\": 32*\"0\"},\n", + " {\"name\": \"3\", \"value\": 32*\"0\"},\n", + " {\"name\": \"4\", \"value\": 32*\"0\"},\n", + " {\"name\": \"5\", \"value\": 32*\"0\"},\n", + " {\"name\": \"6\", \"value\": 32*\"0\"},\n", + " {\"name\": \"7\", \"value\": 32*\"0\"},\n", + " {\"name\": \"8\", \"value\": 32*\"0\"},\n", + " {\"name\": \"9\", \"value\": 32*\"0\"},\n", + " {\"name\": \"10\", \"value\": 32*\"0\"},\n", + "]\n", + "name = \"10\"" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "a87fd09b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.7416022508400602\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "test = {\"name\": name,\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "16c239a8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.0485972693900112\n" + ] + } + ], + "source": [ + "\n", + "test = {\"name\": name, \"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "3e6fcddd", + "metadata": {}, + "source": [ + "## Define Performance Test - Twenty" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "0233f9b7", + "metadata": {}, + "outputs": [], + "source": [ + "for x in range(1,21):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + " \n", + "name = \"20\"" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "a79d7f03", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.9127942244900623\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "74527987", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.3740106260799985\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "ebc4d87a", + "metadata": {}, + "source": [ + "## Define Performance Test - Fifty" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "d621905b", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "name = \"50\"\n", + "credential_attributes = []\n", + "\n", + "for x in range(1,51):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "d7728940", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.1370455552801104\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b1c34d84", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.3724528683499921\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "4fb787f5", + "metadata": {}, + "source": [ + "## Define Performance Test - Hundred" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "ec7afa95", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"100\"\n", + "\n", + "credential_attributes = []\n", + "\n", + "for x in range(1,101):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "0195b829", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.4345285729700117\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "52d21dea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.7642283525200038\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "d4b3f5aa", + "metadata": {}, + "source": [ + "## Display Plots" + ] + }, + { + "cell_type": "markdown", + "id": "6a8381c4", + "metadata": {}, + "source": [ + "### Non Revoked" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "da4801bd", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "non_revoked_averages = []\n", + "for result in experiment[\"results\"]:\n", + "# print(result[\"timings\"])\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " non_revoked_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "cd624b15", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Number of Attributes\")\n", + "# show plot\n", + "# plt.show()\n", + "\n", + "plt.savefig(\"results/issuance/attribute_number/box_plot_non_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "2592f338", + "metadata": {}, + "source": [ + "### Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "0589eeba", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "revocable_averages = []\n", + "for result in revocable_experiment[\"results\"]:\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "ecf55a5d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Number of Attributes\")\n", + "\n", + "plt.savefig(\"results/issuance/attribute_number/box_plot_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "6f49a8d2", + "metadata": {}, + "source": [ + "## Averages" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "2692bf1d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJJCAYAAAB27EniAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABxM0lEQVR4nO3dd3hU1drG4d8i9N577zUJIfTeBAVFBAQFBQtix4aKBz6PghUVRTkoHhBBBBQiIh2RKiId6b33GkglZX1/7CEnQIAASfYkee7rypXMnsnOk9mZ5M1a797LWGsRERERkaSTwe0AIiIiImmNCiwRERGRJKYCS0RERCSJqcASERERSWIqsERERESSmAosERERkSSW0e0AyaFgwYK2bNmybscQERGRNGzt2rWnrbWFErovTRZYZcuWZc2aNW7HEBERkTTMGHPgevdpilBEREQkianAEhEREUliyVZgGWPGGmNOGmM2x9vmb4xZaYzZYIxZY4yp59lujDEjjDG7jTH/GGMC4n1Ob2PMLs9b7+TKKyIiIpJUkrMHaxzwFTA+3raPgXestXOMMfd4brcA7gYqed7qA6OA+saY/MDbQCBggbXGmBnW2nO3GiYqKorDhw8TERFx+9+RiKQZWbNmpWTJkmTKlMntKCKSBiVbgWWtXWqMKXv1ZiC35+M8wFHPx52A8dZZeXqlMSavMaYYTvG1wFp7FsAYswBoD0y61TyHDx8mV65clC1bFmPMLX8/IpJ2WGs5c+YMhw8fply5cm7HEZE0KKXPInwJmGeM+QRnerKRZ3sJ4FC8xx32bLve9msYY54CngIoXbr0NfdHRESouBIRAIwxFChQgFOnTrkdRUTSqJRucn8GeNlaWwp4GRiTVDu21o621gZaawMLFUrwkhQqrkQkjn4fiEhySukCqzcQ5Pn4Z6Ce5+MjQKl4jyvp2Xa97amSj48P/v7+1KxZk3vvvZfz58+7lmX//v3UrFkzwftatGhxy9cR++STT6hatSr+/v7UrVuX8ePH3/yTrmPx4sV07Njxtj///fffv+J2o0aNrvPI/8mZM+ctbU8tpk+fjjGG7du3ux1FRCRdSekC6yjQ3PNxK2CX5+MZwKOeswkbAMHW2mPAPOAuY0w+Y0w+4C7PtlQpW7ZsbNiwgc2bN5M/f35GjhzpdqQk8fXXX7NgwQJWrVrFhg0bWLhwIU473ZViYmJSJM/VBdaKFStS5Ot6o0mTJtGkSRMmTbrltsUEpdQxFBFJ7ZLzMg2TgL+AKsaYw8aYJ4C+wKfGmI3A+3h6poDZwF5gN/At8CyAp7l9CLDa8/bu5Yb31K5hw4YcOeIMxu3Zs4f27dtTp04dmjZtyvbt2wkODqZMmTLExsYCEBoaSqlSpYiKimLDhg00aNAAX19fOnfuzLlzzkmVu3fvpk2bNvj5+REQEMCePXsICQmhdevWBAQEUKtWLX799de4DNHR0fTs2ZNq1arRtWtXwsLCrsk5f/58GjZsSEBAAN26dSMkJOSax7z//vuMGjWK3Lmd8xdy585N797OFTXKli3LG2+8QUBAAD///PN19zd37lyqVq1KQEAAQUFBcfsODQ3l8ccfp169etSuXTsu/7hx43jggQdo3749lSpV4vXXXwfgzTffJDw8HH9/f3r27An8bxTqRs/FzRw7doxmzZrFjUAuW7aMmJgY+vTpQ82aNalVqxbDhw8HrhwBPH36NJeXbdq/fz9NmzYlICCAgICAuMJv8eLFtGjRgq5du1K1alV69uwZV6CuXr2aRo0a4efnR7169bh48SIxMTEMGDCAunXr4uvryzfffJNg5pCQEJYvX86YMWOYPHly3PPcrVu3uMfEHy283rG5+hh+++231K1bFz8/P7p06RL3c7Nnzx4aNGhArVq1GDRo0BWjf8OGDYvL+/bbb8cd2w4dOuDn50fNmjWZMmVKoo+HiIjXs9amubc6derYq23duvV/N/r3t7Z586R969//mq95tRw5clhrrY2OjrZdu3a1c+bMsdZa26pVK7tz505rrbUrV660LVu2tNZae99999k//vjDWmvt5MmT7RNPPGGttbZWrVp28eLF1lprBw8ebPt7vna9evVsUFCQtdba8PBwGxoaaqOiomxwcLC11tpTp07ZChUq2NjYWLtv3z4L2OXLl1trrX3sscfssGHDrLXWNm/e3K5evdqeOnXKNm3a1IaEhFhrrf3www/tO++8c8X3FBwcbPPmzXvd77lMmTL2o48+ivv6Ce0vPDzclixZ0u7cudPGxsbabt262Q4dOlhrrR04cKCdMGGCtdbac+fO2UqVKtmQkBD73Xff2XLlytnz58/b8PBwW7p0aXvw4MErnuern/frPRcJfc7Vn/vJJ5/YoUOHWmud43fhwgW7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ZsyYuGVx5s6de8Wi5fFHC693bK4+ht9++y1169bFz8+PLl26xP3c7NmzhwYNGlCrVi0GDRp0xejfsGHD4vK+/fbbcce2Q4cO+Pn5UbNmTaa4+EtWRFLIjBlQuzZs2QI//QQjR0K8NV9TnLU2zb3VqVPHXm3r1q1xH/97xmb74NcrkvTt3zM2X/M1r5YjRw4bHBxsy5QpY8+fP2+HDRtm3377bWuttR07drTjxo2z1lo7ZswY26lTJ2uttb1797Zdu3a1MTExdsuWLbZChQrX3be11kZHR9uuXbvaOXPmWGutbdWqld25c6e11tqVK1fali1bWmutve++++wff/xhrbV28uTJ9oknnrDWWlurVi27ePFia621gwcPtv3797fWWluvXj0bFBRkrbU2PDzchoaG2qioKBscHGyttfbUqVO2QoUKNjY21u7bt88Cdvny5dZaax977DE7bNgwa621zZs3t6tXr7anTp2yTZs2tSEhIdZaaz/88EP7zjvvXPE9BQcH27x58173+SxTpoz96KOP4r5+QvsLDw+3JUuWtDt37rSxsbG2W7dutkOHDtZaawcOHGgnTJhgrbX23LlztlKlSjYkJMR+9913tly5cvb8+fM2PDzcli5d2h48ePCK5/nq5/16z0VCn3P1537yySd26NCh1lrn+F24cMGuWbPGtmnTJu6x586du+L5u/x1ypQpY621NjQ01IaHh1trrd25c6e9/BpYtGiRzZ07tz106JCNiYmxDRo0sMuWLbORkZG2XLlydtWqVXHPdVRUlP3mm2/skCFDrLXWRkRE2Dp16ti9e/dek/2HH36wjz/+uLXW2oYNG9o1a9bYqKgoW6pUqbhj8PTTT9sJEybc8FjHP4bWWnv69Om4j//1r3/ZESNGWGut7dChg/3xxx+ttdaOGjUq7rmbN2+e7du3r42NjbUxMTG2Q4cOdsmSJXbq1Kn2ySefjNvX+fPnEzwG8X8viEgqFRlp7SuvWAvWBgRYu2tXin1pYI29Ti2iEawUljt3bh599FFGjBhxxfa//vqLhx9+GIBHHnmE5cuXx913//33kyFDBqpXr86JEycS3O/lkZWiRYty4sQJ2rZtS0hICCtWrKBbt274+/vTr18/jh07BjhrHF7+r37y5Ml0796d4OBgzp8/T/PmzQHo3bs3S5cu5eLFixw5ciRubbusWbOS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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + "\n", + "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", + "plt_points = [1,5,10,20,50,100]\n", + "\n", + "plt.plot(plt_points, revocable_averages,'r-',label='Revocable Credential Issuance Averages')\n", + "plt.plot(plt_points, non_revoked_averages,label='Non Revocable Credential Issuance Averages')\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Number of Attributes\")\n", + "\n", + "\n", + "plt.legend()\n", + "plt.savefig(\"results/issuance/attribute_number/averages.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "23dbd3b4", + "metadata": {}, + "source": [ + "## Terminate Controller\n", + "\n", + "Whenever you have finished with this notebook, be sure to terminate the controller. This is especially important if your business logic runs across multiple notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "82582e4e", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "4d7c61a2", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service.save_experiments()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ed02221b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/issuer/notebooks/attrib_size_issuance.ipynb b/playground/issuer/notebooks/attrib_size_issuance.ipynb new file mode 100644 index 0000000..a9017d6 --- /dev/null +++ b/playground/issuer/notebooks/attrib_size_issuance.ipynb @@ -0,0 +1,1067 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "791e2f7e", + "metadata": {}, + "source": [ + "# ACA-Py & ACC-Py Basic Template\n", + "\n", + "## Copy this template into the root folder of your notebook workspace to get started" + ] + }, + { + "cell_type": "markdown", + "id": "ffab7352", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ef6bd5a3", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "import os\n", + "from termcolor import colored\n", + "import asyncio\n", + "import time\n", + "\n", + "from aiohttp import ClientSession\n", + "\n", + "from libs.performance_service import PerformanceService" + ] + }, + { + "cell_type": "markdown", + "id": "2a7f536f", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "bf061914", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://issuer-agent:3021 and an api key of adminApiKey\n" + ] + } + ], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)\n" + ] + }, + { + "cell_type": "markdown", + "id": "e9382403", + "metadata": {}, + "source": [ + "### Start a Webhook Server" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6d506b13", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Listening for webhooks from agent at http://0.0.0.0:3010\n" + ] + } + ], + "source": [ + "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", + "webhook_host = \"0.0.0.0\"\n", + "\n", + "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", + "\n", + "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" + ] + }, + { + "cell_type": "markdown", + "id": "eebf7ce3", + "metadata": {}, + "source": [ + "## Store Issuing Schema and Cred Def Identifiers\n", + "\n", + "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", + "\n", + "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f07d0060", + "metadata": {}, + "outputs": [], + "source": [ + "size1_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size1:0.0.1'\n", + "size1_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:default'\n", + "size1_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:revocable'\n", + "\n", + "size2_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size2:0.0.1'\n", + "size2_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:default'\n", + "size2_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:revocable'\n", + "\n", + "size3_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size3:0.0.1'\n", + "size3_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:default'\n", + "size3_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:revocable'\n", + "\n", + "size4_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size4:0.0.1'\n", + "size4_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:default'\n", + "size4_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:revocable'\n", + "\n", + "size5_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size5:0.0.1'\n", + "size5_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:default'\n", + "size5_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:revocable'\n", + "\n", + "size6_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size6:0.0.1'\n", + "size6_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:default'\n", + "size6_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:revocable'\n", + "\n", + "size7_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size7:0.0.1'\n", + "size7_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:14:default'\n", + "size7_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:14:revocable'\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "193c699e", + "metadata": {}, + "source": [ + "## Init Performance Service" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "48564605", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service = PerformanceService(agent_controller, iterations=100)" + ] + }, + { + "cell_type": "markdown", + "id": "f22fa7a1", + "metadata": {}, + "source": [ + "## Establish Connection\n", + "\n", + "Before you can issue a credential you must first establish a connection across which the credential will be issued to a holder. (see recipes/connection)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "df984e93", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': '843d50e1-e861-4ec3-8620-25ae01b2f027', 'label': 'Issuer', 'serviceEndpoint': 'http://issuer-agent:3020', 'recipientKeys': ['8ZjDVHABDMxN973vYVhFifdoz9y3DZYL492aK3mUg1Vg']}\n", + "bf7d4d2b-1398-4079-a4fa-7cfecf815892\n", + "\u001b[1m\u001b[32mConnection ID: bf7d4d2b-1398-4079-a4fa-7cfecf815892 is now active.\u001b[0m\n" + ] + } + ], + "source": [ + "# Alias for invited connection\n", + "alias = \"Friend\"\n", + "auto_accept = \"true\"\n", + "# Use public DID?\n", + "public = \"false\"\n", + "# Should this invitation be usable by multiple invitees?\n", + "multi_use = \"false\"\n", + "\n", + "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", + "# Is equivalent to above. Arguments are optionally\n", + "# invitation_response = await agent_controller.connections.create_invitation()\n", + "\n", + "\n", + "\n", + "# You will use this identifier to issue a credential across this connection\n", + "connection_id = invitation_response[\"connection_id\"]\n", + "\n", + "invitation = invitation_response[\"invitation\"]\n", + "## Copy this output\n", + "print(invitation)\n", + "print(connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2fc9de00", + "metadata": {}, + "outputs": [], + "source": [ + "connection_id = \"bf7d4d2b-1398-4079-a4fa-7cfecf815892\"" + ] + }, + { + "cell_type": "markdown", + "id": "9469f277", + "metadata": {}, + "source": [ + "# Attribute Size Experiment" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "14fddc98", + "metadata": {}, + "outputs": [], + "source": [ + "experiment = performance_service.new_experiment(\"Attribute Size - Non Revocable\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8fb4f0c3", + "metadata": {}, + "outputs": [], + "source": [ + "revocable_experiment = performance_service.new_experiment(\"Attribute Size - Revocable\")" + ] + }, + { + "cell_type": "markdown", + "id": "4611e4e1", + "metadata": {}, + "source": [ + "## Define Performance Test - 0.1kb" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "496e85e6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*\"0\"},\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "7ba72edb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.7421992142800354\n" + ] + } + ], + "source": [ + "\n", + "name = \"128B\"\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size1_schema_id, \"cred_def_id\": size1_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "85e75bd7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.010123782519986\n" + ] + } + ], + "source": [ + "\n", + "test = {\"name\": name, \"schema_id\": size1_schema_id, \"cred_def_id\": size1_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "e337d008", + "metadata": {}, + "source": [ + "## Define Performance Test - 0.5kb" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "9b078a02", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 512*\"0\"},\n", + "]\n", + "\n", + "name = \"512B\"" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "823c3325", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.7588296626200463\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size2_schema_id, \"cred_def_id\": size2_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0339f642", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.04755196625998\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size2_schema_id, \"cred_def_id\": size2_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "0b500941", + "metadata": {}, + "source": [ + "## Define Performance Test - 1kb" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "9017878f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 1024*\"0\"},\n", + "]\n", + "name = \"1kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "12aff9f4", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.60604519521994\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size3_schema_id, \"cred_def_id\": size3_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "2c42e92f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.0152578131099927\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size3_schema_id, \"cred_def_id\": size3_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "d027d67d", + "metadata": {}, + "source": [ + "## Define Performance Test - 16kb" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "a937f462", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 16 * 1024*\"0\"},\n", + "]\n", + "\n", + "name = \"16kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "7f4f3f2e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.7165110925200042\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size4_schema_id, \"cred_def_id\": size4_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "241f25c5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.251941262279979\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size4_schema_id, \"cred_def_id\": size4_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "eae4f550", + "metadata": {}, + "source": [ + "## Define Performance Test - 64kb" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "05abcee3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 64*1024*\"0\"},\n", + "]\n", + "name = \"64kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "a5c25ad3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.1442755796500024\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size5_schema_id, \"cred_def_id\": size5_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment,test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "e3a810bf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.6424007953500495\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size5_schema_id, \"cred_def_id\": size5_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "491324ad", + "metadata": {}, + "source": [ + "## Define Performance Test - 128kb" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "d85f84be", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*1024*\"0\"},\n", + "]\n", + "\n", + "name = \"128kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "b37357ad", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.7599949260899939\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size6_schema_id, \"cred_def_id\": size6_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment,test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "daf3d06f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.1817698004800876\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size6_schema_id, \"cred_def_id\": size6_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "07ab7fa8", + "metadata": {}, + "source": [ + "## Define Performance Test - 256kb" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "a95128c6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 1024*256*\"0\"},\n", + "]\n", + "name = \"256kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "aed06a30", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.7849772056000073\n" + ] + } + ], + "source": [ + "\n", + "\n", + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size7_schema_id, \"cred_def_id\": size7_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "7006defc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 3.30249226308998\n" + ] + } + ], + "source": [ + "\n", + "\n", + "test = {\"name\": name, \"schema_id\": size7_schema_id, \"cred_def_id\": size7_rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "await performance_service.run_issuance(revocable_experiment, test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "1a4995e1", + "metadata": {}, + "source": [ + "## Define Performance Test - 512kb\n", + "\n", + "### Not able to run past ~320kb until update webhook server client_max_size" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5380f7b1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# credential_attributes = [\n", + "# {\"name\": \"1\", \"value\": 1024*320*\"0\"},\n", + "# ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b37bc531", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "\n", + "# name = \"512kb\"\n", + "\n", + "\n", + "# test = {\"name\": name,\"schema_id\": schema_id, \"cred_def_id\": cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "# await performance_service.run(test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a0baebb", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# name = \"Issuance - 256kb - Revocable\"\n", + "\n", + "# test = {\"name\": name, \"iterations\": iterations, \"schema_id\": schema_id, \"cred_def_id\": rev_cred_def_id, \"attributes\": credential_attributes}\n", + "\n", + "# await performance_service.run(test, connection_id)\n" + ] + }, + { + "cell_type": "markdown", + "id": "87b54506", + "metadata": {}, + "source": [ + "## Plot Results" + ] + }, + { + "cell_type": "markdown", + "id": "8677c68f", + "metadata": {}, + "source": [ + "### Non Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "7bd87b88", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "non_revocable_averages = []\n", + "for result in experiment[\"results\"]:\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " non_revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "4f2fd58d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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FKxFk6cIJR0vaZCk30l6w8wWR19LzGxx/MsDACB5MjIydP4FF+iH+3+nytfuVc2y5H70ubuWznhXix+6UAN8rk444fik1oO1a24MVhd37xV9rVfvq5e7r5eoIgEASAYz09+u+4s+qSjXIZm9teDus1X55njVrlia8FqWfzVVSx69RBkfPKy7x/xV5e+Xabvttkt4HWiZ5o5gAQDQ6fXr109333mHPny/THttWqMF9/xWlWVPyVetjPu2V3z7mSqfulr26u26+ZqL9GlFuQ477DCZceektoyABQBAC2299dZ67OGH9NZrL2vntG+14O7fqvKDf8trVgXf1sr5X6ny+eu1csJfdM15p+jLzz/V8ccfr5SUlODbQngELAAAWikrK0sTn39W/5nwtLZZWq6F9+dr5bwvgvW/7NU7Vfn45frDCYfo6y8+19ln/1bdunUL1j/ij6m4AQBYR2Ymk0nu+maLS8N1PFxa76PUH7eB9sfcPdk1BJedne1lZWXJLgMA0EGVl5fr9xddqtffeltpux6tnln7ylLCHrNYOe9LrXxnvHzup7r2yit0+umnKTU1Neg28NOY2WR3z25sGacIAQBooRkzZug3x47WsJw9VbZiE/U5+XZl7DgieLiSpG59f6aMgy5StxF/1BU3360BWw3SAw88oJqamuDbQngELAAAmjF79mydetoZGjw0WyVzUrThKWOVkX2YuqSmxX3baZtto4zDrpT/6kydd8X1GpSZpaeeekod8QxUR0LAAgBgLdxdf7z4Um2TmaVnp/+gDU6+TRm7H6suaT0SXkv6gMHq9Zu/qHLw0Tol/w/aYWi2pk+fnvA60DIELAAA1qKyslI33fh39TnhH+r565OV0j2599g2M/X4+a5ab/SN+tI31v33P5DUerB2BCwAAJrQpWtXde21UbLLWI1ZF3Vdr684Sdh2EbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAECr5efnKz09XWam9PR05efnJ7skoE0hYAEAWiU/P19jx47Vn//8Z1VVVenPf/6zxo4dS8gC6iFgAQBaZdy4cbr++ut1wQUXqEePHrrgggt0/fXXa9y4cckuDWgzwk//DQDo0FasWKGzzjprtbazzjpLF154YZIqip+UlBSptlaVj/wx2aWsYeXCeeo5/Lxkl4G1IGABAFol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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential Size (Bytes)\")\n", + "\n", + "plt.savefig(\"results/issuance/attribute_size/box_plot_non_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "0687e007", + "metadata": {}, + "source": [ + "### Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "6672f552", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "revocable_averages = []\n", + "for result in revocable_experiment[\"results\"]:\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "41cf0305", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential Size (Bytes)\")\n", + "\n", + "plt.savefig(\"results/issuance/attribute_size/box_plot_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "12890c4e", + "metadata": {}, + "source": [ + "## Averages" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "1825d366", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJJCAYAAAB27EniAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAB7SUlEQVR4nO3dd3gU1dvG8e8hhN6rSFeRnoTQQaTbUBEBqdKLNFGxYfdnryiIiEovoavYABuCIiUJoSNNWugtECAh5bx/zJI3ICVgktlk78915cpmtj07uyQ3c545x1hrEREREZHUk8XtAkREREQyGwUsERERkVSmgCUiIiKSyhSwRERERFKZApaIiIhIKlPAEhEREUllWd0uIC0UKVLElitXzu0yREREJBMLCws7Yq0teqnrMmXAKleuHKGhoW6XISIiIpmYMWbX5a7TEKGIiIhIKlPAEhEREUllClgiIiIiqSxT9mBdSlxcHHv37iUmJsbtUkTEC+TIkYNSpUrh7+/vdikikgn5TMDau3cvefPmpVy5chhj3C5HRFxkreXo0aPs3buX8uXLu12OiGRCPjNEGBMTQ+HChRWuRARjDIULF9YRbRFJMz4TsACFKxFJot8HIpKWfCpguc3Pz4+goCCqVavGfffdx4kTJ1yrZefOnVSrVu2S1zVp0uSa5xF7//33qVSpEkFBQdSuXZvJkydfd22LFy/m3nvvve77v/nmmxf83KBBg6veJ0+ePNe0PaP4+uuvMcawefNmt0sREfEpCljpKGfOnERERLB+/XoKFSrE6NGj3S4pVXz22Wf89NNPrFy5koiICH755Restf+6XUJCQrrUc3HAWrZsWbo8rzcKCQnhtttuIyQkJFUeL73eQxGRjE4ByyX169cnMjISgO3bt3PXXXdRs2ZNGjVqxObNm4mKiqJs2bIkJiYCcPr0aUqXLk1cXBwRERHUq1ePgIAA2rRpw/HjxwHYtm0bLVq0IDAwkODgYLZv3050dDTNmzcnODiY6tWr88033yTVEB8fT5cuXahcuTLt2rXjzJkz/6pz0aJF1K9fn+DgYNq3b090dPS/bvPmm28yZswY8uXLB0C+fPno3r074Myq/8wzzxAcHMzs2bMv+3gLFiygUqVKBAcHM2/evKTHPn36NL169aJOnTrUqFEjqf6JEyfy4IMPctddd1GhQgWefvppAJ599lnOnj1LUFAQXbp0Af7/KNSV9sXV7N+/n9tvvz3pCOTSpUtJSEigR48eVKtWjerVqzNixAjgwiOAR44c4fyyTTt37qRRo0YEBwcTHBycFPwWL15MkyZNaNeuHZUqVaJLly5JAXXVqlU0aNCAwMBA6tSpw6lTp0hISOCpp56idu3aBAQEMHbs2EvWHB0dzR9//MG4ceOYMWNG0n5u37590m2SHy283Htz8Xv4xRdfULt2bQIDA2nbtm3S52b79u3Uq1eP6tWr88ILL1xw9O+9995Lqvfll19Oem9btWpFYGAg1apVY+bMmSl+P0REvJ61NtN91axZ015s48aN///D0KHWNm6cul9Dh/7rOS+WO3dua6218fHxtl27dvbHH3+01lrbrFkzu2XLFmuttcuXL7dNmza11lp7//33219//dVaa+2MGTNs7969rbXWVq9e3S5evNhaa+2LL75oh3qeu06dOnbevHnWWmvPnj1rT58+bePi4mxUVJS11trDhw/bm2++2SYmJtp//vnHAvaPP/6w1lrbs2dP+95771lrrW3cuLFdtWqVPXz4sG3UqJGNjo621lr79ttv21dfffWC1xQVFWULFChw2ddctmxZ+8477yQ9/6Ue7+zZs7ZUqVJ2y5YtNjEx0bZv3962atXKWmvt8OHD7ZQpU6y11h4/ftxWqFDBRkdH2wkTJtjy5cvbEydO2LNnz9oyZcrY3bt3X7CfL97vl9sXl7rPxfd9//337euvv26tdd6/kydP2tDQUNuiRYuk2x4/fvyC/Xf+ecqWLWuttfb06dP27Nmz1lprt2zZYs9/Tn/77TebL18+u2fPHpuQkGDr1atnly5damNjY2358uXtypUrk/Z1XFycHTt2rH3ttdestdbGxMTYmjVr2h07dvyr9qlTp9pevXpZa62tX7++DQ0NtXFxcbZ06dJJ78Ejjzxip0yZcsX3Ovl7aK21R44cSbr8/PPP25EjR1prrW3VqpWdPn26tdbaMWPGJO27hQsX2r59+9rExESbkJBgW7VqZX///Xc7Z84c26dPn6THOnHixCXfg7R0we8FEZFrBITay2QRn5mmwRucP7ISGRlJ5cqVadmyJdHR0SxbtuyCowqxsbEAdOjQgZkzZ9K0aVNmzJjBwIEDiYqK4sSJEzRu3BiA7t270759e06dOkVkZCRt2rQBnDl+wJn/67nnnmPJkiVkyZKFyMhIDh48CEDp0qVp2LAhAF27dmXkyJE8+eSTSXUsX76cjRs3Jt3m3Llz1K9f/5pfd4cOHa74eJs3b6Z8+fJUqFAhqZbPP/8ccI6qzJ8/n/fffx9wzgbdvXs3AM2bNyd//vwAVKlShV27dlG6dOnL1mGtveS+uOGGG676GmrXrk2vXr2Ii4vjgQceICgoiJtuuokdO3YwZMgQWrVqxR133HHFx4iLi2Pw4MFERETg5+fHli1bkq6rU6cOpUqVAiAoKIidO3eSP39+SpQoQe3atQGSjhAuWrSItWvXMmfOHACioqLYunXrv6YbCAkJYejQoQB07NiRkJAQatasyV133cW3335Lu3bt+P7773n33Xf5/fffr/hen38PAdavX88LL7zAiRMniI6O5s477wTgr7/+4uuvvwagc+fOSZ+lRYsWsWjRImrUqAE4R9a2bt1Ko0aNGDZsGM888wz33nsvjRo1uur7ICKSUfhmwProI1ee9nwP1pkzZ7jzzjsZPXo0PXr0oECBAkRERPzr9vfffz/PPfccx44dIywsjGbNml1yiO5Kpk2bxuHDhwkLC8Pf359y5colnZp+8VlUF/9sraVly5ZX7N/Jly8fefLkYceOHdx0002XvE3u3Lmv+HiXeu3Ja5g7dy4VK1a8YPuKFSvInj170s9+fn7Ex8df9nHgyvviam6//XaWLFnC999/T48ePXjiiSfo1q0ba9asYeHChXz22WfMmjWL8ePHkzVr1qSh3eSPP2LECIoXL86aNWtITExMCsHANb0Way2jRo1KCjaXcuzYMX799VfWrVuHMYaEhASMMbz33nt07NiRTz75hEKFClGrVi3y5s171ff6/HsI0KNHD77++msCAwOZOHEiixcvvuK+s9YyfPhw+vfv/6/rwsPD+eGHH3jhhRdo3rw5L7300hUfS0Qko1APlgty5crFyJEj+eCDD8iVKxfly5dn9uzZgPPHaM2aNYDTO1S7dm2GDh3Kvffei5+fH/nz56dgwYIsXboUgClTptC4cWPy5s1LqVKlko4gxMbGcubMGaKioihWrBj+/v789ttv7Nr1/wt/7969m7/++guA6dOnc9ttt11QZ7169fjzzz/Ztm0b4PTMJD/qct7w4cMZNGgQJ0+eBJwjFJc6i/Byj1epUiV27tzJ9u3bAS74I3/nnXcyatSopJ6k1atXX3X/+vv7ExcX96/tV9oXV7Nr1y6KFy9O37596dOnD+Hh4Rw5coTExETatm3L66+/Tnh4OOD0LIWFhQEkHWU6//wlSpQgS5YsTJky5aoN4xUrVmT//v2sWrUKgFOnThEfH8+dd97JmDFjkl7jli1bOH369AX3nTNnDg8//DC7du1i586d7Nmzh/Lly7N06VIaN25MeHg4X3zxBR07dgRS/l6fr6NEiRLExcUxbdq0pO316tVj7ty5AEk9X+C8h+PHj0/6z0FkZCSHDh1i37595MqVi65du/LUU08l7T8RkcxAAcslNWrUICAggJCQEKZNm8a4ceMIDAykatWqFzRfd+jQgalTp14wRDNp0iSeeuopAgICiIiISPpf/5QpUxg5ciQBAQE0aNCAAwcO0KVLF0JDQ6levTqTJ0+mUqVKSY9TsWJFRo8eTeXKlTl+/DgDBgy4oMaiRYsyceJEOnXqREBAQNJw3sUGDBhA06ZNqV27NtWqVaNRo0ZkyfLvj9blHi9Hjhx8/vnntGrViuDgYIoVK5Z0nxdffJG4uDgCAgKoWrUqL7744lX3bb9+/QgICEhqcj/vSvviahYvXkxgYCA1atRg5syZDB06lMjISJo0aUJQUBBdu3blrbfeAuDJJ59kzJgx1KhRgyNHjiQ9xsCBA5k0aRKBgYFs3rz5gqNCl5ItWzZmzpzJkCFDCAwMpGXLlsTExNCnTx+qVKlCcHAw1apVo3///v864hUSEpI0XHxe27ZtCQkJwc/Pj3vvvZcff/wxqcE9pe81wGuvvUbdunVp2LDhBfvwo48+4sMPPyQgIIBt27YlDd/ecccddO7cmfr161O9enXatWvHqVOnWLduHXXq1CEoKIhXX32VF154IYXvhoiI9zPnjwxkJrVq1bIXz+O0adMmKleu7FJFIpnfmTNnyJkzJ8YYZsyYQUhIyDWdqekG/V4Qkf/CGBNmra11qet8swdLRFJdWFgYgwcPxlpLgQIFGD9+vNsliYi4RgFLRFJFo0aNkvoHRUR8nXqwRERERFKZApaIiIhIKlPAEhEREUllClgiIiKS+cyfDytWuPb0CljpyBjDsGHDkn5+//33eeWVV1Llsf38/JIWIr7vvvs4ceJEqjzu9di5cyfVqlW75HXJF0JOqffff59KlSoRFBRE7dq1LzmJaUolX9z4erz55psX/NygQYOr3if5oscp2Z5RfP311xhjLjtfloiIK6yFt9+GBx6Ai35npycFrHSUPXt25s2bd8Hkk6nl/DI869evp1ChQowePTrVn8MNn332GT/99BMrV64kIiKCX375hUvN3Xa1WdFTy8UBa9myZenyvN4oJCSE22677YpLKV2L9HoPRSQTi4mB7t1h+HDo0AGSrSqR3hSw0lHWrFnp168fI0aM+Nd1O3fupFmzZgQEBNC8efOkBY179OjBo48+SoMGDbjpppsuWHrlcurXr09kZCQA27dv56677qJmzZo0atSIzZs3ExUVRdmyZZPWyzt9+jSlS5cmLi6OiIgI6tWrR0BAAG3atOH48eMAbNu2jRYtWhAYGEhwcDDbt28nOjqa5s2bExwcTPXq1S+YVDI+Pp4uXbpQuXJl2rVrx5kzZ/5V56JFi6hfvz7BwcG0b9/+kussvvnmm4wZMyZpoeN8+fLRvXt3wFmS5plnniE4OJjZs2df9vEWLFhApUqVCA4OZt68eUmPffr0aXr16kWdOnWoUaNGUv0TJ07kwQcf5K677qJChQo8/fTTADz77LNJC3afnyX+/FGoK+2Lq9m/fz+333570hHIpUuXkpCQQI8ePahWrRrVq1dP+swkPwJ45MgRypUrBzifn0aNGhEcHExwcHBS8Fu8eDFNmjShXbt2VKpUiS5duiQF1FWrVtGgQQMCAwOpU6cOp06dIiEhgaeeeoratWsTEBDA2LFjL1lzdHQ0f/zxB+PGjUtaFmfBggUXLFqe/Gjh5d6bi9/DL774gtq1axMYGEjbtm2TPjfbt2+nXr16VK9enRdeeOGCo3/vvfdeUr0vv/xy0nvbqlUrAgMDqVatGjNnzkzx+yEiGdSBA9C0KUyZAq+9BtOnQ86c7tVjrc10XzVr1rQX27hxY9LlV+avtw99tixVv16Zv/5fz3mx3Llz26ioKFu2bFl74sQJ+95779mXX37ZWmvtvffeaydOnGittXbcuHG2devW1lpru3fvbtu1a2cTEhLshg0b7M0333zZx7bW2vj4eNuuXTv7448/Wmutbdasmd2yZYu11trly5fbpk2bWmutvf/+++2vv/5qrbV2xowZtnfv3tZaa6tXr24XL15srbX2xRdftEOHDrXWWlunTh07b948a621Z8+etadPn7ZxcXE2KirKWmvt4cOH7c03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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + "\n", + "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", + "\n", + "plot_points = [128, 512, 1024, 16*1024, 64*1024, 128 * 1024, 256 * 1024]\n", + "\n", + "plt.plot(plot_points, revocable_averages,'r-',label='Revocable Credential Issuance Averages')\n", + "plt.plot(plot_points, non_revocable_averages,label='Non Revocable Credential Issuance Averages')\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential Size (Bytes)\")\n", + "\n", + "\n", + "plt.legend()\n", + "plt.savefig(\"results/issuance/attribute_size/averages.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "fc6cd747", + "metadata": {}, + "source": [ + "## Terminate Controller\n", + "\n", + "Whenever you have finished with this notebook, be sure to terminate the controller. This is especially important if your business logic runs across multiple notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "afb0d349", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "a971a660", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service.save_experiments()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4592280c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/issuer/notebooks/issue_verification_credentials.ipynb b/playground/issuer/notebooks/issue_verification_credentials.ipynb new file mode 100644 index 0000000..1d2a834 --- /dev/null +++ b/playground/issuer/notebooks/issue_verification_credentials.ipynb @@ -0,0 +1,928 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2866f7bf", + "metadata": {}, + "source": [ + "# Issue Relevant Credentials to Prover Agent\n", + "\n", + "## Prover Agent Should End up With One of each Credential Used in Experiments" + ] + }, + { + "cell_type": "markdown", + "id": "804ce9f4", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9a4cf632", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "import os\n", + "from termcolor import colored" + ] + }, + { + "cell_type": "markdown", + "id": "cbcda8c9", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "eb7c976f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://issuer-agent:3021 and an api key of adminApiKey\n" + ] + } + ], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)" + ] + }, + { + "cell_type": "markdown", + "id": "33f7a7de", + "metadata": {}, + "source": [ + "### Start a Webhook Server" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9832e5e4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Listening for webhooks from agent at http://0.0.0.0:3010\n" + ] + } + ], + "source": [ + "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", + "webhook_host = \"0.0.0.0\"\n", + "\n", + "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", + "\n", + "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" + ] + }, + { + "cell_type": "markdown", + "id": "468f63fb", + "metadata": {}, + "source": [ + "## Register Agent Event Listeners\n", + "\n", + "You can see some examples within the webhook_listeners recipe. Copy any relevant cells across and customise as needed." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ba63f51c", + "metadata": {}, + "outputs": [], + "source": [ + "listeners = []\n", + "\n", + "# Receive connection messages\n", + "def connections_handler(payload):\n", + " state = payload['state']\n", + " connection_id = payload[\"connection_id\"]\n", + " their_role = payload[\"their_role\"]\n", + " routing_state = payload[\"routing_state\"]\n", + " \n", + " print(\"----------------------------------------------------------\")\n", + " print(\"Connection Webhook Event Received\")\n", + " print(\"Connection ID : \", connection_id)\n", + " print(\"State : \", state)\n", + " print(\"Routing State : \", routing_state)\n", + " print(\"Their Role : \", their_role)\n", + " print(\"----------------------------------------------------------\")\n", + "\n", + " if state == \"invitation\":\n", + " # Your business logic\n", + " print(\"invitation\")\n", + " elif state == \"request\":\n", + " # Your business logic\n", + " print(\"request\")\n", + "\n", + " elif state == \"response\":\n", + " # Your business logic\n", + " print(\"response\")\n", + " elif state == \"active\":\n", + " # Your business logic\n", + " print(colored(\"Connection ID: {0} is now active.\".format(connection_id), \"green\", attrs=[\"bold\"]))\n", + "\n", + "\n", + "\n", + "connection_listener = {\n", + " \"handler\": connections_handler,\n", + " \"topic\": \"connections\"\n", + "}\n", + "\n", + "listeners.append(connection_listener)\n", + "\n", + "agent_controller.register_listeners(listeners)" + ] + }, + { + "cell_type": "markdown", + "id": "41e36269", + "metadata": {}, + "source": [ + "## Create Invitation\n", + "\n", + "Share this with the prover agent" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "156b9356", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 24e2273a-695f-4d54-a8b1-848df81ddaf2\n", + "State : invitation\n", + "Routing State : none\n", + "Their Role : invitee\n", + "----------------------------------------------------------\n", + "invitation\n" + ] + } + ], + "source": [ + "# Alias for invited connection\n", + "alias = None\n", + "auto_accept = False\n", + "# Use public DID?\n", + "public = \"false\"\n", + "# Should this invitation be usable by multiple invitees?\n", + "multi_use = \"false\"\n", + "\n", + "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", + "# Is equivalent to above. Arguments are optionally\n", + "# invitation_response = await agent_controller.connections.create_invitation()\n", + "\n", + "\n", + "\n", + "# You probably want to keep this somewhere so you can enage in other protocols with this connection.\n", + "connection_id = invitation_response[\"connection_id\"]\n" + ] + }, + { + "cell_type": "markdown", + "id": "bd00da73", + "metadata": {}, + "source": [ + "## Share Invitation Object with Prover Agent\n", + "\n", + "Typically in this jupyter notebook playground that involves copying it across to another agent's business logic notebook where they are the invitee. (see invitee_template recipe)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ecfb1102", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': '461920e6-8c56-4665-8171-bf80531b6007', 'label': 'Issuer', 'recipientKeys': ['7e2GBXu7opBR2c7awJD8m9yvyF6yMancFebisdGKT7gd'], 'serviceEndpoint': 'http://issuer-agent:3020'}\n", + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 24e2273a-695f-4d54-a8b1-848df81ddaf2\n", + "State : request\n", + "Routing State : none\n", + "Their Role : invitee\n", + "----------------------------------------------------------\n", + "request\n", + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 24e2273a-695f-4d54-a8b1-848df81ddaf2\n", + "State : response\n", + "Routing State : none\n", + "Their Role : invitee\n", + "----------------------------------------------------------\n", + "response\n", + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 24e2273a-695f-4d54-a8b1-848df81ddaf2\n", + "State : active\n", + "Routing State : none\n", + "Their Role : invitee\n", + "----------------------------------------------------------\n", + "\u001b[1m\u001b[32mConnection ID: 24e2273a-695f-4d54-a8b1-848df81ddaf2 is now active.\u001b[0m\n" + ] + } + ], + "source": [ + "invitation = invitation_response[\"invitation\"]\n", + "## Copy this output\n", + "print(invitation)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27163cae", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "46d2d54c", + "metadata": {}, + "source": [ + "## Store Issuing Schema and Cred Def Identifiers\n", + "\n", + "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", + "\n", + "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "50c9c843", + "metadata": {}, + "outputs": [], + "source": [ + "size1_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size1:0.0.1'\n", + "size1_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:default'\n", + "size1_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:revocable'\n", + "\n", + "size2_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size2:0.0.1'\n", + "size2_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:default'\n", + "size2_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:revocable'\n", + "\n", + "size3_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size3:0.0.1'\n", + "size3_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:default'\n", + "size3_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:revocable'\n", + "\n", + "size4_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size4:0.0.1'\n", + "size4_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:default'\n", + "size4_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:revocable'\n", + "\n", + "size5_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size5:0.0.1'\n", + "size5_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:default'\n", + "size5_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:revocable'\n", + "\n", + "size6_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size6:0.0.1'\n", + "size6_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:default'\n", + "size6_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:revocable'\n", + "\n", + "size7_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size7:0.0.1'\n", + "size7_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:14:default'\n", + "size7_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:14:revocable'\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "e34ddb9a", + "metadata": {}, + "source": [ + "## Issue Attrib Size Credential\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0e1748a5", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size1_schema_id, size1_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4016ca4c", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 512*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size2_schema_id, size2_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "bf4e7956", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size3_schema_id, size3_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "3d8ad96e", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 16*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size4_schema_id, size4_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "3fc96574", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 64*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size5_schema_id, size5_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "10a7e555", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size6_schema_id, size6_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "18344a10", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 256*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size7_schema_id, size7_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d5a7cad1", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size1_schema_id, size1_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "468bec9a", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 512*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size2_schema_id, size2_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "c6bb0484", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size3_schema_id, size3_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "d3e18124", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 16*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size4_schema_id, size4_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "960096b9", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 64*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size5_schema_id, size5_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "34f67a74", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size6_schema_id, size6_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "42d31c18", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 256*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size7_schema_id, size7_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "markdown", + "id": "2f181fb9", + "metadata": {}, + "source": [ + "# Variable Attribute Number Credentials" + ] + }, + { + "cell_type": "markdown", + "id": "d516ffa8", + "metadata": {}, + "source": [ + "## Store Issuing Schema and Cred Def Identifiers\n", + "\n", + "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", + "\n", + "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "8ed8990c", + "metadata": {}, + "outputs": [], + "source": [ + "one_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:one-attrib:0.0.2'\n", + "one_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:default'\n", + "one_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:revocable'\n", + "\n", + "five_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-attrib:0.0.1'\n", + "five_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:default'\n", + "five_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:revocable'\n", + "\n", + "ten_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:ten-attrib:0.0.1'\n", + "ten_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:default'\n", + "ten_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:revocable'\n", + "\n", + "twenty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:twenty-attrib:0.0.1'\n", + "twenty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:default'\n", + "twenty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:revocable'\n", + "\n", + "fifty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:fifty-attrib:0.0.1'\n", + "fifty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:default'\n", + "fifty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:revocable'\n", + "\n", + "hundred_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:hundred-attrib:0.0.1'\n", + "hundred_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:default'\n", + "hundred_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:revocable'\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "77e0dbf2", + "metadata": {}, + "source": [ + "## Issue Credentials" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "cc91f92e", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"1\", \"value\":32*\"0\"}\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, one_schema_id, one_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "19bc9e6f", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,6):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, five_schema_id, five_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "a5deee91", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,11):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, ten_schema_id, ten_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "6d231827", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,21):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, twenty_schema_id, twenty_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "a46d8b2b", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,51):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, fifty_schema_id, fifty_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "2e7cb57b", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,101):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, hundred_schema_id, hundred_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "07f5b6ee", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"1\", \"value\":32*\"0\"}\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, one_schema_id, one_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "831164fb", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,6):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, five_schema_id, five_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "f2f3ba8d", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,11):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, ten_schema_id, ten_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "ae678096", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,21):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, twenty_schema_id, twenty_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "08e09116", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,51):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, fifty_schema_id, fifty_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "c423eb07", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,101):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "response = await agent_controller.issuer.send_credential(connection_id, hundred_schema_id, hundred_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "markdown", + "id": "639f2446", + "metadata": {}, + "source": [ + "# Same Number Attribute Variable Credentials Credentials" + ] + }, + { + "cell_type": "markdown", + "id": "ff5a5419", + "metadata": {}, + "source": [ + "## Store Issuing Schema and Cred Def Identifiers\n", + "\n", + "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", + "\n", + "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "180accd0", + "metadata": {}, + "outputs": [], + "source": [ + "five1_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-one:0.0.1'\n", + "five1_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:21:default'\n", + "five1_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:21:revocable'\n", + "\n", + "five2_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-two:0.0.1'\n", + "five2_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:22:default'\n", + "five2_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:22:revocable'\n", + "\n", + "five3_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-three:0.0.1'\n", + "five3_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:23:default'\n", + "five3_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:23:revocable'\n", + "\n", + "five4_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-four:0.0.1'\n", + "five4_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:24:default'\n", + "five4_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:24:revocable'\n", + "\n", + "five5_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-five:0.0.1'\n", + "five5_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:25:default'\n", + "five5_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:25:revocable'\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "abf858fd", + "metadata": {}, + "source": [ + "## Issue Credentials" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "122018d2", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,6):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "eadbcbe1", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "response = await agent_controller.issuer.send_credential(connection_id, five1_schema_id, five1_cred_def_id, credential_attributes)\n", + "response = await agent_controller.issuer.send_credential(connection_id, five1_schema_id, five1_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "4f908a74", + "metadata": {}, + "outputs": [], + "source": [ + "response = await agent_controller.issuer.send_credential(connection_id, five2_schema_id, five2_cred_def_id, credential_attributes)\n", + "response = await agent_controller.issuer.send_credential(connection_id, five2_schema_id, five2_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "f7be827f", + "metadata": {}, + "outputs": [], + "source": [ + "response = await agent_controller.issuer.send_credential(connection_id, five3_schema_id, five3_cred_def_id, credential_attributes)\n", + "response = await agent_controller.issuer.send_credential(connection_id, five3_schema_id, five3_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "e402ca46", + "metadata": {}, + "outputs": [], + "source": [ + "response = await agent_controller.issuer.send_credential(connection_id, five4_schema_id, five4_cred_def_id, credential_attributes)\n", + "response = await agent_controller.issuer.send_credential(connection_id, five4_schema_id, five4_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "4f0c3a49", + "metadata": {}, + "outputs": [], + "source": [ + "response = await agent_controller.issuer.send_credential(connection_id, five5_schema_id, five5_cred_def_id, credential_attributes)\n", + "response = await agent_controller.issuer.send_credential(connection_id, five5_schema_id, five5_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "markdown", + "id": "e5daa0f0", + "metadata": {}, + "source": [ + "## Terminate Controller\n", + "\n", + "Whenever you have finished with this notebook, be sure to terminate the controller. This is especially important if your business logic runs across multiple notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "a6354a1e", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0917b9db", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/issuer/notebooks/verify_attrib_size.ipynb b/playground/issuer/notebooks/verify_attrib_size.ipynb new file mode 100644 index 0000000..cba66ab --- /dev/null +++ b/playground/issuer/notebooks/verify_attrib_size.ipynb @@ -0,0 +1,1293 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d1b73b54", + "metadata": {}, + "source": [ + "# Performance Test\n", + "## Variable Attribute Size\n" + ] + }, + { + "cell_type": "markdown", + "id": "7fff12a7", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "58808a1a", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "\n", + "from libs.performance_service import PerformanceService\n", + "import os\n", + "import time\n", + "from termcolor import colored" + ] + }, + { + "cell_type": "markdown", + "id": "ed1d12e8", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5765cd43", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://issuer-agent:3021 and an api key of adminApiKey\n" + ] + } + ], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)\n", + "\n", + "agent_controller.register_listeners([], defaults=True)" + ] + }, + { + "cell_type": "markdown", + "id": "1d52df71", + "metadata": {}, + "source": [ + "### Start a Webhook Server" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "001e7847", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Listening for webhooks from agent at http://0.0.0.0:3010\n" + ] + } + ], + "source": [ + "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", + "webhook_host = \"0.0.0.0\"\n", + "\n", + "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", + "\n", + "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" + ] + }, + { + "cell_type": "markdown", + "id": "82030431", + "metadata": {}, + "source": [ + "## Store Issuing Schema and Cred Def Identifiers\n", + "\n", + "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", + "\n", + "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0dc81744", + "metadata": {}, + "outputs": [], + "source": [ + "size1_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size1:0.0.1'\n", + "size1_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:default'\n", + "size1_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:revocable'\n", + "\n", + "size2_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size2:0.0.1'\n", + "size2_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:default'\n", + "size2_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:revocable'\n", + "\n", + "size3_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size3:0.0.1'\n", + "size3_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:default'\n", + "size3_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:revocable'\n", + "\n", + "size4_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size4:0.0.1'\n", + "size4_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:default'\n", + "size4_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:revocable'\n", + "\n", + "size5_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size5:0.0.1'\n", + "size5_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:default'\n", + "size5_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:revocable'\n", + "\n", + "size6_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size6:0.0.1'\n", + "size6_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:default'\n", + "size6_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:revocable'\n", + "\n", + "size7_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:size7:0.0.1'\n", + "size7_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:14:default'\n", + "size7_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:14:revocable'\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c8cd512f", + "metadata": {}, + "source": [ + "## Establish Connection\n", + "\n", + "Before you can issue a credential you must first establish a connection across which the credential will be issued to a holder. (see recipes/connection)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "24c2ea8a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': 'e9079bd4-af0f-4453-b6c3-a0cc8ddb849b', 'label': 'Issuer', 'serviceEndpoint': 'http://issuer-agent:3020', 'recipientKeys': ['9RC5kbj1hmRD9GpBXtX5uEAGpbo9sGNcDmAkg2nn1Eiv']}\n", + "319e18fa-9348-4787-b995-e327cf4e5cda\n" + ] + } + ], + "source": [ + "# Alias for invited connection\n", + "alias = \"Friend\"\n", + "auto_accept = \"true\"\n", + "# Use public DID?\n", + "public = \"false\"\n", + "# Should this invitation be usable by multiple invitees?\n", + "multi_use = \"false\"\n", + "\n", + "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", + "# Is equivalent to above. Arguments are optionally\n", + "# invitation_response = await agent_controller.connections.create_invitation()\n", + "\n", + "\n", + "\n", + "# You will use this identifier to issue a credential across this connection\n", + "connection_id = invitation_response[\"connection_id\"]\n", + "\n", + "invitation = invitation_response[\"invitation\"]\n", + "## Copy this output\n", + "print(invitation)\n", + "print(connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ef23fbb", + "metadata": {}, + "outputs": [], + "source": [ + "connection_id = \"319e18fa-9348-4787-b995-e327cf4e5cda\"" + ] + }, + { + "cell_type": "markdown", + "id": "572aaf3a", + "metadata": {}, + "source": [ + "## Issue Credentials" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f27d4bd6", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size1_schema_id, size1_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64a4d766", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 512*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size2_schema_id, size2_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6e3e941", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size3_schema_id, size3_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "403230a9", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 16*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size4_schema_id, size4_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f24fc176", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 64*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size5_schema_id, size5_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1b84a46", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size6_schema_id, size6_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "534be319", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 256*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size7_schema_id, size7_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e6fde4b", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size1_schema_id, size1_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f40eee6e", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 512*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size2_schema_id, size2_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d98e77fb", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size3_schema_id, size3_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46cd0ebf", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 16*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size4_schema_id, size4_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16feb4af", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 64*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size5_schema_id, size5_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2ff0acf", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 128*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size6_schema_id, size6_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4744b07a", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"image\", \"value\": 256*1024*\"0\"},\n", + "]\n", + "response = await agent_controller.issuer.send_credential(connection_id, size7_schema_id, size7_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "markdown", + "id": "b3c66e5b", + "metadata": {}, + "source": [ + "## Init Performance Service" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd324ed7", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service = PerformanceService(agent_controller, iterations=20)" + ] + }, + { + "cell_type": "markdown", + "id": "40d0ad75", + "metadata": {}, + "source": [ + "## Define Presentation Request Object\n", + "\n", + "The below cell defines a generic presentation request object, that can be sent across specific connections requesting that they produce a presentation containing the identified attributes and meeting the restrictions.\n", + "\n", + "It is often useful to define your request objects first, then reuse these objects across many connections you wish to request a proof from. \n", + "\n", + "Duplicate and customise the below cell as many times as you need. It may be useful to save these request objects either to the jupyter store using %store or through\n", + "\n", + "TODO: Detail the full set of restrictions available to a verifier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "945ce1e3", + "metadata": {}, + "outputs": [], + "source": [ + "# # We add a constraint that the attribute must originate from this schema\n", + "# schema_id = \"\"\n", + "\n", + "# trusted_issuer_did = \"\"\n", + "\n", + "# cred_def_id = \"\"\n", + "\n", + "# # Define the list of attributes and restrictions under which each attribute was issued that a prover must satisfy with a presentation\n", + "# # NOTE: if identifying a schema or credential definition then the attribute name must be contained within the corresponding schema.\n", + "# req_attrs = [\n", + "# {\"name\": \"\", \"restrictions\": [{\"schema_id\": schema_id}]},\n", + "# {\"name\": \"\", \"restrictions\": [{\"cred_def_id\": cred_def_id}]},\n", + "# #NOTE: you do not need to specify any restrictions. This means the prover can present a self-attested attribute to satisfy this request. \n", + "# # Although the business logic (this notebook) can still determine this is unacceptable.\n", + "# {\"name\": \"\", \"restrictions\":[]}\n", + "# # You can also specify individual attributes be non-revoked\n", + "# {\"name\": \"\", \"restrictions\": [], \"non_revoked\": {\"to\": int(time.time() - 1)}}\n", + "# ]\n", + "\n", + "# # We could extend this to request the name attribute aswell if we wanted.\n", + "\n", + "\n", + "# proof_request = {\n", + "# \"name\": \"Name of Proof Request\",\n", + "# \"version\": \"1.0\",\n", + "\n", + "# # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", + "# # We will ignore these for now.\n", + "# \"requested_predicates\": {\n", + "# # f\"0_{req_pred['name']}_GE_uuid\":\n", + "# # req_pred for req_pred in req_preds\n", + "# },\n", + "# # You can also request the entire proof request be non-revoked\n", + "# \"non_revoked\": {\"to\": int(time.time())}\n", + "# }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e1f10ef0", + "metadata": {}, + "outputs": [], + "source": [ + "proof_request = {\n", + " \"name\": \"Name of Proof Request\",\n", + " \"version\": \"1.0\",\n", + "\n", + " # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", + " # We will ignore these for now.\n", + " \"requested_predicates\": {\n", + "# f\"0_{req_pred['name']}_GE_uuid\":\n", + "# req_pred for req_pred in req_preds\n", + " },\n", + " # You can also request the entire proof request be non-revoked\n", + " \"non_revoked\": {\"to\": int(time.time())}\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "c0ec457f", + "metadata": {}, + "source": [ + "# Variable Attribute Size Experiment\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2f9e7b7", + "metadata": {}, + "outputs": [], + "source": [ + "experiment = performance_service.new_experiment(\"Variable Attribute Size - Non Revocable\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d40d6661", + "metadata": {}, + "outputs": [], + "source": [ + "revocable_experiment = performance_service.new_experiment(\"Variable Attribute Size - Revocable\")" + ] + }, + { + "cell_type": "markdown", + "id": "a27f987c", + "metadata": {}, + "source": [ + "## Performance Test - 128B" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "949dbf38", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size1_schema_id, \"cred_def_id\": size1_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "820cffb3", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"128B\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12a75af1", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "80070da8", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size1_schema_id, \"cred_def_id\": size1_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "daae023f", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "7793a380", + "metadata": {}, + "source": [ + "## Performance Test - 512B" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13ffa459", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size2_schema_id, \"cred_def_id\": size2_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "86ae5b75", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"512B\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50a5ad7a", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d7a42fb4", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size2_schema_id, \"cred_def_id\": size2_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea9cc8f6", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "c9f0f67c", + "metadata": {}, + "source": [ + "## Performance Test - 1kB" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2469348d", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size3_schema_id, \"cred_def_id\": size3_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e252b12", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"1kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14400595", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "baacfd2c", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size3_schema_id, \"cred_def_id\": size3_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba224e27", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "3738cb47", + "metadata": {}, + "source": [ + "## Performance Test - 16kB" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40494d3d", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size4_schema_id, \"cred_def_id\": size4_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bc2ad17b", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"16kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b850b79", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8079b79", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size4_schema_id, \"cred_def_id\": size4_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d620f2a", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "07799bfe", + "metadata": {}, + "source": [ + "## Performance Test - 64kB" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b196934", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size5_schema_id, \"cred_def_id\": size5_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d29fc28", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"64kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f7dc715", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca146a79", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size5_schema_id, \"cred_def_id\": size5_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dafaa52e", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "34e83cf7", + "metadata": {}, + "source": [ + "## Performance Test - 128kB" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45109191", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size6_schema_id, \"cred_def_id\": size6_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cba90fe1", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"128kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c99237d5", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c3990f1", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size6_schema_id, \"cred_def_id\": size6_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d337aed", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "e419f6f8", + "metadata": {}, + "source": [ + "## Performance Test - 256kB" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec6d21a3", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size7_schema_id, \"cred_def_id\": size7_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d215dadb", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"256kB\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0c3c0b2d", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e9cd47f3", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"image\", \"restrictions\": [{\"schema_id\": size7_schema_id, \"cred_def_id\": size7_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e48a9cb", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "8fc84705", + "metadata": {}, + "source": [ + "## Plot Results" + ] + }, + { + "cell_type": "markdown", + "id": "5f0aec22", + "metadata": {}, + "source": [ + "### Non Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6f41931", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "non_revocable_averages = []\n", + "for result in experiment[\"results\"]:\n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " non_revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7836456", + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential Size (Bytes)\")\n", + "\n", + "plt.savefig(\"results/verification/attribute_size/box_plot_non_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "68243ae4", + "metadata": {}, + "source": [ + "### Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd8093d2", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "revocable_averages = []\n", + "for result in revocable_experiment[\"results\"]:\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45ca7cab", + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential Size (Bytes)\")\n", + "\n", + "plt.savefig(\"results/verification/attribute_size/box_plot_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "8fc6aee6", + "metadata": {}, + "source": [ + "## Averages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2693891", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + "\n", + "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", + "\n", + "plt_points = [128,512,1024,16*1024,64*1024,128*1024,256*1024]\n", + "\n", + "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", + "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential_size (Bytes)\")\n", + "\n", + "\n", + "plt.legend()\n", + "plt.savefig(\"results/verification/attribute_size/averages.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "15decea2", + "metadata": {}, + "source": [ + "## Terminate Controller" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc9c5cca", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0f505cc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/issuer/notebooks/verify_fixed_attrib.ipynb b/playground/issuer/notebooks/verify_fixed_attrib.ipynb new file mode 100644 index 0000000..aa4ce41 --- /dev/null +++ b/playground/issuer/notebooks/verify_fixed_attrib.ipynb @@ -0,0 +1,1176 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c5e4f52c", + "metadata": {}, + "source": [ + "# ACA-Py & ACC-Py Verifier Template\n", + "\n", + "## Copy this template into the root folder of your notebook workspace to get started" + ] + }, + { + "cell_type": "markdown", + "id": "ff969abc", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df5da339", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "\n", + "from libs.performance_service import PerformanceService\n", + "import os\n", + "import time\n", + "from termcolor import colored" + ] + }, + { + "cell_type": "markdown", + "id": "f30bbc12", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74b78395", + "metadata": {}, + "outputs": [], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)" + ] + }, + { + "cell_type": "markdown", + "id": "fee28a17", + "metadata": {}, + "source": [ + "### Start a Webhook Server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d2dfa11", + "metadata": {}, + "outputs": [], + "source": [ + "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", + "webhook_host = \"0.0.0.0\"\n", + "\n", + "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", + "\n", + "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" + ] + }, + { + "cell_type": "markdown", + "id": "270518cb", + "metadata": {}, + "source": [ + "## Store Issuing Schema and Cred Def Identifiers\n", + "\n", + "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", + "\n", + "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ed2981e", + "metadata": {}, + "outputs": [], + "source": [ + "one_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:one-attrib:0.0.2'\n", + "one_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:default'\n", + "one_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:revocable'\n", + "\n", + "five_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-attrib:0.0.1'\n", + "five_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:default'\n", + "five_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:revocable'\n", + "\n", + "ten_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:ten-attrib:0.0.1'\n", + "ten_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:default'\n", + "ten_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:revocable'\n", + "\n", + "twenty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:twenty-attrib:0.0.1'\n", + "twenty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:default'\n", + "twenty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:revocable'\n", + "\n", + "fifty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:fifty-attrib:0.0.1'\n", + "fifty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:default'\n", + "fifty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:revocable'\n", + "\n", + "hundred_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:hundred-attrib:0.0.1'\n", + "hundred_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:default'\n", + "hundred_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:revocable'\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "2b5205a1", + "metadata": {}, + "source": [ + "## Init Performance Service" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ecde0190", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service = PerformanceService(agent_controller, iterations=20)" + ] + }, + { + "cell_type": "markdown", + "id": "4482c9b8", + "metadata": {}, + "source": [ + "## Establish Connection\n", + "\n", + "Before you can issue a credential you must first establish a connection across which the credential will be issued to a holder. (see recipes/connection)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac73e3f5", + "metadata": {}, + "outputs": [], + "source": [ + "# Alias for invited connection\n", + "alias = \"Friend\"\n", + "auto_accept = \"true\"\n", + "# Use public DID?\n", + "public = \"false\"\n", + "# Should this invitation be usable by multiple invitees?\n", + "multi_use = \"false\"\n", + "\n", + "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", + "# Is equivalent to above. Arguments are optionally\n", + "# invitation_response = await agent_controller.connections.create_invitation()\n", + "\n", + "\n", + "\n", + "# You will use this identifier to issue a credential across this connection\n", + "connection_id = invitation_response[\"connection_id\"]\n", + "\n", + "invitation = invitation_response[\"invitation\"]\n", + "## Copy this output\n", + "print(invitation)\n", + "print(connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47054ba0", + "metadata": {}, + "outputs": [], + "source": [ + "connection_id = \"2782d60f-65d0-4e14-8e28-55fa38735468\"" + ] + }, + { + "cell_type": "markdown", + "id": "9f07e889", + "metadata": {}, + "source": [ + "## Issue Credentials" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "012a8b55", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"1\", \"value\":32*\"0\"}\n", + "]\n", + "await self.agent_controller.issuer.send_credential(connection_id, one_schema_id, one_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97f2619f", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,6):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, five_schema_id, five_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d530546", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,11):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, ten_schema_id, ten_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dcd3fc49", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,21):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, twenty_schema_id, twenty_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f9813dc", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,51):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, fifty_schema_id, fifty_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b46549ab", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,101):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, hundred_schema_id, hundred_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3656b429", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = [\n", + " {\"name\": \"1\", \"value\":32*\"0\"}\n", + "]\n", + "await self.agent_controller.issuer.send_credential(connection_id, one_schema_id, one_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "792b7e9e", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,6):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, five_schema_id, five_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "761d4c00", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,11):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, ten_schema_id, ten_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca93b14b", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,21):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, twenty_schema_id, twenty_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79af4255", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,51):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, fifty_schema_id, fifty_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bb21426d", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,101):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)\n", + "await self.agent_controller.issuer.send_credential(connection_id, hundred_schema_id, hundred_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "markdown", + "id": "1057caf4", + "metadata": {}, + "source": [ + "## Define Presentation Request Object\n", + "\n", + "The below cell defines a generic presentation request object, that can be sent across specific connections requesting that they produce a presentation containing the identified attributes and meeting the restrictions.\n", + "\n", + "It is often useful to define your request objects first, then reuse these objects across many connections you wish to request a proof from. \n", + "\n", + "Duplicate and customise the below cell as many times as you need. It may be useful to save these request objects either to the jupyter store using %store or through\n", + "\n", + "TODO: Detail the full set of restrictions available to a verifier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd4096ee", + "metadata": {}, + "outputs": [], + "source": [ + "# # We add a constraint that the attribute must originate from this schema\n", + "# schema_id = \"\"\n", + "\n", + "# trusted_issuer_did = \"\"\n", + "\n", + "# cred_def_id = \"\"\n", + "\n", + "# # Define the list of attributes and restrictions under which each attribute was issued that a prover must satisfy with a presentation\n", + "# # NOTE: if identifying a schema or credential definition then the attribute name must be contained within the corresponding schema.\n", + "# req_attrs = [\n", + "# {\"name\": \"\", \"restrictions\": [{\"schema_id\": schema_id}]},\n", + "# {\"name\": \"\", \"restrictions\": [{\"cred_def_id\": cred_def_id}]},\n", + "# #NOTE: you do not need to specify any restrictions. This means the prover can present a self-attested attribute to satisfy this request. \n", + "# # Although the business logic (this notebook) can still determine this is unacceptable.\n", + "# {\"name\": \"\", \"restrictions\":[]}\n", + "# # You can also specify individual attributes be non-revoked\n", + "# {\"name\": \"\", \"restrictions\": [], \"non_revoked\": {\"to\": int(time.time() - 1)}}\n", + "# ]\n", + "\n", + "# # We could extend this to request the name attribute aswell if we wanted.\n", + "\n", + "\n", + "# proof_request = {\n", + "# \"name\": \"Name of Proof Request\",\n", + "# \"version\": \"1.0\",\n", + "\n", + "# # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", + "# # We will ignore these for now.\n", + "# \"requested_predicates\": {\n", + "# # f\"0_{req_pred['name']}_GE_uuid\":\n", + "# # req_pred for req_pred in req_preds\n", + "# },\n", + "# # You can also request the entire proof request be non-revoked\n", + "# \"non_revoked\": {\"to\": int(time.time())}\n", + "# }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cadc2aa1", + "metadata": {}, + "outputs": [], + "source": [ + "proof_request = {\n", + " \"name\": \"Name of Proof Request\",\n", + " \"version\": \"1.0\",\n", + "\n", + " # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", + " # We will ignore these for now.\n", + " \"requested_predicates\": {\n", + "# f\"0_{req_pred['name']}_GE_uuid\":\n", + "# req_pred for req_pred in req_preds\n", + " },\n", + " # You can also request the entire proof request be non-revoked\n", + " \"non_revoked\": {\"to\": int(time.time())}\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "fd48db21", + "metadata": {}, + "source": [ + "# Single Disclosed Attribute from Variable Size Credential Experiment\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d0308d0a", + "metadata": {}, + "outputs": [], + "source": [ + "experiment = performance_service.new_experiment(\"Single Attribute from Variable Credentials - Non Revocable\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9a6d36a", + "metadata": {}, + "outputs": [], + "source": [ + "revocable_experiment = performance_service.new_experiment(\"Single Attribute from Variable Credential - Revocable\")" + ] + }, + { + "cell_type": "markdown", + "id": "d6f06601", + "metadata": {}, + "source": [ + "## Performance Test - One Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "70e2d360", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": one_schema_id, \"cred_def_id\": one_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53b42246", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"1\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c6ad346", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0ed2d83", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": one_schema_id, \"cred_def_id\": one_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5bfc8812", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "7b7dbdb8", + "metadata": {}, + "source": [ + "## Performance Test - Five Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0a98547", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "06a281c1", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"5\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5bb5809d", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c7af3c2", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17d7a71a", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "c45281b9", + "metadata": {}, + "source": [ + "## Performance Test - Fice Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c36dd02e", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d49b5575", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"10\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "edfd96cb", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df7fd5e8", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55d44621", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "5f3bbe1d", + "metadata": {}, + "source": [ + "## Performance Test - Twenty Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "222ef333", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dbc6a3dd", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"20\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f248d0e", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "236d46d1", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4279aa6f", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "57aaeed0", + "metadata": {}, + "source": [ + "## Performance Test - Fifty Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad6bedb0", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bdc2719f", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"50\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a799f51b", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f396385", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2bb949f", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "f4728a66", + "metadata": {}, + "source": [ + "## Performance Test - Hundred Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "883b6ae6", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e529824", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"100\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d0d349b", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e668db16", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d9efc73", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "2789bc50", + "metadata": {}, + "source": [ + "## Plot Results" + ] + }, + { + "cell_type": "markdown", + "id": "ae2c3346", + "metadata": {}, + "source": [ + "### Non Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3bfa1514", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "non_revocable_averages = []\n", + "for result in experiment[\"results\"]:\n", + " \n", + " if result[\"name\"] != \"1\":\n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " non_revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6444fbe0", + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential Size (Bytes)\")\n", + "\n", + "plt.savefig(\"results/verification/fixed_disclosure_variable_attrib_number/box_plot_non_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "2ecaa86d", + "metadata": {}, + "source": [ + "### Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8959091d", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "revocable_averages = []\n", + "for result in revocable_experiment[\"results\"]:\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "133d71a3", + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential Size (Bytes)\")\n", + "\n", + "plt.savefig(\"results/verification/fixed_disclosure_variable_attrib_number/box_plot_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "13de0d1c", + "metadata": {}, + "source": [ + "## Averages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f61a7ba", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + "\n", + "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", + "\n", + "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", + "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential_size (Bytes)\")\n", + "\n", + "\n", + "plt.legend()\n", + "plt.savefig(\"results/verification/fixed_disclosure_variable_attrib_number/averages.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "ad1f7137", + "metadata": {}, + "source": [ + "## Terminate Controller\n", + "\n", + "Whenever you have finished with this notebook, be sure to terminate the controller. This is especially important if your business logic runs across multiple notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d9f94fd", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00c835cb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/issuer/notebooks/verify_multiple_creds_fixed_attrib.ipynb b/playground/issuer/notebooks/verify_multiple_creds_fixed_attrib.ipynb new file mode 100644 index 0000000..2c538bb --- /dev/null +++ b/playground/issuer/notebooks/verify_multiple_creds_fixed_attrib.ipynb @@ -0,0 +1,1147 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bce9037d", + "metadata": {}, + "source": [ + "# Performance Test\n", + "## Disclosure of Fixed Number of Attributes from Variable Num Credentials" + ] + }, + { + "cell_type": "markdown", + "id": "7b903fe9", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d92ae7de", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "\n", + "from libs.performance_service import PerformanceService\n", + "import os\n", + "import time\n", + "from termcolor import colored" + ] + }, + { + "cell_type": "markdown", + "id": "90900525", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6b774ee", + "metadata": {}, + "outputs": [], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)" + ] + }, + { + "cell_type": "markdown", + "id": "da5dea6c", + "metadata": {}, + "source": [ + "### Start a Webhook Server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3c953fb", + "metadata": {}, + "outputs": [], + "source": [ + "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", + "webhook_host = \"0.0.0.0\"\n", + "\n", + "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", + "\n", + "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" + ] + }, + { + "cell_type": "markdown", + "id": "fb84ade3", + "metadata": {}, + "source": [ + "## Store Issuing Schema and Cred Def Identifiers\n", + "\n", + "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", + "\n", + "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f698a5dd", + "metadata": {}, + "outputs": [], + "source": [ + "five1_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-one:0.0.1'\n", + "five1_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:21:default'\n", + "five1_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:21:revocable'\n", + "\n", + "five2_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-two:0.0.1'\n", + "five2_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:22:default'\n", + "five2_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:22:revocable'\n", + "\n", + "five3_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-three:0.0.1'\n", + "five3_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:23:default'\n", + "five3_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:23:revocable'\n", + "\n", + "five4_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-four:0.0.1'\n", + "five4_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:24:default'\n", + "five4_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:24:revocable'\n", + "\n", + "five5_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-five:0.0.1'\n", + "five5_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:25:default'\n", + "five5_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:25:revocable'\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c184ac4b", + "metadata": {}, + "source": [ + "## Init Performance Service" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "af052124", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service = PerformanceService(agent_controller, iterations=20)" + ] + }, + { + "cell_type": "markdown", + "id": "6f9e10ee", + "metadata": {}, + "source": [ + "## Establish Connection\n", + "\n", + "Before you can issue a credential you must first establish a connection across which the credential will be issued to a holder. (see recipes/connection)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fba8bfe8", + "metadata": {}, + "outputs": [], + "source": [ + "# Alias for invited connection\n", + "alias = \"Friend\"\n", + "auto_accept = \"true\"\n", + "# Use public DID?\n", + "public = \"false\"\n", + "# Should this invitation be usable by multiple invitees?\n", + "multi_use = \"false\"\n", + "\n", + "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", + "# Is equivalent to above. Arguments are optionally\n", + "# invitation_response = await agent_controller.connections.create_invitation()\n", + "\n", + "\n", + "\n", + "# You will use this identifier to issue a credential across this connection\n", + "connection_id = invitation_response[\"connection_id\"]\n", + "\n", + "invitation = invitation_response[\"invitation\"]\n", + "## Copy this output\n", + "print(invitation)\n", + "print(connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90185f25", + "metadata": {}, + "outputs": [], + "source": [ + "connection_id = \"bf7d4d2b-1398-4079-a4fa-7cfecf815892\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6af98bf1", + "metadata": {}, + "outputs": [], + "source": [ + "## Issue Credentials" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "437d9d44", + "metadata": {}, + "outputs": [], + "source": [ + "credential_attributes = []\n", + "\n", + "for x in range(1,6):\n", + " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", + " credential_attributes.append(attribute)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efac27e1", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "await self.agent_controller.issuer.send_credential(connection_id, five1_schema_id, five1_cred_def_id, credential_attributes)\n", + "await self.agent_controller.issuer.send_credential(connection_id, five1_schema_id, five1_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "938f80ac", + "metadata": {}, + "outputs": [], + "source": [ + "await self.agent_controller.issuer.send_credential(connection_id, five2_schema_id, five2_cred_def_id, credential_attributes)\n", + "await self.agent_controller.issuer.send_credential(connection_id, five2_schema_id, five2_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b39287b9", + "metadata": {}, + "outputs": [], + "source": [ + "await self.agent_controller.issuer.send_credential(connection_id, five3_schema_id, five3_cred_def_id, credential_attributes)\n", + "await self.agent_controller.issuer.send_credential(connection_id, five3_schema_id, five3_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0ccda27", + "metadata": {}, + "outputs": [], + "source": [ + "await self.agent_controller.issuer.send_credential(connection_id, five4_schema_id, five4_cred_def_id, credential_attributes)\n", + "await self.agent_controller.issuer.send_credential(connection_id, five4_schema_id, five4_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bb5a57d", + "metadata": {}, + "outputs": [], + "source": [ + "await self.agent_controller.issuer.send_credential(connection_id, five5_schema_id, five5_cred_def_id, credential_attributes)\n", + "await self.agent_controller.issuer.send_credential(connection_id, five5_schema_id, five5_rev_cred_def_id, credential_attributes)" + ] + }, + { + "cell_type": "markdown", + "id": "7c9a780d", + "metadata": {}, + "source": [ + "## Define Presentation Request Object\n", + "\n", + "The below cell defines a generic presentation request object, that can be sent across specific connections requesting that they produce a presentation containing the identified attributes and meeting the restrictions.\n", + "\n", + "It is often useful to define your request objects first, then reuse these objects across many connections you wish to request a proof from. \n", + "\n", + "Duplicate and customise the below cell as many times as you need. It may be useful to save these request objects either to the jupyter store using %store or through\n", + "\n", + "TODO: Detail the full set of restrictions available to a verifier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f374987b", + "metadata": {}, + "outputs": [], + "source": [ + "# # We add a constraint that the attribute must originate from this schema\n", + "# schema_id = \"\"\n", + "\n", + "# trusted_issuer_did = \"\"\n", + "\n", + "# cred_def_id = \"\"\n", + "\n", + "# # Define the list of attributes and restrictions under which each attribute was issued that a prover must satisfy with a presentation\n", + "# # NOTE: if identifying a schema or credential definition then the attribute name must be contained within the corresponding schema.\n", + "# req_attrs = [\n", + "# {\"name\": \"\", \"restrictions\": [{\"schema_id\": schema_id}]},\n", + "# {\"name\": \"\", \"restrictions\": [{\"cred_def_id\": cred_def_id}]},\n", + "# #NOTE: you do not need to specify any restrictions. This means the prover can present a self-attested attribute to satisfy this request. \n", + "# # Although the business logic (this notebook) can still determine this is unacceptable.\n", + "# {\"name\": \"\", \"restrictions\":[]}\n", + "# # You can also specify individual attributes be non-revoked\n", + "# {\"name\": \"\", \"restrictions\": [], \"non_revoked\": {\"to\": int(time.time() - 1)}}\n", + "# ]\n", + "\n", + "# # We could extend this to request the name attribute aswell if we wanted.\n", + "\n", + "\n", + "# proof_request = {\n", + "# \"name\": \"Name of Proof Request\",\n", + "# \"version\": \"1.0\",\n", + "\n", + "# # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", + "# # We will ignore these for now.\n", + "# \"requested_predicates\": {\n", + "# # f\"0_{req_pred['name']}_GE_uuid\":\n", + "# # req_pred for req_pred in req_preds\n", + "# },\n", + "# # You can also request the entire proof request be non-revoked\n", + "# \"non_revoked\": {\"to\": int(time.time())}\n", + "# }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd0427b6", + "metadata": {}, + "outputs": [], + "source": [ + "proof_request = {\n", + " \"name\": \"Name of Proof Request\",\n", + " \"version\": \"1.0\",\n", + "\n", + " # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", + " # We will ignore these for now.\n", + " \"requested_predicates\": {\n", + "# f\"0_{req_pred['name']}_GE_uuid\":\n", + "# req_pred for req_pred in req_preds\n", + " },\n", + " # You can also request the entire proof request be non-revoked\n", + " \"non_revoked\": {\"to\": int(time.time())}\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "5d3a0f35", + "metadata": {}, + "source": [ + "# Fixed Attributes Disclosed Variable Credentials in Presentation" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "id": "857f1b78", + "metadata": {}, + "outputs": [], + "source": [ + "experiment = performance_service.new_experiment(\"Fixed Attributes Variable Credentials in Presentation\")" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "id": "e77f18de", + "metadata": {}, + "outputs": [], + "source": [ + "revocable_experiment = performance_service.new_experiment(\"Fixed Attributes Variable Credentials in Presentation\")" + ] + }, + { + "cell_type": "markdown", + "id": "e3beca79", + "metadata": {}, + "source": [ + "## Five Attributes One Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "id": "07791a34", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "id": "e75b0667", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"1\"" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "id": "a3c8b560", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.8861745626498305\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "id": "828492b5", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "id": "c34d337e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.888445556750412\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "3ca44112", + "metadata": {}, + "source": [ + "## Five Attributes Two Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "id": "f8389c68", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five2_schema_id, \"cred_def_id\": five2_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "id": "f93fec4c", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"2\"" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "id": "f12f25c2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.3859419959000663\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "id": "34984a80", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five2_schema_id, \"cred_def_id\": five2_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "id": "c7308857", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 3.760751254099887\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "ee16d305", + "metadata": {}, + "source": [ + "## Five Attributes Three Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "id": "6ad12a8c", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five3_schema_id, \"cred_def_id\": five3_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five2_schema_id, \"cred_def_id\": five2_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "id": "3b272100", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"3\"" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "id": "980e69d7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.2802539874501235\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "id": "f51a1cb7", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five3_schema_id, \"cred_def_id\": five3_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five2_schema_id, \"cred_def_id\": five2_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "id": "c232c104", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 4.044143925350181\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "cf90216c", + "metadata": {}, + "source": [ + "## Five Attributes Four Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "id": "ec7f11d1", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five4_schema_id, \"cred_def_id\": five4_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five3_schema_id, \"cred_def_id\": five3_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five2_schema_id, \"cred_def_id\": five2_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "id": "046d1726", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"4\"" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "id": "34af48cc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.808775784350291\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 179, + "id": "0e68a5d7", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five4_schema_id, \"cred_def_id\": five4_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five3_schema_id, \"cred_def_id\": five3_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five2_schema_id, \"cred_def_id\": five2_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "id": "b67f82f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 5.397983192500033\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "af3daa79", + "metadata": {}, + "source": [ + "## Five Attributes Five Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "id": "37e612b5", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five5_schema_id, \"cred_def_id\": five5_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five4_schema_id, \"cred_def_id\": five4_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five3_schema_id, \"cred_def_id\": five3_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five2_schema_id, \"cred_def_id\": five2_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "id": "7454b8de", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"5\"" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "id": "06dece15", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 4.092076107749927\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "id": "2bb609f1", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five1_schema_id, \"cred_def_id\": five1_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": five5_schema_id, \"cred_def_id\": five5_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": five4_schema_id, \"cred_def_id\": five4_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five3_schema_id, \"cred_def_id\": five3_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": five2_schema_id, \"cred_def_id\": five2_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "id": "16be2f3b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 6.604865062400313\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "943efbdf", + "metadata": {}, + "source": [ + "## Plot Results" + ] + }, + { + "cell_type": "markdown", + "id": "aa704c30", + "metadata": {}, + "source": [ + "### Non Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "id": "a74f2511", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "non_revocable_averages = []\n", + "for result in experiment[\"results\"]:\n", + " \n", + "\n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " non_revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(int(result[\"name\"]))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "id": "01b92b5f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credentials in Presentation\")\n", + "\n", + "plt.savefig(\"results/verification/fixed_attributes_disclosed_variable_creds/box_plot_non_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "4c5b406f", + "metadata": {}, + "source": [ + "### Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": 195, + "id": "7182956b", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "revocable_averages = []\n", + "for result in revocable_experiment[\"results\"]:\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(int(result[\"name\"]))\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "id": "c2d197e4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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USRRsAAAaJP2228/nXPWr1T17Di518cdZ6PULvpCVRX36LGHH1D79u3jjiOJggUAQJt12e9/px4FUtVrk+KOssG8vk7Vk2/UpZeUavfdd487zmoULAAA2qjc3Fw9+uD9qp72kL5b8HHccTZI1bRH1Lf75vrNeefGHWUNFCwAANqwPn366PrrrlXV5BvlK2vjjrNeVnz2vla88ZQeKv+7srLSq9KkVxoAAJByp5/+M+27286qeun+uKMkrP67Gi2ffKPG336LevToEXec76FgAQDQxpmZ7rv3LtXN+q9qPnkz7jgJqXrhLh128I80YsSIuKM0iYIFAAC0xRZb6P5779byyTeprmZZ3HFaVDX7FeV8/qbuvO2WuKM0i4IFAAAkSUOGDNGo445W9dTb447SrLrl36rquVv1cPl96ty5c9xxmkXBAgAAq934pz+q4/L5Wv7u83FH+R53V9Wzf9Gvfv4zHXjggXHHaREFCwAArJafn69/PFSu6v/+VSsXfxV3nDVUvfEvdcut0ZWXj407yjpRsAAAwBr22msvXfTb36hqyk3yNLkodO0381T98v36x0PlysvLizvOOlGwAADA91x4wQXaccuOWj79n3FHkdetVNXkG3TdVWXq27dv3HESQsECAADfk52drUceuE/fzXhc3305J9YsVS+Va6+dt9cvf/mLWHOsDwoWAABo0rbbbqtbb75Jy5+5QfW1K2LJUPPp21r53r91/9/ulpnFkmFDULAAAECzTjjhBA384T6qqrgn5WPXr1iuqsk36d67Jqhbt24pH39jULAAAECLJtxxm7I+na7qOZUpHbfq+fE65sihOuKII1I6bggULAAA0KJNN91UD973Ny1/7i+qq16SkjGr3n9RHRbN0c033ZiS8ULLiTsAAABIf3369JHqavXppilaaL5Hw83z81MzXmAULAAA0KL6+nodN+pEtd/zSPWqSc3FlX1lrZY8eIGu3Wa8zjjj9JSMGRK7CAEAQIv++Kcb9P78hSrY55iUjWk5ueow+Fydd8FvNWvWrJSNGwoFCwAANOvNN9/U2CvL1GHQObKs7JSOnbfFtmq/zwj9ZMQo1dbWpnTsjUXBAgAATaqpqdHRx41U/oGnKLfLVrFkyN9zmD6rztJll18Ry/gbioIFAACadN4FF2pRXlfl73pwbBnMstRh4Fn688236KWXXoot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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credentials in Presentation\")\n", + "\n", + "plt.savefig(\"results/verification/fixed_attributes_disclosed_variable_creds/box_plot_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "a9193105", + "metadata": {}, + "source": [ + "## Averages" + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "id": "acc274cc", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJJCAYAAAB27EniAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABweElEQVR4nO3deZyNdf/H8dfXGMa+k30QWccYjC0JiYQIUfYlbUp3e/3udnfLXd2VbndaZC2kEhWVQpF9K5KsMxj7NsyYfb6/P65jGpphMDPXmXPez8djHnOWa675XOeMmbfvaqy1iIiIiEj2yed2ASIiIiK+RgFLREREJJspYImIiIhkMwUsERERkWymgCUiIiKSzRSwRERERLJZfrcLyAlly5a1wcHBbpchIiIiPmzdunVHrbXlMnrOJwNWcHAwa9eudbsMERER8WHGmMjMnlMXoYiIiEg2U8ASERERyWYKWCIiIiLZzCfHYGUkKSmJffv2ER8f73YpIuJDgoKCqFKlCoGBgW6XIiJexG8C1r59+yhWrBjBwcEYY9wuR0R8gLWWY8eOsW/fPmrUqOF2OSLiRfymizA+Pp4yZcooXIlItjHGUKZMGbWMi8jf+E3AAhSuRCTb6feKiGTErwKW2wICAggNDaVhw4Z0796dkydPulZLREQEDRs2zPC566+//pLXEXv99depW7cuoaGhNG/enKlTp152bUuWLKFbt26X/fUvvfTSOfdbt2590a8pWrRoho+nf8/69u3LmTNnLruuy7VkyRKWL19+ycdNmDDhit6H87311lsEBQURHR2dbecUEfFVCli5qFChQmzcuJHNmzdTunRpxo8f73ZJ2WLChAksXLiQ1atXs3HjRn788UestX87LiUlJVfqOT9gZSWcZCb9e1agQAEmTJhwzvPJycmXfe6sutyAdffddzN48OBsq2PGjBk0b96cL774IlvOl1s/DyIiblDAckmrVq2IiooCYOfOnXTp0oWmTZvStm1btm7dSnR0NNWrVyc1NRWA2NhYqlatSlJSEhs3bqRly5aEhITQq1cvTpw4AcCOHTu44YYbaNy4MWFhYezcuZOYmBg6duxIWFgYjRo1Yu7cuWk1JCcnM2DAAOrVq0efPn0ybJ35/vvvadWqFWFhYfTt25eYmJi/HfPSSy/x7rvvUrx4cQCKFy/OkCFDAGdV/ccff5ywsDBmz56d6fm+/fZb6tatS1hY2Dl/wGNjYxk+fDjh4eE0adIkrf7Jkydz66230qVLF2rXrs1jjz0GwBNPPEFcXByhoaEMGDAA+Kt16kKvRVa0bduWHTt2sGTJEtq2bUuPHj2oX78+KSkpPProozRv3pyQkBDee+89AA4cOMB1112X1gK2dOnSC76mwcHBPPvss2n1bd26lYiICCZMmMCbb75JaGgoS5cu5auvvqJFixY0adKEG264gUOHDmV43HPPPcfrr78OkOnPzPXXX8/jjz9OeHg4derUSavxfGd/lsaOHcuMGTMAJ1g/+uijacdMnjyZ0aNHAzB9+nTCw8MJDQ3lrrvuSgtTRYsW5eGHH6Zx48asWLGCF154gebNm9OwYUNGjRqVFszXrFlDSEgIoaGhPProo2mtrZf6WouIuMZa63MfTZs2tefbsmXLX3fGjLG2Xbvs/Rgz5m/f83xFihSx1lqbnJxs+/TpYxcsWGCttbZDhw5227Zt1lprV65cadu3b2+ttbZHjx520aJF1lprZ86caUeMGGGttbZRo0Z2yZIl1lprn376aTvG873Dw8PtF198Ya21Ni4uzsbGxtqkpCQbHR1trbX2yJEjtlatWjY1NdXu3r3bAnbZsmXWWmuHDRtmX3vtNWutte3atbNr1qyxR44csW3btrUxMTHWWmtfeeUV+/zzz59zTdHR0bZkyZKZXnP16tXtq6++mvb9MzpfXFycrVKlit22bZtNTU21ffv2tTfffLO11tonn3zSTps2zVpr7YkTJ2zt2rVtTEyMnTRpkq1Ro4Y9efKkjYuLs9WqVbN79uw553U+/3XP7LXI6Gsy+toePXrY//3vf3bx4sW2cOHCdteuXdZaa9977z374osvWmutjY+Pt02bNrW7du2yr7/+uh07dqy11nnPT506dcHXtHr16nbcuHHWWmvHjx+f9n4/++yzae+NtdYeP348re4PPvjAPvTQQxkel/5+Zj8z7dq1S/v6b775xnbs2DHD12Hs2LH2hRdesCkpKbZatWr24MGD9vDhw7ZWrVppx3Tp0sUuXbrUbtmyxXbr1s0mJiZaa62955577JQpU6y11gJ21qxZaV9z7NixtNsDBw608+bNs9Za26BBA7t8+XJrrbWPP/64bdCgwSW/1rnpnN8vIuI3gLU2kyziN8s0eIOzLStRUVHUq1ePTp06ERMTw/Lly+nbt2/acQkJCQD069ePWbNm0b59e2bOnMm9995LdHQ0J0+epF27dgAMGTKEvn37cvr0aaKioujVqxfgrM0DzvpfTz31FD///DP58uUjKiqKQ4cOAVC1alXatGkDwMCBAxk3bhyPPPJIWh0rV65ky5YtacckJibSqlWrS77ufv36XfB8W7dupUaNGtSuXTutlvfffx9wWnvmzZuX1hITHx/Pnj17AOjYsSMlSpQAoH79+kRGRlK1atVM67DWZvhaXHXVVZl+zdn3DJwWrBEjRrB8+XLCw8PTpuV///33/Pbbb3z22WcAREdHs337dpo3b87w4cNJSkqiZ8+ehIaG8tNPP13wNb311lsBaNq0aaZdcfv27aNfv34cOHCAxMTEiy4PkNnPTEbfMyIiIsNzzJgxgzlz5pAvXz569+7N7NmzGT16NDVr1mTlypXUrl2brVu30qZNG8aPH8+6deto3rx52mtYvnx5wBnT1rt377TzLl68mH//+9+cOXOG48eP06BBA9q2bcvp06fTXpc77riDr7/++pJfaxERN/lnwHrrLVe+7dnxPGfOnKFz586MHz+eoUOHUrJkSTZu3Pi343v06MFTTz3F8ePHWbduHR06dMiwi+5CPv74Y44cOcK6desIDAwkODg4bUr5+bOfzr9vraVTp05pXUIZKV68OEWLFmXXrl3UrFkzw2OKFClywfNldO3pa/j888+55pprznl81apVFCxYMO1+QEDARcdDXei1yMzZ9yyzazpb4zvvvEPnzp3/dtzPP//MN998w9ChQ3nooYcoVarUBV/Ts9d0oeu5//77eeihh+jRowdLlizhueeeu+A1XMzFvuemTZvYvn07nTp1AkgLdaNHj6Z///58+umn1K1bl169emGMwVrLkCFDePnll/92rqCgIAICAgAnLN97772sXbuWqlWr8txzz130/biU1zo7x5+JiFwqjcFyQeHChRk3bhxvvPEGhQsXpkaNGsyePRtw/oD8+uuvgDNepXnz5owZM4Zu3boREBBAiRIlKFWqVNoYk2nTptGuXTuKFStGlSpV+PLLLwGnFezMmTNER0dTvnx5AgMDWbx4MZGRf238vWfPHlasWAHAJ598wrXXXntOnS1btuSXX35hx44dgDMeatu2bX+7nieffJL77ruPU6dOAc5Yp4xmr2V2vrp16xIREcHOnTsBzgkfnTt35p133kkbm7Nhw4aLvr6BgYEkJSX97fELvRZXonPnzrz77rtp33Pbtm3ExsYSGRlJhQoVuPPOOxk5ciTr16/P8muaXrFixTh9+vQ511G5cmUApkyZkulxZ2X2M5NVM2bM4LnnniMiIoKIiAj279/P/v37iYyMpFevXsydO5cZM2bQv39/wGlZ/Oyzzzh8+DAAx48fz/C1PhumypYtS0xMTFqrVMmSJSlWrBirVq0CYObMmWlfcymvtYiImxSwXNKkSRNCQkKYMWMGH3/8MRMnTqRx48Y0aNDgnMHX/fr1Y/r06WndbOD8UX300UcJCQlh48aNPPPMM4Dzh3PcuHGEhITQunVrDh48yIABA1i7di2NGjVi6tSp1K1bN+0811xzDePHj6devXqcOHGCe+6555way5Urx+TJk7n99tsJCQlJ68473z333EP79u3TBiu3bduWfPn+/qOV2fmCgoJ4//33ufnmmwkLC0vrTgJ4+umnSUpKIiQkhAYNGvD0009f9LUdNWoUISEhaYPcz7rQa3ElRo4cSf369QkLC6Nhw4bcddddJCcns2TJEho3bkyTJk2YNWsWY8aMyfJrml737t2ZM2fOOYPX+/btS9OmTSlbtmymx6WX2c9MVsycOTOt6/msXr16MXPmTEqVKkW9evWIjIwkPDwccLprx44dy4033khISAidOnXiwIEDfztvyZIlufPOO2nYsCGdO3dO61IEmDhxInfeeSehoaHExsamdQVfymstIuImc7ZlwJc0a9bMnr+O0x9//EG9evVcqkhELkVMTEza7M9XXnmFAwcO8Pbbb7tcVeb0+0XEPxlj1llrm2X0nH+OwRIRr/bNN9/w8ssvk5ycTPXq1Zk8ebLbJYmIXBIFLBHxOv369TunW1xEJK/RGCwRERGRbKaAJSIiIpLNFLBEREREspkCloiIiPieDz6ATHanyA0KWLnIGMPDDz+cdv/111+/4lW4zwoICEjb6LZ79+6cPHkyW857OSIiItI25z3f9ddfz/lLaFzM66+/Tt26dQkNDaV58+YZLmKaVUuWLKFbt26X/fUvvfTSOfdbt2590a85u9zA+dK/Z3379s1ws+2ctmTJEpYvX37Jx02YMOGK3ofzvfXWWwQFBREdHZ1t5xQRPzZuHIwaBW++6VoJCli5qGDBgnzxxRccPXo02899dkuXzZs3U7p0acaPH5/t38MNEyZMYOHChaxevZqNGzfy448/ktHabSkpKblSz/kBKyvhJDPp37MCBQowYcKEc56/2NY/2eFyA9bdd9+drVvRzJgxg+bNm2e6/+Klyq2fBxHxQu++C2PGQK9e4NnH1g0KWLkof/78jBo1ijczSNQRERF06NCBkJAQOnbsmLah8dChQ3nggQdo3bo1NWvWTNtO5EJatWpFVFQUADt37qRLly40bdqUtm3bsnXrVqKjo6levTqpqamAs11L1apVSUpKYuPGjbRs2ZKQkBB69erFiRMnANixYwc33HADjRs3JiwsjJ07dxITE0PHjh0JCwujUaNG56xAn5yczIABA6hXrx59+vTJsHXm+++/p1WrVoSFhdG3b98M91l86aWXePfddylevDjg7H04ZMgQAIKDg3n88ccJCwtj9uzZmZ7v22+/pW7duoSFhZ3zBzw2Npbhw4cTHh5OkyZN0uqfPHkyt956K126dKF27do89thjADzxxBNpmz+fXSX+bOvUhV6LrGjbti07duxgyZIltG3blh49elC/fn1SUlJ49NFHad68OSEhIbz33nsAHDhwgOuuuy6tBezsyu2ZvQbBwcE8++yzafVt3bqViIgIJkyYwJtvvpm2+vtXX31FixYtaNKkCTfccAOHDh3K8LjnnnsubQPuzH5mrr/+eh5//HHCw8OpU6fO31aXP+vsz9LYsWPTtkmaMGECjz76aNoxkydPZvTo0QBMnz6d8PBwQkNDueuuu9LCVNGiRXn44Ydp3LgxK1as4IUXXkjbXWDUqFFpwXzNmjWEhIQQGhrKo48+mtbaeqmvtYh4oYkT4d57oVs3mDkTAgPdq8Va63MfTZs2tefbsmVL2u3n5m22t01Ynq0fz83b/Lfveb4iRYrY6OhoW716dXvy5En72muv2WeffdZaa223bt3s5MmTrbXWTpw40d5yyy3WWmuHDBli+/TpY1NSUuzvv/9ua9Wqlem5rbU2OTnZ9unTxy5YsMBaa22HDh3stm3brLXWrly50rZv395aa22PHj3sokWLrLXWzpw5044YMcJaa22jRo3skiVLrLXWPv3003bMmDHWWmvDw8PtF198Ya21Ni4uzsbGxtqkpCQbHR1trbX2yJEjtlatWjY1NdXu3r3bAnbZsmXWWmuHDRtmX3vtNWutte3atbNr1qyxR44csW3btrUxMTHWWmtfeeUV+/zzz59zTdHR0bZkyZKZvp7Vq1e3r776atr3z+h8cXFxtkqVKnbbtm02NTXV9u3b1958883WWmuffPJJO23aNGuttSdOnLC1a9e2MTExdtKkSbZGjRr25MmTNi4uzlarVs3u2bPnnNf5/Nc9s9cio6/J6Gt79Ohh//e//9nFixfbwoUL2127dllrrX3vvffsiy++aK21Nj4+3jZt2tTu2rXLvv7663bs2LHWWuc9P3Xq1AVf0+rVq9tx48ZZa60dP3582vv97LPPpr031lp7/PjxtLo/+OAD+9BDD2V4XPr7mf3MtGvXLu3rv/nmG9uxY8cMX4exY8faF154waakpNhq1arZgwcP2sOHD5/zs96lSxe7dOlSu2XLFtutWzebmJhorbX2nnvusVOmTLHWWgvYWbNmpX3NsWPH0m4PHDjQzps3z1prbYMGDezy5cuttdY+/vjjtkGDBpf8Wp8v/e8XEXHJlCnWGmNtly7WxsfnyrcE1tpMsogWGs1lxYsXZ/DgwYwbN45ChQqlPb5ixYq01pVBgwaltZoA9OzZk3z58lG/fn0OHTqU4XnPtqxERUVRr149OnXqRExMDMuXL6dv375pxyUkJADOQo6zZs2iffv2zJw5k3vvvZfo6GhOnjyZthHwkCFD6Nu3L6dPnyYqKiptP7qgoCAAkpKSeOqpp/j555/Jly8fUVFRafVVrVqVNm3aADBw4EDGjRvHI488klbHypUr2bJlS9oxiYmJtGrV6pJfz7OLUWZ2vq1bt1KjRg1q166dVsv7778POK098+bNS2uJiY+PT2s57NixY9r+d/Xr1ycyMpKqVatmWoe1NsPX4qqrrsr0a86+Z+C0YI0YMYLly5cTHh5OjRo10mr87bff0louo6Oj2b59O82bN2f48OEkJSXRs2dPQkND+emnny74mt56660ANG3aNNOuuH379tGvXz8OHDhAYmJiWh2ZyexnJqPvGZHJYNMZM2YwZ84c8uXLR+/evZk9ezajR4+mZs2arFy5ktq1a7N161batGnD+PHjWbduXdq+hXFxcWl7VwYEBNC7d++08y5evJh///vfnDlzhuPHj9OgQQPatm3L6dOn016XO+64g6+//vqSX2sR8TKffALDhkHHjvDFF1CwoNsV+WfAerZ7A1e//4MPPkhYWBjDhg3L0vEF0/2g2Ez2jjw7nufMmTN07tyZ8ePHM3ToUEqWLMnGjRv/dnyPHj146qmnOH78OOvWraNDhw4ZdtFdyMcff8yRI0dYt24dgYGBBAcHEx8fDzgD+tM7/761lk6dOqV1CWWkePHiFC1alF27dlGzZs0MjylSpMgFz5fRtaev4fPPP+eaa6455/FVq1ad85oHBARcdDzUhV6LzJx9zzK7prM1vvPOO3Tu3Plvx/3888988803DB06lIceeohSpUpd8DU9e00Xup7777+fhx56iB49erBkyZIrnoRxse+5adMmtm/fTqdOnQDSQt3o0aPp378/n376KXXr1qVXr14YY7DWMmTIEF5++eW/nSsoKIiAgADACcv33nsva9eupWrVqjz33HMXfT8u5bXOzvFnInKFZs+GwYPhuutg7lxI13jhJo3BckHp0qW57bbbmDhxYtpjrVu3ZubMmYDzx7pt27aXde7ChQszbtw43njjDQoXLkyNGjWYPXs24PwB+fXXXwFnvErz5s0ZM2YM3bp1IyAggBIlSlCqVKm0MSbTpk2jXbt2FCtWjCpVqvDll18CTivYmTNniI6Opnz58gQGBrJ48WIiIyPT6tizZw8rVqwA4JNPPuHaa689p86WLVvyyy+/sGPHDsAZD7Vt27a/Xc+TTz7Jfffdx6lTpwBnrFNGs9cyO1/dunWJiIhg586dAOeEj86dO/POO++khdYNGzZc9PUNDAwkKSnpb49f6LW4Ep07d+bdd99N+57btm0jNjaWyMhIKlSowJ133snIkSNZv359ll/T9IoVK8bp06fPuY7KlSsDMGXKlEyPOyuzn5msmjFjBs899xwRERFERESwf/9+9u/fT2RkJL169WLu3LnMmDGD/v37A07L4meffcbhw4cBOH78eIav9dkwVbZsWWJiYtJapUqWLEmxYsVYtWoVQNq/Obi011pEvMSXX8Idd0DLlvDVV1C4sNsVpVHAcsnDDz98zmzCd955h0mTJhESEsK0adN4++23L/vcTZo0ISQkhBkzZvDxxx8zceJEGjduTIMGDc4ZfN2vXz+mT59+zp5vU6ZM4dFHHyUkJISNGzfyzDPPAM4fznHjxhESEkLr1q05ePAgAwYMYO3atTRq1IipU6dSt27dtPNcc801jB8/nnr16nHixAnuueeec2osV64ckydP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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + "\n", + "new_labels = [int(i) for i in labels]\n", + "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", + "\n", + "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", + "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credentials in Presentation\")\n", + "\n", + "plt.legend()\n", + "plt.savefig(\"results/verification/fixed_attributes_disclosed_variable_creds/averages.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "e482bc34", + "metadata": {}, + "source": [ + "## Terminate Controller\n", + "\n", + "Whenever you have finished with this notebook, be sure to terminate the controller. This is especially important if your business logic runs across multiple notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75928622", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e1010e9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/issuer/notebooks/verify_variable_attrib_fixed_cred.ipynb b/playground/issuer/notebooks/verify_variable_attrib_fixed_cred.ipynb new file mode 100644 index 0000000..62849c6 --- /dev/null +++ b/playground/issuer/notebooks/verify_variable_attrib_fixed_cred.ipynb @@ -0,0 +1,2448 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "89b3126a", + "metadata": {}, + "source": [ + "# ACA-Py & ACC-Py Verifier Template\n", + "\n", + "## Copy this template into the root folder of your notebook workspace to get started" + ] + }, + { + "cell_type": "markdown", + "id": "da515798", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "106c4c1c", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "\n", + "from libs.performance_service import PerformanceService\n", + "import os\n", + "import time\n", + "from termcolor import colored" + ] + }, + { + "cell_type": "markdown", + "id": "12ba2c76", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ebafb07", + "metadata": {}, + "outputs": [], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)" + ] + }, + { + "cell_type": "markdown", + "id": "2c34464b", + "metadata": {}, + "source": [ + "### Start a Webhook Server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "faf3599e", + "metadata": {}, + "outputs": [], + "source": [ + "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", + "webhook_host = \"0.0.0.0\"\n", + "\n", + "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", + "\n", + "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" + ] + }, + { + "cell_type": "markdown", + "id": "6136fc48", + "metadata": {}, + "source": [ + "## Store Issuing Schema and Cred Def Identifiers\n", + "\n", + "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", + "\n", + "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f3661c66", + "metadata": {}, + "outputs": [], + "source": [ + "schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:one-attrib:0.0.2'\n", + "cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:default'\n", + "rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:revocable'\n", + "\n", + "five_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-attrib:0.0.1'\n", + "five_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:default'\n", + "five_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:revocable'\n", + "\n", + "ten_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:ten-attrib:0.0.1'\n", + "ten_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:default'\n", + "ten_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:revocable'\n", + "\n", + "twenty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:twenty-attrib:0.0.1'\n", + "twenty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:default'\n", + "twenty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:revocable'\n", + "\n", + "fifty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:fifty-attrib:0.0.1'\n", + "fifty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:default'\n", + "fifty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:revocable'\n", + "\n", + "hundred_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:hundred-attrib:0.0.1'\n", + "hundred_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:default'\n", + "hundred_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:revocable'\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "9b1599a8", + "metadata": {}, + "source": [ + "## Init Performance Service" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2dfc8e4", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service = PerformanceService(agent_controller, iterations=20)" + ] + }, + { + "cell_type": "markdown", + "id": "79d77b12", + "metadata": {}, + "source": [ + "## Establish Connection\n", + "\n", + "Before you can issue a credential you must first establish a connection across which the credential will be issued to a holder. (see recipes/connection)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c9815cc", + "metadata": {}, + "outputs": [], + "source": [ + "# Alias for invited connection\n", + "alias = \"Friend\"\n", + "auto_accept = \"true\"\n", + "# Use public DID?\n", + "public = \"false\"\n", + "# Should this invitation be usable by multiple invitees?\n", + "multi_use = \"false\"\n", + "\n", + "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", + "# Is equivalent to above. Arguments are optionally\n", + "# invitation_response = await agent_controller.connections.create_invitation()\n", + "\n", + "\n", + "\n", + "# You will use this identifier to issue a credential across this connection\n", + "connection_id = invitation_response[\"connection_id\"]\n", + "\n", + "invitation = invitation_response[\"invitation\"]\n", + "## Copy this output\n", + "print(invitation)\n", + "print(connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5973d717", + "metadata": {}, + "outputs": [], + "source": [ + "connection_id = \"2782d60f-65d0-4e14-8e28-55fa38735468\"" + ] + }, + { + "cell_type": "markdown", + "id": "e8832bb5", + "metadata": {}, + "source": [ + "## Define Presentation Request Object\n", + "\n", + "The below cell defines a generic presentation request object, that can be sent across specific connections requesting that they produce a presentation containing the identified attributes and meeting the restrictions.\n", + "\n", + "It is often useful to define your request objects first, then reuse these objects across many connections you wish to request a proof from. \n", + "\n", + "Duplicate and customise the below cell as many times as you need. It may be useful to save these request objects either to the jupyter store using %store or through\n", + "\n", + "TODO: Detail the full set of restrictions available to a verifier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d0ab80e", + "metadata": {}, + "outputs": [], + "source": [ + "# # We add a constraint that the attribute must originate from this schema\n", + "# schema_id = \"\"\n", + "\n", + "# trusted_issuer_did = \"\"\n", + "\n", + "# cred_def_id = \"\"\n", + "\n", + "# # Define the list of attributes and restrictions under which each attribute was issued that a prover must satisfy with a presentation\n", + "# # NOTE: if identifying a schema or credential definition then the attribute name must be contained within the corresponding schema.\n", + "# req_attrs = [\n", + "# {\"name\": \"\", \"restrictions\": [{\"schema_id\": schema_id}]},\n", + "# {\"name\": \"\", \"restrictions\": [{\"cred_def_id\": cred_def_id}]},\n", + "# #NOTE: you do not need to specify any restrictions. This means the prover can present a self-attested attribute to satisfy this request. \n", + "# # Although the business logic (this notebook) can still determine this is unacceptable.\n", + "# {\"name\": \"\", \"restrictions\":[]}\n", + "# # You can also specify individual attributes be non-revoked\n", + "# {\"name\": \"\", \"restrictions\": [], \"non_revoked\": {\"to\": int(time.time() - 1)}}\n", + "# ]\n", + "\n", + "# # We could extend this to request the name attribute aswell if we wanted.\n", + "\n", + "\n", + "# proof_request = {\n", + "# \"name\": \"Name of Proof Request\",\n", + "# \"version\": \"1.0\",\n", + "\n", + "# # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", + "# # We will ignore these for now.\n", + "# \"requested_predicates\": {\n", + "# # f\"0_{req_pred['name']}_GE_uuid\":\n", + "# # req_pred for req_pred in req_preds\n", + "# },\n", + "# # You can also request the entire proof request be non-revoked\n", + "# \"non_revoked\": {\"to\": int(time.time())}\n", + "# }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cdc61a21", + "metadata": {}, + "outputs": [], + "source": [ + "proof_request = {\n", + " \"name\": \"Name of Proof Request\",\n", + " \"version\": \"1.0\",\n", + "\n", + " # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", + " # We will ignore these for now.\n", + " \"requested_predicates\": {\n", + "# f\"0_{req_pred['name']}_GE_uuid\":\n", + "# req_pred for req_pred in req_preds\n", + " },\n", + " # You can also request the entire proof request be non-revoked\n", + " \"non_revoked\": {\"to\": int(time.time())}\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "0877f5ad", + "metadata": {}, + "source": [ + "# Single Disclosed Attribute from Variable Size Credential Experiment\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bb6948b5", + "metadata": {}, + "outputs": [], + "source": [ + "experiment = performance_service.new_experiment(\"Single Attribute from Variable Credentials - Non Revocable\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3beb7658", + "metadata": {}, + "outputs": [], + "source": [ + "revocable_experiment = performance_service.new_experiment(\"Single Attribute from Variable Credential - Revocable\")" + ] + }, + { + "cell_type": "markdown", + "id": "1d1f5840", + "metadata": {}, + "source": [ + "## Performance Test - One Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d21d6d0", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": schema_id, \"cred_def_id\": cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff91f730", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"1\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5caae1ec", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "097a4137", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": schema_id, \"cred_def_id\": rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75ef50e8", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "411b3329", + "metadata": {}, + "source": [ + "## Performance Test - Five Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0627ab4", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea381dbb", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"5\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "08ce41a3", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3dc44bce", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8944a986", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "5ec33453", + "metadata": {}, + "source": [ + "## Performance Test - Fice Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "93289da3", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32464b92", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"10\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fdfeedd", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e9b8196", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59f3ddeb", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "c4055b08", + "metadata": {}, + "source": [ + "## Performance Test - Twenty Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a19ea559", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b63f1ce6", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"20\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "77d0dab0", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fccfe138", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a75b134", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "6aace5fe", + "metadata": {}, + "source": [ + "## Performance Test - Fifty Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a61627fb", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df6703d1", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"50\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "437ec141", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce2acbda", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1297b7b3", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "fa460244", + "metadata": {}, + "source": [ + "## Performance Test - Hundred Attribute Credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "95b76c63", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8fac1e76", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"100\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50ad832f", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56aec046", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21e16e42", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "08b7acf2", + "metadata": {}, + "source": [ + "## Plot Results" + ] + }, + { + "cell_type": "markdown", + "id": "acbc72bf", + "metadata": {}, + "source": [ + "### Non Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfbb5a49", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "non_revocable_averages = []\n", + "for result in experiment[\"results\"]:\n", + " \n", + " if result[\"name\"] != \"1\":\n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " non_revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9d5cf877", + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential Size (Bytes)\")\n", + "\n", + "plt.savefig(\"single_attrib_variable_cred_box_plot_non_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "4faeb8d9", + "metadata": {}, + "source": [ + "### Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a816e7cc", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "revocable_averages = []\n", + "for result in revocable_experiment[\"results\"]:\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "723f0477", + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential Size (Bytes)\")\n", + "\n", + "plt.savefig(\"single_attrib_variable_cred_box_plot_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "88c60c0f", + "metadata": {}, + "source": [ + "## Averages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d0857ba3", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + "\n", + "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", + "\n", + "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", + "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Credential_size (Bytes)\")\n", + "\n", + "\n", + "plt.legend()\n", + "plt.savefig(\"single_attrib_variable_cred_averages.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "6a4a7e06", + "metadata": {}, + "source": [ + "# Fixed Credential Variable Attributes Disclosed" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0499076e", + "metadata": {}, + "outputs": [], + "source": [ + "experiment = performance_service.new_experiment(\"Fixed Credential Variable Attributes Disclosed\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1fa15d95", + "metadata": {}, + "outputs": [], + "source": [ + "revocable_experiment = performance_service.new_experiment(\"Fixed Credential Variable Attributes Disclosed - Revocable\")" + ] + }, + { + "cell_type": "markdown", + "id": "8935f43a", + "metadata": {}, + "source": [ + "## One Attribute" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "070b8705", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87cc2c1f", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"1\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c8f9e1a", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23e0fa07", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6843e524", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "ea57c768", + "metadata": {}, + "source": [ + "## Two Attribute" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "60621fd2", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d4616a0", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"2\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "303a5c43", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a514754b", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2aa7dea7", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "abd4b319", + "metadata": {}, + "source": [ + "## Five Attribute" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3cf57768", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d4b6e7f", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"5\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "496d5112", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "76ad6382", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "86a43b17", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "8ee6a192", + "metadata": {}, + "source": [ + "## Ten Attribute" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42016326", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e6d0695", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"10\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb67ba00", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47285159", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "821e0ae6", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "0a8ea5a4", + "metadata": {}, + "source": [ + "## Twenty Attribute" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5212a59", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"11\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"12\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"13\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"14\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"15\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"16\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"17\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"18\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"19\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"20\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db218fd1", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"20\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a6bbf77", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6abb521e", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"11\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"12\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"13\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"14\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"15\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"16\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"17\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"18\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"19\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"20\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e7d29a7", + "metadata": {}, + "outputs": [], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8ad33bf", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "fc788c2c", + "metadata": {}, + "source": [ + "## Plot Results" + ] + }, + { + "cell_type": "markdown", + "id": "6e78c969", + "metadata": {}, + "source": [ + "### Non Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ff422af", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "non_revocable_averages = []\n", + "for result in experiment[\"results\"]:\n", + " \n", + "\n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " non_revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66fab458", + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Attributes Disclosed\")\n", + "\n", + "plt.savefig(\"fixed_cred_variable_disclosure_box_plot_non_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "b8578765", + "metadata": {}, + "source": [ + "### Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d0f85b8", + "metadata": {}, + "outputs": [], + "source": [ + "help(plt.axes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb4fb2f2", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "revocable_averages = []\n", + "for result in revocable_experiment[\"results\"]:\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b07d768e", + "metadata": {}, + "outputs": [], + "source": [ + "print(labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "id": "131f8e3d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl4AAAJJCAYAAAB78jmlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAu4UlEQVR4nO3dfXRdd33n+/fXkmwljp1HxwmJgw12iIIChmicAGYVZ4YQ0pkJ7VAGt5QUdEl7C4a23N6mqOvy1NwLs6ZwBxe4k9aUwFCFTCFDCmlDJhUDAvIgh5TYcR5MHIhNYjt2sGMb2ZLyvX9o21VsyT6yfX7Hkt6vtc46+3z303f7gNYne//2PpGZSJIkqf6mNboBSZKkqcLgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYU0N7qB0s4666ycP39+o9uQJEmT2OrVq5/JzDkH16dc8Jo/fz59fX2NbkOSJE1iEfHT0epeapQkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJKq67u5v29naamppob2+nu7u70S0V0dzoBiRJ0tTS3d1NV1cXq1atYunSpfT29tLZ2QnA8uXLG9xdfUVmNrqHojo6OrKvr6/RbUiSNGW1t7ezcuVKli1bdqDW09PDihUrWLNmTQM7O34iYnVmdhxSN3hJkqSSmpqa6O/vp6Wl5UBtYGCA1tZWhoaGGtjZ8TNW8HKMlyRJKqqtrY3e3t4X1Hp7e2lra2tQR+UYvCRJUlFdXV10dnbS09PDwMAAPT09dHZ20tXV1ejW6s7B9ZIkqaj9A+hXrFjBunXraGtr44Ybbpj0A+vBMV6SJEnHnWO8JEmSGszgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYXULXhFRGtE3BsR/xwRayPio1V9QUTcExHrI+KrETG9qs+oPq+v5s8fsa0/reqPRMSbRtSvqmrrI+L6eh2LJEnS8VDPM157gSsy85XAYuCqiLgc+CTw6cxcCDwLdFbLdwLPVvVPV8sRERcDbwdeDlwFfC4imiKiCfgs8GbgYmB5tawkSdIJqW7BK4ftqj62VK8ErgD+rqrfBLylmr6m+kw1/19HRFT1mzNzb2ZuANYDS6rX+sx8PDP3ATdXy0qSJJ2Q6jrGqzoz9QCwBbgT+Anwi8wcrBbZCJxXTZ8HPAlQzd8BnDmyftA6Y9UlSZJOSHUNXpk5lJmLgfMZPkN1UT33N5aIuC4i+iKib+vWrY1oQZIkqcxdjZn5C6AHeA1wWkQ0V7POBzZV05uAeQDV/FOBbSPrB60zVn20/d+YmR2Z2TFnzpzjcUiSJEnjVs+7GudExGnV9EnAG4F1DAewt1aLXQt8o5q+rfpMNf+fMjOr+turux4XAIuAe4H7gEXVXZLTGR6Af1u9jkeSJOlYNR95kaN2LnBTdffhNOCWzPxmRDwE3BwRfw78CFhVLb8K+HJErAe2MxykyMy1EXEL8BAwCLw3M4cAIuJ9wB1AE/CFzFxbx+ORJEk6JjF8Umnq6OjoyL6+vka3IUmSJrGIWJ2ZHQfXfXK9JElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJKq67u5v29naamppob2+nu7u70S0V0dzoBiRJ0tTS3d1NV1cXq1atYunSpfT29tLZ2QnA8uXLG9xdfUVmNrqHojo6OrKvr6/RbUiSNGW1t7ezcuVKli1bdqDW09PDihUrWLNmTQM7O34iYnVmdhxSN3hJkqSSmpqa6O/vp6Wl5UBtYGCA1tZWhoaGGtjZ8TNW8HKMlyRJKqqtrY3e3t4X1Hp7e2lra2tQR+UYvCRJUlFdXV10dnbS09PDwMAAPT09dHZ20tXV1ejW6s7B9ZIkqaj9A+hXrFjBunXraGtr44Ybbpj0A+vBMV6SJEnHnWO8JEmSGszgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkFdfd3U17eztNTU20t7fT3d3d6JaKaG50A5IkaWrp7u6mq6uLVatWsXTpUnp7e+ns7ARg+fLlDe6uviIzG91DUR0dHdnX19foNiRJmrLa29tZuXIly5YtO1Dr6elhxYoVrFmzpoGdHT8RsTozOw6u1+1SY0TMi4ieiHgoItZGxAeq+kciYlNEPFC9rh6xzp9GxPqIeCQi3jSiflVVWx8R14+oL4iIe6r6VyNier2OR5IkHR/r1q1j6dKlL6gtXbqUdevWNaijcuo5xmsQ+GBmXgxcDrw3Ii6u5n06MxdXr9sBqnlvB14OXAV8LiKaIqIJ+CzwZuBiYPmI7Xyy2tZC4Fmgs47HI0mSjoO2tjZ6e3tfUOvt7aWtra1BHZVTt+CVmU9l5v3V9HPAOuC8w6xyDXBzZu7NzA3AemBJ9VqfmY9n5j7gZuCaiAjgCuDvqvVvAt5Sl4ORJEnHTVdXF52dnfT09DAwMEBPTw+dnZ10dXU1urW6KzK4PiLmA68C7gFeB7wvIt4J9DF8VuxZhkPZ3SNW28i/BLUnD6pfBpwJ/CIzB0dZ/uD9XwdcB3DBBRcchyOSJElHa/8A+hUrVrBu3Tra2tq44YYbJv3AeijwOImIOAX4GvAHmbkT+DzwUmAx8BTwF/XuITNvzMyOzOyYM2dOvXcnSZKOYPny5axZs4ahoSHWrFkzJUIX1Dl4RUQLw6HrK5n5dYDM3JyZQ5n5PPBXDF9KBNgEzBux+vlVbaz6NuC0iGg+qC5Jkk5wU/U5XvW8qzGAVcC6zPzUiPq5Ixb7NWD/faO3AW+PiBkRsQBYBNwL3Acsqu5gnM7wAPzbcvg5GD3AW6v1rwW+Ua/jkSRJx8f+53itXLmS/v5+Vq5cSVdX15QIX3V7jldELAW+BzwIPF+VPwQsZ/gyYwJPAL+bmU9V63QB72b4jsg/yMx/qOpXA/8v0AR8ITNvqOovYXiw/RnAj4B3ZObew/Xlc7wkSWqsqfwcLx+gKkmSimpqaqK/v5+WlpYDtYGBAVpbWxkaGmpgZ8dP8QeoSpIkjcbneEmSJBXic7wkSZIKmcrP8XKMlyRJ0nHmGC9JkqQGM3hJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKmQ5kY3IEmSThyPPvooa9euHfd6v/7rv16Hbsb29a9/fVzLz5w5kze+8Y1ERJ06qk1kZkMbKK2joyP7+voa3YYkSSekly++lKd2PU/LyacU2d+OHTs59dTZ9d/P4//MPd//Hq985Svrvi+AiFidmR0H1z3jJUmSDhgYGGTG0ncz45yFRfZ3UpG9wNDN/weDg4OF9jY2x3hJkiQV4hkvSZJ0wIwZ09m6+lYG5i1m+oteRsuZ5xMxMc/TDO3Zwd6nHmXwqUf45bafM3369Ea3ZPCSJEn/4tZbuvnWt75Fz/d+wD3f/h9s3raNWedfyNBZL6V57iKmn/symmed2eg2D/H8QD/7Nj/Ovp8/QvP2x9n71KMM7NnJKxa/ml95/Wv4lQ91c8kllzS6TQfXS5KksW3bto17772XH959D9/p/SE/Wn0fNLVw0nkvY/DMlzL9nAuZfs5Cps04uVhP+fwQA9s2su+pR4itP+H5LevZteVnLFj4Ml7/ust5/Wtfw5IlS7jwwguZNq0xZ+vGGlxv8JIkSTXLTDZs2MCtt97KX/7lZ3niiQ0Qwdzf+AitCy4t0sPmv3oP/dufYsaMGSxfvpzOzk46OjpobW0tsv9aGLwqBi9Jksa2c+dONm/efEitr6+Pe+65h94f3M1jj6wDYOacecTZC2k590K2v667aJ+zb78Ctqxn98aHeX5okNPPnMNlly3hda+5nCVLljB//vwXPLOrtbWVefPmFevP4FUxeEmSNLbLl/4K93z/u4ddZlpTE2efe/5xeRjp05s3c87cuce0jT27d7Fj+zOHXSYiePjhh7nwwguPaV+18jlekiTpiF503nm8eOHLeM1ll/GG17+WJUuW0N7eTktLS132FxH8/Gcbjvt2N23axL333sv3f/BDvvP9H7Lxp09w0kmlnho2Ns94SZKkhokIJmMWGeuM18R8MIckSdIEZPCSJEkqxDFekiTpmB3LQPujWXeiXp40eEmSpGM2UYNQaV5qlCRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqZC6Ba+ImBcRPRHxUESsjYgPVPUzIuLOiHisej+9qkdEfCYi1kfEjyPi1SO2dW21/GMRce2I+qUR8WC1zmciIup1PJIkSceqnme8BoEPZubFwOXAeyPiYuB64K7MXATcVX0GeDOwqHpdB3wehoMa8GHgMmAJ8OH9Ya1a5j0j1ruqjscjSZJ0TOoWvDLzqcy8v5p+DlgHnAdcA9xULXYT8JZq+hrgSznsbuC0iDgXeBNwZ2Zuz8xngTuBq6p5szPz7sxM4EsjtiVJknTCKTLGKyLmA68C7gHmZuZT1ayngbnV9HnAkyNW21jVDlffOEpdkiTphFT34BURpwBfA/4gM3eOnFedqcoCPVwXEX0R0bd169Z6706SJGlUdQ1eEdHCcOj6SmZ+vSpvri4TUr1vqeqbgHkjVj+/qh2ufv4o9UNk5o2Z2ZGZHXPmzDm2g5IkSTpK9byrMYBVwLrM/NSIWbcB++9MvBb4xoj6O6u7Gy8HdlSXJO8AroyI06tB9VcCd1TzdkbE5dW+3jliW5IkSSec5jpu+3XAbwMPRsQDVe1DwCeAWyKiE/gp8LZq3u3A1cB6YA/wLoDM3B4RHwfuq5b7WGZur6Z/H/gicBLwD9VLkiTphBTDw6ymjo6Ojuzr62t0G5IkaRKLiNWZ2XFw3SfXS5IkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUSE3BKyJeGhEzquk3RMT7I+K0unYmSZI0ydR6xutrwFBELARuBOYBf1u3riRJkiahWoPX85k5CPwasDIz/xg4t35tSZIkTT61Bq+BiFgOXAt8s6q11KclSZKkyanW4PUu4DXADZm5ISIWAF+uX1uSJEmTT3MtC2XmQ8D7R3zeAHyyXk1JkiRNRocNXhHxIJBjzc/MVxz3jiRJkiapI53x+rfV+3ur9/2XF9/BYQKZJEmSDnXY4JWZPwWIiDdm5qtGzPqTiLgfuL6ezUmSJE0mtQ6uj4h43YgPrx3HupIkSaLGwfVAJ/CFiDgVCOBZ4N1160qSJGkSqvWuxtXAK6vgRWbuqGtXkiRJk1BNwav6ncb/AMwHmiMCgMz8WN06kyRJmmRqvdT4DWAHsBrYW792JEmSJq9ag9f5mXlVXTuRJEma5Gq9M/EHEXFJXTuRJEma5Go947UU+J2I2MDwpcYA0ifXS5Ik1a7W4PXmunYhSZI0BdR0qbF6gv1pwL+rXqftf6q9JEmSalNT8IqIDwBfAc6uXv8tIlbUszFJkqTJZjxPrr8sM3cDRMQngR8CK+vVmCRJ0mRT8281AkMjPg9VNUmSJNWo1jNefwPcExG3Vp/fAqyqS0eSJEmTVK2/1fipiPgOw4+VAHhXZv6obl1JkiRNQrX+VuPlwNrMvL/6PDsiLsvMe+ranSRJ0iRS6xivzwO7RnzeVdUkSZJUo5oH12dm7v+Qmc9T+/gwSZIkUXvwejwi3h8RLdXrA8Dj9WxMkiRpsqk1eP0e8FpgE7ARuAy4rl5NSZIkTUa13tW4BXh7nXuRJEma1Gr9yaALI+KuiFhTfX5FRPxZfVuTJEmaXGq91PhXwJ8CAwCZ+WM8AyZJkjQutQavkzPz3oNqg8e7GUmSpMms1uD1TES8FEiAiHgr8FTdupIkSZqEan0W13uBG4GLImITsAF4R926kiRJmoRqvavxceDfRMRMYFpmPlfftiRJkiafWu9q/EBEzAb2AJ+OiPsj4sr6tiZJkjS51DrG692ZuRO4EjgT+G3gE3XrSpIkaRKq+bcaq/ergS9l5toRNUmSJNWg1uC1OiK+zXDwuiMiZgHP168tSZKkyafWuxo7gcXA45m5JyLOBN5Vt64kSZImocMGr4i4KDMfZjh0AbwkwiuMkiRJR+NIZ7w+CLwH+ItR5iVwxXHvSJIkaZI6bPDKzPdU78vKtCNJkjR5HelS468fbn5mfv34tiNJkjR5HelS4787zLwEDF6SJEk1OtKlRu9clCRJOk6OdKnxjw43PzM/dXzbkSRJmryOdKlxVpEuJEmSpoAjXWr8aKlGJEmSJrvD/mRQRPyf1fvKiPjMwa8jrPuFiNgSEWtG1D4SEZsi4oHqdfWIeX8aEesj4pGIeNOI+lVVbX1EXD+iviAi7qnqX42I6UfzDyBJklTKkX6rcV313gesHuV1OF8Erhql/unMXFy9bgeIiIuBtwMvr9b5XEQ0RUQT8FngzcDFwPJqWYBPVttaCDzL8M8aSZIknbCOdKnx76v3m8a74cz8bkTMr3Hxa4CbM3MvsCEi1gNLqnnrM/NxgIi4GbgmItYx/NT836yWuQn4CPD58fYpSZJUypHuarztcPMz898fxT7fFxHvZPgs2gcz81ngPODuEctsrGoATx5Uvww4E/hFZg6OsvwhIuI64DqACy644ChaliRJOnZHuqvxNQwHn27gHuBYfyH788DHGX746scZ/g3Idx/jNo8oM28EbgTo6OjIeu9PkiRpNEcKXucAbwSWM3xZ71tAd2auPZqdZebm/dMR8VfAN6uPm4B5IxY9v6oxRn0bcFpENFdnvUYuL0mSdEI67OD6zBzKzH/MzGuBy4H1wHci4n1Hs7OIOHfEx18D9t/xeBvw9oiYERELgEXAvcB9wKLqDsbpDA/Avy0zE+gB3lqtfy3wjaPpSZIkqZQjnfEiImYAv8rwWa/5wGeAW2tYrxt4A3BWRGwEPgy8ISIWM3yp8QngdwEyc21E3AI8BAwC783MoWo77wPuAJqAL4w42/YnwM0R8efAj4BVtRywJElSo8TwyaMxZkZ8CWgHbmf4rsM1Yy48QXR0dGRfX1+j25AkSZNYRKzOzI6D60c64/UOYDfwAeD9EQfG1geQmTn7uHYpSZI0iR3pOV5HesCqJEmSamSwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUSN2CV0R8ISK2RMSaEbUzIuLOiHisej+9qkdEfCYi1kfEjyPi1SPWubZa/rGIuHZE/dKIeLBa5zMREfU6FkmSpOOhnme8vghcdVDteuCuzFwE3FV9BngzsKh6XQd8HoaDGvBh4DJgCfDh/WGtWuY9I9Y7eF+SJEknlLoFr8z8LrD9oPI1wE3V9E3AW0bUv5TD7gZOi4hzgTcBd2bm9sx8FrgTuKqaNzsz787MBL40YluSJEknpNJjvOZm5lPV9NPA3Gr6PODJEcttrGqHq28cpS5JknTCatjg+upMVZbYV0RcFxF9EdG3devWEruUJEk6ROngtbm6TEj1vqWqbwLmjVju/Kp2uPr5o9RHlZk3ZmZHZnbMmTPnmA9CkiTpaJQOXrcB++9MvBb4xoj6O6u7Gy8HdlSXJO8AroyI06tB9VcCd1TzdkbE5dXdjO8csS1JkqQTUnO9NhwR3cAbgLMiYiPDdyd+ArglIjqBnwJvqxa/HbgaWA/sAd4FkJnbI+LjwH3Vch/LzP0D9n+f4TsnTwL+oXpJkiSdsGJ4qNXU0dHRkX19fY1uQ5IkTWIRsTozOw6u++R6SZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJGlS6O7upr29naamJtrb2+nu7m50S9IhmhvdgCRJx6q7u5uuri5WrVrF0qVL6e3tpbOzE4Dly5c3uDvpX0RmNrqHojo6OrKvr6/RbUiSjqP29nZWrlzJsmXLDtR6enpYsWIFa9asaWBnmqoiYnVmdhxSN3hJkia6pqYm+vv7aWlpOVAbGBigtbWVoaGhBnamqWqs4OUYL0nShNfW1kZvb+8Lar29vbS1tTWoI2l0Bi9J0oTX1dVFZ2cnPT09DAwM0NPTQ2dnJ11dXY1uTXoBB9dLkia8/QPoV6xYwbp162hra+OGG25wYL1OOI7xkiRJOs4c4yVJktRgXmqUJJ2QIqLo/qbaFSA1hsFLknRCOtogFBGGKJ2wvNQoSZJUiMFLkiSpEC81SpLqasUffpC//+btxfYX009m/qL6Pzh11ikzueuO2zn77LPrvi9NHgYvSVJd3fHt/8nW5jlMP2cRzafNpXn22URzy5FXPErnAPvqseFMhnY/y+COzQz+YjNPr72TJ5980uClcTF4SZLq6i8+8ed89e9u5bGfrOenfXexdfPPOWnW6bSecS4x62wGTj6LplPn0nzqXJpPm0vTKWcS05oa0utQ/y4Gf/H0gXDVvHsr03ZvZd8vnmb3tqdpPXkm5897MS95yQIWX/l+Lrnkkob0qYnLB6hKkooaHBxk06ZNbNiwgQ0bNrBmzVruvOufWPPjB8hMpjU3M+O0uZz2qx9k+jkXFunp2Vs/Tv/GtezbswuAOXPP4Yply3jtay5nwYIFLFiwgPnz53PKKacU6UcT31gPUDV4SZLqanBwkCeffPJA0Fr/k8dZ9+h6fvL4Bjb+7Al27dzBzDPPYfpp55CzzmZw5lk0n3oOWxd/rmifZ/7wHeRzm2nZ/QxDOzaze9vPyaFBzj3vAuYvmM9FixbyskUvPRDEFixYwKxZs4r2qInD4FUxeElSWW9689V8+x//YdR5TS3TmXn6nOIPS63Vvj27+OVzvxhz/jPPPMOZZ55ZriFNGGMFL8d4SZLq6r9/9Wa2bNlSbH+LFi3iscceq/t+WltbDV0aN4OXJKmuZs+ezezZs4vuc+HChUX3J9XK4CVJOiEdy+XHo1l3qg29UWMYvCRJJySDkCYjfzJIkiSpEIOXJElSIQYvSZKkQgxekiRJhRi8JEmSCjF4SZIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqpCHBKyKeiIgHI+KBiOiramdExJ0R8Vj1fnpVj4j4TESsj4gfR8SrR2zn2mr5xyLi2kYciyRJUq0aecZrWWYuzsyO6vP1wF2ZuQi4q/oM8GZgUfW6Dvg8DAc14MPAZcAS4MP7w5okSdKJ6ES61HgNcFM1fRPwlhH1L+Wwu4HTIuJc4E3AnZm5PTOfBe4ErircsyRJUs0aFbwS+HZErI6I66ra3Mx8qpp+GphbTZ8HPDli3Y1Vbaz6ISLiuojoi4i+rVu3Hq9jkCRJGpfmBu13aWZuioizgTsj4uGRMzMzIyKP184y80bgRoCOjo7jtl1JkqTxaMgZr8zcVL1vAW5leIzW5uoSItX7lmrxTcC8EaufX9XGqkuSJJ2QigeviJgZEbP2TwNXAmuA24D9dyZeC3yjmr4NeGd1d+PlwI7qkuQdwJURcXo1qP7KqiZJknRCasSlxrnArRGxf/9/m5n/GBH3AbdERCfwU+Bt1fK3A1cD64E9wLsAMnN7RHwcuK9a7mOZub3cYUiSJI1PZE6tIU8dHR3Z19fX6DYkSdIkFhGrRzwy64AT6XESkiRJk5rBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhBi9JkqRCDF6SJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIQYvSZKkQgxekjSG7u5u2tvbaWpqor29ne7u7ka3JGmCa250A5J0Iuru7qarq4tVq1axdOlSent76ezsBGD58uUN7k7SRBWZ2egeiuro6Mi+vr5GtyHpBNfe3s7KlStZtmzZgVpPTw8rVqxgzZo1DexM0kQQEaszs+OQusFLkg7V1NREf38/LS0tB2oDAwO0trYyNDTUwM4kTQRjBS/HeEnSKNra2ujt7X1Brbe3l7a2tgZ1JGkyMHhJ0ii6urro7Oykp6eHgYEBenp66OzspKurq9GtSZrAHFwvSaPYP4B+xYoVrFu3jra2Nm644QYH1ks6Jo7xkjRlRETR/U21v6+S/sVYY7w84yVpwvnAB/+Yz3zqPx/4fPLMU5h5yixmzprNyTNPYVrT6KMo2l/9r45qf2vXPsTLX37xuNe75NIlh9Qyk339/ex6bid7du1i166dDA0OAnDKrNk8seFxzjzzzKPqU9KJz+AlacJZ8OILmHvui9j13HPs3vUce3bvYs/uXWzd/NSoyzfPOJmYcTKzl76D5tNfNO79nd0GW8e5zs7v3sTAticZ6t9NPn/4uyCnT5/BrNmzab/kFbS2to67P0kTh8FL0oTTt/p+Nj/185qXH9y7B/b188y/+kIduzrIQoiP7qxp0X379rLtma38r5672LVrFzNnzqxzc5IaxeAlacJ51zvfwZwzTuPUU09l1qxZTJtW2w3anz7K/f3RH/0Rn/rUp8a9Xi2rZCb9/f3s2LGD2bNnc9ZZZx1Fh5ImCgfXS9IRRIQD5SWNiw9QlSRJajAvNUqaMo7lcRJHs65nySQdzOAlacowCElqNC81SpIkFWLwkiRJKsTgJUmSVIjBS5IkqRCDlyRJUiEGL0mSpEIMXpIkSYUYvKSCuru7aW9vp6mpifb2drq7uxvdkiSpIB+gKhXS3d1NV1cXq1atYunSpfT29tLZ2QnA8uXLG9ydJKkEfyRbKqS9vZ2VK1eybNmyA7Wenh5WrFjBmjVrGtiZJOl4G+tHsg1eUiFNTU309/fT0tJyoDYwMEBraytDQ0MN7EySdLyNFbwc4yUV0tbWRm9v7wtqvb29tLW1NagjSVJpjvGSgF27drFt27Zxrzd//vxxLX/FFVeMWo+ImtZ/4oknxrW/GTNmcM4554xrHUlS/Ri8JODSJa/h0XVHHmc1ramZlhmttMw4iWhqZtZZ545rP4ODAwzsG+D5559n2rRptExvobm55cgrVtovvYzBfXsZ3NvP4L7+mtZ59NFHWbRo0bj6lCTVh8FLAi7reHVNwev5oUH27tnF3j27ADhp/mJaX3RhzftpBlqPssdnf3DLUa137rnjC4eSpPoxeElAx5IlfPnLXwKgubmZk08+mZkzZzJz5szDTv+X078IPF6myTfO5n/f/Jvs3r2bPXv2sHv37jGn+/uHz4a9+tJDxnVKkhrIuxqlY1Dr2KzjZar9/1WSJqqx7mr0jJd0DAxCkqTx8HESkiRJhXjGq046f/f3+ea3vjXu9bZu2VKHbsY25+yzx7X8KTNn8v3/9U8+okCSpKNg8KqTJ598ki2bfgbAjFNOpfnkU5l20myYMYtsncW0k2Yz7aTZNJ1cvZ80m2knzeLcaU3lmswk9/2SoV/u5Pk9O4bfq1f+8jmm7X2O7H+OwT072Ld7B0MD+9jW1MzevXvL9ShJ0iRi8KqTO751G8899xw/+9nPWLduHQ8//PCB1yOP/Jidu3ePut7c3/pPtJ5/cZEen/6b97F3yxOH1COCBQsWcNFFF3HRRcu46KKLaGtrY+HChZx11lk0N/s/G0mSjoZ3NdbJe97zHv76r/96XOs0tUxn8ENH+5SnoxMf3TnudXbu3MmsWbPq0I0kSZODP5JdKRW8tm/fzsaNGzn55JPH9ciBhQsX1rGrQ61fv77mZQcGBogIXvayl9WxI0mSJj4fJ1HYGWecwRlnnDHu9aZaEJYkaSrxcRKSJEmFGLwkSZIKMXhJkiQVYvCSJEkqxOAlSZJUiMFLkiSpEIOXJElSIRM+eEXEVRHxSESsj4jrG92PJEnSWCZ08IqIJuCzwJuBi4HlEVHmhw4lSZLGaUIHL2AJsD4zH8/MfcDNwDUN7kmSJGlUEz14nQc8OeLzxqomSZJ0wpnowasmEXFdRPRFRN/WrVsb3Y4kSZqiJnrw2gTMG/H5/Kr2Apl5Y2Z2ZGbHnDlzijUnSZI00kQPXvcBiyJiQURMB94O3NbgniRJkkbV3OgGjkVmDkbE+4A7gCbgC5m5tsFtSZIkjWpCBy+AzLwduL3RfUiSJB3JRL/UKEmSNGEYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIhkZmN7qGoiNgK/LTRfdTBWcAzjW5CNfP7mlj8viYWv6+JZbJ+Xy/OzEN+p3DKBa/JKiL6MrOj0X2oNn5fE4vf18Ti9zWxTLXvy0uNkiRJhRi8JEmSCjF4TR43NroBjYvf18Ti9zWx+H1NLFPq+3KMlyRJUiGe8ZIkSSrE4DXBRcQXImJLRKxpdC86vIiYFxE9EfFQRKyNiA80uicdXkQ8EREPRsQDEdHX6H50qNH+BkbEGRFxZ0Q8Vr2f3sgeNWysv4FT7fsyeE18XwSuanQTqskg8MHMvBi4HHhvRFzc4J50ZMsyc/FUut19gvkih/4NvB64KzMXAXdVn9V4Y/0NnFLfl8FrgsvM7wLbG92Hjiwzn8rM+6vp54B1wHmN7Uqa2Mb4G3gNcFM1fRPwlpI9aXSH+Rs4pb4vg5fUABExH3gVcE+DW9HhJfDtiFgdEdc1uhnVbG5mPlVNPw3MbWQzOtRBfwOn1PfV3OgGpKkmIk4Bvgb8QWbubHQ/OqylmbkpIs4G7oyIh6szLJogMjMjwtv3TyAH/w2MiAPzpsL35RkvqaCIaGH4D85XMvPrje5Hh5eZm6r3LcCtwJLGdqQabY6IcwGq9y0N7keVMf4GTqnvy+AlFRLD/1m3CliXmZ9qdD86vIiYGRGz9k8DVwLePTwx3AZcW01fC3yjgb2ocpi/gVPq+/IBqhNcRHQDb2D41903Ax/OzFUNbUqjioilwPeAB4Hnq/KHMvP2xnWlsUTESxg+ywXDwzL+NjNvaGBLGsVofwOB/wHcAlwA/BR4W2Z6E1KDjfU3kOFxXlPm+zJ4SZIkFeKlRkmSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CWpriLiLRGREXHRiNriiLh6xOc3RMRrD7ONfx8R11fTX4yIt46zhw8dTe+jbOcjEbEpIh6IiMci4usjf+g8Iv56vD98HhHzI6JuzweLiN+JiL+s1/YljY/BS1K9LQd6q/f9FgNXj/j8BmDU4BURzZl5W2Z+4hh6OC7Bq/LpzFycmYuArwL/FBFzADLzf8vMh47jviRNMgYvSXVT/SbbUqATeHtVmw58DPiP1ZmjPwF+D/jD6vPrq7Na/19E3AP8p1HO2vybiOiLiEcj4t9W233BMhHxzepM2ieAk6ptf6Wa946IuLeq/deIaKpeX4yINRHxYET84ZGOLzO/Cnwb+M1qu9+JiI6xthURCyPif0bEP0fE/RHx0oP+vVoj4m+qdX4UEcuq+stH9PvjiFg01nFU9XdV/zb3Aq8b59cmqY78kWxJ9XQN8I+Z+WhEbIuISzNzdUT8X0BHZr4PICJOAnZl5n+uPncC5wOvzcyhiPidg7Y7n+HfTXwp0BMRC8dqIDOvj4j3ZebiatttwH8EXpeZAxHxOeC3gLXAeZnZXi13Wo3HeD9w0UG1xWNs6yvAJzLz1ohoZfg/fs8esd57h1vOS6pLs9+OiAsZDqb/JTO/UgXXprGOIyLuBD4KXArsAHqAH9V4LJLqzDNekuppOXBzNX0zL7zceCT/PTOHxph3S2Y+n5mPAY9zaPA5nH/NcCi5LyIeqD6/pNrOSyJiZURcBeyscXsxSu2QbVW/+3heZt4KkJn9mbnnoPWWAv+tmv8wwz+fciHwQ+BD1dnBF2fmLw9zHJcB38nMrZm5j+HLoZJOEJ7xklQXEXEGcAVwSUQk0ARkRPxxjZvYfZh5B//WWQKDvPA/JlvHag24KTP/dJSeXwm8ieEzTG8D3l1Dn68C+l7QTOazo2zrAzVsa1SZ+bfVZddfBW6PiN8d6zgi4i1Hux9J9ecZL0n18lbgy5n54sycn5nzgA3A64HngFkjlj3485H8RkRMq8ZIvQR4BHgCWFzV5zF8KXK/gYhoqabvAt4aEWfDcECMiBdHxFnAtMz8GvBnwKuP1ERE/AfgSqD7oPoh28rM54CN+4NRRMyIiJMP2uT3GL7sSXWJ8QLgkRj+we7HM/MzwDeAV4x1HAz/4PCvRMSZ1TH/xpGOQ1I5nvGSVC/LgU8eVPtaVe8Crq8ukf0/wN8DfxcR1wAratj2z4B7gdnA72Vmf0R8n+Fg9xCwjuGxV/vdCPw4Iu7PzN+KiD9jePzUNGCA4bFVvwT+pqoBHHJGrPKHEfEOYCawBrgiM7cetMx5Y2zrt4H/GhEfq/b7G8DzI9b7HPD5iHiQ4TN4v5OZeyPibcBvR8QA8DTwf2fm9tGOIzPvjoiPMHx58hfAA4f5d5RUWGQefMZekiRJ9eClRkmSpEIMXpIkSYUYvCRJkgoxeEmSJBVi8JIkSSrE4CVJklSIwUuSJKkQg5ckSVIh/z/veBM/1TOa2gAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Attributes Disclosed\")\n", + "\n", + "plt.savefig(\"fixed_cred_variable_disclosure_box_plot_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "4e740e17", + "metadata": {}, + "source": [ + "## Averages" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "id": "8b919bcf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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P3482Y99YWqb9evXky9fPj744INkL8MNEydO5Ndff2Xp0qWsXr2a3377jaTGpYuLi0uReC5NvLxJWi4n8d8sc+bMTJw48aL1V5sCKTlcb+L1+OOPJ+uUPCEhIdSvX/+y81Neq5R6PYhI6vPyt+vZdTKacV+/SvbYc67EoMQrlciUKRN9+vRh3Lhx/1m3e/dubrvtNoKCgrj99tsTJoLu3r07AwYMoEmTJpQrVy5hWpUrady4MQcOHABgx44dtG7dmrp169K0aVM2b95MeHg4pUuXJj4+HnCmrSlZsiQxMTGsXr2aRo0aERQURLt27Th58iQA27dvp0WLFtSqVYs6deqwY8cOIiIiuP3226lTpw41a9a8aMT92NhYunbtStWqVWnfvn2StTm//PILjRs3pk6dOnTo0CHJeShfe+01PvroI3LlygU4c0N269YNgDJlyjB06FDq1KnDrFmzLnu8n376iSpVqlCnTp2LPtgjIyPp2bMnDRo0oHbt2gnxT5o0ifvvv5/WrVtTsWJFnn32WQCGDRuWMGn2hVHxL9RmXelaeKNp06Zs376dhQsX0rRpU9q2bUu1atWIi4tjyJAh1K9fn6CgID7++GMADh06RLNmzRJqzC6MVH+5a1CmTBlGjBiREN/mzZvZvXs3EydOZNy4cQmj3X/33Xc0bNiQ2rVr06JFC44cOZLkdiNHjkyYuPxyr5lbbrmFoUOH0qBBAypVqvSf0fQvuPBaGj16dMJ0URMnTmTIkCEJ20yaNIl+/foBMHXqVBo0aEBwcDCPPfZYQpKVI0cOBg8eTK1atfj3338ZNWpUwmwKffr0SUjYly1bRlBQEMHBwQwZMiShdvZar7WIpD7z1x5ixooD9F08iybP94NE8+qmKGtthvqpW7euvdTGjRsTHo+ct952nLgoWX9Gzlv/nzIvlT17dhseHm5Lly5tT506Zd966y07YsQIa621bdq0sZMmTbLWWvv555/be++911prbbdu3Wz79u1tXFyc3bBhgy1fvvxlj22ttbGxsbZ9+/b2xx9/tNZae9ttt9mtW7daa61dvHixvfXWW6211rZt29b+/vvv1lprQ0NDba9evay11tasWdMuXLjQWmvtiy++aAcOHGittbZBgwZ2zpw51lprz549ayMjI21MTIwNDw+31lp77NgxW758eRsfH2937dplAfv3339ba63t0aOHfeutt6y11jZv3twuW7bMHjt2zDZt2tRGRERYa61944037Msvv3zROYWHh9s8efJc9nqWLl3ajhkzJqH8pI539uxZW6JECbt161YbHx9vO3ToYO+++25rrbXDhw+3U6ZMsdZae/LkSVuxYkUbERFhv/zyS1u2bFl76tQpe/bsWVuqVCm7d+/ei67zpdf9ctciqX2S2rdt27b2ww8/tAsWLLDZsmWzO3futNZa+/HHH9tXXnnFWmttdHS0rVu3rt25c6cdO3asHT16tLXW+ZufPn36ite0dOnSdvz48dZaaz/44IOEv/eIESMS/jbWWhsWFpYQ96effmoHDRqU5HaJn1/uNdO8efOE/efPn29vv/32JK/D6NGj7ahRo2xcXJwtVaqUPXz4sD169OhFr/XWrVvbv/76y27cuNG2adPGnj9/3lprbd++fe3kyZOttdYCdsaMGQn7nDhxIuHxQw89ZOfNm2ettbZ69ep20aJF1lprhw4daqtXr37N1/pSid9fRMQd+8IibY3nvrdtH37bnu/zWIqUCSy3SeQhGkA1FcmVKxePPPII48ePJ2vWrAnL//3334TamIcffjihlgXgvvvuw8/Pj2rVqnHkyJEkj3uhJubAgQNUrVqVli1bEhERwaJFi+jQoUPCdufOOdWunTp1YsaMGdx6662EhobyxBNPEB4ezqlTpxImUO7WrRsdOnTgzJkzHDhwIGG+vsDAQABiYmJ47rnn+PPPP/Hz8+PAgQMJ8ZUsWZKbbroJgIceeojx48fzzDPPJMSxePFiNm7cmLDN+fPnady48TVfzwuDbF7ueJs3b6Zs2bJUrFgxIZZPPvkEcGqH5s2bl1BzEx0dnVDTePvttyfMD1itWjX27NlDyZIlLxuHtTbJa1GkSJHL7nPhbwZOjVevXr1YtGgRDRo0oGzZsgkxrl27NqGmMzw8nG3btlG/fn169uxJTEwM9913H8HBwfzxxx9XvKb3338/AHXr1r1sk97+/fvp1KkThw4d4vz58wlxXM7lXjNJlbl79+4kjxESEsLcuXPx8/PjgQceYNasWfTr149y5cqxePFiKlasyObNm7npppv44IMPWLFiRcK8jmfPnk2Y29Pf358HHngg4bgLFizgzTffJCoqirCwMKpXr07Tpk05c+ZMwnV58MEH+f7776/5WotI6hIbF89TXy3F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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + "\n", + "new_labels = [int(i) for i in labels]\n", + "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", + "\n", + "\n", + "\n", + "plt.plot(new_labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", + "plt.plot(new_labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "\n", + "plt.xticks(range(1,21))\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Attributes Disclosed\")\n", + "\n", + "plt.legend()\n", + "plt.savefig(\"fixed_cred_variable_disclosure_averages.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "ffced940", + "metadata": {}, + "source": [ + "# Fixed Attributes Disclosed Variable Credentials in Presentation" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "id": "eaedbb9d", + "metadata": {}, + "outputs": [], + "source": [ + "experiment = performance_service.new_experiment(\"Fixed Attributes Disclosed Variable Credentials in Presentation\")" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "id": "11ec6b68", + "metadata": {}, + "outputs": [], + "source": [ + "revocable_experiment = performance_service.new_experiment(\"Fixed Attributes Disclosed Variable Credentials in Presentation\")" + ] + }, + { + "cell_type": "markdown", + "id": "5443d82b", + "metadata": {}, + "source": [ + "## Five Attributes One Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "id": "5dd73818", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "id": "30ad59a6", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"1\"" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "id": "849cf49f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.8861745626498305\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "id": "bbba5837", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "id": "ec3fdac8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.888445556750412\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "8430f021", + "metadata": {}, + "source": [ + "## Five Attributes Two Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "id": "82b01938", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "id": "08aacf81", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"2\"" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "id": "29c7b93c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.3859419959000663\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "id": "044aaa38", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "id": "25681622", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 3.760751254099887\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "73c39334", + "metadata": {}, + "source": [ + "## Five Attributes Three Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "id": "3c7efa7d", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "id": "29f83aac", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"3\"" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "id": "a6c2a110", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.2802539874501235\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "id": "dd9d69d7", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "id": "3fd4c417", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 4.044143925350181\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "8896b048", + "metadata": {}, + "source": [ + "## Five Attributes Four Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "id": "f0941727", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "id": "39a1a967", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"4\"" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "id": "3ca2e7ba", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 2.808775784350291\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 179, + "id": "a1054aaa", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "id": "fcbff82d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 5.397983192500033\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "7ea2fb45", + "metadata": {}, + "source": [ + "## Five Attributes Five Cred" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "id": "b5ec64d3", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "id": "1c5c46ef", + "metadata": {}, + "outputs": [], + "source": [ + "name = \"5\"" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "id": "880e29aa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 4.092076107749927\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(experiment, test, connection_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "id": "08dd9b64", + "metadata": {}, + "outputs": [], + "source": [ + "req_attrs = [\n", + " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", + "]\n", + "\n", + "proof_request[\"requested_attributes\"] = {\n", + " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", + " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", + " f\"0_{req_attr['name']}_uuid\":\n", + " req_attr for req_attr in req_attrs\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "id": "4b9308ea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 6.604865062400313\n" + ] + } + ], + "source": [ + "test = {\"name\": name, \"proof_request\": proof_request}\n", + "\n", + "await performance_service.run_verification(revocable_experiment, test, connection_id)" + ] + }, + { + "cell_type": "markdown", + "id": "287815b8", + "metadata": {}, + "source": [ + "## Plot Results" + ] + }, + { + "cell_type": "markdown", + "id": "a09cd455", + "metadata": {}, + "source": [ + "### Non Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "id": "614569d2", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "non_revocable_averages = []\n", + "for result in experiment[\"results\"]:\n", + " \n", + "\n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " non_revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(int(result[\"name\"]))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "id": "d0858796", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Attributes Disclosed\")\n", + "\n", + "plt.savefig(\"fixed_attributes_disclosed_variables_credentials_presented_box_plot_non_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "0ddc8f50", + "metadata": {}, + "source": [ + "### Revocable" + ] + }, + { + "cell_type": "code", + "execution_count": 195, + "id": "5168cc44", + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "labels = []\n", + "revocable_averages = []\n", + "for result in revocable_experiment[\"results\"]:\n", + " \n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(int(result[\"name\"]))\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "id": "baa999b2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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USRRsAAAaJP2228/nXPWr1T17Di518cdZ6PULvpCVRX36LGHH1D79u3jjiOJggUAQJt12e9/px4FUtVrk+KOssG8vk7Vk2/UpZeUavfdd487zmoULAAA2qjc3Fw9+uD9qp72kL5b8HHccTZI1bRH1Lf75vrNeefGHWUNFCwAANqwPn366PrrrlXV5BvlK2vjjrNeVnz2vla88ZQeKv+7srLSq9KkVxoAAJByp5/+M+27286qeun+uKMkrP67Gi2ffKPG336LevToEXec76FgAQDQxpmZ7rv3LtXN+q9qPnkz7jgJqXrhLh128I80YsSIuKM0iYIFAAC0xRZb6P5779byyTeprmZZ3HFaVDX7FeV8/qbuvO2WuKM0i4IFAAAkSUOGDNGo445W9dTb447SrLrl36rquVv1cPl96ty5c9xxmkXBAgAAq934pz+q4/L5Wv7u83FH+R53V9Wzf9Gvfv4zHXjggXHHaREFCwAArJafn69/PFSu6v/+VSsXfxV3nDVUvfEvdcut0ZWXj407yjpRsAAAwBr22msvXfTb36hqyk3yNLkodO0381T98v36x0PlysvLizvOOlGwAADA91x4wQXaccuOWj79n3FHkdetVNXkG3TdVWXq27dv3HESQsECAADfk52drUceuE/fzXhc3305J9YsVS+Va6+dt9cvf/mLWHOsDwoWAABo0rbbbqtbb75Jy5+5QfW1K2LJUPPp21r53r91/9/ulpnFkmFDULAAAECzTjjhBA384T6qqrgn5WPXr1iuqsk36d67Jqhbt24pH39jULAAAECLJtxxm7I+na7qOZUpHbfq+fE65sihOuKII1I6bggULAAA0KJNN91UD973Ny1/7i+qq16SkjGr3n9RHRbN0c033ZiS8ULLiTsAAABIf3369JHqavXppilaaL5Hw83z81MzXmAULAAA0KL6+nodN+pEtd/zSPWqSc3FlX1lrZY8eIGu3Wa8zjjj9JSMGRK7CAEAQIv++Kcb9P78hSrY55iUjWk5ueow+Fydd8FvNWvWrJSNGwoFCwAANOvNN9/U2CvL1GHQObKs7JSOnbfFtmq/zwj9ZMQo1dbWpnTsjUXBAgAATaqpqdHRx41U/oGnKLfLVrFkyN9zmD6rztJll18Ry/gbioIFAACadN4FF2pRXlfl73pwbBnMstRh4Fn688236KWXXoot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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Import libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + " \n", + "\n", + " \n", + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + " \n", + "# Creating plot`\n", + "bp = ax.boxplot(data, patch_artist = True,\n", + " notch ='True')\n", + "\n", + "# x-axis labels\n", + "ax.set_xticklabels(labels)\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Attributes Disclosed\")\n", + "\n", + "plt.savefig(\"fixed_attributes_disclosed_variables_credentials_presented_box_plot_revocable.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "268b2d3e", + "metadata": {}, + "source": [ + "## Averages" + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "id": "13ab51f9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJJCAYAAAB27EniAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABweElEQVR4nO3deZyNdf/H8dfXGMa+k30QWccYjC0JiYQIUfYlbUp3e/3udnfLXd2VbndaZC2kEhWVQpF9K5KsMxj7NsyYfb6/P65jGpphMDPXmXPez8djHnOWa675XOeMmbfvaqy1iIiIiEj2yed2ASIiIiK+RgFLREREJJspYImIiIhkMwUsERERkWymgCUiIiKSzRSwRERERLJZfrcLyAlly5a1wcHBbpchIiIiPmzdunVHrbXlMnrOJwNWcHAwa9eudbsMERER8WHGmMjMnlMXoYiIiEg2U8ASERERyWYKWCIiIiLZzCfHYGUkKSmJffv2ER8f73YpIuJDgoKCqFKlCoGBgW6XIiJexG8C1r59+yhWrBjBwcEYY9wuR0R8gLWWY8eOsW/fPmrUqOF2OSLiRfymizA+Pp4yZcooXIlItjHGUKZMGbWMi8jf+E3AAhSuRCTb6feKiGTErwKW2wICAggNDaVhw4Z0796dkydPulZLREQEDRs2zPC566+//pLXEXv99depW7cuoaGhNG/enKlTp152bUuWLKFbt26X/fUvvfTSOfdbt2590a8pWrRoho+nf8/69u3LmTNnLruuy7VkyRKWL19+ycdNmDDhit6H87311lsEBQURHR2dbecUEfFVCli5qFChQmzcuJHNmzdTunRpxo8f73ZJ2WLChAksXLiQ1atXs3HjRn788UestX87LiUlJVfqOT9gZSWcZCb9e1agQAEmTJhwzvPJycmXfe6sutyAdffddzN48OBsq2PGjBk0b96cL774IlvOl1s/DyIiblDAckmrVq2IiooCYOfOnXTp0oWmTZvStm1btm7dSnR0NNWrVyc1NRWA2NhYqlatSlJSEhs3bqRly5aEhITQq1cvTpw4AcCOHTu44YYbaNy4MWFhYezcuZOYmBg6duxIWFgYjRo1Yu7cuWk1JCcnM2DAAOrVq0efPn0ybJ35/vvvadWqFWFhYfTt25eYmJi/HfPSSy/x7rvvUrx4cQCKFy/OkCFDAGdV/ccff5ywsDBmz56d6fm+/fZb6tatS1hY2Dl/wGNjYxk+fDjh4eE0adIkrf7Jkydz66230qVLF2rXrs1jjz0GwBNPPEFcXByhoaEMGDAA+Kt16kKvRVa0bduWHTt2sGTJEtq2bUuPHj2oX78+KSkpPProozRv3pyQkBDee+89AA4cOMB1112X1gK2dOnSC76mwcHBPPvss2n1bd26lYiICCZMmMCbb75JaGgoS5cu5auvvqJFixY0adKEG264gUOHDmV43HPPPcfrr78OkOnPzPXXX8/jjz9OeHg4derUSavxfGd/lsaOHcuMGTMAJ1g/+uijacdMnjyZ0aNHAzB9+nTCw8MJDQ3lrrvuSgtTRYsW5eGHH6Zx48asWLGCF154gebNm9OwYUNGjRqVFszXrFlDSEgIoaGhPProo2mtrZf6WouIuMZa63MfTZs2tefbsmXLX3fGjLG2Xbvs/Rgz5m/f83xFihSx1lqbnJxs+/TpYxcsWGCttbZDhw5227Zt1lprV65cadu3b2+ttbZHjx520aJF1lprZ86caUeMGGGttbZRo0Z2yZIl1lprn376aTvG873Dw8PtF198Ya21Ni4uzsbGxtqkpCQbHR1trbX2yJEjtlatWjY1NdXu3r3bAnbZsmXWWmuHDRtmX3vtNWutte3atbNr1qyxR44csW3btrUxMTHWWmtfeeUV+/zzz59zTdHR0bZkyZKZXnP16tXtq6++mvb9MzpfXFycrVKlit22bZtNTU21ffv2tTfffLO11tonn3zSTps2zVpr7YkTJ2zt2rVtTEyMnTRpkq1Ro4Y9efKkjYuLs9WqVbN79uw553U+/3XP7LXI6Gsy+toePXrY//3vf3bx4sW2cOHCdteuXdZaa9977z374osvWmutjY+Pt02bNrW7du2yr7/+uh07dqy11nnPT506dcHXtHr16nbcuHHWWmvHjx+f9n4/++yzae+NtdYeP348re4PPvjAPvTQQxkel/5+Zj8z7dq1S/v6b775xnbs2DHD12Hs2LH2hRdesCkpKbZatWr24MGD9vDhw7ZWrVppx3Tp0sUuXbrUbtmyxXbr1s0mJiZaa62955577JQpU6y11gJ21qxZaV9z7NixtNsDBw608+bNs9Za26BBA7t8+XJrrbWPP/64bdCgwSW/1rnpnN8vIuI3gLU2kyziN8s0eIOzLStRUVHUq1ePTp06ERMTw/Lly+nbt2/acQkJCQD069ePWbNm0b59e2bOnMm9995LdHQ0J0+epF27dgAMGTKEvn37cvr0aaKioujVqxfgrM0DzvpfTz31FD///DP58uUjKiqKQ4cOAVC1alXatGkDwMCBAxk3bhyPPPJIWh0rV65ky5YtacckJibSqlWrS77ufv36XfB8W7dupUaNGtSuXTutlvfffx9wWnvmzZuX1hITHx/Pnj17AOjYsSMlSpQAoH79+kRGRlK1atVM67DWZvhaXHXVVZl+zdn3DJwWrBEjRrB8+XLCw8PTpuV///33/Pbbb3z22WcAREdHs337dpo3b87w4cNJSkqiZ8+ehIaG8tNPP13wNb311lsBaNq0aaZdcfv27aNfv34cOHCAxMTEiy4PkNnPTEbfMyIiIsNzzJgxgzlz5pAvXz569+7N7NmzGT16NDVr1mTlypXUrl2brVu30qZNG8aPH8+6deto3rx52mtYvnx5wBnT1rt377TzLl68mH//+9+cOXOG48eP06BBA9q2bcvp06fTXpc77riDr7/++pJfaxERN/lnwHrrLVe+7dnxPGfOnKFz586MHz+eoUOHUrJkSTZu3Pi343v06MFTTz3F8ePHWbduHR06dMiwi+5CPv74Y44cOcK6desIDAwkODg4bUr5+bOfzr9vraVTp05pXUIZKV68OEWLFmXXrl3UrFkzw2OKFClywfNldO3pa/j888+55pprznl81apVFCxYMO1+QEDARcdDXei1yMzZ9yyzazpb4zvvvEPnzp3/dtzPP//MN998w9ChQ3nooYcoVarUBV/Ts9d0oeu5//77eeihh+jRowdLlizhueeeu+A1XMzFvuemTZvYvn07nTp1AkgLdaNHj6Z///58+umn1K1bl169emGMwVrLkCFDePnll/92rqCgIAICAgAnLN97772sXbuWqlWr8txzz130/biU1zo7x5+JiFwqjcFyQeHChRk3bhxvvPEGhQsXpkaNGsyePRtw/oD8+uuvgDNepXnz5owZM4Zu3boREBBAiRIlKFWqVNoYk2nTptGuXTuKFStGlSpV+PLLLwGnFezMmTNER0dTvnx5AgMDWbx4MZGRf238vWfPHlasWAHAJ598wrXXXntOnS1btuSXX35hx44dgDMeatu2bX+7nieffJL77ruPU6dOAc5Yp4xmr2V2vrp16xIREcHOnTsBzgkfnTt35p133kkbm7Nhw4aLvr6BgYEkJSX97fELvRZXonPnzrz77rtp33Pbtm3ExsYSGRlJhQoVuPPOOxk5ciTr16/P8muaXrFixTh9+vQ511G5cmUApkyZkulxZ2X2M5NVM2bM4LnnniMiIoKIiAj279/P/v37iYyMpFevXsydO5cZM2bQv39/wGlZ/Oyzzzh8+DAAx48fz/C1PhumypYtS0xMTFqrVMmSJSlWrBirVq0CYObMmWlfcymvtYiImxSwXNKkSRNCQkKYMWMGH3/8MRMnTqRx48Y0aNDgnMHX/fr1Y/r06WndbOD8UX300UcJCQlh48aNPPPMM4Dzh3PcuHGEhITQunVrDh48yIABA1i7di2NGjVi6tSp1K1bN+0811xzDePHj6devXqcOHGCe+6555way5Urx+TJk7n99tsJCQlJ68473z333EP79u3TBiu3bduWfPn+/qOV2fmCgoJ4//33ufnmmwkLC0vrTgJ4+umnSUpKIiQkhAYNGvD0009f9LUdNWoUISEhaYPcz7rQa3ElRo4cSf369QkLC6Nhw4bcddddJCcns2TJEho3bkyTJk2YNWsWY8aMyfJrml737t2ZM2fOOYPX+/btS9OmTSlbtmymx6WX2c9MVsycOTOt6/msXr16MXPmTEqVKkW9evWIjIwkPDwccLprx44dy4033khISAidOnXiwIEDfztvyZIlufPOO2nYsCGdO3dO61IEmDhxInfeeSehoaHExsamdQVfymstIuImc7ZlwJc0a9bMnr+O0x9//EG9evVcqkhELkVMTEza7M9XXnmFAwcO8Pbbb7tcVeb0+0XEPxlj1llrm2X0nH+OwRIRr/bNN9/w8ssvk5ycTPXq1Zk8ebLbJYmIXBIFLBHxOv369TunW1xEJK/RGCwRERGRbKaAJSIiIpLNFLBEREREspkCloiIiPieDz6ATHanyA0KWLnIGMPDDz+cdv/111+/4lW4zwoICEjb6LZ79+6cPHkyW857OSIiItI25z3f9ddfz/lLaFzM66+/Tt26dQkNDaV58+YZLmKaVUuWLKFbt26X/fUvvfTSOfdbt2590a85u9zA+dK/Z3379s1ws+2ctmTJEpYvX37Jx02YMOGK3ofzvfXWWwQFBREdHZ1t5xQRPzZuHIwaBW++6VoJCli5qGDBgnzxxRccPXo02899dkuXzZs3U7p0acaPH5/t38MNEyZMYOHChaxevZqNGzfy448/ktHabSkpKblSz/kBKyvhJDPp37MCBQowYcKEc56/2NY/2eFyA9bdd9+drVvRzJgxg+bNm2e6/+Klyq2fBxHxQu++C2PGQK9e4NnH1g0KWLkof/78jBo1ijczSNQRERF06NCBkJAQOnbsmLah8dChQ3nggQdo3bo1NWvWTNtO5EJatWpFVFQUADt37qRLly40bdqUtm3bsnXrVqKjo6levTqpqamAs11L1apVSUpKYuPGjbRs2ZKQkBB69erFiRMnANixYwc33HADjRs3JiwsjJ07dxITE0PHjh0JCwujUaNG56xAn5yczIABA6hXrx59+vTJsHXm+++/p1WrVoSFhdG3b98M91l86aWXePfddylevDjg7H04ZMgQAIKDg3n88ccJCwtj9uzZmZ7v22+/pW7duoSFhZ3zBzw2Npbhw4cTHh5OkyZN0uqfPHkyt956K126dKF27do89thjADzxxBNpmz+fXSX+bOvUhV6LrGjbti07duxgyZIltG3blh49elC/fn1SUlJ49NFHad68OSEhIbz33nsAHDhwgOuuuy6tBezsyu2ZvQbBwcE8++yzafVt3bqViIgIJkyYwJtvvpm2+vtXX31FixYtaNKkCTfccAOHDh3K8LjnnnsubQPuzH5mrr/+eh5//HHCw8OpU6fO31aXP+vsz9LYsWPTtkmaMGECjz76aNoxkydPZvTo0QBMnz6d8PBwQkNDueuuu9LCVNGiRXn44Ydp3LgxK1as4IUXXkjbXWDUqFFpwXzNmjWEhIQQGhrKo48+mtbaeqmvtYh4oYkT4d57oVs3mDkTAgPdq8Va63MfTZs2tefbsmVL2u3n5m22t01Ynq0fz83b/Lfveb4iRYrY6OhoW716dXvy5En72muv2WeffdZaa223bt3s5MmTrbXWTpw40d5yyy3WWmuHDBli+/TpY1NSUuzvv/9ua9Wqlem5rbU2OTnZ9unTxy5YsMBaa22HDh3stm3brLXWrly50rZv395aa22PHj3sokWLrLXWzpw5044YMcJaa22jRo3skiVLrLXWPv3003bMmDHWWmvDw8PtF198Ya21Ni4uzsbGxtqkpCQbHR1trbX2yJEjtlatWjY1NdXu3r3bAnbZsmXWWmuHDRtmX3vtNWutte3atbNr1qyxR44csW3btrUxMTHWWmtfeeUV+/zzz59zTdHR0bZkyZKZvp7Vq1e3r776atr3z+h8cXFxtkqVKnbbtm02NTXV9u3b1958883WWmuffPJJO23aNGuttSdOnLC1a9e2MTExdtKkSbZGjRr25MmTNi4uzlarVs3u2bPnnNf5/Nc9s9cio6/J6Gt79Ohh//e//9nFixfbwoUL2127dllrrX3vvffsiy++aK21Nj4+3jZt2tTu2rXLvv7663bs2LHWWuc9P3Xq1AVf0+rVq9tx48ZZa60dP3582vv97LPPpr031lp7/PjxtLo/+OAD+9BDD2V4XPr7mf3MtGvXLu3rv/nmG9uxY8cMX4exY8faF154waakpNhq1arZgwcP2sOHD5/zs96lSxe7dOlSu2XLFtutWzebmJhorbX2nnvusVOmTLHWWgvYWbNmpX3NsWPH0m4PHDjQzps3z1prbYMGDezy5cuttdY+/vjjtkGDBpf8Wp8v/e8XEXHJlCnWGmNtly7WxsfnyrcE1tpMsogWGs1lxYsXZ/DgwYwbN45ChQqlPb5ixYq01pVBgwaltZoA9OzZk3z58lG/fn0OHTqU4XnPtqxERUVRr149OnXqRExMDMuXL6dv375pxyUkJADOQo6zZs2iffv2zJw5k3vvvZfo6GhOnjyZthHwkCFD6Nu3L6dPnyYqKiptP7qgoCAAkpKSeOqpp/j555/Jly8fUVFRafVVrVqVNm3aADBw4EDGjRvHI488klbHypUr2bJlS9oxiYmJtGrV6pJfz7OLUWZ2vq1bt1KjRg1q166dVsv7778POK098+bNS2uJiY+PT2s57NixY9r+d/Xr1ycyMpKqVatmWoe1NsPX4qqrrsr0a86+Z+C0YI0YMYLly5cTHh5OjRo10mr87bff0louo6Oj2b59O82bN2f48OEkJSXRs2dPQkND+emnny74mt56660ANG3aNNOuuH379tGvXz8OHDhAYmJiWh2ZyexnJqPvGZHJYNMZM2YwZ84c8uXLR+/evZk9ezajR4+mZs2arFy5ktq1a7N161batGnD+PHjWbduXdq+hXFxcWl7VwYEBNC7d++08y5evJh///vfnDlzhuPHj9OgQQPatm3L6dOn016XO+64g6+//vqSX2sR8TKffALDhkHHjvDFF1CwoNsV+WfAerZ7A1e//4MPPkhYWBjDhg3L0vEF0/2g2Ez2jjw7nufMmTN07tyZ8ePHM3ToUEqWLMnGjRv/dnyPHj146qmnOH78OOvWraNDhw4ZdtFdyMcff8yRI0dYt24dgYGBBAcHEx8fDzgD+tM7/761lk6dOqV1CWWkePHiFC1alF27dlGzZs0MjylSpMgFz5fRtaev4fPPP+eaa6455/FVq1ad85oHBARcdDzUhV6LzJx9zzK7prM1vvPOO3Tu3Plvx/3888988803DB06lIceeohSpUpd8DU9e00Xup7777+fhx56iB49erBkyZIrnoRxse+5adMmtm/fTqdOnQDSQt3o0aPp378/n376KXXr1qVXr14YY7DWMmTIEF5++eW/nSsoKIiAgADACcv33nsva9eupWrVqjz33HMXfT8u5bXOzvFnInKFZs+GwYPhuutg7lxI13jhJo3BckHp0qW57bbbmDhxYtpjrVu3ZubMmYDzx7pt27aXde7ChQszbtw43njjDQoXLkyNGjWYPXs24PwB+fXXXwFnvErz5s0ZM2YM3bp1IyAggBIlSlCqVKm0MSbTpk2jXbt2FCtWjCpVqvDll18CTivYmTNniI6Opnz58gQGBrJ48WIiIyPT6tizZw8rVqwA4JNPPuHaa689p86WLVvyyy+/sGPHDsAZD7Vt27a/Xc+TTz7Jfffdx6lTpwBnrFNGs9cyO1/dunWJiIhg586dAOeEj86dO/POO++khdYNGzZc9PUNDAwkKSnpb49f6LW4Ep07d+bdd99N+57btm0jNjaWyMhIKlSowJ133snIkSNZv359ll/T9IoVK8bp06fPuY7KlSsDMGXKlEyPOyuzn5msmjFjBs899xwRERFERESwf/9+9u/fT2RkJL169WLu3LnMmDGD/v37A07L4meffcbhw4cBOH78eIav9dkwVbZsWWJiYtJapUqWLEmxYsVYtWoVQNq/Obi011pEvMSXX8Idd0DLlvDVV1C4sNsVpVHAcsnDDz98zmzCd955h0mTJhESEsK0adN4++23L/vcTZo0ISQkhBkzZvDxxx8zceJEGjduTIMGDc4ZfN2vXz+mT59+zp5vU6ZM4dFHHyUkJISNGzfyzDPPAM4fznHjxhESEkLr1q05ePAgAwYMYO3atTRq1IipU6dSt27dtPNcc801jB8/nnr16nHixAnuueeec2osV64ckydP5vbbbyckJCStO+9899xzD+3bt08brNy2bVvy5fv7j21m5wsKCuL999/n5ptvJiwsLK07CeDpp58mKSmJkJAQGjRowNNPP33R13bUqFGEhISkDXI/60KvxZUYOXIk9evXJywsjIYNG3LXXXeRnJzMkiVLaNy4MU2aNGHWrFmMGTMmy69pet27d2fOnDnnDF7v27cvTZs2pWzZspkel15mPzNZMXPmzLSu57N69erFzJkzKVWqFPXq1SMyMpLw8HDA6a4dO3YsN954IyEhIXTq1IkDBw787bwlS5bkzjvvpGHDhnTu3DmtSxFg4sSJ3HnnnYSGhhIbG5vWFXwpr7WIeIFvvoHbboOmTWH+fMhkSRy3mMy6nPKyZs2a2fPXWvrjjz+oV6+eSxWJiLeIiYlJm/35yiuvcODAgSv6Dw3o94tIrvvuO+jRAxo1gh9+gJIlXSnDGLPOWtsso+f8cgyWiPivb775hpdffpnk5GSqV6/O5MmT3S5JRC7Fjz9Cz55Qvz58/71r4epiFLBExK/069fvnG5xEclDfvoJuneHq6+GhQuhdGm3K8qUxmCJiIiI9/vlF7j5ZggOdlqx0o0T9UZ+FbB8cbyZiLhLv1dEcsHq1XDTTVCpkhOu0k1Y8lZ+E7CCgoI4duyYfhmKSLax1nLs2LG0xXdFJAesWwc33gjlysGiRVCxotsVZYnfjMGqUqUK+/bt48iRI26XIiI+JCgoiCpVqrhdhohv+vVX6NTJGci+aBHkoX9rfhOwAgMDL7rth4iIiHiJzZvhhhugSBFYvBiqV3e7okviN12EIiIikkds3ersKxgY6ISrPNhAooAlIiIi3mP7dujQAYxxugWvvtrtii6L33QRioiIiJfbtcsJV8nJTstVNm075gYFLBEREXFfZCS0bw9nzjjhqkEDtyu6IgpYIiIi4q59+5xwdeqUs85VSIjbFV0xBSwRERFxz/79TrfgsWPOxs1hYW5XlC0UsERERMQdhw45swUPHIDvvoPmzd2uKNsoYImIiEjuO3LECVd79sC330Lr1m5XlK0UsERERCR3HTvmLCK6cyfMnw9t27pdUbZTwBIREZHcc/Kks7fgn3/CvHnO4HYfpIAlIiIiuSM6Gjp3hk2b4MsvnaDloxSwREREJOedPg1du8L69fD5585tH6aAJSIiIjkrNha6dYNVq2DWLOjRw+2KcpwCloiIiOScuDgnUC1bBh9/DL17u11RrlDAEhERkZwRHw89ezpb30yZAv37u11RrlHAEhERkeyXkAB9+sD338PEiTBokNsV5ap8bhcgIiIiPiYpCfr1g2++gQkTYPhwtyvKdQpYIiIikn2Sk+GOO2DuXHjnHbjrLrcrcoUCloiIiGSPlBQYPBg++wz+8x8YPdrtilyjgCUiIiJXLiXF6QqcMQNeeQX+8Q+3K3KVApaIiIhcmdRUpytw6lR44QV4/HG3K3KdApaIiIhcPmvhvvucmYL//Cc8/bTbFXkFBSwRERG5PNbCgw86MwUff9xpvRJAAUtEREQuh7Xw6KMwbpwz3urll8EYt6vyGgpYIiIicmmshf/7P3jjDad78I03FK7Oo4AlIiIil+b5550Wq1GjnBYshau/UcASERGRrPvXv5yANWwYvPsu5FOUyIheFREREcma115zZgoOHAgffKBwdQF6ZUREROTi3noLHnvM2WNw0iQICHC7Iq+mgCUiIiIXNn68M1Pw1lth2jTIn9/tiryeApaIiIhk7oMPnD0Fu3d3tsEJDHS7ojxBAUtEREQyNnmyswXOTTfB7NlQoIDbFeUZClgiIiLydx9/7GzefMMN8MUXULCg2xXlKQpYIiIicq5PP4XBg6FdO/jySwgKcruiPEcBS0RERP4yZw7ccQe0bg1ffQWFC7tdUZ6kgCUiIiKOr75ylmEID4f586FoUbcryrMUsERERAS+/Rb69IHGjWHBAihWzO2K8jQFLBEREX/3ww/QsyfUrw/ffw8lSrhdUZ6ngCUiIuLPliyBHj2gTh1YuBBKlXK7Ip+ggCUiIuKvli2Dbt2gRg2nFatsWbcr8hkKWCIiIv5o5Uro2hUqV4Yff4Ty5d2uyKcoYImIiPibtWuhc2cnVC1aBFdd5XZFPkcBS0RExJ9s2ACdOkHp0k64qlzZ7Yp8kgKWiIiIv9i0yQlXxYrB4sVQrZrbFfmsHA1YxpiSxpjPjDFbjTF/GGNaGWNKG2MWGmO2ez6X8hxrjDHjjDE7jDG/GWPC0p1niOf47caYITlZs4iIiE/asgU6dnT2FFy8GIKD3a7Ip+V0C9bbwLfW2rpAY+AP4AngR2ttbeBHz32Am4Dano9RwLsAxpjSwLNACyAcePZsKBMREZEs2LbNCVcBAU63YK1ablfk83IsYBljSgDXARMBrLWJ1tqTwC3AFM9hU4Centu3AFOtYyVQ0hhTEegMLLTWHrfWngAWAl1yqm4RERGfsnMndOgAKSnObMFrrnG7Ir+Qky1YNYAjwCRjzAZjzIfGmCJABWvtAc8xB4EKntuVgb3pvn6f57HMHj+HMWaUMWatMWbtkSNHsvlSRERE8qCICGjfHuLjnXBVv77bFfmNnAxY+YEw4F1rbRMglr+6AwGw1lrAZsc3s9a+b61tZq1tVq5cuew4pYiISN61d68Trk6fdlZob9TI7Yr8Sk4GrH3APmvtKs/9z3AC1yFP1x+ez4c9z0cBVdN9fRXPY5k9LiIiIhmJinLC1fHjTrhq0sTtivxOjgUsa+1BYK8x5mxnb0dgCzAPODsTcAgw13N7HjDYM5uwJRDt6Ur8DrjRGFPKM7j9Rs9jIiIicr6DB50xV4cOwXffQbNmblfkl/Ln8PnvBz42xhQAdgHDcELdp8aYEUAkcJvn2PlAV2AHcMZzLNba48aYF4E1nuNesNYez+G6RURE8p7Dh53Zgvv2OeGqZUu3K/JbxhkG5VuaNWtm165d63YZIiIiuefYMadbcMcOmD8frr/e7Yp8njFmnbU2wybCnG7BEhERkZx24oSzQvu2bfD11wpXXkABS0REJC+LjnY2bv79d5g7F264we2KBAUsERGRvOv0aejSxdnA+YsvnNviFRSwRERE8qLYWOjaFdasgU8/he7d3a5I0lHAEhERyWvOnHEC1fLl8MkncOutblck51HAEhERyUvi46FnT1iyBKZNg3793K5IMqCAJSIiklckJDitVQsXwqRJMGCA2xVJJnJyqxwRERHJLomJ0LcvLFgA770HQ4e6XZFcgAKWiIiIt0tKgttvh6++gv/+F0aNcrsiuQgFLBEREW+WnAyDBzvLMLz5Jtx3n9sVSRYoYImIiHirlBQYNgxmzoR//xsefNDtiiSLFLBERES8UWoq3HknTJ8OY8fCo4+6XZFcAgUsERERb2Mt3HOPM1PwmWfg//7P7YrkEilgiYiIeBNr4YEH4P334Ykn4Lnn3K5ILoMCloiIiLewFh5+2Jkp+PDD8NJLYIzbVcllUMASERHxBtbCk086MwXvvx9ee03hKg9TwBIREfEGzz4Lr74Kd98Nb7+tcJXHKWCJiIi47cUXnY/hw2H8eIUrH6CAJSIi4qZXX3VmCg4a5Axsz6c/zb5A76KIiIhb3nzTmSl4++3OkgwBAW5XJNlEAUtERMQN//0vPPQQ9O4NU6cqXPkYBSwREZHc9t57zkzBW26BGTMgf363K5JspoAlIiKSmz76yJkp2LUrzJoFgYFuVyQ5QAFLREQkt0ybBiNHwo03wuefQ8GCblckOUQBS0REJDfMnAlDh0L79vDllxAU5HZFkoMUsERERHLa55/DwIHQpg3MmweFCrldkeQwBSwREZGcNG8e9O8P4eHwzTdQpIjbFUkuUMASERHJKfPnQ58+EBYGCxZAsWJuVyS5RAFLREQkJ3z/Pdx6KzRqBN9+CyVKuF2R5CIFLBERkey2aJGzxtU11zhBq1QptyuSXKaAJSIikp2WLoXu3aFmTfjhByhTxu2KxAUKWCIiItllxQpnAdGqVeHHH6FcObcrEpcoYImIiGSH1auhSxe46iqni/Cqq9yuSFykgCUiInKl1q+Hzp2d7sBFi6BSJbcrEpcpYImIiFyJ336DTp2geHEnXFWt6nZF4gUUsERERC7X779Dx47OyuyLFkFwsNsViZdQwBIREbkcf/7phKvAQCdc1arldkXiRRSwRERELtWOHdChA1jrzBasU8ftisTL5He7ABERkTxl925o3x4SEmDJEqhXz+2KxAspYImIiGTVnj1OuIqNdboFGzZ0uyLxUgpYIiIiWREV5YSrkyedbsHQULcrEi+mgCUiInIxBw444erIEVi4EJo2dbsi8XIKWCIiIhdy6JAzoH3/fvjuO2jRwu2KJA9QwBIREcnM0aNwww0QGQkLFkCbNm5XJHmEApaIiEhGjh93VmjfsQO+/hratXO7IslDFLBERETOd/Ik3HgjbNkCc+c6C4qKXAIFLBERkfROnYIuXZw9Br/4wrktcokUsERERM6KiYGuXWHdOpg9G7p1c7siyaMUsERERADOnHEC1YoVMHMm9OzpdkWShylgiYiIxMXBLbfAzz/D9OnQt6/bFUkep82eRUTEv8XHw623OquzT5oEd9zhdkXiA9SCJSIi/isx0Wmt+vZb+OADGDLE7YrER6gFS0RE/FNSEvTv76xx9b//wciRblckPkQBS0RE/E9yMgwcCHPmwFtvwT33uF2R+BgFLBER8S8pKU5X4KefwmuvwZgxblckPkgBS0RE/EdqKowYAZ98Av/6FzzyiNsViY9SwBIREf9gLYweDVOmwHPPwVNPuV2R+DAFLBER8Q+vvgrvvguPPgrPPON2NeLjFLBERMT3zZgBTz7pzBp85RUwxu2KxMcpYImIiG/7+WcYOhSuvdZZSDSf/vRJztNPmYiI+K6tW509BYOD4csvISjI5YLEXyhgiYiIbzp0CLp2hfz5YcECKFPG7YrEj2irHBER8T1nzkCPHnDwICxZAjVrul2R+BkFLBER8S0pKc6GzWvWOCu1h4e7XZH4IQUsERHxLQ89BHPnwttvwy23uF2N+CmNwRIREd/x1lswbhw8+CA88IDb1YgfU8ASERHf8MUXTutVr17w+utuVyN+TgFLRETyvpUrYcAAZ7zV9OkQEOB2ReLnFLBERCRv27kTuneHSpVg3jwoXNjtikQUsEREJA87dgxuuglSU521rsqXd7siEUCzCEVEJK+Kj3dmCe7ZAz/8AHXquF2RSBoFLBERyXtSU2HIEPjlF5g509lnUMSLqItQRETyniefhE8/hVdfhX793K5G5G8UsEREJG95913497/h7rvh0UfdrkYkQwpYIiKSd3z9NYweDTffDO+8A8a4XZFIhhSwREQkb1i3zukODA11xl3l1zBi8V4KWCIi4v0iI6FbNyhb1mnFKlrU7YpELkjxX0REvNvJk9C1K8TFOcsxVKzodkUiF6WAJSIi3isxEW69FbZvh+++gwYN3K5IJEsUsERExDtZCyNHwuLFMHUqtG/vdkUiWaYxWCIi4p2efRamTYMXXoBBg9yuRuSSKGCJiIj3+egjePFFGD4c/vlPt6sRuWQKWCIi4l0WLoS77oJOnWDCBK11JXmSApaIiHiP336D3r2hXj347DMIDHS7IpHLooAlIiLeISrKWY6hWDGYPx+KF3e7IpHLplmEIiLivlOnnO1voqNh6VKoUsXtikSuiAKWiIi4KykJbrsNNm+Gb75xtsIRyeMUsERExD3Wwr33OouIfvABdO7sdkUi2UJjsERExD0vvwwffghPPeUsKiriIxSwRETEHR9/DP/3f3DHHTB2rNvViGQrBSwREcl9S5bAsGFw/fXOoqJa60p8jAKWiIjkrj/+gF694Oqr4YsvoGBBtysSyXYKWCIiknsOHoSbbnJC1fz5UKqU2xWJ5AjNIhQRkdwRGwvdusGRI/DTTxAc7HZFIjlGAUtERHJeSgrcfjts2ABffgnNmrldkUiOytEuQmNMhDFmkzFmozFmreex0saYhcaY7Z7PpTyPG2PMOGPMDmPMb8aYsHTnGeI5frsxZkhO1iwiItnMWhgzBr76CsaNg+7d3a5IJMflxhis9tbaUGvt2f+uPAH8aK2tDfzouQ9wE1Db8zEKeBecQAY8C7QAwoFnz4YyERHJA/7zHxg/Hh5+GO67z+1qRHKFG4PcbwGmeG5PAXqme3yqdawEShpjKgKdgYXW2uPW2hPAQqBLLtcsIiKX47PP4JFHoE8f+Pe/3a5GJNfkdMCywPfGmHXGmFGexypYaw94bh8EKnhuVwb2pvvafZ7HMnv8HMaYUcaYtcaYtUeOHMnOaxARkcuxfDkMHAitWsHUqZBPE9fFf+T0IPdrrbVRxpjywEJjzNb0T1prrTHGZsc3sta+D7wP0KxZs2w5p4iIXKbt26FHD6haFebNg0KF3K5IJFfl6H8nrLVRns+HgTk4Y6gOebr+8Hw+7Dk8Cqia7sureB7L7HEREfFGR49C167O7QULoGxZd+sRcUGOBSxjTBFjTLGzt4Ebgc3APODsTMAhwFzP7XnAYM9swpZAtKcr8TvgRmNMKc/g9hs9j4mIiLeJi3NarvbudVqurr7a7YpEXJGTXYQVgDnG2V8qP/CJtfZbY8wa4FNjzAggErjNc/x8oCuwAzgDDAOw1h43xrwIrPEc94K19ngO1i0iIpcjNRUGDYKVK2H2bGjd2u2KRFyTYwHLWrsLaJzB48eAjhk8boEM5+9aaz8CPsruGkVEJBs99hh8/jm88Qb07u12NSKu0pQOERG5cuPHO8Fq9Gj4xz/crkbEdQpYIiJyZebNgwcecMZevfUWOENDRPyaApaIiFy+NWugf38IC4NPPoGAALcrEvEKClgiInJ5du+Gbt2gQgX4+msoUsTtikS8Rk4vNCoiIr7oxAlnravERFiyxAlZIpJGAUtERC5NQgL06gW7dsH330O9em5XJOJ1FLBERCTrUlNh+HD46Sf4+GNo187tikS8ksZgiYhI1j39tDOY/V//gjvucLsaEa+lgCUiIlnzwQfw0kswciQ8+aTb1Yh4NQUsERG5uG+/hXvugc6d4X//01pXIhehgCUiIhe2cSP07QsNGzp7DAYGul2RiNdTwBIRkczt3Qs33wwlS8I330CxYm5XJJInaBahiIhkLDraCVcxMbBsGVSu7HZFInmGApaIiPxdUpLTLfjHH7BgATRq5HZFInmKApaIiJzLWrjrLli4ECZNghtucLsikTxHY7BERORcY8c6weqZZ2DoULerEcmTFLBEROQv06Y5wWrwYHjuOberEcmzFLBERMSxaBGMGAEdOjiLimqtK5HLpoAlIiLw++9w661Qpw58/jkUKOB2RSJ5mgKWiIi/O3AAunaFQoWcta5KlnS7IpE8T7MIRUT8WUwMdOsGx47Bzz9D9epuVyTiExSwRET8VXIy9OvnbIXz1VcQFuZ2RSI+QwFLRMQfWQv33w/z58O77zpdhCKSbTQGS0TEH732GkyYAI89Bnff7XY1Ij5HAUtExN/MmgWPP+50D778stvViPgkBSwREX+ybJmziOi118LkyZBPfwZEcoL+ZYmI+Is//4RbboHgYPjySwgKcrsiEZ+lgCUi4g8OH3YGsgcEwIIFUKaM2xWJ+DTNIhQR8XVnzkCPHs6CoosXQ82ablck4vMUsEREfFlKCgwcCKtXwxdfQIsWblck4hcUsEREfNkjj8CcOfDWW9Czp9vViPgNjcESEfFV48Y5wWrMGOdDRHKNApaIiC/68kt48EHo1QveeMPtakT8jgKWiIivWb0a7rgDwsNh+nRn5qCI5CoFLBERX7JrF3TrBhUrwrx5ULiw2xWJ+CUFLBERX3HsGNx0kzNzcP58KF/e7YpE/JZmEYqI+IL4eGeWYEQE/PADXHON2xWJ+DUFLBGRvC41FYYOdfYZnDkT2rZ1uyIRv6cuQhGRvO6pp2DWLHjlFejXz+1qRAQFLBGRvO299+DVV+Huu+Gxx9yuRkQ8FLBERPKq+fPh3nvh5pvhnXfAGLcrEhEPBSwRkbxo/Xq47TYIDXXGXeXXkFoRb6KAJSKS1+zZ47RalSkDX38NRYu6XZGInEf/5RERyUtOnoSuXSEuzlmOoWJFtysSkQwoYImI5BWJidC7N2zbBt9+Cw0auF2RiGQiS12ExphaxpiCntvXG2MeMMaUzNHKRETkL9bCnXfCokXw4YfQoYPbFYnIBWR1DNbnQIox5mrgfaAq8EmOVSUiIud6/nmYOtX5PHiw29WIyEVkNWClWmuTgV7AO9baRwF1/IuI5IbJk51gNXQoPP2029WISBZkNWAlGWNuB4YAX3seC8yZkkREJM0PPzhdgzfcAO+/r7WuRPKIrAasYUAr4F/W2t3GmBrAtJwrS0RE2LTJGdRerx589hkE6v+1InlFlmYRWmu3AA+ku78beDWnihIR8XtRUc5yDEWLwjffQIkSblckIpfgggHLGLMJsJk9b60NyfaKRET83enTzkKiJ0/C0qVQtarbFYnIJbpYC1Y3z+f7PJ/PdgsO5ALBS0RELlNSkrMFzubNzirtoaFuVyQil+GCActaGwlgjOlkrW2S7qnHjTHrgSdysjgREb9iLdx3n7OI6PvvQ5cublckIpcpq4PcjTGmTbo7rS/ha0VEJCteeQU++ACeesqZOSgieVZWt8oZAXxkjCkBGOAEMDzHqhIR8TeffOIEqzvugLFj3a5GRK5QVmcRrgMaewIW1troHK1KRMSf/PwzDBsG7drBRx9prSsRH5ClgOXZh7A3EAzkN55//NbaF3KsMhERf7B1K/TsCTVrwpw5ULCg2xWJSDbIahfhXCAaWAck5Fw5IiJ+5NAhuOkmZwHR+fOhVCm3KxKRbJLVgFXFWqvpLCIi2SU2Frp3h8OHYckSqFHD7YpEJBtldSbgcmNMoxytRETEX6SkOIPZ162DGTOgeXO3KxKRbJbVFqxrgaHGmN04XYQGsFrJXUTkElkL//gHzJsH77wDPXq4XZGI5ICsBqybcrQKERF/8dZbTrB66CEYPdrtakQkh2Spi9CzontJoLvno+TZVd5FRCSLPv8cHn4YeveG115zuxoRyUFZCljGmDHAx0B5z8d0Y8z9OVmYiIhPWbECBg6Eli1h2jTIp80wRHzZpazk3sJaGwtgjHkVWAG8k1OFiYj4jB07nLFWlSvD3LlQqJDbFYlIDsvyXoRASrr7KZ7HRETkQo4eha5dncHtCxZAuXJuVyQiuSCrLViTgFXGmDme+z2BiTlSkYiIr4iLg1tugT17YNEiqF3b7YpEJJdkdS/C/xhjluAs1wAwzFq7IceqEhHJ61JTYcgQZ+zVp59C69ZuVyQiuSirexG2BH631q733C9ujGlhrV2Vo9WJiORVjz8Os2fD669Dnz5uVyMiuSyrY7DeBWLS3Y/xPCYiIuf73/+cYHXffc56VyLid7I8yN1aa8/esdamkvXxWyIi/uOrr+D++519Bt9+G4zmA4n4o6wGrF3GmAeMMYGejzHArpwsTEQkz1m7Fvr3h7AwZ4/BgAC3KxIRl2Q1YN0NtAaigH1AC2BUThUlIpLnRERAt27OMgxffQVFirhdkYi4KKuzCA8D/XO4FhGRvOnECWetq4QEWLwYrrrK7YpExGVZ3SqnjjHmR2PMZs/9EGPMP3O2NBGRPCAhAW691Vmt/csvoV49tysSES+Q1S7CD4AngSQAa+1vqEVLRPydtTByJCxZApMmQbt2blckIl4iqwGrsLV29XmPJWd3MSIiecozz8D06TB2LAwY4HY1IuJFshqwjhpjagEWwBjTBziQY1WJiHi7jz5ygtXIkfDUU25XIyJeJqtrWd0HvA/UNcZEAbuBgTlWlYiIN/v+exg1Cjp3dhYV1VpXInKerM4i3AXcYIwpAuSz1p7O2bJERLzUr786W980bOjsMRgY6HZFIuKFsjqLcIwxpjhwBnjTGLPeGHNjzpYmIuJl9u2Dm2+GEiXgm2+geHG3KxIRL5XVMVjDrbWngBuBMsAg4JUcq0pExNucOuWEq1OnnHBVubLbFYmIF8vqGKyzAwy6AlOttb8bo0EHIuInkpKgb1/YsgXmz4eQELcrEhEvl9UWrHXGmO9xAtZ3xphiQGrOlSUi4iWshbvvdga2v/8+dOrkdkUikgdktQVrBBAK7LLWnjHGlAGG5VhVIiLe4l//cpZkePppGKZfeyKSNRcMWMaYutbarTjhCqCmegZFxG9Mn+4Eq0GD4Pnn3a5GRPKQi7VgPQzcCbyRwXMW6JDtFYmIeIPFi2H4cGjfHj78UGtdieQxR04nULZoAdxqGLpgwLLW3un53D53yhER8QJbtkCvXlC7NnzxBRQo4HZFInIJok7G0efd5fRqUpnHutR1pYaLdRHeeqHnrbVfZG85IiIuO3gQunaFQoWcGYMlS7pdkYhcgmMxCQyauIqYhGS6hVRyrY6LdRF2v8BzFlDAEhHfERMD3brBkSPw889QvbrbFYnIJYhJSGbY5DVEnYhj2ogW1K/k3mLAF+si1JQZEfEPyclw++2wYQPMnQtNm7pdkYhcgoTkFO6atpbf95/ivYFNCa9R2tV6LtZF+NCFnrfW/id7yxERcYG1MGYMfP21s3lzt25uVyQilyAl1fLgzI38suMYb/RtzA31K7hd0kW7CIvlShUiIrktKgqWLnW6An/+GX7/HR59FO65x+3KROQSWGv555ebWbD5IP+8uR69m1ZxuyTg4l2EWvhFRPI+a2HHjr8C1dKlsGuX81zRotCmDdx5J9x/v7t1isgle+P7bcxYvYd7r6/FyLY13S4nzcW6CB+z1v7bGPMOzqD2c1hrH7jYNzDGBABrgShrbTdjTA1gJs6m0euAQdbaRGNMQWAq0BQ4BvSz1kZ4zvEkzmryKcAD1trvLuEaRcTfpKbCpk3nBqqDB53nypaFtm1h9Gi47jpo3BjyZ3VTCxHxJhOX7ea/i3dwe3hVHu18jdvlnONiv1X+8HxeewXfY4znPGeH8r8KvGmtnWmMmYATnN71fD5hrb3aGNPfc1w/Y0x9oD/QAKgE/GCMqWOtTbmCmkTElyQmwrp1fwWqX36Bkyed56pWhY4dnVB13XVQt64WDRXxAV+s38eLX2+hS4OrGNuzkWsLimbmYl2EX3k+T7mckxtjqgA3A/8CHjLO1XcA7vAcMgV4Didg3eK5DfAZ8F/P8bcAM621CcBuY8wOIBxYcTk1iYgPiI2FlSv/ClQrV0JcnPPcNddA375/BSottSDicxZtPcSjn/1G61pleKt/KAH5vCtcwcW7COdd6HlrbY+LnP8t4DH+GixfBjhprU323N8HVPbcrgzs9Zw32RgT7Tm+MrAy3TnTf036WkcBowCqVat2kbJEJE85cQKWLfsrUK1b5yyrkC+f08U3apQTqK69Fiq4P3tIRHLOmojj3DN9PfUrFuf9wc0ICgxwu6QMXayLsBVO6JkBrAKyHBGNMd2Aw9badcaY6y+3wKyy1r4PvA/QrFmzv40XE5E8ZP9+J0ydDVSbNzsD1QsUgPBwZ7Zf27bQujWUKOF2tSKSS/44cIrhk9dQuWQhJg9rTtGC3jt+8mKVXQV0Am7H6db7Bphhrf09C+duA/QwxnQFgnDGYL0NlDTG5Pe0YlUBojzHRwFVgX3GmPxACZzB7mcfPyv914hIXmetM6Pv7GD0n3+GnTud54oUcULUbbc53X3Nmztb2IiI39lz7AyDP1pNkQL5mToinDJFC7pd0gVdbAxWCvAt8K1nlt/twBJjzPPW2v9e5GufBJ4E8LRgPWKtHWCMmQ30wZlJOASY6/mSeZ77KzzPL7LWWk835SfGmP/gDHKvDay+jGsVEW+QmuqsOZU+UB044DxXpozTzXfvvU4LVZMmmuEnIhw+Hc/AiatISknlk7taUaVUYbdLuqiL/ubyBKubccJVMDAOmHMF3/NxYKYxZiywAZjoeXwiMM0ziP04zsxBrLW/G2M+BbYAycB9mkEokockJcH69X8FqmXLnDFVAFWqQPv2Tphq2xbq1XPGVYmIeETHJTHkozUcOZ3Ax3e2oHaFvLEGurE28+FKxpipQENgPs5Mvs25VdiVaNasmV279kpWlhCRy3bmDKxa9VegWrHCeQygTh2nqy/9DD8vm1otIt4jPimFwRNXs2HvCT4c0px2dcq5XdI5jDHrrLXNMnruYi1YA4FYnLWsHki3xoQBrLXWvW2qRcQ7nDzprDt1NlCtXeu0WhnjzPAbOfKvFirN8BORLEpOSWX0J+tZE3mccf2beF24upiLjcFSW72InOvgwXNXSP/tN2egemCgMwj94Yf/muFXsqTb1YpIHpSaann880388MdhXrylAd0bV3K7pEum0aMikjlrYffucwPV9u3Oc0WKQKtW8PzzTqBq0UIz/ETkillreXnBH3y+fh//uKEOg1oFu13SZVHAEpG/pKbCli3nBqooz6oopUs7M/zuuuuvGX6Bge7WKyI+Z8JPu/hg6W6GtKrOAx2vdrucy6aAJeLPkpJgw4a/AtWyZXD8uPNcpUrOQPSzg9Lr19cMPxHJUTNX7+HVb7fSo3Elnu3ewOv2F7wUClgi/iQuzpnhdzZQrVjh7OsHULs29Oz5V6CqUUMz/EQk13y7+QBPzdlEuzrleL1vY/J54f6Cl0IBS8SXRUc7M/zOBqo1a/6a4RcSAsOGOYHq2muhYkW3qxURP7V851EemLGR0KoleXdgGAXy5/3WcgUsEV9y6NC546d+/dUZqJ4/vzPD7x//cAJV69ZQqpTb1YqIsGlfNHdOWUtw2cJ8NLQ5hQv4RjTxjasQ8UfWQmSkE6bOBqpt25znChd2Zvg9+6wTqFq0cB4TEfEiu47EMHTSakoWLsDU4S0oWbiA2yVlGwUskbwiNRX++OPcFqp9+5znSpZ0xk2NHOkEqrAwzfATEa92IDqOQROdrYWnj2zBVSWCXK4oeylgiXir5OS/z/A7dsx5rmLFc7ecadBAM/xEJM84EZvI4ImriY5LYuaoltQoW8TtkrKdApaIt4iLg9Wrz53hFxPjPFerFvTo8VegqllTM/xEJE86k5jM8ClriDx+hinDwmlYuYTbJeUIBSwRt0RHw/Ll587wS0x0glPDhjBkyF97+FXKe9tEiIicLzE5lbunr+fXvSd5d2BTWtUq43ZJOUYBSyS3HD7shKmzgerXX51xVfnzQ9OmMGaME6batHFWTRcR8SGpqZaHZ//Kz9uO8GrvRnRucJXbJeUoBSyRnHJ2ht/ZQPXnn87jhQpBy5bw9NNOoGrZ0tnXT0TER1lree6r3/nq1/08cVNd+jWv5nZJOU4BSyQ7WAtbt54bqPbudZ4rUcJZyHP4cCdQNW0KBXxnKrKIyMW8/eN2pq6IZNR1Nbm7XS23y8kVClgilyM52eniOxuoli6Fo0ed5666yglSjz3mfG7YEAIC3K1XRMQlU5ZH8NYP2+nTtApP3lTX7XJyjQKWSFbExzuD0M8Gql9++WuGX82acPPNfy2bcPXVmuEnIgLM3RjFc1/9zg31KvDKrY3y9ObNl0oBSyQzMTHwxhvw44/O8gkJCc7jDRvCoEF/BarKld2tU0TECy358zAPf/orzYNL8987mpA/wL/W6lPAEsnIxo3Qrx9s3+7s4Td6tBOo2rSBMr47rVhEJDusizzBPdPXU6dCMT4c0oygQP8bJqGAJZKetfDuu/DQQ85SCYsWwfXXu12ViEiese3QaYZPXkOF4gWZMjyc4kH+uW2Xf7XXiVzIyZPQty/cdx906OAMYle4EhHJsr3HzzBo4ioK5s/HtBEtKFesoNsluUYBSwRg5UoIDYW5c+G11+Drr6FcOberEhHJM47GJDD4o9XEJaYwdUQ4VUsXdrskVylgiX9LTXUCVdu2zsy/ZcvgkUe0cbKIyCU4HZ/E0EmrORAdx0dDm1P3quJul+Q6jcES/3XkiLPf34IF0Ls3fPghlCzpdlUiInlKfFIKo6auY+uB03wwuBnNgrXVF6gFS/zVkiVOl+CiRTB+PMyerXAlInKJklNSGTNzAyt2HeP1vo1pX7e82yV5DQUs8S8pKfDcc9CxIxQt6oy9uvdeLQwqInKJrLX835zNfPf7IZ7tXp+eTbQmYHrqIhT/ERUFAwbATz/B4MFOy1XRom5XJSKSJ/37uz+ZtXYv93e4mmFtarhdjtdRwBL/sGCBE6rOnIHJk52xVyIiclk++HkX7y7ZyR0tqvFQpzpul+OV1EUovi0pydl0uWtXqFQJ1q1TuBIRuQKfrdvHv+b/wc2NKvLiLQ39an/BS6EWLPFdu3fD7bfDqlVw993wn/9AoUJuVyUikmf9sOUQj3/+G9deXZb/9GtMQD6Fq8woYIlv+vxzGDHC2frm00+dFdpFROSyrdp1jPs+WU/DSsV5b1BTCub3v/0FL4W6CMW3xMc7swL79IFrrnE2bVa4EhG5Ir/vj2bklLVUKVWIScPCKVJQ7TMXo4AlvuPPP6FlS2ez5ocfhqVLoYZmtoiIXInIY7EM+WgNxYLyM21EC0oXKeB2SXmCIqj4hmnT4J57ICjI2Ufw5pvdrkhEJM87fCqegRNXkZKaytRRralUUuNYs0otWJK3xcTA0KHOEgxNmzpdggpXIiJXLPpMEoM/Ws2xmEQmDwvn6vJaN/BSKGBJ3vXbb9CsGUydCs88Az/+CFWquF2ViEieF5eYwogpa9h1JJb3BzWjcdWSbpeU56iLUPIea+G99+DBB6F0aSdYtW/vdlUiIj4hKSWV+z5Zz7o9Jxh/RxjX1i7rdkl5klqwJG85eRJuu80Zb3X99U6XoMKViEi2SE21PPbZbyzaepixPRvStVFFt0vKsxSwJO9YvRqaNIE5c+DVV2H+fCivndtFRLKDtZax3/zBnA1RPHJjHQa0qO52SXmaApZ4v9RUeOMNaNPGub10qbP9TT79+IqIZJf/LdnJR7/sZlibYO5rf7Xb5eR5GoMl3u3oUWfvwPnzoVcvmDgRSpVyuyoREZ/y8apIXvvuT3o1qczTN9fX/oLZQE0A4r1++gkaN4YffoD//tfZ/kbhSkQkW83fdIB/frmZDnXL8+8+IeTT/oLZQgFLvE9KCrzwAnToAEWKwMqVcN99oP9RiYhkq2Xbj/LgzI00rVaK8XeEERigWJBd1EUo3mX/fhg4EBYvhgEDnG1vihVzuyoREZ/z696TjJq2lprlijBxSHMKFdDmzdlJAUu8x7ffOiuyx8bCRx85K7Sr1UpEJNvtOBzD0EmrKVO0AFOGh1OicKDbJfkctQWK+5KS4PHH4aaboEIFWLsWhg1TuBIRyQH7T8YxeOIqAvLlY9rwFlQoHuR2ST5JLVjirogIuP12Z5zVXXfBm29CIW0mKiKSE47HJjJo4ipOxycz866WBJct4nZJPksBS9wzZw4MH+6sbTVrlrNCu4iI5IjYhGSGTV7DvhNxTB0eToNKJdwuyaepi1ByX3w8jB4Nt94KV18NGzYoXImI5KCE5BTunr6OzVHR/PeOMFrULON2ST5PAUty17Zt0KoVjB8P//gH/PIL1KzpdlUiIj4rJdXy0KxfWbr9KK/c2ohO9Su4XZJfUBeh5J7p0+Huu6FgQfjqK+jWze2KRER8mrWWZ+Zu5ptNB/i/rvXo26yq2yX5DbVgSc6LjXXGWg0aBGFh8OuvClciIrngzYXb+HjVHu5uV4s7r1NvQW5SwJKctWkTNG8OkyfDP/8JixZBlSpuVyUi4vMm/bKbcYt20K9ZVR7vco3b5fgddRFKzrAW3n8fHnwQSpSAhQuhY0e3qxIR8Qtfboji+a+20LlBBf7Vq6E2b3aBWrAk+0VHQ//+znir665zugQVrkREcsXiPw/zyOxfaVWzDG/3b0J+7S/oCr3qkr3WrHHGWX3+Obz8MixY4KzOLiIiOW5d5HHumb6OuhWL8f7gpgQFan9BtyhgSfaw1lmFvU0bSE6Gn3+GJ56AfPoRExHJDVsPnmLYpDVULFGIycPCKRak/QXdpDFYcuWOHXM2Zv76a7jlFmej5tKl3a5KRMRv7D1+hsETV1OoQADTRoRTtmhBt0vye2pekCuzdCk0bgzffw/jxjnb3yhciYjkmiOnExg0cRUJyalMG9GCKqUKu12SoIAllyslBcaOheuvdzZnXrEC7r8fNFNFRCTXnIpPYshHqzl0KoGPhjanToVibpckHuoilEt34AAMHOisaXXHHTBhAhTTP2oRkdwUn5TCnVPWsu3QaT4c0oym1Uu5XZKko4All+b7750V2U+fhokTYdgwtVqJiOSy5JRU7p+xgdURx3mrXyjXX1Pe7ZLkPOoilKxJSoInn4TOnaFcOWc5huHDFa5ERHKZtZYnv9jEwi2HeK57A24Jrex2SZIBtWDJxUVGwu23O+Os7rwT3noLCmsQpYiIG15ZsJXZ6/YxpmNthrQOdrscyYQCllzYl1863YApKTBjhrNCu4iIuGLCTzt57+ddDG5VnQdvqO12OXIB6iKUjCUkwAMPQK9eUKsWrF+vcCUi4qJP1+zllQVb6d64Es91b6D9Bb2cApb83fbt0Lo1vPOOs1nzL7/A1Ve7XZWIiN/67veDPPHFb1xXpxxv9G1MvnwKV95OXYRyrk8+gbvugsBAmDsXevRwuyIREb+2Yucx7p+xgZAqJZkwMIwC+dU2khfoXRJHbCyMGAEDBjgrs2/cqHAlIuKyzVHR3Dl1LdVLF2bS0OYULqB2kbxCAUtg82YID4dJk+Cpp2DJEqhWze2qRET82u6jsQz5aDUlCgUydUQ4pYoUcLskuQSKwv7MWvjwQ2cwe4kSziKiN9zgdlUiIn7vYHQ8Az9chQWmjQinYolCbpckl0gtWP7q1Clnm5tRo+Daa50uQYUrERHXnTyTyOCPVnHyTCJThoVTs1xRt0uSy6CA5Y/WroWwMJg9G/71L/juO7jqKrerEhHxe2cSkxk+eQ0RR8/wwZBmNKpSwu2S5DIpYPkTa51V2Fu3dta5WrLEGXOVTz8GIiJuS0xO5Z7p69m49yTjbg+lda2ybpckV0BjsPzFsWPO3oHz5jmzAz/6CMqUcbsqEREBUlMtj8z+lZ+2HeGVWxvRpWFFt0uSK6SmC3+wbBmEhsKCBU4L1pdfKlyJiHgJay0vfL2Feb/u57Eu19A/XLO4fYECli9LSXHGWF1/PRQsCMuXw5gxoO0VRES8xjuLdjB5eQQjr63BPe1quV2OZBN1Efqqgwdh0CD44QdnD8H33oPixd2uSkRE0pm2MpL/LNxG77AqPNW1nvYX9CEKWL5o4UIYONBZiuGDD5wV2vWPVkTEq3z9236embuZG+qV59XejbS/oI9RF6EvSU6G//s/6NwZypaFNWtg5EiFKxERL/PztiP8Y9ZGmlcvzX/vCCN/gP4c+xq1YPmKvXvh9tvhl1+cFqtx46BwYberEhGR82zYc4K7p6/j6vLF+GBIM4ICA9wuSXKAApYvmDcPhg6FpCT4+GNnhXYREfE62w+dZtjkNZQrVpApw5tTolCg2yVJDlGbZF6WkAAPPgi33ALBwbB+vcKViIiXijoZx+CPVhMYkI9pw1tQvliQ2yVJDlILVl61Ywf06+eEqvvvh9dec5ZiEBERr3MsJoFBE1cRk5DMp3e1oloZDeHwdQpYedHMmc4mzfnzw5w50LOn2xWJiEgmYhKSGTZ5DVEn4pg+sgX1KmrJHH+gLsK85MwZuPNOZzB7o0awcaPClYiIF0tITmHU1LX8vv8U7w4Mo3lwabdLklyigJVX/P47hIfDhx/Ck086GzVX03YKIiLeKiXV8uDMjSzfeYzX+oTQoW4Ft0uSXKQuQm9nrbMx8/33Q7Fi8N13cOONblclIiIXYK3ln19uYsHmgzzdrT63hlVxuyTJZWrB8manTsGAAc5ioa1aOV2CClciIl7v9e//ZMbqvdzXvhYjrq3hdjniAgUsb7V+PTRtCrNmwYsvwvffQ8WKblclIiIX8eHSXYxfvJPbw6vxyI3XuF2OuEQBy9tY66zC3qoVxMU5Y63++U8I0Eq/IiLe7vN1+xj7zR90bXQVY3s21ObNfkxjsLzJ8eMwfDjMnQvdusGkSc6egiIi4vV+/OMQj33+G22uLsOb/UIJ0ObNfk0tWN5i+XIIDYX58+E//3G2v1G4EhHJE1bvPs69H6+nQaXivDeoGQXzq9fB3ylguS01FV5+Ga67zlk49Jdf4B//ADUri4jkCVv2n2LElDVULlWIycPCKVpQnUOSgwHLGBNkjFltjPnVGPO7MeZ5z+M1jDGrjDE7jDGzjDEFPI8X9Nzf4Xk+ON25nvQ8/qcxpnNO1ZzrDh2Cm26Cp56C3r1hwwZo3tztqkREJIv2HDvDkEmrKVowP9NGtKB0kQJulyReIidbsBKADtbaxkAo0MUY0xJ4FXjTWns1cAIY4Tl+BHDC8/ibnuMwxtQH+gMNgC7A/4wxeb/t9ccfnS7Bn3+G995ztr8pUcLtqkREJIsOn45n4MRVJKekMm1EOJVLFnK7JPEiORawrCPGczfQ82GBDsBnnsenAD09t2/x3MfzfEfjTL+4BZhprU2w1u4GdgDhOVV3jktOdmYFduoEJUvC6tXOvoLqEhQRyTOi45IYPHE1R2MSmDQsnKvLF3O7JPEyOToGyxgTYIzZCBwGFgI7gZPW2mTPIfuAyp7blYG9AJ7no4Ey6R/P4GvSf69Rxpi1xpi1R44cyYGryQb79kH79vCvf8HQobB2rbOnoIiI5BnxSSncOWUtO4/E8N6gpoRWLel2SeKFcjRgWWtTrLWhQBWcVqe6Ofi93rfWNrPWNitXrlxOfZvL99VX0LixM85q2jRn+5siRdyuSkRELkFSSiqjP1nPmsjjvNkvlLa1vfDvjXiFXJlFaK09CSwGWgEljTFnp1hUAaI8t6OAqgCe50sAx9I/nsHXeL/ERHjoIejRw9mcef16GDjQ7apEROQSpaZaHv/8N3744zAv3tKQbiGV3C5JvFhOziIsZ4wp6bldCOgE/IETtPp4DhsCzPXcnue5j+f5RdZa63m8v2eWYQ2gNrA6p+rOVjt3Qps28OabMHo0rFgBdeq4XZWIiFwiay0vzf+DL9ZH8VCnOgxsWd3tksTL5eRiHRWBKZ4Zf/mAT621XxtjtgAzjTFjgQ3ARM/xE4FpxpgdwHGcmYNYa383xnwKbAGSgfustSk5WHf2mDUL7rzT2eLm88/h1lvdrkhERC7Tuz/t5MNluxnaOpj7O1ztdjmSBxinkci3NGvWzK5du9adbx4XBw8+CO+/Dy1bwowZEBzsTi0iInLFZqzew5NfbKJnaCX+c1so+bQFjngYY9ZZa5tl9JxWcs9OW7ZAeLgTrh57zFnjSuFKRCTP+nbzAf5vziauv6Ycr/VtrHAlWab1/LODtc7GzPff78wMXLAAunRxuyoREbkCy3cc5YEZG2lSrRTvDmhKYIDaJCTr9NNypU6fhkGDYMQIaNECNm5UuBIRyeN+23eSO6eupUbZInw0pDmFCuT9DUQkdylgXYkNG6BpU2ec1fPPw8KFUEnTdkVE8rKdR2IYOmkNpYoUYOqIcEoUDnS7JMmDFLAuh7Xw3/86g9hjY2HRInjmGWfGoIiI5FkHouMYPHE1+QxMG9GCCsWD3C5J8iiNwbpUcXEwYADMmQNdu8LkyeCNK8eLiMglORGbyOCJqzkVl8SMUS2pUVa7bcjlUwvWpQoKggIF4PXXne1vFK5ERPK82IRkhk1eQ+TxM3wwpBkNK5dwuyTJ49SCdamMccZcGU3VFRHxBYnJqdw9fR2/7TvJhIFNaVmzjNsliQ9QwLocClciIj4hJdXy0KcbWbr9KP/uE8KNDa5yuyTxEeoiFBERv2St5bl5v/P1bwd48qa63NasqtsliQ9RwBIREb/01g/bmbYykrva1eSudrXcLkd8jAKWiIj4nSnLI3j7x+3c1qwKT3Sp63Y54oMUsERExK/M3RjFs/N+58b6FXipVyOMxtVKDtAgdxER8QupqZZ5v+7nkdm/0qJGacbd3oT82l9QcogCloiI+LS4xBQ+W7+Pj5btZvfRWEKqlODDIc0ICtTuG5JzFLBERMQnHT4dz7QVkUxfGcmJM0k0rlKCd25vwk0Nr1LLleQ4BSwREfEpfx48zYdLdzF3436SUlPpVK8CI9vWpHlwKY23klyjgCUiInmetZal24/y4bLd/LztCEGB+ejXvCrDr62hPQXFFQpYIiKSZyUkpzBv434mLtvN1oOnKVesII92voY7wqtRqkgBt8sTP6aAJSIiec6J2EQ+XhXJlBWRHDmdQN2rivF638Z0b1yRgvk1eF3cp4AlIiJ5xu6jsUxctovP1u0jPimV6+qU4z+31eDaq8tqfJV4FQUsERHxatZaVu8+zofLdvPDH4cIzJePnk0qMeLamlxzVTG3yxPJkAKWiIh4paSUVBZsPsiHS3fx275oShUO5P72VzOwVXXKFwtyuzyRC1LAEhERr3IqPolZq/cyeXkEUSfjqFm2CGN7NqR3WBUKFdD4KskbFLBERMQr7Dtxhsm/RDBzzV5iEpJpUaM0z/doQIe65cmXT+OrJG9RwBIREVf9uvckHyzdxYLNBwHoFlKRkdfWpFGVEi5XJnL5FLBERCTXpaRafvjjEB8u3cWaiBMUK5ifEdfWYGjrYCqVLOR2eSJXTAFLRERyzZnEZD5b52y8HHHsDJVLFuLpbvXp17wqRQvqT5L4Dv00i4hIjjt8Kp4pKyL4eNUeTp5JIrRqScZ3rkvnBhW08bL4JAUsERHJMX8cOMWHS3cz79coklMtnetfxci2NWhaXRsvi29TwBIRkWxlreWnbUeYuGw3S7cfpVBgAHeEV2P4tTWoXkYbL4t/UMASEZFsEZ/kbLz84bJdbDsUQ4XiBXmsi7PxcsnC2nhZ/IsCloiIXJHjsYlMXxnJ1BURHI1JpO5VxXijb2O6N65EgfwaXyX+SQFLREQuy84jMUxctpvP1+0jITmV9teUY2TbmrSuVUbjq8TvKWCJiEiWWWtZues4E5ft4oc/DlMgfz5ubVKZEdfWoHYFbbwscpYCloiIXFRSSirzNx3gg6W72Bx1itJFCvBAx9oMalmdcsUKul2eiNdRwBIRkUxFxyUxc/UeJi+P4EB0PDXLFeGlXo24NawyQYHaeFkkMwpYIiLyN3uPn2HSLxHMWrOH2MQUWtUsw796NeT6Otp4WSQrFLBERCTNhj0n+HDpbhZsPkA+Y+jeuBIjrq1Bw8raeFnkUihgiYj4uZRUy8ItB/lg6W7WRZ6gWFB+7ryuJkNbB1OxhDZeFrkcClgiIn4qNiGZ2Wv38tEvEew5foaqpQvxbPf63NasKkW08bLIFdG/IBERP3Mw2rPx8spITsUnE1atJE/eVJcbG1xFgMZXiWQLBSwRET/x+/5oJi7dzVe/7Scl1dK5wVWMbFuTptVLuV2aiM9RwBIR8WGpqc7Gyx8s3cXynccoXCCAAS2qM7xNDaqVKex2eSI+SwFLRMQHxSel8OWGKD5ctpsdh2O4qngQT9xUl9vDq1GiUKDb5Yn4PAUsEREfciwmgWkrI5m2IpJjsYnUr1icN/s15uZG2nhZJDcpYImI+IAdh2OYuGwXn6+PIjE5lQ51yzOybQ1a1dTGyyJuUMASEcmjrLWs2HmMD5ftZtHWwxTMn4/eYVUYcW0Nri5f1O3yRPyaApaISB6TmJzKN5v288HPu9ly4BRlihTgHzfUYWDLapQpqo2XRbyBApaISB4RfSaJT1bvYcryCA6eiufq8kV55dZG9GyijZdFvI0CloiIl9tz7Awf/bKbT9fu5UxiCm2uLsPLvRvRrnY5bbws4qUUsEREvNS6yBN8uHQX3/1+kIB8f2283KCSNl4W8XYKWCIiXiQl1fLd7wf5YOkuNuw5SfGg/NzVrhZDWgVzVYkgt8sTkSxSwBIR8QIxCcl8umYvk5bvZu/xOKqVLszzPRrQp2kVbbwskgfpX62IiIsORMcxeXkEn6zaw+n4ZJpVL8X/da1Pp/oVtPGySB6mgCUi4oLNUdF8uHQXX/92gFRrualhRUa2rUGTatp4WcQXKGCJiOSS1FTL4j8P88HSXazcdZwiBQIY3CqYYW2CqVpaGy+L+BIFLJFMHIiOY/6mgxQIMJQtWpCyxQo6n4sWoGjB/Np+RLIsPimFz9fvY+Ky3ew6EkvFEkE81bUu/Zpr42URX6WAJZKOtZZVu48zdUUE3/1+iJRUm+FxBfPnSwtd5YoW8AQvJ3yV8dwuV8x5vEShQIUxP3U0JoGpKyKZvjKS47GJNKxcnLf7h9K1UUUCA7TxsogvU8ASAc4kJvPlhv1MXRHB1oOnKVEokJHX1uCOFtUoVCCAo6cTORqTkO4jkaOnEzgSk8D+k/H8ti+aY7GJGQaywABDmSIFKVssfRBzwli5YufeL1W4gBaO9AHbD53mw6W7mbPR2Xj5hnrlGdm2Ji1qlFbYFvETClji1yKPxTJtRSSfrt3Lqfhk6lUszqu9G9GjcWUKFfhr65HyxS6+/lBqquVkXJITwDzh62hMYtr9s8Hsz4OnORqTQFLK38NYPgOli5wfvtIFs2Ke54oWpHSRAuRXK4jXsNbyy45jfLhsF0v+PELB/Pno27QKw6+tQa1y2nhZxN8oYInfSU21/Lz9CFNXRLL4z8MEGEOXhlcxpHUwzaqXuuwWhnz5DKWLFKB0kQLUqVDsgsdaazkVl+wJYQkcizm3heyIp8Vs99FYjsYkEJ+U+rdzGAOlChdwuiWL/BW+yhYtSLmi57aYlSlagIL5tVddTkhMTuWrX/fz4bLd/HHgFGWLFuChTnUY2LI6pYsUcLs8EXGJApb4jVPxSXy2dh/TVkay+2gsZYsW5P4OtRnQohoViufuCtnGGEoUDqRE4UCuLn/h1g1rLbGJKelawRI44umiPJouoG3ad5KjMYnEJCRneJ7iQfnTBuqXS9cyVubs7WJnHy94TuudZOzkmUQ+XuVsvHz4dAJ1KhTl371D6BFaSRsvi4gClvi+7YdOM2VFBF+sj+JMYgph1UryYP9QbmpYkQL5vb+LzRhD0YL5KVowP8Fli1z0+LjElHPHip3XRXkkJoE/Dp7i6OkETsVnHMaKFAg4Z9Zk+i7K9IP6y/jhjMqIo7F89MtuZq/dR1xSCm1rl+W1vo25rnZZv3odROTCFLDEJyWnpPLj1sNMWR7B8p3HKJA/Hz0aV2JIq2AaVfHtjXILFQigaunCWVpXKSE5hWMxiWldlGe7LNMP6t99NJY1ESc4cSYRm8GkyqDAfGldlOfPqCybbhB/uaIFKV4ob4Yxay1rPRsvf7/lEPnzGW4JrcyIa2tQr2Jxt8sTES+kgCU+5XhsIrPW7GX6ykiiTsZRqUQQj3W5hn7NqlKmaEG3y/M6BfMHUKlkISqVLHTRY5NTUjkem/jX4P3TCX9rKYs6Gc+v+6I5nsmMygIB+SiT1jV5bhjzxhmVySmpfPv7QT5Yuptf956kRKFA7r3e2Xi5fC53K4tI3qKAJT5hc1Q0U5ZHMPfX/SQmp9KqZhme7lafG+qV10y7bJI/IB/liwdlKVikplpOnEn8q4syJoEjpxPOuX80JoGtB05zLDbjGZUBnkkDaQEs3SzK9IP6c2JG5en4JGat2cukXyKIOhlHcJnCvHhLA3o3rULhAvq1KSIXp98UkmclJqeyYPMBpiyPYP2ekxQuEMBtzaowuFXwRWfxSc7Kl89QxjOA/houPqMyOi7p3PB1Xhg7EpPIriPOjMqE5AvPqDxnrbFi6WZVeu6XKVIw07F3+086Gy/PWLWH0wnJhAeX5pnu9bmhnjZeFpFLo4Alec6hU/F8smoPn6zew5HTCQSXKcwz3erTu2kVbTuSBxljKFm4ACULF8jSjMqYhOS/Dd4/4rl/zNNd+eu+kxw9nUBsYkqG58loRuWx2EQWbD4IwE0Nr2Jk25qEVi2Z3ZcrIn5CAUvyBGst6yJPMGVFJAs2HSDFWq6vU44hrYO5rnY518fqSO4wxlAsKJBiQYHUuIQZlUcyaBU7O5j/jwOnOBKTAMCw1sEMbRNMlVLaeFlErowClni1+KQU5m3cz+TlEWw5cIpiQfkZ0jqYQS2rZ2nJAvFvlzKj0lqbJ2c4ioh3UsASr7T3+Bmmr4pk1pq9nDyTxDUVivFSr0b0bFJJg4wlRyhciUh20l8q8Rpn93KbsiKCH/84hDGGG+tXYEjrYG2SKyIieYoClrguJiGZL9bvY8ryCHYeiaV0kQLcc30tBrSonqX1mURERLyNApa4ZueRGKatiOSzdfuISUgmpEoJ3ujbmJtDKmovNxERydMUsCRXpaRaFm89zJQVESzdfpTAAEO3kEoMblWdJtVKuV2eiIhItlDAklxx8kwin67dy7SVkew9HkeF4gV5uFMd+odXo1wxbWEjIiK+RQFLctSW/aeYuiKCLzdGEZ+USniN0jzRpR43NqhAoLawERERH6WAJdkuKSWV734/yNTlkayOOE5QYD56NanMoJbB1K9U3O3yREREcpwClmSbI6cTmLF6Dx+viuTQqQSqli7E/3WtR99mVShZuIDb5YmIiOQaBSy5ItZaNu49yZTlEXyz6QBJKZa2tcvyUq9GXH9NeW2QKyIifkkBSy5LfFIK3/x2gCkrIvhtXzRFC+ZnQIvqDGpVnVrlLrxhr4iIiK9TwJJLsv9kHB+vimTG6r0cj02kVrkivHBLA24Nq0LRgvpxEhERAQUsyQJrLSt3HWfqigi+33IIay0d61VgaOtgWtcqoy1sREREzqOAJZk6k5jMnA1RTF0eyZ+HTlOycCAj29ZgYIvqVC1d2O3yREREvJYClvxNxNFYpq2M5NO1ezkdn0z9isX5d+8QeoRW0hY2IiIiWaCAJQCkplp+2n6EqcsjWLLtCAHGcFOjigxpVZ2m1UupG1BEROQSKGD5uei4JD5bt49pKyKIOHaGcsUK8kCH2tzRohoVige5XZ6IiEiepIDlp/48eJqpKyKYsyGKM4kpNK1ein90qsNNDStSIL+2sBEREbkSClh+JDkllR/+OMSU5ZGs2HWMAvnzcUvjSgxpHUzDyiXcLk9ERMRnKGD5geOxic4WNisj2R8dT+WShXi8S136Na9K6SLawkZERCS7KWD5sE37opm8PIKvfttPYnIqba4uw7M9GtCxbnnyB6gbUEREJKcoYPmYxORU5m9ytrDZsOckhQsE0K9ZVQa3qk7tCsXcLk9ERMQvKGD5iEOn4vl4ZSSfrN7L0ZgEapQtwrPd69O7aRWKBwW6XZ6IiIhfUcDKw6y1rI08weTlEXy3+SAp1tL+mvIMaR1M26vLki+f1q4SERFxQ44FLGNMVWAqUAGwwPvW2reNMaWBWUAwEAHcZq09YZyVLN8GugJngKHW2vWecw0B/uk59Vhr7ZScqjsviEtMYe7GKKasiOSPA6coHpSfoa2DGdSqOtXLFHG7PBEREb+Xky1YycDD1tr1xphiwDpjzEJgKPCjtfYVY8wTwBPA48BNQG3PRwvgXaCFJ5A9CzTDCWrrjDHzrLUncrB2r7T3+Bmmr4xk5pq9RMclUfeqYrx8ayNuCa1E4QJqjBQREfEWOfZX2Vp7ADjguX3aGPMHUBm4Bbjec9gUYAlOwLoFmGqttcBKY0xJY0xFz7ELrbXHATwhrQswI6dq9ybWWpbtOMqU5ZH8uPUQ+Yyhc4MKDGkVTHiN0trCRkRExAvlSrOHMSYYaAKsAip4whfAQZwuRHDC1950X7bP81hmj5//PUYBowCqVauWjdW743R8El+sj2LKigh2HYmlTJEC3Hf91QxoWY2KJQq5XZ6IiIhcQI4HLGNMUeBz4EFr7an0LS7WWmuMsdnxfay17wPvAzRr1ixbzumGHYdjmLYigs/W7SM2MYXGVUvyn9sac3NIRQrmD3C7PBEREcmCHA1YxphAnHD1sbX2C8/Dh4wxFa21BzxdgIc9j0cBVdN9eRXPY1H81aV49vElOVl3bktJtSzaepipKyJYuv0oBQLy0S2kIoNbBxNataTb5YmIiMglyslZhAaYCPxhrf1PuqfmAUOAVzyf56Z7fLQxZibOIPdoTwj7DnjJGFPKc9yNwJM5VXduOhGbyKdr9zJtZST7TsRxVfEgHrmxDv3Dq1G2aEG3yxMREZHLlJMtWG2AQcAmY8xGz2NP4QSrT40xI4BI4DbPc/NxlmjYgbNMwzAAa+1xY8yLwBrPcS+cHfCeV/2+P5qpyyP5cmMUCcmphNcozVNd69GpfgUCtYWNiIhInmecSXu+pVmzZnbt2rVul3GOpJRUvt18kKkrIlgTcYKgwHz0alKFwa2qU69icbfLExERkUtkjFlnrW2W0XNaPCmHHT4dz4xVe/l4VSSHTydQrXRh/nlzPfo2rUqJwtrCRkRExBcpYOUAay3r95xk6ooI5m86QFKK5bo65Xild3Xa1SlPgLawERER8WkKWNkoPimFr37dz9QVkWyKiqZYwfwMbFmdQS2rU7NcUbfLExERkVyigJUNok7GOVvYrN7DiTNJ1C5flBd7NqRXk8oULaiXWERExN/or/9lstayYtcxpiyPYOGWQwDcUK8CQ1sH06pWGW1hIyIi4scUsC5RckoqM9fsZeqKCLYdiqFk4UBGXVeLgS2rUaVUYbfLExERES+ggHWJAvIZJv2ym6DAAP7dJ4QejSsRFKgtbEREROQvCliXyBjD7LtbU6pwoLoBRUREJEMKWJehdJECbpcgIiIiXkz7soiIiIhkMwUsERERkWymgCUiIiKSzRSwRERERLKZApaIiIhINlPAEhEREclmClgiIiIi2UwBS0RERCSbKWCJiIiIZDMFLBEREZFspoAlIiIiks0UsERERESymQKWiIiISDZTwBIRERHJZgpYIiIiItlMAUtEREQkmylgiYiIiGQzBSwRERGRbKaAJSIiIpLNFLBEREREspkCloiIiEg2U8ASERERyWbGWut2DdnOGHMEiMzhb1MWOJrD38Pb+OM1g39et67Zf/jjdeua/UdOX3d1a225jJ7wyYCVG4wxa621zdyuIzf54zWDf163rtl/+ON165r9h5vXrS5CERERkWymgCUiIiKSzRSwLt/7bhfgAn+8ZvDP69Y1+w9/vG5ds/9w7bo1BktEREQkm6kFS0RERCSbKWBdgDHmI2PMYWPM5kyeN8aYccaYHcaY34wxYbldY3bLwjVfb4yJNsZs9Hw8k9s1ZjdjTFVjzGJjzBZjzO/GmDEZHOOL73VWrtun3m9jTJAxZrUx5lfPNT+fwTEFjTGzPO/1KmNMsAulZpssXvNQY8yRdO/zSDdqzQnGmABjzAZjzNcZPOdT7/VZF7lmn3yvjTERxphNnmtam8Hzuf47PH9Of4M8bjLwX2BqJs/fBNT2fLQA3vV8zssmc+FrBlhqre2WO+XkimTgYWvtemNMMWCdMWahtXZLumN88b3OynWDb73fCUAHa22MMSYQWGaMWWCtXZnumBHACWvt1caY/sCrQD83is0mWblmgFnW2tEu1JfTxgB/AMUzeM7X3uuzLnTN4LvvdXtrbWZrXuX673C1YF2AtfZn4PgFDrkFmGodK4GSxpiKuVNdzsjCNfsca+0Ba+16z+3TOL+YKp93mC++11m5bp/ief9iPHcDPR/nD0S9BZjiuf0Z0NEYY3KpxGyXxWv2ScaYKsDNwIeZHOJT7zVk6Zr9Va7/DlfAujKVgb3p7u/Dx/9AebTydDcsMMY0cLuY7OTpImgCrDrvKZ9+ry9w3eBj77en+2QjcBhYaK3N9L221iYD0UCZXC0ym2XhmgF6e7pOPjPGVM3dCnPMW8BjQGomz/vce83Frxl88722wPfGmHXGmFEZPJ/rv8MVsORSrcfZGqAx8A7wpbvlZB9jTFHgc+BBa+0pt+vJLRe5bp97v621KdbaUKAKEG6MaehySTkuC9f8FRBsrQ0BFvJXq06eZYzpBhy21q5zu5bcksVr9rn32uNaa20YTlfgfcaY69wuSAHrykQB6dN/Fc9jPstae+psd4O1dj4QaIwp63JZV8wzNuVz4GNr7RcZHOKT7/XFrttX328Aa+1JYDHQ5byn0t5rY0x+oARwLFeLyyGZXbO19pi1NsFz90OgaS6XlhPaAD2MMRHATKCDMWb6ecf42nt90Wv20fcaa22U5/NhYA4Qft4huf47XAHryswDBntmJ7QEoq21B9wuKicZY646O0bBGBOO8zOUl38h4bmeicAf1tr/ZHKYz73XWbluX3u/jTHljDElPbcLAZ2ArecdNg8Y4rndB1hk8/CCgVm55vPGovTAGY+Xp1lrn7TWVrHWBgP9cd7Hgecd5lPvdVau2Rffa2NMEc9EHYwxRYAbgfNnwuf673DNIrwAY8wM4HqgrDFmH/AszgBRrLUTgPlAV2AHcAYY5k6l2ScL19wHuMcYkwzEAf3z8i8kjzbAIGCTZ5wKwFNANfDd95qsXbevvd8VgSnGmACcsPiptfZrY8wLwFpr7Tyc0DnNGLMDZ8JHf/fKzRZZueYHjDE9cGaWHgeGulZtDvPx9zpDfvBeVwDmeP4vmB/4xFr7rTHmbnDvd7hWchcRERHJZuoiFBEREclmClgiIiIi2UwBS0RERCSbKWCJiIiIZDMFLBEREZFspoAlItnCGNPTGGONMXXTPRZqjOma7v71xpjWFzhHD2PME57bk40xfS6xhqcup/YMzvOcMSbKGLPRGLPdGPOFMaZ+uuc/TH8/i+cMNsacvzZPtjHGDDXG/Denzi8il0YBS0Syy+3AMs/ns0Jx1p4563ogw4BljMlvrZ1nrX3lCmrIloDl8aa1NtRaWxuYBSwyxpQDsNaOtNZuycbvJSI+RgFLRK6YZz/Da4EReBZrNMYUAF4A+nlagh4H7gb+4bnf1tNKNcEYswr4dwatMDcYY9YaY7Z59ln7W0uNMeZrT8vYK0Ahz7k/9jw30Biz2vPYe8bZ9DjA8303G2M2GWP+cbHrs9bOAr4H7vCcd4kxpllm5zLGXG2M+cE4m2SvN8bUOu/1CjLGTPJ8zQZjTHvP4w3S1fubMaZ2ZtfheXyY57VZjbNwrIh4Ca3kLiLZ4RbgW2vtNmPMMWNMU2vtOmPMM0Aza+1oSNuqJcZa+7rn/gicPcFaW2tTjDFDzztvMM6eYrWAxcaYqzMrwFr7hDFmtGdTY4wx9YB+QBtrbZIx5n/AAOB3oLK1tqHnuJJZvMb1QN3zHgvN5FwfA69Ya+cYY4Jw/jNbPt3X3eeUbBt5ulS/N8bUwQmgb1trP/YE1IDMrsMYsxB4HmcvuWicPQY3ZPFaRCSHqQVLRLLD7Tiby+L5fPsFjj3fbGttSibPfWqtTbXWbgd28feAcyEdccLHGs9WQB2Bmp7z1DTGvGOM6QKcyuL5TAaP/e1cxtkTrbK1dg6AtTbeWnvmvK+7FpjueX4rEAnUAVYAT3la+6pba+MucB0tgCXW2iPW2kScbkwR8RJqwRKRK2KMKQ10ABoZYywQAFhjzKNZPEXsBZ47fy8vi7OHWvr/HAZlVhowxVr7ZAY1NwY647QY3QYMz0KdTYC15xRj7YkMzjUmC+fKkLX2E0936c3AfGPMXZldhzGm5+V+HxHJeWrBEpEr1QeYZq2tbq0NttZWBXYDbYHTQLF0x55//2L6GmPyecYw1QT+BCKAUM/jVXG6EM9KMsYEem7/CPQxxpQHJwgaY6obY8oC+ay1nwP/BMIuVoQxpjdwIzDjvMf/di5r7Wlg39kAZIwpaIwpfN4pl+J0V+LpGqwG/GmMqQnsstaOA+YCIZldB7AKaGeMKeO55r4Xuw4RyT1qwRKRK3U78Op5j33uefz/gCc8XVsvA18BnxljbgHuz8K59wCrgeLA3dbaeGPMLzgBbgvwB87YqLPeB34zxqy31g4wxvwTZ3xTPiAJZ+xTHDDJ8xjA31q4PP5hjBkIFAE2Ax2stUfOO6ZyJucaBLxnjHnB8337Aqnpvu5/wLvGmE04LXJDrbUJxpjbgEHGmCTgIPCStfZ4RtdhrV1pjHkOp1vxJLDxAq+jiOQyY+35LfAiIiIiciXURSgiIiKSzRSwRERERLKZApaIiIhINlPAEhEREclmClgiIiIi2UwBS0RERCSbKWCJiIiIZDMFLBEREZFs9v+2Y/FLwyFGlwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize =(10, 10))\n", + " \n", + "# Creating axes instance\n", + "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", + "\n", + "new_labels = [int(i) for i in labels]\n", + "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", + "\n", + "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", + "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "\n", + "plt.ylabel(\"Milliseconds\")\n", + "plt.xlabel(\"Attributes Disclosed\")\n", + "\n", + "plt.legend()\n", + "plt.savefig(\"fixed_attributes_disclosed_variables_credentials_presented_averages.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "1c95eb4a", + "metadata": {}, + "source": [ + "## Terminate Controller\n", + "\n", + "Whenever you have finished with this notebook, be sure to terminate the controller. This is especially important if your business logic runs across multiple notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa96d3b4", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7f7db47", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/prover/example.env b/playground/prover/example.env index e44df3b..15483f0 100644 --- a/playground/prover/example.env +++ b/playground/prover/example.env @@ -3,7 +3,7 @@ # Replace these with real values when deploying to a real environment # For postgres DB which hosts the wallets -WALLET_DB_HOST=issuer-wallet-db +WALLET_DB_HOST=prover-wallet-db WALLET_DB_PORT=5432 WALLET_DB_USER=postgres WALLET_DB_PASS=dbpass @@ -13,7 +13,7 @@ WALLET_DB_ADMIN_PASS=dbpass # These values are only used locally by docker-compose to set up the DB container - should match values above POSTGRES_PASSWORD=dbpass POSTGRES_USER=postgres -POSTGRES_DB=issuer_wallet +POSTGRES_DB=prover_wallet # for tails server # ACAPY_TAILS_SERVER_BASE_URL=http://tails-server:6543 @@ -22,28 +22,24 @@ POSTGRES_DB=issuer_wallet HTTP_PORT=3020 WEBHOOK_PORT=3010 ADMIN_PORT=3021 -ADMIN_URL=http://issuer-agent:3021 +ADMIN_URL=http://prover-agent:3021 ACAPY_OUTBOUND_TRANSPORT=http ACAPY_ADMIN=[0.0.0.0,3021] # Only used if run ./manage production # Typically you will want to update 0.0.0.0 to some public IP -ACAPY_ENDPOINT=http://0.0.0.0:3020 +ACAPY_ENDPOINT=http://prover-agent:3020 -ACAPY_WEBHOOK_URL=http://issuer-business-logic:3010 +ACAPY_WEBHOOK_URL=http://prover-business-logic:3010 ACAPY_ADMIN_API_KEY=adminApiKey # DO NOT USE IN INSECURE MODE # ACAPY_ADMIN_INSECURE_MODE=true -ACAPY_LABEL=Issuer +ACAPY_LABEL=Prover ACAPY_WALLET_NAME=Alice_Name -ACAPY_WALLET_KEY=issuer_key +ACAPY_WALLET_KEY=prover_key ACAPY_WALLET_TYPE=indy -ACAPY_WALLET_STORAGE_TYPE=postgres_storage -ACAPY_WALLET_SEED=0000000000000000000000IssuerAny1 -ACAPY_WALLET_STORAGE_CONFIG={"url":"issuer-wallet-db:5432","wallet_scheme":"MultiWalletSingleTable"} -ACAPY_WALLET_STORAGE_CREDS={"account":"postgres","password":"dbpass","admin_account":"postgres","admin_password":"dbpass"} ACAPY_AUTO_PROVISION=true @@ -61,7 +57,7 @@ ACAPY_GENESIS_FILE=/home/indy/von-local-genesis-txns # Name of ngrok container if exposing agent endpoint over ngrok -NGROK_NAME= ngrok-issuer +NGROK_NAME= ngrok-prover @@ -81,9 +77,9 @@ ACAPY_PRESERVE_EXCHANGE_RECORDS=true # Optional Trace Arguments -ACAPY_TRACE=true -ACAPY_TRACE_TARGET=log -ACAPY_TRACE_LABEL=Issuer +#ACAPY_TRACE=true +#ACAPY_TRACE_TARGET=log +#ACAPY_TRACE_LABEL=Prover # Timing arguments ACAPY_TIMING=true @@ -93,4 +89,4 @@ ACAPY_TIMING_LOG=/home/indy/logs/timing.txt ACAPY_DEBUG=true ACAPY_LOG_LEVEL=debug -ACAPY_LOG_FILE=/home/indy/logs/agent_logs.txt \ No newline at end of file +# ACAPY_LOG_FILE=/home/indy/logs/agent_logs.txt \ No newline at end of file diff --git a/playground/prover/notebooks/prover.ipynb b/playground/prover/notebooks/prover.ipynb new file mode 100644 index 0000000..42cbce3 --- /dev/null +++ b/playground/prover/notebooks/prover.ipynb @@ -0,0 +1,310 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e40b05fb", + "metadata": {}, + "source": [ + "# ACA-Py & ACC-Py Basic Template\n", + "\n", + "## Copy this template into the root folder of your notebook workspace to get started" + ] + }, + { + "cell_type": "markdown", + "id": "e8a4ea98", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cfcdbac0", + "metadata": {}, + "outputs": [], + "source": [ + "from aries_cloudcontroller import AriesAgentController\n", + "import os\n", + "from termcolor import colored" + ] + }, + { + "cell_type": "markdown", + "id": "4667a23a", + "metadata": {}, + "source": [ + "### Initialise the Agent Controller" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "37db385d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://prover-agent:3021 and an api key of adminApiKey\n" + ] + } + ], + "source": [ + "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", + "admin_url = os.getenv(\"ADMIN_URL\")\n", + "\n", + "print(f\"Initialising a controller with admin api at {admin_url} and an api key of {api_key}\")\n", + "agent_controller = AriesAgentController(admin_url,api_key)" + ] + }, + { + "cell_type": "markdown", + "id": "4e3a0f24", + "metadata": {}, + "source": [ + "### Start a Webhook Server" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ae78df31", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Listening for webhooks from agent at http://0.0.0.0:3010\n" + ] + } + ], + "source": [ + "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", + "webhook_host = \"0.0.0.0\"\n", + "\n", + "await agent_controller.init_webhook_server(webhook_host, webhook_port)\n", + "\n", + "print(f\"Listening for webhooks from agent at http://{webhook_host}:{webhook_port}\")" + ] + }, + { + "cell_type": "markdown", + "id": "59bfcbf5", + "metadata": {}, + "source": [ + "## Register Agent Event Listeners\n", + "\n", + "You can see some examples within the webhook_listeners recipe. Copy any relevant cells across and customise as needed." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "45a0063d", + "metadata": {}, + "outputs": [], + "source": [ + "listeners = []\n", + "\n", + "# Receive connection messages\n", + "def connections_handler(payload):\n", + " state = payload['state']\n", + " connection_id = payload[\"connection_id\"]\n", + " their_role = payload[\"their_role\"]\n", + " routing_state = payload[\"routing_state\"]\n", + " \n", + " print(\"----------------------------------------------------------\")\n", + " print(\"Connection Webhook Event Received\")\n", + " print(\"Connection ID : \", connection_id)\n", + " print(\"State : \", state)\n", + " print(\"Routing State : \", routing_state)\n", + " print(\"Their Role : \", their_role)\n", + " print(\"----------------------------------------------------------\")\n", + "\n", + " if state == \"invitation\":\n", + " # Your business logic\n", + " print(\"invitation\")\n", + " elif state == \"request\":\n", + " # Your business logic\n", + " print(\"request\")\n", + "\n", + " elif state == \"response\":\n", + " # Your business logic\n", + " print(\"response\")\n", + " elif state == \"active\":\n", + " # Your business logic\n", + " print(colored(\"Connection ID: {0} is now active.\".format(connection_id), \"green\", attrs=[\"bold\"]))\n", + "\n", + "\n", + "\n", + "connection_listener = {\n", + " \"handler\": connections_handler,\n", + " \"topic\": \"connections\"\n", + "}\n", + "\n", + "listeners.append(connection_listener)\n", + "\n", + "agent_controller.register_listeners(listeners)" + ] + }, + { + "cell_type": "markdown", + "id": "51a6e5b1", + "metadata": {}, + "source": [ + "## Accept Invitation\n", + "\n", + "Copy an invitation object from another agent playing the role inviter (see the inviter_template recipe)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "49f9b228", + "metadata": {}, + "outputs": [], + "source": [ + "invitation = {'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': '461920e6-8c56-4665-8171-bf80531b6007', 'label': 'Issuer', 'recipientKeys': ['7e2GBXu7opBR2c7awJD8m9yvyF6yMancFebisdGKT7gd'], 'serviceEndpoint': 'http://issuer-agent:3020'}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "490c94ff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 8ba709c5-ba62-4213-b6bd-ff17c84a4af6\n", + "State : invitation\n", + "Routing State : none\n", + "Their Role : inviter\n", + "----------------------------------------------------------\n", + "invitation\n", + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 8ba709c5-ba62-4213-b6bd-ff17c84a4af6\n", + "State : request\n", + "Routing State : none\n", + "Their Role : inviter\n", + "----------------------------------------------------------\n", + "request\n", + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 8ba709c5-ba62-4213-b6bd-ff17c84a4af6\n", + "State : response\n", + "Routing State : none\n", + "Their Role : inviter\n", + "----------------------------------------------------------\n", + "response\n", + "----------------------------------------------------------\n", + "Connection Webhook Event Received\n", + "Connection ID : 8ba709c5-ba62-4213-b6bd-ff17c84a4af6\n", + "State : active\n", + "Routing State : none\n", + "Their Role : inviter\n", + "----------------------------------------------------------\n", + "\u001b[1m\u001b[32mConnection ID: 8ba709c5-ba62-4213-b6bd-ff17c84a4af6 is now active.\u001b[0m\n" + ] + } + ], + "source": [ + "auto_accept=\"true\"\n", + "alias=None\n", + "\n", + "invite_response = await agent_controller.connections.receive_invitation(invitation, alias, auto_accept)\n", + "connection_id = invite_response[\"connection_id\"]" + ] + }, + { + "cell_type": "markdown", + "id": "3d4e1b6a", + "metadata": {}, + "source": [ + "## Your Own Business Logic\n", + "\n", + "Now you should have an established, active connection you can write any custom logic you want to engage with protocols with the connection" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "5a668f2f", + "metadata": {}, + "outputs": [], + "source": [ + "response = await agent_controller.credentials.get_all(count=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "670510d3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "36" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(response[\"results\"])" + ] + }, + { + "cell_type": "markdown", + "id": "ac41ee8b", + "metadata": {}, + "source": [ + "## Terminate Controller\n", + "\n", + "Whenever you have finished with this notebook, be sure to terminate the controller. This is especially important if your business logic runs across multiple notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d4951cf", + "metadata": {}, + "outputs": [], + "source": [ + "await agent_controller.terminate()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/playground/verifier/example.env b/playground/verifier/example.env index 8043480..1d5ba90 100644 --- a/playground/verifier/example.env +++ b/playground/verifier/example.env @@ -3,7 +3,7 @@ # Replace these with real values when deploying to a real environment # For postgres DB which hosts the wallets -WALLET_DB_HOST=prover-wallet-db +WALLET_DB_HOST=verifier-wallet-db WALLET_DB_PORT=5432 WALLET_DB_USER=postgres WALLET_DB_PASS=dbpass @@ -13,7 +13,7 @@ WALLET_DB_ADMIN_PASS=dbpass # These values are only used locally by docker-compose to set up the DB container - should match values above POSTGRES_PASSWORD=dbpass POSTGRES_USER=postgres -POSTGRES_DB=prover_wallet +POSTGRES_DB=verifier_wallet # for tails server # ACAPY_TAILS_SERVER_BASE_URL=http://tails-server:6543 @@ -22,24 +22,27 @@ POSTGRES_DB=prover_wallet HTTP_PORT=3020 WEBHOOK_PORT=3010 ADMIN_PORT=3021 -ADMIN_URL=http://prover-agent:3021 +ADMIN_URL=http://verifier-agent:3021 ACAPY_OUTBOUND_TRANSPORT=http ACAPY_ADMIN=[0.0.0.0,3021] +ACAPY_WALLET_TYPE=indy +ACAPY_WALLET_STORAGE_TYPE=postgres_storage +ACAPY_WALLET_STORAGE_CONFIG={"url":"verifier-wallet-db:5432","wallet_scheme":"MultiWalletSingleTable"} +ACAPY_WALLET_STORAGE_CREDS={"account":"postgres","password":"dbpass","admin_account":"postgres","admin_password":"dbpass"} # Only used if run ./manage production # Typically you will want to update 0.0.0.0 to some public IP -ACAPY_ENDPOINT=http://prover-agent:3020 +ACAPY_ENDPOINT=http://verifier-agent:3020 -ACAPY_WEBHOOK_URL=http://prover-business-logic:3010 +ACAPY_WEBHOOK_URL=http://verifier-business-logic:3010 ACAPY_ADMIN_API_KEY=adminApiKey # DO NOT USE IN INSECURE MODE # ACAPY_ADMIN_INSECURE_MODE=true -ACAPY_LABEL=Prover -ACAPY_WALLET_NAME=Alice_Name -ACAPY_WALLET_KEY=prover_key -ACAPY_WALLET_TYPE=indy +ACAPY_LABEL=Verifier +ACAPY_WALLET_NAME=Verifier_Name +ACAPY_WALLET_KEY=verifier_key ACAPY_AUTO_PROVISION=true @@ -57,7 +60,7 @@ ACAPY_GENESIS_FILE=/home/indy/von-local-genesis-txns # Name of ngrok container if exposing agent endpoint over ngrok -NGROK_NAME= ngrok-prover +NGROK_NAME= ngrok-verifier @@ -89,4 +92,4 @@ ACAPY_TIMING_LOG=/home/indy/logs/timing.txt ACAPY_DEBUG=true ACAPY_LOG_LEVEL=debug -ACAPY_LOG_FILE=/home/indy/logs/agent_logs.txt \ No newline at end of file +# ACAPY_LOG_FILE=/home/indy/logs/agent_logs.txt \ No newline at end of file diff --git a/playground/verifier/notebooks/Fixed Attributes Variable Credentials in Presentation - Revocable.txt b/playground/verifier/notebooks/Fixed Attributes Variable Credentials in Presentation - Revocable.txt new file mode 100644 index 0000000..4a7636c --- /dev/null +++ b/playground/verifier/notebooks/Fixed Attributes Variable Credentials in Presentation - Revocable.txt @@ -0,0 +1 @@ +{"name": "Fixed Attributes Variable Credentials in Presentation - Revocable", "results": [{"name": "1", "timings": [1.4432579309977882, 1.1169212239983608, 1.2975897930009523, 1.305322411000816, 1.3917937260011968, 1.0648722219993942, 1.0592983070018818, 1.2850121689989464, 1.3058943039977748, 1.5106022620020667, 1.1653384470009769, 1.2798116340018169, 1.2234815950032498, 1.2185815449993243, 1.1210744560012245, 1.0543447209965962, 1.0719989870012796, 1.1500280800028122, 1.1576987480002572, 1.1871024280007987, 1.2309732089997851, 1.1566620189987589, 1.257139853998524, 1.1166405660005694, 1.2096145149989752, 1.1187560540020058, 1.2943505740004184, 1.1605925699986983, 1.138675943002454, 1.1543372380001529, 0.946172234002006, 1.1372549330008042, 1.1305757449990779, 1.1668449549979414, 1.0403578109981027, 1.2485859949993028, 1.048802532000991, 0.9670819160019164, 1.024521884999558, 1.1621646319981664, 0.9846332209999673, 1.1903246809997654, 1.1431018180010142, 0.9679783520005003, 1.0442548360006185, 1.0651555969998299, 1.0446677039981296, 1.1315706459972716, 1.0044576079999388, 1.2400044450005225, 0.999418372000946, 1.0043330250009603, 1.3077681930008112, 1.5084040260007896, 1.605846078000468, 0.9735147259998485, 1.181550387002062, 0.9974126329980209, 1.1807998469994345, 0.9150865820010949, 1.373359862001962, 0.9393864349985961, 1.2454455129991402, 0.9742822970001725, 1.2950549950001005, 1.0029174119990785, 1.1424760640002205, 1.0223294889983663, 1.0112658979996922, 1.1219882240002335, 0.9997525479993783, 0.9449152659981337, 0.9965891630017722, 1.1940759319986682, 1.057124130999, 1.5021163719975448, 1.1399561620019085, 1.9383589810022386, 1.947139308998885, 2.2320365390005463, 1.9851667490002, 1.3994936659983068, 1.594454467001924, 1.8042609509975591, 1.9340277219998825, 2.0236065729986876, 1.4781685090019892, 1.5778476589985075, 1.5876635249987885, 1.6635030040015408, 1.1856372319998627, 1.1248595689976355, 1.3032436899993627, 1.1296586300013587, 1.0804417549989012, 1.2884938930001226, 1.4999505619998672, 1.2070450540013553, 1.242268954996689, 1.4145510119997198], "average": 1.2421532671599562}, {"name": "2", "timings": [1.8275724129998707, 1.6892087460000766, 1.8829889249973348, 2.1315560519979044, 2.397447845996794, 2.066001863000565, 1.819094242000574, 1.7986681280017365, 1.9340203809988452, 1.9708504549998906, 2.0501874320034403, 2.5063251220017264, 2.501414541999111, 2.397241878999921, 2.319366773001093, 2.55029691800155, 2.344556152002042, 2.2453941340027086, 2.0029885600015405, 2.298147440000321, 1.94173150899951, 2.1013624150000396, 1.9936965279994183, 2.2425030320009682, 2.9406172589988273, 2.232362519000162, 2.556487024998205, 2.3901228980030282, 2.155556403002265, 2.2914084010008082, 2.301904324998759, 2.115551430000778, 2.3513105050005834, 2.343585490998521, 2.2596294350005337, 1.6435172210003657, 1.9586307989993657, 2.5757797210026183, 2.3031154980017163, 1.7704723770002602, 1.9248458029978792, 1.9239169089996722, 1.6969803600004525, 1.8452405110001564, 2.0465159629966365, 1.8759651799991843, 1.9336575899978925, 2.0018248919986945, 2.1134538750011416, 2.2918257570017886, 2.165589991000161, 2.6535626990007586, 2.5559563449969573, 2.67131745900042, 2.5882682880001084, 1.9003957789973356, 1.9028553099997225, 1.888256984999316, 1.9053495379994274, 1.8192725459994108, 1.9258429319997958, 1.8273926629990456, 1.8384086309997656, 1.72062371499851, 1.7498789809978916, 1.6859111490011855, 1.8554375319981773, 1.966163446999417, 2.116762519999611, 2.0313697930032504, 1.9954439860011917, 2.0162706119990617, 1.8584616059997643, 1.6555993319998379, 1.7825698099986766, 1.6684349019997171, 1.7601095249992795, 1.8037369589983427, 1.6428770660022565, 1.8027896399980818, 1.6758731800000533, 1.7503192629992554, 1.8715703039997607, 1.6250929119996727, 1.7128067099984037, 1.904519641000661, 2.1809962730003463, 3.9291522210005496, 5.049276084999292, 4.868718945999717, 5.162307316000806, 5.51964202200179, 6.209726758002944, 4.320006212998123, 1.6985958410004969, 1.6680468409977038, 1.8349366040019959, 1.6986235910007963, 1.8106321619998198, 1.7417769490020873], "average": 2.23844429206998}, {"name": "3", "timings": [4.936234871998749, 3.537222203998681, 4.269632144998468, 3.7748120649994235, 3.5827112029983255, 3.0523685300031502, 2.4918408599987742, 2.8936601799978234, 3.1017860590000055, 3.0848125299999083, 3.2969965400006913, 2.8358116150011483, 2.6839125659971614, 2.5199321239997516, 2.331845651999174, 2.3931547189968114, 3.050219525001012, 2.599104396002076, 2.4766812960006064, 2.3726232400003937, 2.482577072998538, 2.9144988670013845, 2.990828922000219, 2.169923920002475, 2.64279711600102, 2.4403663929988397, 3.166243586998462, 2.5606111160013825, 2.3701011070006643, 2.3597553889994742, 2.4599117889993067, 2.2774006520012335, 2.6820858539977053, 2.1996605210006237, 2.3861801589991956, 2.165164078996895, 2.6609537699987413, 2.397144537000713, 2.51315929699922, 2.70421082699977, 2.4361667550001584, 2.462935149000259, 2.676574208002421, 2.619761975001893, 2.74890269000025, 2.425060867000866, 2.5256375480021234, 2.633226140998886, 2.6602131170002394, 2.5688699249985802, 2.798272061998432, 2.7133948219998274, 3.02538197299873, 3.0649847259992384, 3.118824950997805, 3.4148520170019765, 3.558130273999268, 3.4430468079990533, 3.027306129999488, 2.424741233000532, 2.996772055998008, 2.9419955740013393, 3.0121701969983405, 2.6948010839987546, 3.1410805220002658, 2.76388408099956, 2.934340850002627, 3.084767885000474, 2.951314885998727, 2.7512026379990857, 3.2125060699981987, 3.100942398999905, 3.2385174430019106, 3.0515881199971773, 3.1487293879981735, 2.7177283040000475, 2.820555358001002, 3.258024900002056, 3.1494224690031842, 3.245174892999785, 3.1319068939992576, 3.5192361999979767, 3.6575833470014913, 4.607009990999359, 4.245320746002108, 3.432242672999564, 3.018794986001012, 3.263679307001439, 3.100785812999675, 3.3648467359998904, 2.7819181550003123, 3.2346384760021465, 2.7037244610000926, 2.802170055001625, 2.632981683000253, 2.9529411389994493, 3.0538192659987544, 2.9979830849988502, 2.990801924999687, 2.7643808079992596], "average": 2.9264750552998886}, {"name": "4", "timings": [3.7674600260033912, 4.085209393000696, 4.190140741997311, 4.256354347002343, 3.4462824999973236, 3.233654061998095, 3.5161919400015904, 3.395911833002174, 3.7753927579979063, 3.9061620399988897, 4.3640211390011245, 4.118750040001032, 4.421094279001409, 4.583061593999446, 4.425447947000066, 5.316309113000898, 3.860728610998194, 3.847765589998744, 3.4995131690011476, 3.5993987289984943, 2.909193482999399, 2.8317657119987416, 2.67546558200047, 2.9377022039989242, 3.503986586998508, 3.624028966998594, 5.258797391001281, 3.9500066849977884, 2.967499634996784, 3.013043186001596, 2.8060029890002625, 3.1191663829995377, 3.5460992160005844, 3.4943466799995804, 4.372760070000368, 4.209332905000338, 3.9952968430006877, 4.063707450997754, 3.8681095780011674, 3.5019672749986057, 3.8916351910011144, 4.325318765000702, 4.105679678999877, 4.2808078059970285, 5.158249608997721, 7.832445625997934, 5.2373507259981125, 5.361811216000206, 9.063072056997044, 5.634250892999262, 3.4925751779992424, 3.570658065000316, 3.558151908000582, 3.0110272530000657, 3.340938672001357, 3.865984825999476, 3.9440642730005493, 3.1027797589995316, 3.158919205001439, 3.0523799729999155, 3.447614602999238, 3.25774429699959, 2.8658526289982547, 2.8984944830008317, 3.0815504010024597, 2.979645015002461, 3.450438055999257, 3.35610957300014, 3.312743116999627, 3.397859028998937, 4.050993123000808, 3.491058477000479, 3.6412364059979154, 3.7728217330004554, 5.093173987999762, 4.8844510939998145, 4.517182535997563, 4.942241931999888, 5.5969426650008245, 7.367795516001934, 4.815034266001021, 9.821871755000757, 4.13325761699889, 5.116655982998054, 2.8862615329999244, 3.3057757950009545, 3.412229788998957, 3.0793843400024343, 3.329191409997293, 2.7637102429980587, 2.795641410000826, 2.9634323949976533, 2.695552242003032, 2.650183284000377, 2.819345235999208, 2.823070580001513, 3.1328772970009595, 3.148849038003391, 2.8868710859969724, 2.6072566629991343], "average": 3.898376299889824}, {"name": "5", "timings": [3.4792968159999873, 3.417413775998284, 3.378223319999961, 3.391804462997243, 3.3395817700002226, 3.1435333920017, 3.4089527590003854, 3.3920665419973375, 3.4133252649990027, 3.661943375998817, 3.2633672550000483, 3.307794279000518, 3.0568633120019513, 3.3013134419998096, 3.3372452730000077, 3.1642190719976497, 3.1093369480004185, 3.1061208940009237, 3.097446605002915, 3.064328594999097, 3.2764368930002092, 2.845489453000482, 3.546705970999028, 3.1193338929988386, 3.440345145001629, 3.4765658989999793, 2.864834209998662, 2.8754027909999422, 3.1753891019980074, 3.238105758999154, 3.1660411869997915, 3.5377378720004344, 2.8849055070022587, 3.2485921359984786, 2.966555332997814, 3.257071922002069, 3.035499326997524, 2.740119432000938, 3.1931357600005867, 3.688335699000163, 3.382698599001742, 3.279175308998674, 3.3352452049985004, 3.38144572300007, 3.5884029589979036, 3.1715661769994767, 2.986632937001559, 2.9337033560004784, 3.360582148001413, 3.549925069000892, 3.6371158120018663, 2.9646344049979234, 3.0978077319996373, 3.46106829099881, 2.8519803150011285, 3.017924542000401, 3.038981841997156, 3.6267822650006565, 2.9965408939970075, 3.4245191769987287, 3.2461773060022097, 2.8745004539996444, 3.017058929999621, 3.1759802799970203, 2.8632579449986224, 2.903726305001328, 3.2333160400012275, 3.326402106999012, 3.6767753770000127, 3.22996923699975, 3.4919105439985287, 3.252048835998721, 3.367865543001244, 3.302584929999284, 3.123259211999539, 3.3213652880003792, 3.7121899600024335, 3.2275235490014893, 3.1111151079967385, 3.059240550999675, 3.194662686000811, 3.1610203749987704, 3.147392549999495, 3.091510812002525, 3.2338255979993846, 2.891745473003539, 3.251494307998655, 3.5201320060004946, 3.21623265299786, 3.1745841199990537, 3.1109303180019197, 3.642623718998948, 3.681886696998845, 3.7491870769990783, 3.7898767269980453, 4.194503192000411, 3.828067230999295, 3.812137648998032, 4.075399377001304, 4.070716027999879], "average": 3.288517092999791}]} \ No newline at end of file diff --git a/playground/verifier/notebooks/Fixed Attributes Variable Credentials in Presentation.txt b/playground/verifier/notebooks/Fixed Attributes Variable Credentials in Presentation.txt new file mode 100644 index 0000000..37715c0 --- /dev/null +++ b/playground/verifier/notebooks/Fixed Attributes Variable Credentials in Presentation.txt @@ -0,0 +1 @@ +{"name": "Fixed Attributes Variable Credentials in Presentation", "results": [{"name": "1", "timings": [0.8284478019995731, 0.42524821199913276, 0.4091208589998132, 0.35189337200063164, 0.4751956969994353, 0.401737984000647, 0.4257523640008003, 0.3983073780000268, 0.4057936070021242, 0.3618623510010366, 0.4008226320001995, 0.4483345199987525, 0.36192165299871704, 0.42430697300005704, 0.36982132300181547, 0.36605632300052093, 0.3896904989996983, 0.38913583400062635, 0.4375324390020978, 0.4098000049998518, 0.4635884250019444, 0.3570726910002122, 0.39053750700259116, 0.4152819869996165, 0.37528966900208616, 0.3975778139974864, 0.3333294779986318, 0.3832412359988666, 0.34208020200094325, 0.4562633839996124, 0.37271535599938943, 0.34688276299857534, 0.29128678900087834, 0.341645876000257, 0.4398193400011223, 0.4100975359979202, 0.3619456109991006, 0.36961076200168463, 0.3594755530029943, 0.36981391399967833, 0.33526848499968764, 0.308283289999963, 0.37835070800065296, 0.3654755860006844, 0.47060412499922677, 0.38022332200125675, 0.4827613570014364, 0.41289529699861305, 0.3775464620011917, 0.41145025700097904, 0.4100741949987423, 0.3698216480006522, 0.3582497620009235, 0.3464879050006857, 0.7076506890007295, 0.45108361799793784, 0.3467740070009313, 0.40475720999893383, 0.4243810679981834, 0.32520421799927135, 0.4355878490023315, 0.3593595100028324, 0.3232315130007919, 0.3209226649996708, 0.3665278079970449, 0.33725774199774605, 0.3190788360006991, 0.34431639799731784, 0.3214555910017225, 0.46400020299915923, 0.34569099600048503, 0.351893758001097, 0.3301774089995888, 0.3966778020003403, 0.45668498200029717, 0.3813538449976477, 0.31808319999981904, 0.3244999199996528, 0.37851926800067304, 0.40302616199915064, 0.4178296940008295, 0.3956076119975478, 0.32504571599929477, 0.30716605500128935, 0.3596750949982379, 0.32849509400330135, 0.32604676600021776, 0.38884150800004136, 0.4410620500020741, 0.3242531979994965, 0.35404195899900515, 0.34723850799855427, 0.3497368229982385, 0.3682308600000397, 0.3562053030000243, 0.38196637600049144, 0.3801430089988571, 0.43123216299864, 0.36796460500045214, 0.36598871699970914], "average": 0.3872079749700424}, {"name": "2", "timings": [0.8298483660000784, 0.5492605559993535, 0.6415714419999858, 0.6642193420011608, 0.6714631320028275, 0.6017684629987343, 0.5917713880007796, 0.6539368539997668, 0.627022427997872, 0.7552014840002812, 0.6494859030026419, 0.6203717190001043, 0.6160528979999071, 0.7199110319997999, 0.6726036130021384, 1.6542543899995508, 0.6108972769980028, 0.5628876120026689, 0.550253679000889, 0.563777701001527, 0.5702913040004205, 0.4993331029982073, 0.428735614001198, 0.5165656690005562, 0.4856447969978035, 0.5264038630011783, 0.46770788700086996, 0.5543410029968072, 0.5880523169980734, 0.5837891640003363, 0.701441844998044, 0.5910859479990904, 0.537619454000378, 0.5388865429995349, 0.5129020310014312, 0.5413386590007576, 0.5525284810028097, 0.5068771910009673, 0.4879664479994972, 0.5530097400005616, 0.6280402509983105, 0.612331231997814, 0.6442037999986496, 0.6055378319979354, 0.529644496000401, 0.49549249899791903, 0.4050864540004113, 0.46301775699976133, 0.4259185679984512, 0.40986358700320125, 0.43483225800082437, 0.4292685500004154, 0.43472670699702576, 0.3957060930006264, 0.4834181920014089, 0.3999253239999234, 0.4596793809978408, 0.475271523999254, 0.4711594979999063, 0.4471002870013763, 0.4055567670002347, 0.4298482470003364, 0.43911574199955794, 0.44818238299922086, 0.4372826939979859, 0.3993552070023725, 0.37989796600231784, 0.4029438300021866, 0.39165699200020754, 0.42003824899802567, 0.44297565200031386, 0.38291969100100687, 0.3953699099984078, 0.4550334089981334, 0.39091836599982344, 0.3967885120000574, 0.3648603049987287, 0.3952307709987508, 0.41474973700314877, 0.4072689349995926, 0.3978345850009646, 0.3923467200002051, 0.38968628799921134, 0.4505387979988882, 0.35342959300032817, 0.3794554939995578, 0.47074436399998376, 0.41224163899823907, 0.41041819699967164, 0.3517956249997951, 0.38235478199931094, 0.4584506600003806, 0.41095012199730263, 0.37936013099897536, 0.36264115200174274, 0.3672983690012188, 0.3741997170000104, 0.43109880500196596, 0.5091999299984309, 0.4480231509987789], "average": 0.5053336611699342}, {"name": "3", "timings": [0.7868932279998262, 0.5229764809992048, 0.5568546300019079, 0.5720249389996752, 0.5077342840013443, 0.5223338920004608, 0.5537873499997659, 0.5590224469997338, 0.5998857770027826, 0.6273764649995428, 0.5688720309990458, 0.5708407419988362, 0.5064437010005349, 0.5538611550000496, 0.5054636929999106, 0.4786739640003361, 0.4918713770020986, 0.47603514900038135, 0.5919083890003094, 0.5719149280012061, 0.8126407990021107, 0.7271917190009844, 0.5507429979988956, 0.5580662499996834, 0.5541477490005491, 0.6109273280017078, 0.5276413809988298, 0.5319230589993822, 0.5594328070001211, 0.6812012840018724, 0.6083301440012292, 0.6204261429993494, 0.518814832001226, 0.5691934790011146, 0.6020263290010917, 0.5533139549988846, 0.49467475799974636, 0.5616427919994749, 0.8061384020002151, 0.6480949279975903, 0.7031347689990071, 0.5539451250006096, 0.5072231049998663, 0.7760664189991076, 0.6942419259976305, 0.6042647190006392, 0.5628587980027078, 0.6559103439976752, 0.6410711080025067, 0.7385942389992124, 0.8704196500002581, 0.5474202790028357, 0.5355749650007056, 0.5398149149987148, 0.6277211300002818, 0.7823907040001359, 0.8210943220001354, 0.6738903199984634, 0.5442945100003271, 0.5295162709990109, 0.6105501530000765, 0.725550506998843, 0.82847137799763, 0.7700847710002563, 0.6473468690019217, 0.6755131110003276, 0.8266282190015772, 0.592440696000267, 0.6066961649994482, 0.6986679139990883, 0.7659597330020915, 0.7212232710007811, 0.8223417420012993, 0.7021052519994555, 0.6120577910005522, 0.8875018780017854, 0.8653001169986965, 0.8370881240007293, 0.8460950539993064, 0.9846201779982948, 0.8594683459996304, 2.979411190000974, 0.8080414089999977, 0.7557634189979581, 0.714707390001422, 0.7303076150019479, 0.9171282540009997, 0.7805930790018465, 0.8252969300010591, 0.8463474260024668, 1.9771811470018292, 0.8153307389984548, 0.9489409540001361, 0.777665880999848, 0.98623063299965, 1.0066387799997756, 1.0693543240013241, 1.0023152840003604, 1.0809329619987693, 1.0317993989992829], "average": 0.72070491460021}, {"name": "4", "timings": [1.175244860998646, 0.6233474990003742, 0.6906984980014386, 0.8906949129996065, 0.6689672079992306, 0.6619241799999145, 0.7974079110026651, 0.6765721329975349, 0.6525433110000449, 0.744983463002427, 0.8428486299999349, 0.9552061159993173, 1.0293854720002855, 1.125510726000357, 0.9975669840023329, 1.01053230099933, 0.8675777800017386, 1.0057663590014272, 0.9803369910005131, 1.1005353479995392, 2.106613648000348, 0.8130905209982302, 0.78725465000025, 0.7725611860005301, 0.6353553119988646, 1.9554068400029792, 0.788407742002164, 0.8949109650020546, 0.9071816219984612, 0.8215768989975913, 0.8292419540011906, 0.8985124499995436, 0.9386252660005994, 0.9027695229997335, 1.0375689729989972, 0.7629177730013907, 0.8163621160019829, 0.8996283050000784, 0.8345242989998951, 0.715955016999942, 0.8427619190006226, 0.8181153379991883, 0.7566123320029874, 0.7567328059994907, 0.7197652600007132, 0.688288568999269, 0.7247405260022788, 0.8266322029994626, 0.8099104780012567, 0.8037368559998868, 0.7419578459994227, 0.7075953290004691, 0.6647453130026406, 0.6771921920008026, 0.5954388829995878, 0.7746387780025543, 0.7533433670032537, 0.6515448239988473, 0.8284100529999705, 0.8514486770000076, 0.9364294599981804, 0.8541115309999441, 1.0592114770006447, 1.0317400339990854, 0.9015237359999446, 0.6829495550009597, 0.7453338320010516, 0.7850652920024004, 0.6221514110002317, 0.6642452449996199, 0.8475264979970234, 0.8926692730019568, 0.842617671998596, 0.7892791529993701, 0.9054091030011477, 0.760294839998096, 0.6525753480018466, 0.6725031490022957, 0.6608892789990932, 0.6683827540000493, 0.8680663179984549, 0.7329588780012273, 0.6657786279974971, 0.6626539360004244, 0.6523090650007362, 0.7828013729995291, 0.7393172520023654, 0.7594041209995339, 0.7370727509987773, 0.6338790570007404, 0.6151335520007706, 0.6553363849998277, 0.6607971990015358, 0.6927450080002018, 0.8871743180025078, 0.9066293780015258, 0.9342279439988488, 0.8607809739987715, 0.8826521079972736, 0.779309703000763], "average": 0.8269366388402705}, {"name": "5", "timings": [0.8626700589993561, 0.6532584970009339, 0.733111898000061, 0.6820489349993295, 0.7749359129993536, 0.9721901189986966, 0.9160025780001888, 0.6783353760001773, 0.6460383019984874, 0.7398548570017738, 0.6177107880030235, 0.6334527889994206, 0.6528476189996582, 0.650061143001949, 0.6253827979999187, 0.6160152519987605, 0.6140721120027592, 0.5790799209971738, 0.630860239998583, 0.5637654759993893, 0.5838958480017027, 0.6418860520025191, 0.5863034930007416, 0.7893246940002427, 0.842679405999661, 0.6493458179975278, 0.7073000599993975, 0.7008457970005111, 0.7077590820008481, 0.6132400780006719, 0.6703937880010926, 0.7077170420016046, 0.5738520680024521, 0.6532568799993896, 0.7558163229987258, 0.7192134830002033, 0.6939509099975112, 0.5889076809980907, 0.58682927299742, 0.6440671800010023, 0.68226236999908, 0.6796632080004201, 0.7543728399978136, 0.7390807949996088, 0.6882918249975774, 0.5856086229978246, 0.6656674280020525, 0.6212339849989803, 0.6063041839988728, 0.5450807259985595, 0.562990271999297, 0.6795382970012724, 0.6249573509994661, 0.6303547279967461, 0.8219712969985267, 0.7117356490016391, 0.6545517470003688, 0.6912037439979031, 0.5664046319980116, 0.5865620650001802, 0.7922591130009096, 0.7799251350006671, 0.7577204369990795, 0.7413776490029704, 0.7247814700021991, 0.7087428359991463, 0.8408886400029587, 0.6354601790008019, 0.7670170290002716, 0.7893544270009443, 0.7418572499991569, 0.6372153609991074, 0.8285022470008698, 0.7579951560001064, 0.6770417989973794, 0.7123052640017704, 0.7172045020015503, 0.7297920060009346, 0.7661193499989167, 0.7840249850014516, 0.8402372910022677, 0.6123718670023663, 0.6365679890004685, 0.6115357829985442, 0.6406714040022052, 0.574083977000555, 0.5954178279971529, 0.5508810600003926, 0.6515377110008558, 0.6771108739994816, 0.6333912100017187, 0.585755041000084, 0.5829391050028789, 0.7190746739979659, 0.7668699679998099, 0.6519998889998533, 0.5941953980000108, 0.5722144430001208, 0.7099682820007729, 0.5979145140008768], "average": 0.6805043853700409}]} \ No newline at end of file diff --git a/playground/verifier/notebooks/Fixed Credential Variable Attributes Disclosed - Revocable.txt b/playground/verifier/notebooks/Fixed Credential Variable Attributes Disclosed - Revocable.txt new file mode 100644 index 0000000..328d809 --- /dev/null +++ b/playground/verifier/notebooks/Fixed Credential Variable Attributes Disclosed - Revocable.txt @@ -0,0 +1 @@ +{"name": "Fixed Credential Variable Attributes Disclosed - Revocable", "results": [{"name": "1", "timings": [2.1592906909972953, 1.8696552139990672, 2.147544138999365, 2.1236339200004295, 1.9295949420011311, 1.7727730789993075, 2.089884698998503, 1.9352562339990982, 1.8682788039986917, 1.902585004001594, 2.3766474940021, 1.9200537139986409, 2.115783076998923, 1.9427256350027164, 1.936630857999262, 2.001540418001241, 1.9258544510012143, 2.0061115249991417, 1.8025994900017395, 1.9686643469976843, 2.0820709649997298, 2.127424427999358, 2.2246716339977866, 2.3396876500009967, 2.283170213999256, 2.3064746179989015, 2.2730886430035753, 2.204003147999174, 2.2956448949989863, 2.253719544998603, 2.161109476001002, 2.36271923899767, 2.126899497001432, 2.0489101320017653, 2.294074647998059, 2.084148093003023, 2.061830161001126, 2.9776692960003857, 1.9937228779999714, 1.981466631998046, 3.2953527600002417, 2.197894229000667, 2.1773919309998746, 5.932736914997804, 1.82218021099834, 1.8729729210026562, 2.1785984479975014, 1.9820967919986288, 2.1468308030016487, 2.9377570430006017, 3.381905704001838, 2.06383642199944, 3.896878998999455, 1.9525377320023836, 2.028327899002761, 1.9979474829997343, 2.3314721999995527, 4.898877476000052, 1.7868517099996097, 2.108108757998707, 2.1305343659987557, 2.2458303839994187, 3.368666943999415, 2.1634457649997785, 2.138615372001368, 2.442445439999574, 2.2393182419982622, 2.229433336000511, 3.091623714000889, 2.1776981919974787, 2.2119730489976064, 2.1619199179986026, 2.2274474810001266, 1.9951114030009194, 2.2150665339977422, 2.8979978369970922, 2.220659163998789, 2.9039405829971656, 2.2397328540027956, 2.4030832610005746, 2.9958535309997387, 2.2596273189992644, 2.6556500019978557, 2.3687456629995722, 2.936942246000399, 2.2680180730021675, 3.120574136999494, 2.2595394079980906, 2.176093605998176, 2.1360596740014444, 3.390287755999452, 4.844502214997192, 2.092586898001173, 2.018941750000522, 2.0659682730001805, 2.206469910997839, 2.3054003329998523, 4.277566660002776, 1.9727947430001223, 3.884878437002044], "average": 2.3920921443698173}, {"name": "2", "timings": [2.885861822996958, 1.795054001002427, 1.739859654000611, 1.898294086997339, 1.8074129189990344, 1.9958036950010865, 2.1306152420002036, 2.119498530002602, 2.0290126639993105, 2.314818553000805, 2.903716983000777, 1.6220848970006045, 2.1872191989968996, 2.3033421779982746, 2.0635535520013946, 2.3976497820003715, 2.069763041999977, 2.1850501369990525, 2.2258914439989894, 2.068672354998853, 2.2518910260005214, 3.90513609700065, 1.9225925020000432, 2.825078919002408, 3.0633172490015568, 1.8067336330022954, 1.6854314240008534, 2.209721057002753, 3.6910524660015653, 1.6749340090027545, 1.8139989890005381, 1.9499129299983906, 1.7852517070023168, 3.31968572400001, 2.4821049769998353, 1.941340522000246, 4.819172063998849, 1.6250799099980213, 1.7410225670028012, 1.8675161010032753, 2.0210798119987885, 1.971975503001886, 1.9723566729990125, 4.431581898999866, 2.031742592000228, 1.8365821699990192, 2.2100046660016233, 2.0290571080004156, 2.6059741569988546, 4.1255686709992005, 1.9004566599978716, 2.7101158939985908, 4.952060226998583, 1.9317141120009182, 4.014102362998528, 1.714388478998444, 1.9365237790007086, 2.0116609090000566, 1.8053793149992998, 2.1088257360024727, 2.66732631099876, 2.5663001040011295, 3.290361497001868, 2.289528238998173, 2.1107895289969747, 2.357913132000249, 2.498373407001054, 3.3233643890016538, 1.9745938970008865, 1.948263277001388, 3.818087210001977, 1.946546955001395, 2.241284513998835, 2.244210037002631, 2.113715643998148, 1.9387086529968656, 2.2210015439995914, 2.2819655380008044, 2.9463408890005667, 1.8829285119973065, 2.3275961550025386, 3.877508764002414, 1.6981075530020462, 1.8066888310022478, 1.9872587420031778, 2.899040783999226, 1.9920706869997957, 2.2558116750005865, 2.1762006739991193, 2.284688896001171, 2.7775196279981174, 1.9467850449982507, 1.9650319310021587, 2.06872065999778, 2.032111584998347, 2.101799069001572, 2.432242855000368, 2.1287441959975695, 2.1810721200017724, 2.9657943599995633], "average": 2.360116968230177}, {"name": "5", "timings": [2.0224829710023187, 1.8130477859995153, 2.038260977999016, 2.0433335109992186, 2.109531144997163, 3.076659799000481, 2.0880376780005463, 4.0562444499992125, 1.99568513900158, 2.1738474490011868, 2.025528543999826, 2.2201879089989234, 2.384641011001804, 2.5033516399998916, 2.659641260001081, 2.537637094003003, 2.5493281529998058, 4.096584041999449, 1.8658432490010455, 2.363547394001216, 3.2928756440014695, 2.5983421860000817, 2.2954013609996764, 3.8324187289981637, 2.0442428200003633, 3.9569840479998675, 1.880474845002027, 2.3828156029994716, 4.9915028260002146, 1.9019372829970962, 3.08715630900042, 3.92124839600001, 1.9055215280022821, 3.1602066480008943, 2.197615973000211, 2.0155457359978755, 5.352688663999288, 2.0539025889993354, 1.980605786000524, 5.103238001000136, 1.7244968800005154, 1.7539456869999412, 2.1189152109982388, 4.96181277100186, 1.896063175998279, 1.725627589999931, 1.7596081330011657, 1.5996727910023765, 1.6343757600006938, 1.6347200279997196, 1.475325455001439, 1.4053068379980687, 1.1752586370021163, 1.3158631400001468, 1.5669706890003, 1.530307452998386, 1.7626354439998977, 4.289906484002131, 2.3769515759995556, 2.55457220199969, 2.428194234998955, 5.440988070000458, 2.3770985299997847, 2.112232691000827, 2.461143278000236, 1.9383701549995749, 3.4202383240008203, 2.232343685998785, 2.6350822530002915, 2.088167242000054, 2.3878412560006836, 2.4301505200019164, 4.275499883999146, 2.1208623479978996, 2.289480489002017, 2.3962269420007942, 2.325410280001961, 2.1936909750002087, 4.756034276000719, 1.8309632319978846, 2.006704785999318, 2.2021997639967594, 2.0481161110001267, 2.287525610998273, 2.497250117998192, 4.123621136997826, 2.1698967070005892, 2.2281729159985844, 2.352800100998138, 2.4297724020034366, 2.5464338439996936, 3.1867013629998837, 2.1816114140019636, 2.256079246999434, 2.4498805010007345, 2.4614646429981804, 4.166648102000181, 2.0214515420011594, 3.3639768969987927, 2.22876719299893], "average": 2.5418957518700336}, {"name": "10", "timings": [4.248501935999229, 2.5032269090006594, 2.443785237999691, 3.367290731999674, 3.3872836560003634, 2.261918454998522, 2.8242813290016784, 2.6539802299994335, 3.849650602998736, 2.7726334409999254, 4.59331786400071, 2.69371184800184, 2.7195130230029463, 2.60135564400116, 3.5941879700003483, 2.2414014080022753, 2.231280574000266, 4.429714497000532, 2.2453914289981185, 2.5638499130000127, 2.6911344709988043, 2.461849079998501, 2.9500622769992333, 2.618563957999868, 5.414747875998728, 2.0330965450011718, 2.4957462810016295, 2.4787582399985695, 2.346068833001482, 4.533088197000325, 2.363851676000195, 4.1847551809987635, 2.1777827099977003, 2.1722183439997025, 2.4743796119983017, 2.4908593929976632, 2.454906855000445, 2.70140580700172, 4.399878774001991, 2.1479397370021616, 3.37533891899875, 2.3055500570008007, 2.7023620440013474, 2.609399583998311, 2.404755298000964, 4.413411483001255, 2.2775917620019754, 2.541946083998482, 3.235099708002963, 4.266540687000088, 2.1266689039985067, 2.4866363599976467, 2.579365555997356, 4.477151422001043, 2.362817647997872, 2.5302337860011903, 4.443565522000426, 2.115628289000597, 2.4885745079991466, 2.614589878001425, 4.346778702001757, 2.9062397530033195, 3.5939642330013157, 2.7758124520005367, 4.825657957000658, 2.541042999000638, 2.5707249909974053, 2.699147710001853, 2.4997011570012546, 3.507363004999206, 4.150001345999044, 2.2634309160021076, 3.399983457999042, 2.5148802769981558, 4.121973986999365, 2.3591992859983293, 2.688776006001717, 2.708971644002304, 2.6599612700010766, 4.34123757999987, 2.138972658998682, 4.24778334399889, 2.2991200139986177, 2.5493288560028304, 4.262216296996485, 2.168505297999218, 2.367740165002033, 2.6448918290006986, 2.5201713719980035, 2.9876516000003903, 5.464809569002682, 2.1438836779998383, 2.3512064429996826, 2.3677900020011293, 3.064876467000431, 3.2259337800023786, 2.469239699999889, 2.433003597998322, 4.3253003299978445, 3.125484662999952], "average": 2.9880735643801017}, {"name": "20", "timings": [3.4841172769993136, 5.498838150000665, 2.6702900150012283, 2.9770123779999267, 3.49594336500013, 4.958325392999541, 3.157493965998583, 5.081306183998095, 2.817265599998791, 3.248467041001277, 2.8542417120006576, 5.018754071999865, 3.036418899002456, 3.351099677001912, 3.1140057310003613, 5.476278356996772, 2.9206207980023464, 4.833705443001236, 2.8533794039976783, 3.4781994740005757, 3.4162961360016197, 5.36802181999883, 3.250515448002261, 5.348277765999228, 3.1191606000029424, 2.920116302000679, 3.426092866997351, 3.081473827998707, 3.5657629319975968, 5.297047239997482, 3.126130433000071, 3.027190769000299, 4.163211396000406, 4.9976394699988305, 3.2351047019983525, 2.379770000999997, 2.38146504299948, 2.0197807190015737, 1.9582144630003313, 2.3041123789989797, 1.984918664998986, 2.044518598999275, 2.5214239450033347, 2.278048541997123, 2.0435460389999207, 2.156593581999914, 1.982197332999931, 1.889972429999034, 2.097273146002408, 1.8623668370019004, 2.2590752280011657, 2.058123129001615, 1.855157034999138, 2.0190574350017414, 2.222128466997674, 1.9951313819983625, 1.8646583070003544, 1.9967165589987417, 1.9893548539985204, 2.0876304779994825, 1.9900283890019637, 2.016913093000767, 2.0227403309982037, 1.9805696399998851, 1.809077598998556, 1.9016831549997733, 2.179825023999001, 2.012477366002713, 1.8478254410001682, 1.9946306530000584, 1.8648390089983877, 1.878637110999989, 2.4356069730019954, 1.935605090999161, 1.9165789980033878, 2.1744803149995278, 1.7484492510011478, 1.8334417180012679, 2.141698150000593, 1.900224144999811, 1.8389190189991496, 2.0799413439999626, 2.134609744000045, 1.788949246001721, 2.1281387800008815, 2.0710164379997877, 1.9150525260010909, 2.0816951470005733, 1.8754267010008334, 1.7363100410002517, 2.0116229110026325, 1.8645276289971662, 1.9737938329999452, 2.0606186549994163, 2.122918134999054, 2.0372570010003983, 2.0697159730007115, 2.111927244000981, 1.9924521499997354, 2.213683741996647], "average": 2.636129469530024}]} \ No newline at end of file diff --git a/playground/verifier/notebooks/Fixed Credential Variable Attributes Disclosed.txt b/playground/verifier/notebooks/Fixed Credential Variable Attributes Disclosed.txt new file mode 100644 index 0000000..4a7ac73 --- /dev/null +++ b/playground/verifier/notebooks/Fixed Credential Variable Attributes Disclosed.txt @@ -0,0 +1 @@ +{"name": "Fixed Credential Variable Attributes Disclosed", "results": [{"name": "1", "timings": [1.5151171450015681, 0.9246594169999298, 0.7995840490002593, 0.7850052750000032, 0.8191835150028055, 0.781538246999844, 0.817438822999975, 0.788461271997221, 0.8995625850002398, 0.716725956001028, 0.8963241850033228, 0.9787489870032005, 1.0285410200012848, 1.059937269998045, 0.9377045479996013, 0.9408354250008415, 0.6961431700001413, 0.8531389529998705, 0.7349782780001988, 0.7115897069998027, 0.6665076470017084, 0.7201757959992392, 0.7484672339996905, 0.8057439910007815, 0.7672892280024826, 0.8009836710007221, 0.7594514929987781, 0.6952449710006476, 0.7616400549995888, 0.7441896990021633, 0.7851116540005023, 0.8427046649994736, 0.8056548219974502, 0.8230740580002021, 0.8047962110031222, 0.695535574999667, 0.6379479600000195, 0.796569496000302, 0.9244895339979848, 0.8348079139977926, 0.7574018580016855, 0.7311995630007004, 0.7570661089994246, 0.7905070289998548, 0.7537584589990729, 0.7067263479984831, 0.7820913440009463, 0.8024882539975806, 0.6653144090014393, 0.761903031001566, 0.7212674919974233, 0.7291490489988064, 0.7366908140029409, 0.6663282780027657, 0.6488355920009781, 0.7957530509993376, 0.7183041259995662, 0.7130947250007011, 0.7923597269982565, 0.7742997739987914, 0.7173817930015502, 0.7458876060009061, 0.7003708500014909, 0.7865436989995942, 0.7380992649996188, 0.8484777010016842, 0.8149066799996945, 0.7885555310022028, 0.7375153249995492, 0.6554527500011318, 0.5873950969980797, 0.8151076920003106, 0.7671963409993623, 0.7408208630004083, 0.7104423929995392, 0.6938025460003701, 0.6951242969989835, 0.6752854080004909, 0.6955005879972305, 0.7365615420021641, 0.9706420080001408, 0.8015459519992874, 0.7267963039994356, 0.7692317319997528, 0.656696064001153, 0.7163801079987024, 0.7425906029966427, 0.851219451000361, 0.7163543559981917, 0.6955473839989281, 0.6880502450003405, 1.5654195890019764, 0.7032313800009433, 0.7491410190013994, 0.9169748889980838, 0.8098665719990095, 0.7243577840017679, 0.7761836640020192, 0.7631432979978854, 0.813330725999549], "average": 0.7871727362801175}, {"name": "2", "timings": [0.8779711839997617, 0.8404787010003929, 1.9131023490008374, 0.7569096759980312, 0.7934935330013104, 0.9445577249971393, 0.8853050849975261, 1.9642251679979381, 0.6659469600017474, 0.6856774699990638, 2.7272265719984716, 0.6716472080006497, 0.6406866110010014, 0.8570239130021946, 0.9844594360001793, 0.9337673160007398, 0.8667029040007037, 0.9527591229998507, 0.9489390140006435, 0.9462712000022293, 1.015367807001894, 2.6705417550001584, 0.8551875709999877, 0.781753914001456, 0.7300968689996807, 1.532516126997507, 0.654249980001623, 0.7600994950007589, 1.8961648719996447, 0.7083883019986388, 0.7603998610029521, 0.8500385210027162, 1.891466445998958, 0.7077224770000612, 0.7710868979993393, 0.7904010640013439, 1.8070765049997135, 0.7960661469987826, 0.7245270909988903, 0.9269559819986171, 0.9513362389989197, 1.0833767789990816, 1.9197402509998938, 0.8476121229978162, 0.8447965660016052, 0.8665912350006693, 0.868208791998768, 1.8196646810029051, 1.674659131000226, 0.6317689749994315, 0.6312836520010023, 1.7947982129990123, 0.724776375998772, 0.7157397039991338, 0.8655559450016881, 0.7974381250023725, 0.8890815300001123, 0.7904891629987105, 0.750603880998824, 1.7897248750014114, 0.705296691001422, 0.6336819780008227, 0.7190741909980716, 0.7305043050000677, 1.6642466519988375, 0.6499848659987038, 0.614306420997309, 1.7349734630006424, 0.6698305639984028, 0.6310615280017373, 0.6966717450013675, 0.6866097319980327, 2.777323610000167, 0.6382124129995645, 0.6340097339998465, 0.5563908080002875, 0.6410466149973217, 0.7929023139986384, 1.8419783760000428, 0.6275922280001396, 0.7380028980005591, 0.7834746049993555, 0.7501046850011335, 0.7997097619991109, 0.7723887419997482, 1.7074932579998858, 0.7150024900001881, 0.8778155769978184, 0.6448262570011138, 0.6185091650004324, 0.7154053500016744, 1.7107202279985358, 0.5731882370018866, 0.5830015860010462, 0.7446528910004417, 0.7491266279976116, 1.6449192850013787, 0.6409504469993408, 0.7409271100004844, 0.8134519409977656], "average": 0.9971387444399443}, {"name": "5", "timings": [1.0384617540003092, 2.7879721079989395, 0.8739878859996679, 0.822306973997911, 1.7442838230017514, 0.7323061099996266, 0.9052511879999656, 0.8499200849983026, 2.7867655789996206, 0.7735245680014486, 0.6994084699981613, 0.8120672979966912, 2.812177085001167, 0.9303277850012819, 0.9116910630000348, 0.7693812049983535, 0.634472713998548, 0.7788338130012562, 0.9328076079982566, 0.9088452600008168, 1.1710268460010411, 1.1558856100018602, 3.4245007270001224, 0.6691276450001169, 0.717724153000745, 0.7670460089975677, 0.8094875760034483, 0.8587858329992741, 0.8376757010009896, 0.8467055629989773, 0.8889605010008381, 2.006040149997716, 0.7536259790031181, 1.8216843850022997, 0.7267589280018001, 0.73476373000085, 0.8125517650005349, 0.8927598640002543, 3.016704181998648, 1.1210316050019173, 1.1564669610015699, 1.0217718979984056, 1.034901433999039, 1.2307670320005855, 1.1662250030021823, 1.1143866679994971, 1.9294149579982331, 0.9357110999990255, 2.080444314000488, 4.667989564997697, 0.786763248997886, 0.7440617970023595, 0.8025575239989848, 0.7705173409995041, 0.7806888199993409, 2.818638209002529, 0.8484858199990413, 0.6841064139989612, 0.6773139729994, 0.7102908000015304, 1.7766863459983142, 0.746395884998492, 0.8986927119985921, 0.9301572429976659, 0.9365841680009908, 1.0870987289999903, 1.0139389219984878, 0.9251593699991645, 2.942314699997951, 0.7528750160017808, 0.6956148889985343, 0.8840050710023206, 0.92453455100258, 0.9145273009999073, 0.9656469239998842, 1.9419476360017143, 0.7733922369989159, 0.8820578989980277, 0.8891913199986448, 0.938253207001253, 0.9457358399995428, 0.9607879590002995, 1.9712649109969789, 0.8702524219988845, 1.8978274420005619, 0.766701575001207, 0.8529528740000387, 0.832033840000804, 1.904862060000596, 0.8319133740005782, 0.9361113240011036, 0.9558878390016616, 0.904309285000636, 0.9594086519973644, 1.131622442000662, 1.0270452900003875, 0.911330299997644, 3.803385105999041, 0.7491181500008679, 0.7270977959997253], "average": 1.1925786461499228}, {"name": "10", "timings": [1.2203335799968045, 1.2331500830005098, 3.2480010710023635, 1.0703078009973979, 2.1781296270019084, 2.0884563839972543, 2.009928920000675, 1.2824985430015658, 1.1580805449993932, 1.1940608840013738, 1.2852491649973672, 1.242987435998657, 2.1046547869991628, 1.2101558079993993, 2.1218592830009584, 1.2734803169987572, 1.2567245030004415, 1.2524156309991668, 1.3512862069983385, 2.312448938999296, 1.140621110000211, 1.1374438700004248, 2.892174166998302, 1.3591313930010074, 1.018518924000091, 1.1010085039997648, 3.23424080499899, 1.355896995999501, 1.312208331997681, 1.2372226330007834, 1.1931635769979039, 1.1985287069983315, 1.1975107540019962, 2.0660927220014855, 1.0022673309977108, 3.208883136001532, 1.222329977001209, 3.067969386000186, 1.0697971939989657, 1.2118796409995412, 1.1837327729990648, 1.1706328629989002, 1.169298393997451, 1.2068639040007838, 1.2976637390020187, 3.0775630099997215, 0.9911845179994998, 1.053492508999625, 2.078969105001306, 1.0953721039986704, 1.9821366209980624, 1.0799008360008884, 2.296367058999749, 1.0811062819993822, 1.0465884160003043, 1.0998909439986164, 2.013582809999207, 1.1399489380019077, 1.1645900209987303, 1.221499125000264, 1.1408243770019908, 1.2520505329994194, 3.1846615729991754, 1.2686925009984407, 1.1487156439980026, 1.1411029810005857, 1.4482483269966906, 1.927242762001697, 0.9329229340000893, 1.0338639799992961, 1.1094846129999496, 1.0872537379982532, 1.3124103359987203, 3.1660691170000064, 1.0564635029986675, 1.1798324020019209, 2.9786547449984937, 0.9852633880000212, 0.9257527010013291, 1.0416001960002177, 1.0234476510013337, 1.03355726099835, 1.2854972839995753, 3.0275550780024787, 1.0920241310013807, 1.3370835660025477, 1.3258284639996418, 1.2056481750005332, 1.2057273150021501, 1.166037636998226, 3.2437309699998877, 1.1045769410011417, 2.1632439360000717, 0.978850663999765, 1.1373591259980458, 1.2536899339975207, 1.1746077169991622, 1.144122369998513, 1.2060672150000755, 1.2340191470029822], "average": 1.5043526757697692}, {"name": "20", "timings": [2.2878315709967865, 3.7668274530005874, 1.999288125000021, 1.879030337997392, 1.8926088359985442, 2.1696359740017215, 4.685960828999669, 1.7430216199973074, 1.7063724039981025, 3.773018019997835, 2.7653707419995044, 1.8007009899993136, 2.0226630230026785, 3.706816224002978, 1.92294102699816, 1.8513538810002501, 1.9044502180004201, 2.852793854999618, 2.777865693999047, 2.0914723809983116, 10.159044837000692, 1.7367676809990371, 1.6546028120028495, 1.560310026998195, 1.8942829169973265, 1.759986218999984, 1.8173560259965598, 2.17502186099955, 2.9486172200013243, 2.1214474629996403, 2.1047336459996586, 2.241460000001098, 2.193447350000497, 3.985588071998791, 1.8764954940015741, 2.1895479140002863, 3.929082225997263, 2.09849274500084, 2.807980536999821, 2.0289372890001687, 2.063455368999712, 1.911346537002828, 2.0741215699999884, 2.1512374200028717, 2.128300632000901, 4.099587960001372, 1.9079712940001627, 2.129928682999889, 2.321197534998646, 2.8774651819985593, 1.8669890460005263, 4.805184359000123, 1.6702424089999113, 1.7602478560002055, 2.0106722849996004, 3.8032703699973354, 1.9290804759984894, 2.0521883469991735, 2.0247588330021244, 2.0420782399996824, 4.924762167000154, 1.8705210070002067, 2.8128981390000263, 1.6086839010022231, 1.9319594680018781, 2.117078268001933, 1.8960927840016666, 3.7598502330001793, 1.7771400609999546, 1.851287539000623, 3.973936764999962, 2.001922815998114, 1.8138276659992698, 3.9949396990014066, 1.8420262210020155, 1.7384094810004171, 1.9889087109986576, 3.881568591001269, 1.836287883001205, 1.819161269999313, 2.688013248000061, 1.8517109940003138, 1.8932905340006982, 2.010880759000429, 3.7580543600015517, 1.8594691660000535, 1.9828116909993696, 2.1190595849984675, 2.171499058997142, 2.0001534419970994, 2.1695016080011555, 2.0812235599987616, 2.104760400001396, 4.225923624999268, 1.7856394080008613, 1.9182389480010897, 3.7787997819978045, 1.7987186040008964, 2.2470839560010063, 1.8220960560029198], "average": 2.4622074139899635}]} \ No newline at end of file diff --git a/playground/verifier/notebooks/Single Attribute from Variable Credential - Revocable.txt b/playground/verifier/notebooks/Single Attribute from Variable Credential - Revocable.txt new file mode 100644 index 0000000..25afb4a --- /dev/null +++ b/playground/verifier/notebooks/Single Attribute from Variable Credential - Revocable.txt @@ -0,0 +1 @@ +{"name": "Single Attribute from Variable Credential - Revocable", "results": [{"name": "1", "timings": [1.110720984001091, 1.092246055999567, 1.2185216109974135, 1.0425322039991443, 1.0586362130015914, 1.2810048060018744, 1.1484797280027124, 1.147550906000106, 0.9694758419973368, 1.0999135479978577, 0.9528311169997323, 0.9148356199984846, 1.0262704240012681, 1.06175889899896, 0.971196358997986, 0.9750475409964565, 0.9896615609977744, 1.1041786929999944, 0.9802466049986833, 1.0048240779979096, 1.157585619999736, 1.117637752002338, 1.005191691001528, 1.1498698960022011, 1.1524572919988714, 1.2086797369993292, 1.2161102289974224, 1.1277623679998214, 1.2940730509981222, 1.0303337580007792, 1.3539179899998999, 1.1704485270020086, 1.2324355890013976, 1.1969703429967922, 1.2572057819998008, 1.304898565998883, 1.0528734699983033, 0.8597680960010621, 0.852148196001508, 0.8154666219998035, 0.8618430129972694, 0.9012223599966092, 1.1029677070000616, 0.9454876349991537, 0.9489341609987605, 0.929052559997217, 0.9124620990005496, 0.8417801150026207, 1.043874949002202, 0.9591600290004862, 1.0070706459991925, 1.0656220379969454, 1.1761166269971, 1.1045619409997016, 0.9414274749979086, 1.1144645099993795, 0.9381647810005234, 1.068028335001145, 1.0920139810004912, 1.0773345710003923, 1.182331942000019, 1.148606260001543, 1.0517596879981284, 1.030943591002142, 1.0183819899975788, 1.0257502190033847, 1.0068595559969253, 1.13408275799884, 1.0227663460027543, 1.1082068370014895, 1.217573147998337, 1.1813742119993549, 1.6024742150002567, 1.7413496609988215, 1.5882277630007593, 1.1588985870002944, 0.9642708069986838, 1.1988417130014568, 0.987962046998291, 1.1276863489983953, 1.0368729820002045, 1.0904284040007042, 1.246787736999977, 1.0789606079997611, 0.9828177640010836, 1.0594488570022804, 0.9904631760000484, 1.111075647000689, 1.0513679180003237, 0.9806831480018445, 1.0165251140024338, 1.0557698999982676, 0.8836591450017295, 0.9258498570015945, 1.0533933169972443, 1.0354855730001873, 1.2045212550001452, 1.0483081120000861, 1.1067110959993443, 1.3016453199998068], "average": 1.0849647952197847}, {"name": "5", "timings": [1.2073714159996598, 1.016586230001849, 1.039793070001906, 1.0379422000005434, 1.152374254001188, 1.2072429759973602, 1.036392206002347, 1.1944488789995376, 1.013437323999824, 1.1818981479991635, 1.139242720000766, 1.0949485989985988, 1.086057112999697, 0.9655582000013965, 1.081719827001507, 1.0436610399992787, 1.1932484240023769, 0.9951265509989753, 0.9997818060001009, 1.1369970830019156, 0.9943490029982058, 1.0994336069998099, 1.1563444359999266, 1.0445621340004436, 1.271614416000375, 1.1752006489987252, 1.207824844001152, 1.0539478270002292, 1.0908336940010486, 1.0365152589984064, 1.0321663079994323, 1.147505683999043, 1.3135639100000844, 1.0710311149996414, 1.2078836090004188, 1.2038092209986644, 1.1060240990009333, 1.3006971729992074, 1.0391938879984082, 1.0021679130004486, 0.9427431039985095, 1.1796863320014381, 1.034446163001121, 1.0027181719997316, 1.1943772859995079, 1.0296384929970372, 1.1466520590001892, 1.0035511450005288, 1.034802246002073, 0.964627459001349, 1.0249277139992046, 0.9418450759985717, 1.0828757449999102, 0.8877903600005084, 1.135650940999767, 0.9314506529990467, 0.8488431209989358, 0.9809427069994854, 1.037286974999006, 0.9224444969986507, 0.9678593140015437, 0.950580278000416, 0.9420002940023551, 0.951895942002011, 1.0643641690003278, 1.1532759049987362, 0.985172461001639, 1.0091500199996517, 1.1626014610010316, 0.991670460000023, 0.9778550049995829, 1.1119709790000343, 0.9903292419985519, 1.0544257350011321, 1.1943332010014274, 0.9882540689977759, 1.2022655309992842, 1.1436780950025422, 1.1598871799978951, 0.9613096930006577, 1.0076907689981454, 1.1867741269998078, 1.2958711850005784, 1.2088350369995169, 1.2092804989988508, 1.0607202140017762, 1.1392046630026016, 1.2897254300005443, 1.0223783349974838, 1.104012629002682, 1.002994337999553, 1.0548303450013918, 1.0694682559987996, 1.0651840059981623, 1.0963648020006076, 1.1276821790015674, 1.2566034810006386, 1.1073624620003102, 1.2342468019996886, 1.0608029020004324], "average": 1.0826870859800692}, {"name": "10", "timings": [1.176385435002885, 0.9351622069989389, 0.9554938880028203, 1.0146565089999058, 0.9473489559968584, 1.2198975500032248, 0.920429920002789, 1.0290560930006905, 1.0755823069994221, 0.92856213900086, 0.9648621680025826, 0.9094260609999765, 0.9570577129998128, 0.8895415249971848, 0.966279468000721, 0.9145275019982364, 0.905867137000314, 0.9673518279996642, 0.9254993070026103, 1.0762600369998836, 0.9734214240015717, 0.9328365889996348, 0.9669820550006989, 1.00305823799863, 1.1745710559989675, 1.0488882409990765, 1.40632216800077, 1.2825972130012815, 1.6584884859985323, 1.3634784179994313, 1.3417522240015387, 1.1867419560003327, 1.2955080650026503, 1.124193319999904, 1.3535334010011866, 1.076567668998905, 1.1116593299993838, 1.1387704359985946, 1.073242268001195, 1.2740836880002462, 1.597844672996871, 1.307110167999781, 1.3131276620006247, 1.312419524998404, 1.2712592079988099, 1.226585439999326, 1.0693794899998466, 1.3943895470001735, 1.4174750590027543, 1.2026078249982675, 1.2824513939995086, 1.1853642250025587, 1.2462828589996207, 1.2810553119998076, 1.29736868100008, 1.2036002530003316, 1.447708372001216, 1.3105961040018883, 1.362466411999776, 1.3073460720006551, 1.1823592280015873, 1.2739846759977809, 1.4283237820018257, 1.0312609339998744, 1.2475981600000523, 1.2740782250002667, 1.1828429909983242, 1.4799846409987367, 1.0897017770003004, 1.0613293839996913, 0.9258844760006468, 1.0697305940011574, 1.1237274820014136, 1.1723797949998698, 0.8905748639990634, 1.122951153000031, 1.191591201000847, 1.0566627599982894, 1.2314976300003764, 1.040441468001518, 1.0720510190003552, 1.059068312002637, 1.0008739349977986, 1.1610931689974677, 1.0450741620006738, 1.1708450149999408, 1.1972975800017593, 1.160938435998105, 1.3942144199972972, 0.963921749000292, 1.0061989509995328, 1.173169884001254, 1.0861376790016948, 1.1606952639995143, 1.0594479959981982, 1.1160550940003304, 1.0170264599983057, 0.9984427710005548, 1.0186443979982869, 1.029816001002473], "average": 1.1447029979201033}, {"name": "20", "timings": [1.8485318239982007, 2.619044111997937, 1.3451669530004438, 1.141614768999716, 1.4580924329966365, 1.2522244569991017, 1.1651136950022192, 1.2469540669990238, 1.4781289769998693, 1.2497884799995518, 1.7578550270009146, 1.4933276980009396, 1.2754894790014077, 1.563463750997471, 1.6533415190024243, 1.9204478979991109, 1.7902438269993581, 1.9849433999988833, 1.41691938400254, 1.1630395490028604, 1.1920368840001174, 7.445054042000265, 1.0318213649989048, 0.992292611997982, 0.924644738999632, 0.9802896920009516, 0.9258259460002591, 0.937334207999811, 1.0136772220030252, 1.081493061999936, 0.8456985630000418, 0.9929278999989037, 0.9971222310014127, 1.0650842799987004, 0.8910471859999234, 0.9452031259970681, 0.9044385849992977, 0.9510596709988022, 0.9780681199990795, 1.0218584379981621, 0.926214343002357, 0.8416492030009977, 0.8859531750022143, 0.9026033779991849, 0.9717306830025336, 0.9355694760015467, 1.0642872509997687, 0.856983682999271, 0.9060733490005077, 0.8942123000015272, 0.8436577880020195, 0.8948767539986875, 0.8982645530013542, 0.9251421579974703, 0.9096288520013331, 0.8338089240023692, 0.9167511570012721, 0.9182583809997595, 1.060510790997796, 1.1365332630011835, 1.252598916998977, 1.0323946250027802, 0.9682796609995421, 0.957729539997672, 1.039497724003013, 1.0381646220012044, 1.0217183550012123, 1.1721715790008602, 1.1066010930007906, 1.0962879530015925, 1.0298518540002988, 0.9776780739994138, 0.9517364890016324, 0.9603014000022085, 1.0866016279978794, 1.0393673690014111, 1.0500748220001697, 0.961286754001776, 0.9788111420020869, 1.0985163030018157, 1.122749190999457, 1.010607963999064, 1.0372179139994842, 1.0159820139997464, 1.0146403949984233, 1.0019608349975897, 1.089797919998091, 1.105086769999616, 1.142409067000699, 0.9937084049997793, 1.1013788229975034, 1.090261109999119, 1.1235659529993427, 1.0670847820001654, 1.1577036440030497, 1.1000706369995896, 0.9999433880002471, 1.186162014000729, 1.0456583640007011, 1.075768392001919], "average": 1.177648461190147}, {"name": "50", "timings": [1.5360319790015637, 1.4528944220000994, 1.3107639869995182, 1.3590250490015023, 1.516829702002724, 1.4142237400010345, 1.6213547110019135, 1.787801025002409, 1.6304393559985328, 1.6702980430018215, 1.4463455269979022, 1.3255901239972445, 1.4547075080008653, 1.8373612079994928, 1.3897942429975956, 1.5350128700010828, 1.612622394997743, 1.8990290590008954, 1.7469323530021938, 1.7425650010009122, 1.4971403249983268, 1.402782961999037, 1.387471246001951, 1.384606065999833, 1.4244448159988679, 1.3634821479972743, 1.287787629000377, 1.2531251910004357, 1.236713136000617, 1.5631111430011515, 1.4040579190004792, 1.1880805239998153, 1.5419926300019142, 1.3323523190010746, 1.4511633139991318, 1.396137371997611, 1.2448954640021839, 1.4644265669994638, 1.393985104001331, 1.2944744739979797, 1.3111493149990565, 1.4693232070021622, 1.2991935610007204, 1.2933051799991517, 1.261223395998968, 1.2968224030009878, 1.3630912249973335, 1.2413942029997997, 1.196301684998616, 1.2511378700000932, 1.2371423689983203, 1.2787563569982012, 1.3045774470010656, 1.218367963003402, 1.4705164389997663, 1.3053657759992348, 1.2690842790034367, 1.2440181040001335, 1.2474875070001872, 1.194256939998013, 1.196037850000721, 1.1982663689996116, 1.4617477930005407, 1.175512769001216, 1.2641832159970363, 1.2316101390024414, 1.3837710869993316, 1.598976794997725, 1.44015751200277, 1.604826842998591, 1.3111206510002376, 1.1838052529965353, 1.440868349000084, 1.3586422180014779, 1.329950583000027, 1.2912038779977593, 1.2253798170022492, 1.4345630659991002, 1.5040200949988503, 1.627970296998683, 1.5483814300023369, 1.3217376040011004, 1.1893753059994197, 1.329930379997677, 1.3215368820019648, 1.4030946620005125, 1.2967878769995878, 1.3960691399988718, 1.2602216620034596, 1.497343857998203, 1.301715219997277, 1.2425289630009502, 1.3472227069978544, 1.2048602020004182, 1.398765966998326, 1.2407436849971418, 1.2503954079984396, 1.3278188340009365, 1.252686657000595, 1.264350015000673], "average": 1.3821254891599528}, {"name": "100", "timings": [2.0265786359996127, 1.529715025000769, 1.5778784709982574, 1.724734831997921, 1.5994405480014393, 1.5707431280025048, 1.8767128710023826, 1.77212381299978, 1.6701959409983829, 1.581147916996997, 1.676757176999672, 1.6410987460003525, 1.6234639229987806, 1.7547651610002504, 1.7097910850025073, 1.406323388000601, 1.4377301230015291, 1.4128782540028624, 1.5978598149995378, 1.4914531060021545, 1.7240315409981122, 1.5325768780021463, 1.4935948089987505, 1.5581270840011712, 1.648992777998501, 1.660977114999696, 1.6442870020000555, 1.7158105240014265, 1.7155597830023908, 2.0757024730010016, 1.6909958280011779, 1.667555234998872, 1.9342880279982637, 1.7647130289988127, 1.8091487179990509, 1.8688778640025703, 1.8697220320027554, 1.7839376960000664, 1.7605905160016846, 1.7975471829995513, 1.7433757120015798, 1.6206472520025272, 1.744327215001249, 1.6186059739993652, 1.6181088269986503, 1.4754348610003944, 1.702179904001241, 1.8430083010025555, 1.6241509020001104, 1.8995573290012544, 1.7597108490008395, 1.9682849009986967, 1.7748824390000664, 1.4471934419998433, 1.5846607589992345, 1.695620335998683, 1.785020416999032, 1.6295129410027585, 1.655130397000903, 1.644585306999943, 1.5149501899977622, 1.4821800499994424, 1.6143630570004461, 1.5926341250014957, 1.4702544129977468, 1.4812483019995852, 1.6311894539976493, 1.6206643370023812, 1.5773839670000598, 1.5056005470032687, 1.6294744840015483, 1.5356096909999906, 1.5548377580016677, 1.622790483001154, 1.6640177139997832, 1.4402887050018762, 1.5745427120018576, 1.4360628789982002, 1.8609761109983083, 1.5787731560012617, 1.8122385819988267, 1.6917224150020047, 1.6258291529993585, 1.5554386799994973, 1.8030114510002022, 1.7130851980000443, 1.6939031779984361, 1.748100994998822, 1.700551005997113, 1.6625307979993522, 1.7399999459994433, 1.7040960189988255, 1.8213323609998042, 1.8649023180005315, 1.9764416940015508, 1.6164167159986391, 1.7974555590008094, 1.7282937380005023, 1.7809303940011887, 1.9155278819998784], "average": 1.675720763590216}]} \ No newline at end of file diff --git a/playground/verifier/notebooks/Single Attribute from Variable Credentials - Non Revocable.txt b/playground/verifier/notebooks/Single Attribute from Variable Credentials - Non Revocable.txt new file mode 100644 index 0000000..17cda7f --- /dev/null +++ b/playground/verifier/notebooks/Single Attribute from Variable Credentials - Non Revocable.txt @@ -0,0 +1 @@ +{"name": "Single Attribute from Variable Credentials - Non Revocable", "results": [{"name": "1", "timings": [0.5144683379985509, 0.374318898000638, 0.2955529099999694, 0.35413808099838207, 0.3622073590013315, 0.30609929299680516, 0.2616788710001856, 0.3016092520010716, 0.3813119509977696, 0.36886360999778844, 0.3771588290001091, 0.35079841799961287, 0.27113772200027597, 0.3092291920002026, 0.2784253030004038, 0.2809111179994943, 0.3442825080019247, 0.4348563070016098, 0.30828068100163364, 0.29427685699920403, 0.3527879729990673, 0.318386285998713, 0.3521268459990097, 0.3245194349983649, 0.3363016669973149, 0.3274332080000022, 0.32528882500264444, 0.35080211700187647, 0.3314272339994204, 0.351303065999673, 0.31214611299947137, 0.31072573699930217, 0.2873753380008566, 0.30771006000213674, 0.31030746800024644, 0.31060074199922383, 0.28177527300067595, 0.2978859140021086, 0.33707751499969163, 0.29685300500204903, 0.38749371099765995, 0.4983562039997196, 0.435031720000552, 0.3788292099998216, 0.3742210759992304, 0.31310757200117223, 0.29686889799995697, 0.2908247980012675, 0.30005053599961684, 0.27951307599869324, 0.26524335000067367, 0.3122285310018924, 0.34641710199866793, 0.3422543630003929, 0.27984916900095413, 0.31386608899993007, 0.2947287700008019, 0.31349747300191666, 0.31152715800271835, 0.2768703540023125, 0.28901526000117883, 0.30417339199993876, 0.310741995999706, 0.29528749699966284, 0.2948798569996143, 0.26241376300095, 0.29126651200203924, 0.251149842999439, 0.2792789140003151, 0.27651477299878024, 0.3546116939978674, 0.3076270910023595, 0.2885864810014027, 0.31553575599900796, 0.2629853229991568, 0.28281666900147684, 0.2642781120011932, 0.27667319199827034, 0.2723453079997853, 0.2943475439969916, 0.26937996500055306, 0.2664414669998223, 0.28522361000068486, 0.2669801230003941, 0.2955467479987419, 0.30391297100140946, 0.2798007099991082, 0.2847077270016598, 0.29337903400301, 0.28298334999999497, 0.260008730001573, 0.3039669629979471, 0.29635160700127017, 0.2980001460018684, 0.28211732700219727, 0.2540260989990202, 0.2740461110006436, 0.2884403569987626, 0.2585666070008301, 0.2825492880001548], "average": 0.31204176397015543}, {"name": "5", "timings": [0.8593609050003579, 0.555105002997152, 0.45073235599920736, 0.46577948100093636, 0.659122954999475, 0.4674891270005901, 0.534101372002624, 0.4702426639996702, 0.489892552002857, 0.4937320800017915, 0.3862603669986129, 0.5058517979996395, 0.5082108500027971, 0.4667682879990025, 0.5999987569994119, 0.4496779519977281, 0.3690803280005639, 0.335063855000044, 0.33742102999894996, 0.28299261199936154, 0.2916701610010932, 0.3314078769981279, 0.29373593000127585, 0.3614942099993641, 0.3086759420002636, 0.35895029000312206, 0.2906218099997204, 0.31573491800008924, 0.289931904997502, 0.3336419430015667, 0.3832496480026748, 0.42841673899965826, 0.4022021519995178, 0.35834939099731855, 0.37997322299997904, 0.3745605889998842, 0.36294615100268857, 0.39562913099871366, 0.44748798699947656, 0.3921006159980607, 0.4237549969984684, 0.4645859400006884, 0.49985918599850265, 0.4806520729980548, 0.35031584200260113, 0.3163888470007805, 0.3457343380032398, 0.4956311550013197, 0.4238324420002755, 0.3602086719984072, 0.335362421003083, 0.29215562399986084, 0.33627828000317095, 0.3101540399984515, 0.30107661000147345, 0.3372097190003842, 0.3719665630014788, 0.311824639000406, 0.29855681200206163, 0.36032592300034594, 0.37971515800018096, 0.37156507399777183, 0.39632265100226505, 0.3570282740001858, 0.4837707490005414, 0.41741936600010376, 0.45964629700029036, 0.3716076030032127, 0.3430753559987352, 0.37111999800254125, 0.37244777800151496, 0.34679386299831094, 0.3232155049990979, 0.28922802099987166, 0.3405794239988609, 0.3963681169989286, 0.37604367099993397, 0.3412529689994699, 0.4178059240002767, 0.3782812000026752, 0.3800778690019797, 0.4470134920011333, 0.44994885999767575, 0.38998910700320266, 0.3258981869985291, 0.3104840129999502, 0.3552110320015345, 0.3539149720018031, 0.33679145100177266, 0.2923535490008362, 0.3197668889988563, 0.32234236099975533, 0.3191456530003052, 0.34648803399977623, 0.3867765879986109, 0.3817533949986682, 0.3460464729978412, 0.31768594900131575, 0.37637215399809065, 0.3246155099986936], "average": 0.38819501604019024}, {"name": "10", "timings": [0.6308347619997221, 0.3828673140014871, 0.38203296500068973, 0.46173970199743053, 0.39939932500055875, 0.37898446199687896, 0.32631223800126463, 0.3510249959981593, 0.3599353230019915, 0.45353904299918213, 0.45331506399816135, 0.439485439001146, 0.4104094020003686, 0.3676534179976443, 0.36953940800231067, 0.37351125100030913, 0.4526154970008065, 0.3925981860011234, 0.39157314100157237, 0.38322159399831435, 0.3795050959997752, 0.40311590900091687, 0.4140314459982619, 0.40186217200243846, 0.4643391559984593, 1.4800051210004312, 0.41259533099946566, 0.29712868700153194, 0.3556050809966109, 0.41932562999863876, 0.4048604540002998, 0.41695883799911826, 0.3788461170006485, 0.39566774500053725, 0.3739795459987363, 0.39760961399952066, 0.3944022319992655, 0.38363897900126176, 0.4024197760008974, 0.3842596459980996, 0.43970976199852885, 0.3775680509970698, 0.3785867349979526, 0.3856824399990728, 0.38653965999765205, 0.415374920998147, 0.35909761899893056, 0.33337595800185227, 0.36956505199850653, 0.35296860999733326, 0.3960943979982403, 0.36717175699959625, 0.3968943420004507, 0.34583945499980473, 0.3883476770024572, 0.4034915350021038, 0.36180964300001506, 0.35799490999852424, 0.35810011200010194, 0.3702185969996208, 0.34960027299894136, 0.36565376500220736, 0.3687779440006125, 0.3682134339978802, 0.3687474040016241, 0.34489277499960735, 0.3188151469985314, 0.3613403790004668, 0.3690848330006702, 0.37070303699874785, 0.41917581999950926, 0.3971681000002718, 0.39329123299830826, 0.39710802899935516, 0.38873755800159415, 0.35728452900002594, 0.36264574799861293, 0.37290061800013063, 0.3730015010005445, 0.3599822510004742, 0.309488501996384, 0.32493415199860465, 0.31330714900104795, 0.2711037879998912, 0.3513198319997173, 0.32594495200100937, 0.36679144200024894, 0.3780316100019263, 0.38160385899755056, 0.3552488679997623, 0.4185601860008319, 0.34051634799834574, 0.37599390800096444, 0.3771328540024115, 0.33913475099689094, 0.35939242000313243, 0.365424436997273, 0.3462621079997916, 0.32949509600075544, 0.36150636299862526], "average": 0.3906349734297328}, {"name": "20", "timings": [0.7008111200011626, 0.385185390998231, 0.4678929599976982, 0.485052039999573, 0.5160795679985313, 0.48120713800017256, 0.5274463659989124, 0.49363875500057475, 0.5047589759997209, 0.6081262610023259, 0.6020307399994635, 0.5739040720000048, 0.5250039710008423, 0.5178370469984657, 0.5163633529991785, 0.4979187170029036, 1.5680374759976985, 0.48619947000042885, 0.527033409998694, 0.5266536250019271, 0.4839492749997589, 0.45686989299792913, 0.47795358700022916, 0.4520782389990927, 0.46737675500116893, 0.4670446650015947, 0.4880779139966762, 0.4634985170014261, 0.42788450099760666, 2.574405707000551, 0.5542134389979765, 0.44208709400118096, 0.367832454998279, 0.375407441999414, 0.4283790619992942, 0.4032079739990877, 0.45946380700115697, 0.5552954390004743, 0.6091131580033107, 0.5023999000004551, 0.553539466996881, 0.5293520849991182, 0.557420169996476, 0.5215389140030311, 0.4418160559980606, 0.3506766869977582, 0.37638281199906487, 0.388894651998271, 0.40744544900007895, 0.4653579389996594, 0.4856810979981674, 0.48347205499885604, 0.5312576739997894, 0.46422378799979924, 0.49408126499838545, 0.5700848489977943, 0.5331977579990053, 0.45641287800026475, 0.4973871930014866, 0.5051367269988987, 0.5059128980028618, 0.6460244100017007, 0.6891673479985911, 0.521757484999398, 0.6111959260015283, 0.5913779199981946, 0.6950334229986765, 0.5515525820010225, 0.5472942180022073, 1.4315413869990152, 0.4972401319973869, 0.5792214430002787, 0.46825457500017365, 0.528899573997478, 0.5458355190021393, 0.6146723109995946, 0.6291193249999196, 0.569520842997008, 0.5237913240016496, 0.5088801270030672, 0.5312279010031489, 0.5255508879999979, 0.572238290002133, 0.49371079999764333, 0.6939296780001314, 0.6286931680006091, 0.6239874169987161, 0.6269293160003144, 0.5238786510017235, 0.6448701590015844, 0.7099810780018743, 0.8121122750017093, 0.8478269080005703, 0.8006340520005324, 0.8111577100025897, 0.9395688399999926, 0.7892546270013554, 2.7976229729974875, 0.7916588519983634, 0.5965959339991969], "average": 0.6059880108198559}, {"name": "50", "timings": [0.7969237910001539, 0.6048876940003538, 0.6539683379996859, 0.7787454879980942, 0.8024239909973403, 0.65711375599858, 0.783983581000939, 0.6214589480005088, 0.7247441459985566, 0.6650295019971963, 1.6478882640003576, 0.8031285510005546, 0.6909131909997086, 0.7243256270012353, 0.6987661489984021, 0.9501392950005538, 1.213740178001899, 1.166741920998902, 1.1706221409986028, 0.6266202900005737, 0.6579230600000301, 0.6334266450030555, 0.7018411579992971, 0.5790844170005585, 0.5922151089980616, 0.65051669499735, 0.5956680300005246, 0.7060789370007114, 0.6343298479987425, 0.6402786239996203, 0.555355796997901, 0.6387729779999063, 0.7981467979989247, 0.8027471270033857, 0.7479556459984451, 0.7665809150021232, 0.7540641279992997, 0.767474725998909, 0.6951517880006577, 0.6138594930016552, 0.7491775630005577, 0.7186090479990526, 0.7353210290020797, 0.6422587349989044, 0.5861677130014868, 0.7352236930018989, 0.549327673001244, 0.6363829360016098, 0.8346887999978208, 0.7207630099983362, 0.8736756090002018, 0.8314674329994887, 0.85584500099867, 0.7343992390015046, 0.673737559998699, 0.65332762899925, 0.5788578739993682, 0.6028555490011058, 0.7551527920004446, 0.767627948000154, 0.7480735619974439, 0.6989096409997728, 0.6931124319999071, 0.6895323499993538, 0.6633935540012317, 0.5112192330016114, 0.5616373230004683, 0.6976767430023756, 0.5550784080005542, 0.5611214890013798, 0.6003364589996636, 0.5298359910011641, 0.5071358220011462, 0.5946942580012546, 0.5353569899998547, 0.5542671789989981, 0.5710244429974409, 0.5884210000003804, 0.6122428029993898, 0.5551795290011796, 0.5434581439985777, 0.5837760850008635, 0.6345844729985402, 0.5570454849985254, 0.5871075579998433, 0.5660555100002966, 0.5109233799994399, 0.8340729550000106, 0.8724463379985536, 0.7498231819990906, 0.992145313997753, 0.6048669299998437, 0.6794726290027029, 0.6973628259984253, 0.9054670880032063, 0.8267699600000924, 0.5605821659992216, 0.5577385719989252, 0.5192357239975536, 0.5528859609985375], "average": 0.6991257308398781}, {"name": "100", "timings": [1.3919392919997335, 0.8689027380023617, 0.8106343159997778, 0.838126000999182, 0.9097233329994197, 0.8053637989978597, 0.775033923000592, 0.8055674499992165, 0.8009333139998489, 0.7960417930007679, 0.8139473749979516, 1.0015924399995129, 0.7602616510012012, 0.7816545040004712, 0.8964216670028691, 0.9454021229976206, 0.8306068100027915, 0.8341800479975063, 0.92578993600182, 0.8103533770008653, 0.8535431069976767, 0.921824139997625, 0.848124040003313, 0.8076635859979433, 0.9284624389983946, 0.9447670600020501, 0.860012215001916, 0.8759357729977637, 0.8274433170008706, 0.7875404660007916, 0.85182824200092, 0.9295629990010639, 0.8658229270004085, 0.9001134059981268, 0.906599787002051, 1.0413091810005426, 0.8543053129978944, 0.9785637970016978, 1.0326448419982626, 0.8408235069982766, 0.9502893240023695, 0.95418411799983, 0.981916184999136, 0.9496560040024633, 1.0382628289989952, 0.8696775839998736, 0.8152529849976418, 0.9340028970000276, 0.9162610750026943, 0.8885037649997685, 0.9429576199981966, 0.8746335270006966, 0.8286410209984751, 0.8640261820000887, 0.8698421030021564, 0.8425421739993908, 0.8955959509985405, 0.8601880499991239, 1.000101364999864, 0.8297943370016583, 0.8158951830009755, 0.8889243400008127, 0.8550108189992898, 0.9510731529990153, 0.8747168800000509, 0.8625204700001632, 0.9236661059985636, 0.8408702839988109, 0.8321777099990868, 0.8540216779983894, 0.8924634210015938, 1.1179623440002615, 0.9185359809998772, 1.0134080829993763, 0.9764811630011536, 1.1040627170004882, 1.0782890629998292, 0.9557955960008258, 1.003194821998477, 0.9086562670017884, 0.8438151119989925, 1.1071367520016793, 1.151679744998546, 0.8517539280001074, 0.9040342019980017, 1.0103785719984444, 0.772645498997008, 0.825552874001005, 0.9650014589969942, 0.8817656749997695, 0.9163755289991968, 0.992284276002465, 0.7947955399977218, 0.9981076570002188, 1.022097640998254, 0.8303669759989134, 0.8577700999994704, 0.867831527000817, 0.8891622110022581, 0.822077086999343], "average": 0.9033805357198799}]} \ No newline at end of file diff --git a/playground/verifier/notebooks/Variable Attribute Size - Non Revocable.txt b/playground/verifier/notebooks/Variable Attribute Size - Non Revocable.txt new file mode 100644 index 0000000..a4c631c --- /dev/null +++ b/playground/verifier/notebooks/Variable Attribute Size - Non Revocable.txt @@ -0,0 +1 @@ +{"name": "Variable Attribute Size - Non Revocable", "results": [{"name": "128B", "timings": [0.402161559999513, 0.2571755690005375, 0.20185413400031393, 0.17845723999926122, 0.16261534199657035, 0.1628293939975265, 0.16431888199804234, 0.16918245700071566, 0.17829332999826875, 0.184937557001831, 0.18503748900184291, 0.16549446800127043, 0.22148454600028344, 0.1581555209995713, 0.16184727499785367, 0.1850822549968143, 0.18367945399950258, 0.1911297110018495, 0.18142664399783826, 0.19879690000016126, 0.23485716799768852, 0.16305872600059956, 0.18000727400067262, 0.17581999899994116, 0.1772679909990984, 0.17665638700054842, 0.18320710400075768, 0.18301868200069293, 0.17613337700095144, 0.1852301279977837, 0.17915862000154448, 0.17828741899938905, 0.17500006300178939, 0.17766206899977988, 0.2017225679992407, 0.17173181800171733, 0.18611054700159002, 0.17328669900234672, 0.18901767500210553, 0.1727760869980557, 0.17223632400055067, 0.21213720900050248, 0.2703284229974088, 0.16856706500038854, 0.19154574099957244, 0.1851047579984879, 0.1863994779996574, 0.18344065999917802, 0.1722773950023111, 0.18772709599943482, 0.27606283500063, 0.1814910159991996, 0.1932113990005746, 0.1773028780007735, 0.1759544829983497, 0.18419046900089597, 0.153549495000334, 0.1574897479986248, 0.18287709800279117, 0.16849986799934413, 0.16392371599795297, 0.15170109800237697, 0.1475557990015659, 0.14890429599836352, 0.20686409199697664, 0.16967331699925126, 0.1565655529993819, 0.16499053799998364, 0.35127913700125646, 0.2843732399996952, 0.2563410450020456, 0.16641436899953987, 0.1630866839986993, 0.16714705699996557, 0.16163452900218545, 0.14920853600051487, 0.15478920099849347, 0.1551905699998315, 0.15723900599914487, 0.14934187900144025, 0.1791256219985371, 0.18991876599829993, 0.18169191700144438, 0.17618218300049193, 0.1728203550010221, 0.18066069499764126, 0.1638535439997213, 0.1473915729984583, 0.15097502899880055, 0.1527584770010435, 0.15245088699884946, 0.16609887899903697, 0.1653407560006599, 0.15534262800065335, 0.15282127799946466, 0.1534652019981877, 0.15592315100002452, 0.1560760290012695, 0.16003563900085283, 0.16038805299831438], "average": 0.18213907891986308}, {"name": "512B", "timings": [0.40897187999871676, 0.31227226599730784, 0.29542326699811383, 0.26695350000227336, 0.25798129699978745, 0.2584735790005652, 0.3243415709985129, 0.28694789400105947, 0.26593026599948644, 0.25785617899964564, 0.25302711999756866, 0.2718715549999615, 0.2685509319999255, 0.26586419100203784, 0.2927516529998684, 0.33344227699853946, 0.3604824930007453, 0.3158549909967405, 0.27958576699893456, 0.28300817200215533, 0.31102102899967576, 0.29839892699965276, 0.30654293699990376, 0.2936846449993027, 0.2829666739999084, 0.27614811300009023, 0.3020679549990746, 0.3834499449985742, 0.36524331900000107, 0.24456269100119243, 0.39949663099832833, 0.27738766300171847, 0.276731676000054, 0.3355071730002237, 0.3870023269992089, 0.3176858100014215, 0.2841922030020214, 0.24355893000029027, 0.2329887299965776, 0.3066471089987317, 0.2811682909996307, 0.31933675199979916, 0.2948103019989503, 0.2788866519986186, 0.30577039399940986, 0.32863061200259835, 0.2937989300007757, 0.24604899599944474, 0.3145355519991426, 0.2847553540013905, 0.28269060799721046, 0.2628493280026305, 0.24887352600126178, 0.25772654699903796, 0.24801162799849408, 0.22876394499689923, 0.23622555700058, 0.24422622899874114, 0.24604687799728708, 0.3052574379980797, 0.28836924100323813, 0.28175460800048313, 0.2614322200024617, 0.3039612300017325, 0.2817754360003164, 0.23155231199780246, 0.2561395769989758, 0.3023431539986632, 0.23822341800041613, 0.24474742700112984, 0.22200965999945765, 0.21223497000028146, 0.22037153000201215, 0.18626185299945064, 0.2062137930006429, 0.20131754000249202, 0.2032649950015184, 0.1900193670007866, 0.19820363399776397, 0.1929418430008809, 0.19372503100021277, 0.19921695299854036, 0.21789486100169597, 0.2757860480014642, 0.2557336120007676, 0.20199754599889275, 0.18308373599938932, 0.20159930499721668, 0.2120872830018925, 0.21964260399909108, 0.206598696000583, 0.1966698850010289, 0.19038889500006917, 0.19096932499815011, 0.19333869999900344, 0.20221271500122384, 0.20030175799911376, 0.1948243500009994, 0.1870891769976879, 0.1855556720001914], "average": 0.263251428159856}, {"name": "1kB", "timings": [0.4601088570016145, 0.2533407279988751, 0.2497311389997776, 0.22107150300143985, 0.23163106900028652, 0.23583289199814317, 0.24945573899822193, 0.2136511110002175, 0.21648390100017423, 0.2224014220009849, 0.2200634609980625, 0.21576238800116698, 0.22414005199971143, 0.21636788900286774, 0.21764803700352786, 0.2167282359987439, 0.21358986000268487, 0.2081718320005166, 0.19259252199844923, 0.18011664000005112, 0.1877463919990987, 0.1994102299977385, 0.20679368600031012, 0.19832923900321475, 0.2076471640029922, 0.19724382599815726, 0.19644465099918307, 0.20396183300181292, 0.19738024600155768, 0.1743534790002741, 0.18705195000075037, 0.19322228400051245, 0.19761786699746153, 0.29400211599931936, 0.278388842001732, 0.19217203700100072, 0.21497823699974106, 0.20984681000118144, 0.19251247300053365, 0.20542293199832784, 0.19325008900341345, 0.20983584100031294, 0.21557090199712547, 0.21097843200186617, 0.26693594199969084, 0.2427977280021878, 0.2350206609989982, 0.24745463900035247, 0.2560172160010552, 0.4115168310017907, 0.34202036799979396, 0.2799817710001662, 0.22794135000003735, 0.23135611599718686, 0.24078758300311165, 0.22334165899883374, 0.21302767799716094, 0.19786206299977493, 0.2580124199994316, 0.2320022780004365, 0.2277259230031632, 0.20819164299973636, 0.1983785180018458, 0.2072338790021604, 0.24494815099751577, 0.19422911499714246, 0.2204669710008602, 0.22614885399889317, 0.20909309199851123, 0.21403991599800065, 0.3636802789987996, 0.30059794199769385, 0.30743338499814854, 0.32261804600057076, 0.34609225500025786, 0.27556273200025316, 0.29989818400281365, 0.23290828900280758, 0.22159400600139634, 0.22227396800008137, 0.26692582000032417, 0.2290497879985196, 0.20896586800154182, 0.22318593700038036, 0.2634551340015605, 0.36879182800112176, 0.2790637729995069, 0.3080008959987026, 0.36325788400063175, 0.33924590699825785, 0.3315959580031631, 0.3723865100000694, 0.39919564299998456, 0.36613362800198956, 0.31056592800086946, 0.34901717899992946, 0.3451825859992823, 0.2793288360007864, 0.26338602299802005, 0.24926436500027194], "average": 0.2488824177801871}, {"name": "16kB", "timings": [0.655375655998796, 0.5186141120029788, 0.3623549219992128, 0.39801243499823613, 0.45643788700181176, 0.33674126800178783, 0.5054235399984464, 0.33187553500101785, 0.30070587299996987, 0.3028047619991412, 0.2811536530025478, 0.292737561998365, 0.3637374829995679, 0.2810694899999362, 0.2643251830013469, 0.2998234670012607, 0.28336536699862336, 0.2883262709983683, 0.2666278799988504, 0.29138638799850014, 0.28975412100044196, 0.27781075700113433, 0.28376045299955877, 0.27730636700289324, 0.2637586460004968, 0.26993695899727754, 0.2913502960000187, 0.23151421700094943, 0.24149199500243412, 0.23233240499757812, 0.2564341670004069, 0.23429939500056207, 0.28571271799955866, 0.3743223060009768, 0.30224090900082956, 0.2705577609995089, 0.29099345299982815, 0.5871240529995703, 0.4282620180019876, 0.34612924300017767, 0.32940659999803756, 0.3302368260010553, 0.37421867000011844, 0.3207143649997306, 0.3065627260002657, 0.308594008001819, 0.2977539679995971, 0.299183474999154, 0.30321130900119897, 0.2959900749992812, 0.29750784399948316, 0.36838705399713945, 0.28622514000016963, 0.23652686900095432, 0.2982042760013428, 0.3401096549969225, 0.3596134940016782, 0.29896573799851467, 0.33895448200200917, 0.36564315000214265, 0.3521174849993258, 0.29067886600023485, 0.33576786299818195, 0.3169774800007872, 0.3433716950021335, 0.34325315000023693, 0.341344989999925, 0.3605976949984324, 0.41848667999875033, 0.38244775400016806, 0.3744660379998095, 0.459318336997967, 0.48225215500133345, 0.3983733079985541, 0.41249110200078576, 0.5213953150014277, 0.7230130340030883, 0.7224644809975871, 0.5192663220004761, 0.631849962999695, 0.7264032300008694, 0.5434730890010542, 0.5959145820015692, 0.6253869760002999, 0.7445131319982465, 0.777013087998057, 0.6027829019985802, 0.5750088130007498, 0.4440178320000996, 0.4451882370012754, 0.5104870010000013, 0.5724722539998766, 0.5359572100023797, 0.44806263699865667, 0.4076765469981183, 0.4029908969969256, 0.3644469440005196, 0.3713427490001777, 0.4094747249982902, 0.5179792180024378], "average": 0.38822526473002655}, {"name": "64kB", "timings": [0.4677445870001975, 0.38686154300012277, 0.38773542599665234, 0.39513642200108734, 0.39280175100066117, 0.391507897998963, 0.38874064899937366, 0.37467375400228775, 0.405277109999588, 0.4823509779998858, 0.4097590970013698, 0.49713042700022925, 0.44694091199926334, 0.37175993399796425, 0.3787320480005292, 0.4028616560026421, 0.37756011999954353, 0.3823684460003278, 0.47688301599919214, 0.39516161600113264, 0.36992659499810543, 0.35831310900175595, 0.4167668180016335, 0.43915989699962665, 0.4381256230008148, 0.40725863800253137, 0.40659311399940634, 0.3827685109972663, 0.37021134899987374, 0.39330286599943065, 0.3589657329976035, 0.37568711200219695, 0.41793396299908636, 0.430943766998098, 0.43887415700010024, 0.3640142590011237, 0.4428692620022048, 0.3879181250013062, 0.4014801970006374, 0.39657566900132224, 0.42275112900097156, 0.3563967789996241, 0.41613678200155846, 0.38118287899851566, 0.39083744999879855, 0.4177986520007835, 0.39598674599983497, 0.4024934340013715, 0.36387305300013395, 0.41411424900070415, 0.38281731299866806, 0.364647562000755, 0.40300549099993077, 0.3758545190030418, 0.4136546890003956, 0.41382196500126156, 0.43972362100248574, 0.5580928550007229, 0.5179828139989695, 0.42785832400113577, 0.42595965399959823, 0.4435950299994147, 0.45658881700001075, 0.5191482090012869, 0.48079919800147763, 0.47197469900129363, 0.47715453899945715, 0.5299189149991435, 0.5192977229999087, 0.6552729370014276, 0.48255659300048137, 0.5563293049999629, 0.4004882980007096, 0.37561634899975616, 0.43462960200122325, 0.4121116499991331, 0.4003004529986356, 0.42082150200076285, 0.4210401769996679, 0.4106450200015388, 0.4000470629980555, 0.41893636700115167, 0.3814986709985533, 0.3816527259987197, 0.37133426400032477, 0.378533093000442, 0.39210223899863195, 0.3961369970020314, 0.3731238719992689, 0.37600944799851277, 0.40350244299770566, 0.3836016630011727, 0.3688472629983153, 0.4130124040020746, 0.46980321999944863, 0.42590455299796304, 0.41919942000095034, 0.3586339399989811, 0.3776949790008075, 0.38363189099982264], "average": 0.41636161646012626}, {"name": "128kB", "timings": [0.7773583130001498, 0.6454590469984396, 0.5809774000008474, 0.6432795200016699, 0.6538218529967708, 0.6305854709971754, 0.5759059030024218, 0.6506395329997758, 0.6718374849988322, 0.6022692670012475, 0.6974651359996642, 0.5814041230005387, 0.5847170150009333, 0.5825499780003156, 0.5865530280025268, 0.5982075409992831, 0.5727230769989546, 0.754415240000526, 0.7371574600001622, 0.708193754999229, 0.7471941699986928, 0.7068367900028534, 0.5824592710014258, 0.6240845440006524, 0.7421307929980685, 0.7461230949993478, 0.8007823850020941, 0.5983356529977755, 0.6762654119993385, 0.6073476340025081, 0.7213196579978103, 0.5968976160002057, 0.6269527309996192, 0.5855402359993604, 0.6240098910020606, 0.6127846080016752, 0.6486796580029477, 0.6011066389983171, 0.6157866320027097, 0.5789805989988963, 0.5693873119998898, 0.5849653639997996, 0.5767131949978648, 0.5939253979995556, 0.6379756999995152, 0.6309002089983551, 0.5904573360021459, 0.6087218909997318, 0.6336122619977687, 0.6072688260028372, 0.5791335199974128, 0.5866747279978881, 0.5680925859996933, 0.6213182980027341, 0.6571557550014404, 0.5772366199998942, 0.6208557279969682, 0.5769921899991459, 0.5638650619985128, 0.5809782979995362, 0.5768406240022159, 0.5600889100023778, 0.5966701200013631, 0.835453845000302, 1.2139515230010147, 0.7400634530022216, 0.7055163240002003, 0.6759301269994467, 0.7348723850009264, 0.7586831320004421, 1.1456931869979599, 0.8516000990020984, 0.8012310740014073, 0.7279897320004238, 0.7405755469990254, 0.8775191839995387, 0.8542471040018427, 0.7248247700008505, 0.8149540480008, 0.7733884629997192, 0.8238806929985003, 0.6711990679978044, 0.7231768630008446, 0.6431955640000524, 0.7785658940010762, 0.730092584999511, 0.7332153829993331, 0.7163112359994557, 0.7338000740019197, 0.7336984700014, 0.8069440500003111, 0.7631081899999117, 0.80214882799919, 0.856693683002959, 0.7674197769993043, 0.7661241479981982, 0.8039489820002927, 0.7806717259991274, 0.744611142003123, 0.8300979949999601], "average": 0.6876436644001296}, {"name": "256kB", "timings": [1.5097436270007165, 1.3593273299993598, 1.4096826290005993, 1.5318467659999442, 1.5357701530010672, 1.3476696420002554, 1.512795169997844, 1.1601628829994297, 1.2180964549988857, 1.4817150620001485, 1.5275811100000283, 1.4397612539978581, 1.1294171970002935, 1.2284743739983242, 1.265931896999973, 1.4445687950028514, 1.3394955919975473, 1.1797353440015286, 1.110468459999538, 1.416879175001668, 1.3163472640007967, 1.3781978580009309, 1.1903261209990887, 1.091602996999427, 1.2627314450000995, 1.1602244579989929, 1.0790621050000482, 0.9766958369982603, 1.0335434090011404, 1.4011689370017848, 1.325621632997354, 1.4629696550000517, 1.2498874839984637, 1.3265273760007403, 1.5148634620018129, 1.5443047449989535, 1.290579243999673, 1.3571604889984883, 1.346777638002095, 1.4234637539993855, 1.0649189070027205, 1.225578747002146, 1.4181752029980998, 1.5825917430011032, 1.1490376649999234, 1.0565152150011272, 1.1115638230003242, 1.1409006169997156, 1.1675408750015777, 1.2458969569997862, 1.1901791330019478, 1.0983743670003605, 1.111226009001257, 1.252070697999443, 1.033663438000076, 1.1114472590015794, 1.0985521469992818, 1.0576830229983898, 1.2780653349982458, 1.303657590997318, 1.3129475630012166, 1.17227391599954, 1.05538921599873, 1.0925653009981033, 1.040363508000155, 1.186789144998329, 1.1969094579981174, 1.2030134800006635, 1.0648217649977596, 1.0928332820003561, 0.9970533779996913, 1.1247533929999918, 1.1500453830012702, 1.1242919270007405, 1.1605389020005532, 1.153735907999362, 1.1324759700000868, 1.1922796300023037, 1.1228400049985794, 1.1186961299972609, 1.2356526160001522, 1.4014752120019693, 2.1167635530000553, 1.373366124000313, 1.1692714800010435, 1.2687545260014303, 1.1504780459981703, 1.5686789840001438, 1.4126161169988336, 1.4193665780003357, 1.2959015330015973, 1.242573611001717, 1.1935848899993289, 1.2368224450001435, 1.0979684199992334, 1.0751863849982328, 0.9720444380000117, 1.0501560979973874, 1.0651051610002469, 1.077235243999894], "average": 1.2469643629899292}]} \ No newline at end of file diff --git a/playground/verifier/notebooks/Variable Attribute Size - Revocable.txt b/playground/verifier/notebooks/Variable Attribute Size - Revocable.txt new file mode 100644 index 0000000..45e9652 --- /dev/null +++ b/playground/verifier/notebooks/Variable Attribute Size - Revocable.txt @@ -0,0 +1 @@ +{"name": "Variable Attribute Size - Revocable", "results": [{"name": "128B", "timings": [0.7256133809969469, 0.7424160529990331, 0.5642815070023062, 0.5936448100001144, 0.6603832799992233, 0.7252507590019377, 0.7319615330015949, 0.7427263139979914, 0.6352480309979001, 0.5434817239984113, 0.5566150239974377, 0.5954159659995639, 0.6212303889988107, 0.7026936670008581, 0.5850577959972725, 0.6437695659988094, 0.7676731020001171, 0.7223881209974934, 0.5647378590001608, 0.6503434760015807, 0.6441849929979071, 0.6588634459985769, 0.7056337569993048, 0.7367939680007112, 0.6861656629989739, 0.6420814079974662, 0.7911515560008411, 1.057097094002529, 1.0483305230009137, 0.8073091480000585, 0.8003993810016254, 0.6852687610007706, 0.6753187360009179, 0.6846523569984129, 0.6523373710006126, 0.7746494109997002, 0.7636412409992772, 0.6652106750007079, 0.7447258499996678, 0.6734356849992764, 0.7096290499976021, 0.8109305530015263, 0.6649194499987061, 0.7090478489990346, 0.6626779520011041, 0.6484352909974405, 0.6246820570013369, 0.8242851110007905, 0.6787796150019858, 0.680140239001048, 0.9008542560004571, 0.7216486710021854, 0.6940239130017289, 0.7829117139990558, 0.8558264919993235, 0.7625091490008344, 0.8427689840027597, 0.5947639369987883, 0.6303260560016497, 0.782147743000678, 0.7747065859985014, 0.6580726020001748, 0.7257327270017413, 0.7795802900000126, 0.6852217710002151, 0.673727883000538, 0.696614985998167, 0.7855164720022003, 0.6173779040000227, 0.722029021999333, 0.7305533209982968, 0.7058524089989078, 0.691590657002962, 0.6788249279998126, 0.7143918830006442, 0.8480261960030475, 0.8431966289972479, 0.6133214319997933, 0.9115322720026597, 0.8482379659981234, 0.6599761130019033, 0.7897447659997852, 0.7267727329999616, 0.7709172979994037, 0.7389549489998899, 0.9404812590000802, 0.7615069320017938, 0.9671740410012717, 0.9662184339977102, 0.8973113329993794, 0.824566698000126, 0.9062027709987888, 0.895130059998337, 0.8767332659990643, 0.9479429149978387, 0.9744123590025993, 0.9407164209987968, 1.0934165429971472, 0.9220469469983072, 0.9050711630006845], "average": 0.7476289640098912}, {"name": "512B", "timings": [0.7132291160014574, 0.6376923259995237, 0.6429928159996052, 0.6999370789999375, 0.6841533440019703, 0.6316652259993134, 0.684436816998641, 0.7510165589992539, 0.5908985200003372, 0.6771141620010894, 0.6854209440025443, 0.6259097580004891, 0.6910808119973808, 0.7123886789995595, 0.7198028550010349, 0.597239744001854, 0.6153584829989995, 0.655004590000317, 0.6135503730001801, 0.9048854270004085, 0.7053019119994133, 0.732114038997679, 0.8269568129981053, 0.6904437520024658, 0.7446764039996197, 0.8301368300017202, 0.7311630659969524, 0.7999777500008349, 0.8310658880000119, 0.7759422130002349, 0.7834572279971326, 0.8876919850008562, 0.7805964920007682, 0.6229853759978141, 0.7782054279996373, 0.6506445710001572, 0.673001685001509, 0.9543310980006936, 0.766236832998402, 0.6843053230004443, 0.6714715279995289, 0.6919616349987336, 0.8718563049988006, 0.8459696330028237, 0.7888482560010743, 0.7581919590011239, 0.701384510997741, 0.701694718998624, 0.7455933269993693, 0.7436114789998101, 0.7595344170003955, 0.707849400001578, 0.7212444830001914, 0.7349577149980178, 0.6216309209994506, 0.7328228639998997, 0.8106318009995448, 0.8918710429970815, 0.7131094620017393, 0.693932322999899, 0.7222574430015811, 0.6580152330025157, 0.7376356149979983, 0.8896634179982357, 0.9581992370003718, 1.0903673249995336, 0.7684141479985556, 0.7408792889982578, 0.8974219500014442, 0.8740271720016608, 0.8776583520011627, 0.8497517600007995, 0.936649141000089, 0.8619527940027183, 0.8367432369996095, 0.8491503129989724, 0.7601235580004868, 0.940537750000658, 0.9769491150000249, 0.8996164119998866, 0.8042613480029104, 0.7895752399999765, 0.8474452840018785, 0.7516228130007221, 0.7388056740019238, 0.7595453670001007, 0.7620556600013515, 0.738125805000891, 0.8743149510009971, 0.8190241510019405, 0.8937911079992773, 0.8097012369980803, 0.8004018570027256, 0.7505051980006101, 0.8502947890010546, 0.7465688010015583, 0.6635150600013731, 0.690499872998771, 0.7173497610019695, 0.8456716849977965], "average": 0.7647026902101425}, {"name": "1kB", "timings": [0.8404216029994132, 0.7604357679992972, 0.863284470000508, 0.8057009250005649, 0.8128300040007161, 0.9790535920001275, 1.2227806789996976, 1.2657311020011548, 1.199335126002552, 1.7079631449996668, 1.2051935389972641, 1.0328133849980077, 1.0333238809980685, 1.0877450820007653, 1.0402006910007913, 1.0065459629986435, 1.002683139002329, 1.1300832550004998, 0.861926098998083, 0.8261070160006057, 0.769452052001725, 0.8547291780014348, 0.7107223740022164, 1.1065554540000448, 1.3254272379999747, 1.730533910998929, 1.3385776700015413, 0.9647875070004375, 0.9355453019998095, 0.7997809840016998, 0.779100504998496, 0.9831226429996605, 0.8940967000016826, 0.8791003749975062, 0.9242883260012604, 0.7809776180001791, 0.8070474289997946, 0.8006216319990926, 0.8231175490000169, 0.8088016700021399, 0.8698301789991092, 0.854089076998207, 0.7506451250010286, 0.8243539059985778, 0.7975019690020417, 0.6921873680003046, 0.6933595750015229, 0.7691981040006795, 0.7356238389984355, 0.781763819999469, 0.8810089479993621, 0.6545709499987424, 0.6984081649970904, 0.7659358000018983, 0.7631997050011705, 0.7486640979986987, 0.755647494999721, 0.7395613310000044, 0.6944981330016162, 0.8697452200030966, 0.8236653249987285, 0.7555460379990109, 0.7420451799989678, 0.7885605239971483, 0.7963565540012496, 0.7736423300011666, 0.8872149970011378, 0.7282960770025966, 0.7149995340005262, 0.7763573860029283, 0.8012217789982969, 0.8307408350010519, 0.8203608949988848, 0.9042460909986403, 0.9148168089996034, 0.8496148499980336, 0.9100129559992638, 0.9466327160007495, 0.7998289890019805, 0.9675867480000306, 1.3160223370032327, 0.9390857769976719, 0.8564110749975953, 0.8217852039997524, 1.04998407000312, 1.3195843780013092, 1.3245538439987286, 1.378374566000275, 1.010619743999996, 0.8048104160006915, 0.9643204280000646, 1.0087428219994763, 1.438912307999999, 1.1327540679994854, 1.008606522998889, 0.8635173359980399, 0.8546707150017028, 1.2080424050000147, 1.0480374399994616, 1.5137150320006185], "average": 0.934346344890073}, {"name": "16kB", "timings": [1.370579688998987, 1.2239114149997476, 1.5281059659973835, 1.389708509999764, 1.0927138789993478, 0.9688350539981911, 0.9804369150006096, 1.176385990002018, 1.0988072239997564, 1.0920994029984286, 1.5668305690014677, 1.3883497719980369, 1.3704892179994204, 1.0553961300029187, 1.0554864029982127, 0.9129195460009214, 1.1474953870019817, 1.5518870750020142, 1.572809495999536, 1.4485253230013768, 1.1684427260006487, 1.4315982020016236, 1.3574113460017543, 1.3753249640030845, 1.0993993030024285, 0.9176356899988605, 1.2456239640014246, 0.941209204000188, 0.8170600940029544, 0.8846195059995807, 0.8414809470014006, 0.907500635003089, 0.8637341079993348, 0.9739036370010581, 0.9015242290006427, 0.780915568000637, 0.7175460929975088, 0.7562268119982036, 0.7758130020010867, 0.7661054089985555, 0.9155651860019134, 0.7613424839983054, 0.7599292409977352, 0.7291368980004336, 0.7449863459987682, 0.8107802849990549, 0.7902239059985732, 0.793377596000937, 0.7577427620017261, 0.9143617509980686, 0.7373770579979464, 0.8439850969989493, 0.8107640099988203, 0.7420083350007189, 0.8808461289991101, 0.9394500430025801, 0.9578076460020384, 0.919419193000067, 0.7595109270005196, 0.7753489989991067, 0.8028182449997985, 0.8488881529992796, 0.8205172140005743, 0.8609149670010083, 0.7567199719997006, 0.8253762870008359, 0.7367810850009846, 0.8395777799996722, 0.8105326689983485, 0.7676566800000728, 0.8936497219983721, 0.7479363220008963, 0.7836550550018728, 0.9315753430018958, 0.7158088600008341, 0.8294869230012409, 0.7441355700029817, 0.7606592640004237, 0.7324122399986663, 0.691062508001778, 0.7527311190024193, 0.711879238999245, 0.7123420659991098, 0.7844952029990964, 0.7558138439999311, 0.7757854629999201, 0.779279737998877, 0.8575454419988091, 0.7277406610010075, 0.7368378089995531, 0.7276017490003142, 0.7754877570005192, 0.7163911419993383, 0.7031858019981883, 0.81668463099777, 0.7103196310017665, 0.7097679660000722, 0.73062340999968, 0.8003359590002219, 0.7588436170008208], "average": 0.9180266940201546}, {"name": "64kB", "timings": [0.9056441519969667, 0.8429361320013413, 0.9598593590017117, 0.9052220539997506, 0.947277359002328, 0.9394332250012667, 0.9452437020008801, 0.870405061999918, 0.8752268509997521, 0.9280564900000172, 0.9051697190006962, 0.8432039129984332, 0.8753263059988967, 0.867910862001736, 1.0435535969991179, 0.9764675250007713, 1.1093360449995089, 1.0225124300013704, 0.9220453179987089, 0.9272865040002216, 1.31211437499951, 1.4089212979997683, 1.2394788550009253, 1.8375288040006126, 1.3370946920003917, 1.1627978040014568, 1.0430585209978744, 1.1550971629985725, 0.9045259160011483, 1.0101818570001342, 1.051511790999939, 1.0117036840019864, 0.961868948998017, 0.8511670629995933, 0.9986935529996117, 0.8879537309985608, 1.0323171339987312, 1.0775236040026357, 0.9118317139982537, 1.2118364219968498, 1.689125774999411, 1.9936999379970075, 1.4189498769992497, 1.454485455997201, 1.5223587389991735, 1.533864970999275, 1.320402326000476, 0.9827502609987278, 1.1931475390010746, 1.1319452819989237, 1.0240040170028806, 1.1092937870016613, 0.8881474049994722, 0.8752997720002895, 1.138591211001767, 1.1021190459978243, 0.9986950120000984, 1.0609725610011083, 1.7098584169980313, 1.476091907999944, 1.4062600849974842, 1.1524106609977025, 1.2715918610010704, 1.0369612730028166, 1.3521662329985702, 1.0648682290011493, 1.000780588001362, 1.2267249649994483, 1.1180995000031544, 0.954985864002083, 0.9879309030002332, 1.0139493520000542, 0.9652755669994804, 0.863774936999107, 0.9148583669993968, 1.0109695520004607, 1.1331803070024762, 1.1423433060008392, 0.9253176509992045, 0.9871257910017448, 1.1009449400007725, 0.9726929879980162, 1.2406419350008946, 1.1200074150001456, 1.0279564729971753, 0.9559120310004801, 0.8779454379982781, 0.9320163250013138, 1.0063647850001871, 0.9877431570021145, 0.9030735140004253, 0.9437319610005943, 1.0039433739984815, 0.9911727670005348, 1.1499120549997315, 0.9932115350020467, 0.9358319860002666, 0.9519833169979393, 1.118488141000853, 1.127695200000744], "average": 1.085139711640004}, {"name": "128kB", "timings": [1.664146005998191, 1.8049103129997093, 1.4784529349999502, 1.3035640939997393, 1.2473563759995159, 1.494335258998035, 1.4137448789988412, 1.2222770210028102, 1.2339335520009627, 1.4378457829989202, 1.244717462999688, 1.2385858119996556, 1.4126411709985405, 1.2635993080002663, 1.4566942579986062, 1.4495365990005666, 1.7639360079992912, 1.382636949998414, 1.4958305820000533, 1.4308337920010672, 1.3822336609991908, 1.662706954000896, 1.3955251309998857, 1.4462470250000479, 1.4186045389978972, 1.3258422520011663, 1.301315746997716, 1.1590829609995126, 1.2868146869986958, 1.2041133580023597, 1.3436028380019707, 1.305136497001513, 1.5306935490007163, 1.9738788330032548, 1.8181903469994722, 1.8481648269989819, 1.769651114998851, 2.049747990000469, 2.5281528399973467, 2.136669344999973, 1.601474216000497, 1.4410961360008514, 1.6341165519988863, 1.4007837280005333, 1.3839278340019519, 1.392727268001181, 1.7877869660005672, 1.7251803469989682, 1.705793391000043, 1.5623400010008481, 1.4144702129997313, 1.66813679400002, 1.7439410130027682, 1.6170332649999182, 1.6191254609984753, 1.4734840210003313, 1.8702016549977998, 1.6070990289990732, 1.5151744870017865, 1.5733798149994982, 1.5695801810034027, 1.4816041579979355, 1.464348962999793, 1.4843616489997657, 1.569117898998229, 1.638769459001196, 1.6733109890010383, 1.6235331469979428, 1.569676556999184, 1.5718846750023658, 1.5964816430023347, 1.2950806469998497, 1.4807443970021268, 1.3021799380003358, 1.5291163000001688, 1.7280548270027793, 1.3350413199987088, 1.624839656000404, 1.4476417519981624, 1.5487942729996576, 1.4489213580018259, 1.3364745580001909, 1.4813520770003379, 1.293393184998422, 1.4176145560013538, 1.29293407500154, 1.3315405809989898, 1.4226624130023993, 1.7759126589990046, 1.3518521549995057, 1.5033908959994733, 1.9089137809969543, 1.6876558849980938, 1.4941024979998474, 1.7694626840020646, 1.8832277259971306, 1.5393266649989528, 1.5421706979977898, 2.000975382001343, 1.9244802389985125], "average": 1.5400375134999558}, {"name": "256kB", "timings": [2.0848419059984735, 1.4895742810003867, 1.4997420090003288, 1.5758700439982931, 1.7304109409997182, 1.6424054759991122, 1.736582162000559, 1.6368200990000332, 1.7044084270019084, 1.8758527649988537, 1.859801205999247, 2.1977413870008604, 2.1180017849983415, 2.119649003001541, 2.2858163740020245, 2.07062526899972, 2.0447392639980535, 2.1538408570013416, 2.054133735000505, 1.8921854090003762, 1.6364869179997186, 1.897732322999218, 1.617085022997344, 1.510007600998506, 1.7017456600005971, 1.661400060998858, 1.5909065420019033, 1.510449213998072, 1.6618818110000575, 1.588425631998689, 1.5590323690012156, 1.4469711710007687, 1.565654555997753, 1.6815794819995062, 1.5829904029997124, 1.5181462799992005, 1.4899618560011731, 1.6807755079971685, 1.5063637080020271, 1.628758333001315, 1.5010687629983295, 1.6376374789979309, 1.5373140049996437, 1.4908613940024225, 1.5593170299980557, 1.6187629890009703, 1.5240740240005834, 1.5419962310006667, 1.6107992729994294, 1.9091791069986357, 1.8936628389965335, 1.74158081099813, 1.8073618150010589, 1.9095443890000752, 1.5983160319992749, 1.734289940999588, 1.5614307729993016, 1.6751693699989119, 1.4956169340002816, 1.5380791259995021, 1.4945399820026068, 1.6550408379989676, 1.5265460359987628, 1.6209315149972099, 1.6355148760012526, 1.708866458000557, 1.5955627519979316, 1.5858247600008326, 1.3780295610013127, 1.5066339730001346, 1.6222969410009682, 1.4747389159965678, 1.705524921999313, 1.8183663769996201, 2.222801217001688, 1.974340070002654, 2.225468792999891, 2.291202214997611, 2.1084602019982412, 2.482353930998215, 2.2583269829992787, 2.1846557400021993, 3.12412974599647, 2.133288597000501, 1.955588839999109, 2.1833249339979375, 2.1903592630005733, 1.8540868300005968, 1.9529760309997073, 3.0836881720024394, 2.037149911000597, 1.9468483870005002, 1.985745140002109, 2.1370471000009275, 2.3764893670013407, 2.202926390000357, 2.2071528699998453, 5.349704423999356, 2.5158701249965816, 2.245071972000005], "average": 1.8625293433197658}]} \ No newline at end of file diff --git a/playground/verifier/notebooks/verify_attrib_size.ipynb b/playground/verifier/notebooks/verify_attrib_size.ipynb index cba66ab..16d1869 100644 --- a/playground/verifier/notebooks/verify_attrib_size.ipynb +++ b/playground/verifier/notebooks/verify_attrib_size.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "d1b73b54", + "id": "46bce60b", "metadata": {}, "source": [ "# Performance Test\n", @@ -11,7 +11,7 @@ }, { "cell_type": "markdown", - "id": "7fff12a7", + "id": "40cf49b2", "metadata": {}, "source": [ "### Imports" @@ -20,7 +20,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "58808a1a", + "id": "df74c615", "metadata": {}, "outputs": [], "source": [ @@ -34,7 +34,7 @@ }, { "cell_type": "markdown", - "id": "ed1d12e8", + "id": "1f57483b", "metadata": {}, "source": [ "### Initialise the Agent Controller" @@ -43,14 +43,14 @@ { "cell_type": "code", "execution_count": 2, - "id": "5765cd43", + "id": "0194a147", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Initialising a controller with admin api at http://issuer-agent:3021 and an api key of adminApiKey\n" + "Initialising a controller with admin api at http://verifier-agent:3021 and an api key of adminApiKey\n" ] } ], @@ -66,7 +66,7 @@ }, { "cell_type": "markdown", - "id": "1d52df71", + "id": "16d41ba5", "metadata": {}, "source": [ "### Start a Webhook Server" @@ -75,7 +75,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "001e7847", + "id": "da6be760", "metadata": {}, "outputs": [ { @@ -97,20 +97,18 @@ }, { "cell_type": "markdown", - "id": "82030431", + "id": "111f5e4c", "metadata": {}, "source": [ - "## Store Issuing Schema and Cred Def Identifiers\n", + "## Store Schema and Cred Def Identifiers\n", "\n", - "If you intend for this agent to issue credentials you should first initialise your agent as an issuer and author the relevant identifiers to the public ledger. The issuer_initialisation recipe notebook can be duplicated and used as a starting point.\n", - "\n", - "Once schema and cred def identifiers are created copy across and store in variables as illustrated in the cell below. Be sure to use unique names for each variable." + "These are used to specify the proof requests for the experiment" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "0dc81744", + "execution_count": 9, + "id": "2bbd3455", "metadata": {}, "outputs": [], "source": [ @@ -144,12 +142,32 @@ "\n", "\n", "\n", + "\n", + "\n", "\n" ] }, { "cell_type": "markdown", - "id": "c8cd512f", + "id": "8e59c8fe", + "metadata": {}, + "source": [ + "## Init Performance Service" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3581fe7b", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service = PerformanceService(agent_controller, iterations=100)" + ] + }, + { + "cell_type": "markdown", + "id": "18cae8be", "metadata": {}, "source": [ "## Establish Connection\n", @@ -159,16 +177,17 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "24c2ea8a", + "execution_count": 7, + "id": "6b392881", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': 'e9079bd4-af0f-4453-b6c3-a0cc8ddb849b', 'label': 'Issuer', 'serviceEndpoint': 'http://issuer-agent:3020', 'recipientKeys': ['9RC5kbj1hmRD9GpBXtX5uEAGpbo9sGNcDmAkg2nn1Eiv']}\n", - "319e18fa-9348-4787-b995-e327cf4e5cda\n" + "{'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': 'd9fcb03f-265a-4a1a-860c-edb780c79920', 'serviceEndpoint': 'http://verifier-agent:3020', 'recipientKeys': ['HPnYM57JSBQUwaKrJSpDgKSzCK2fdNPhuMksfHkdRrCP'], 'label': 'Verifier'}\n", + "3aaf07e2-d41b-4dff-903d-6acc4b21c3af\n", + "\u001b[1m\u001b[32mConnection ID: 3aaf07e2-d41b-4dff-903d-6acc4b21c3af is now active.\u001b[0m\n" ] } ], @@ -198,286 +217,26 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "6ef23fbb", + "execution_count": 10, + "id": "931be2f5", "metadata": {}, "outputs": [], "source": [ - "connection_id = \"319e18fa-9348-4787-b995-e327cf4e5cda\"" + "connection_id = \"3aaf07e2-d41b-4dff-903d-6acc4b21c3af\"" ] }, { "cell_type": "markdown", - "id": "572aaf3a", - "metadata": {}, - "source": [ - "## Issue Credentials" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f27d4bd6", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 128*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size1_schema_id, size1_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "64a4d766", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 512*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size2_schema_id, size2_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e6e3e941", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size3_schema_id, size3_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "403230a9", + "id": "fafd3ba5", "metadata": {}, - "outputs": [], "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 16*1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size4_schema_id, size4_cred_def_id, credential_attributes)" + "## Define Presentation Request Object Template\n" ] }, { "cell_type": "code", - "execution_count": null, - "id": "f24fc176", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 64*1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size5_schema_id, size5_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d1b84a46", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 128*1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size6_schema_id, size6_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "534be319", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 256*1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size7_schema_id, size7_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5e6fde4b", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 128*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size1_schema_id, size1_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f40eee6e", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 512*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size2_schema_id, size2_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d98e77fb", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size3_schema_id, size3_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "46cd0ebf", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 16*1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size4_schema_id, size4_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "16feb4af", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 64*1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size5_schema_id, size5_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d2ff0acf", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 128*1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size6_schema_id, size6_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4744b07a", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"image\", \"value\": 256*1024*\"0\"},\n", - "]\n", - "response = await agent_controller.issuer.send_credential(connection_id, size7_schema_id, size7_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "markdown", - "id": "b3c66e5b", - "metadata": {}, - "source": [ - "## Init Performance Service" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cd324ed7", - "metadata": {}, - "outputs": [], - "source": [ - "performance_service = PerformanceService(agent_controller, iterations=20)" - ] - }, - { - "cell_type": "markdown", - "id": "40d0ad75", - "metadata": {}, - "source": [ - "## Define Presentation Request Object\n", - "\n", - "The below cell defines a generic presentation request object, that can be sent across specific connections requesting that they produce a presentation containing the identified attributes and meeting the restrictions.\n", - "\n", - "It is often useful to define your request objects first, then reuse these objects across many connections you wish to request a proof from. \n", - "\n", - "Duplicate and customise the below cell as many times as you need. It may be useful to save these request objects either to the jupyter store using %store or through\n", - "\n", - "TODO: Detail the full set of restrictions available to a verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "945ce1e3", - "metadata": {}, - "outputs": [], - "source": [ - "# # We add a constraint that the attribute must originate from this schema\n", - "# schema_id = \"\"\n", - "\n", - "# trusted_issuer_did = \"\"\n", - "\n", - "# cred_def_id = \"\"\n", - "\n", - "# # Define the list of attributes and restrictions under which each attribute was issued that a prover must satisfy with a presentation\n", - "# # NOTE: if identifying a schema or credential definition then the attribute name must be contained within the corresponding schema.\n", - "# req_attrs = [\n", - "# {\"name\": \"\", \"restrictions\": [{\"schema_id\": schema_id}]},\n", - "# {\"name\": \"\", \"restrictions\": [{\"cred_def_id\": cred_def_id}]},\n", - "# #NOTE: you do not need to specify any restrictions. This means the prover can present a self-attested attribute to satisfy this request. \n", - "# # Although the business logic (this notebook) can still determine this is unacceptable.\n", - "# {\"name\": \"\", \"restrictions\":[]}\n", - "# # You can also specify individual attributes be non-revoked\n", - "# {\"name\": \"\", \"restrictions\": [], \"non_revoked\": {\"to\": int(time.time() - 1)}}\n", - "# ]\n", - "\n", - "# # We could extend this to request the name attribute aswell if we wanted.\n", - "\n", - "\n", - "# proof_request = {\n", - "# \"name\": \"Name of Proof Request\",\n", - "# \"version\": \"1.0\",\n", - "\n", - "# # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", - "# # We will ignore these for now.\n", - "# \"requested_predicates\": {\n", - "# # f\"0_{req_pred['name']}_GE_uuid\":\n", - "# # req_pred for req_pred in req_preds\n", - "# },\n", - "# # You can also request the entire proof request be non-revoked\n", - "# \"non_revoked\": {\"to\": int(time.time())}\n", - "# }" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e1f10ef0", + "execution_count": 11, + "id": "f859d203", "metadata": {}, "outputs": [], "source": [ @@ -498,7 +257,7 @@ }, { "cell_type": "markdown", - "id": "c0ec457f", + "id": "d52c8b18", "metadata": {}, "source": [ "# Variable Attribute Size Experiment\n" @@ -506,8 +265,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "c2f9e7b7", + "execution_count": 12, + "id": "d7e0d7dd", "metadata": {}, "outputs": [], "source": [ @@ -516,8 +275,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d40d6661", + "execution_count": 13, + "id": "becefa43", "metadata": {}, "outputs": [], "source": [ @@ -526,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "a27f987c", + "id": "5105fb7f", "metadata": {}, "source": [ "## Performance Test - 128B" @@ -534,8 +293,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "949dbf38", + "execution_count": 14, + "id": "8e7e6a82", "metadata": {}, "outputs": [], "source": [ @@ -553,8 +312,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "820cffb3", + "execution_count": 15, + "id": "7e45c600", "metadata": {}, "outputs": [], "source": [ @@ -563,10 +322,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "12a75af1", + "execution_count": 16, + "id": "73f5acfc", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.18213907891986308\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -575,8 +342,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "80070da8", + "execution_count": 17, + "id": "3f85a2f8", "metadata": {}, "outputs": [], "source": [ @@ -594,10 +361,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "daae023f", + "execution_count": 18, + "id": "34a3427a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.7476289640098912\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -606,7 +381,7 @@ }, { "cell_type": "markdown", - "id": "7793a380", + "id": "15fe3045", "metadata": {}, "source": [ "## Performance Test - 512B" @@ -614,8 +389,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "13ffa459", + "execution_count": 19, + "id": "98a73525", "metadata": {}, "outputs": [], "source": [ @@ -633,8 +408,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "86ae5b75", + "execution_count": 20, + "id": "f6d1f0c5", "metadata": {}, "outputs": [], "source": [ @@ -643,10 +418,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "50a5ad7a", + "execution_count": 21, + "id": "2b768a54", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.263251428159856\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -655,8 +438,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d7a42fb4", + "execution_count": 22, + "id": "ccbfe264", "metadata": {}, "outputs": [], "source": [ @@ -674,10 +457,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ea9cc8f6", + "execution_count": 23, + "id": "71c30dd0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.7647026902101425\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -686,7 +477,7 @@ }, { "cell_type": "markdown", - "id": "c9f0f67c", + "id": "e31641d5", "metadata": {}, "source": [ "## Performance Test - 1kB" @@ -694,8 +485,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "2469348d", + "execution_count": 24, + "id": "5497c7b5", "metadata": {}, "outputs": [], "source": [ @@ -713,8 +504,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "5e252b12", + "execution_count": 25, + "id": "52b5d7ab", "metadata": {}, "outputs": [], "source": [ @@ -723,10 +514,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "14400595", + "execution_count": 26, + "id": "1b8b6990", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.2488824177801871\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -735,8 +534,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "baacfd2c", + "execution_count": 27, + "id": "9d3bc205", "metadata": {}, "outputs": [], "source": [ @@ -754,10 +553,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ba224e27", + "execution_count": 28, + "id": "c2d0a212", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.934346344890073\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -766,7 +573,7 @@ }, { "cell_type": "markdown", - "id": "3738cb47", + "id": "3f183acc", "metadata": {}, "source": [ "## Performance Test - 16kB" @@ -774,8 +581,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "40494d3d", + "execution_count": 29, + "id": "3bd3f111", "metadata": {}, "outputs": [], "source": [ @@ -793,8 +600,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "bc2ad17b", + "execution_count": 30, + "id": "fc0e966b", "metadata": {}, "outputs": [], "source": [ @@ -803,10 +610,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "9b850b79", + "execution_count": 31, + "id": "38f63f8f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.38822526473002655\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -815,8 +630,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d8079b79", + "execution_count": 32, + "id": "20a339b5", "metadata": {}, "outputs": [], "source": [ @@ -834,10 +649,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "6d620f2a", + "execution_count": 33, + "id": "8622af7e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.9180266940201546\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -846,7 +669,7 @@ }, { "cell_type": "markdown", - "id": "07799bfe", + "id": "edcbe526", "metadata": {}, "source": [ "## Performance Test - 64kB" @@ -854,8 +677,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "2b196934", + "execution_count": 34, + "id": "e5715d7b", "metadata": {}, "outputs": [], "source": [ @@ -873,8 +696,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "3d29fc28", + "execution_count": 35, + "id": "7ff2e5be", "metadata": {}, "outputs": [], "source": [ @@ -883,10 +706,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "6f7dc715", + "execution_count": 36, + "id": "d873eaec", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.41636161646012626\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -895,8 +726,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ca146a79", + "execution_count": 37, + "id": "7b76de28", "metadata": {}, "outputs": [], "source": [ @@ -914,10 +745,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "dafaa52e", + "execution_count": 38, + "id": "2b0b95a5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.085139711640004\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -926,7 +765,7 @@ }, { "cell_type": "markdown", - "id": "34e83cf7", + "id": "b478fa00", "metadata": {}, "source": [ "## Performance Test - 128kB" @@ -934,8 +773,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "45109191", + "execution_count": 39, + "id": "b0586264", "metadata": {}, "outputs": [], "source": [ @@ -953,8 +792,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "cba90fe1", + "execution_count": 40, + "id": "eb41dc41", "metadata": {}, "outputs": [], "source": [ @@ -963,10 +802,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "c99237d5", + "execution_count": 41, + "id": "7ade16ab", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.6876436644001296\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -975,8 +822,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "1c3990f1", + "execution_count": 42, + "id": "87b96078", "metadata": {}, "outputs": [], "source": [ @@ -994,10 +841,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "4d337aed", + "execution_count": 43, + "id": "2672c1ba", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.5400375134999558\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -1006,7 +861,7 @@ }, { "cell_type": "markdown", - "id": "e419f6f8", + "id": "b5d4c767", "metadata": {}, "source": [ "## Performance Test - 256kB" @@ -1014,8 +869,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ec6d21a3", + "execution_count": 44, + "id": "4b3effa2", "metadata": {}, "outputs": [], "source": [ @@ -1033,8 +888,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d215dadb", + "execution_count": 45, + "id": "71c2e305", "metadata": {}, "outputs": [], "source": [ @@ -1043,10 +898,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "0c3c0b2d", + "execution_count": 46, + "id": "08c2a10c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.2469643629899292\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -1055,8 +918,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "e9cd47f3", + "execution_count": 47, + "id": "078f8a47", "metadata": {}, "outputs": [], "source": [ @@ -1074,10 +937,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "9e48a9cb", + "execution_count": 48, + "id": "6e5017e8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.8625293433197658\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -1086,7 +957,7 @@ }, { "cell_type": "markdown", - "id": "8fc84705", + "id": "f416a083", "metadata": {}, "source": [ "## Plot Results" @@ -1094,7 +965,7 @@ }, { "cell_type": "markdown", - "id": "5f0aec22", + "id": "abbea014", "metadata": {}, "source": [ "### Non Revocable" @@ -1102,8 +973,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "c6f41931", + "execution_count": 50, + "id": "079bc16c", "metadata": {}, "outputs": [], "source": [ @@ -1120,10 +991,23 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "f7836456", + "execution_count": 51, + "id": "f799fa2f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Import libraries\n", "import matplotlib.pyplot as plt\n", @@ -1151,7 +1035,7 @@ }, { "cell_type": "markdown", - "id": "68243ae4", + "id": "05a00a01", "metadata": {}, "source": [ "### Revocable" @@ -1159,8 +1043,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "dd8093d2", + "execution_count": 52, + "id": "486ae1bb", "metadata": {}, "outputs": [], "source": [ @@ -1178,10 +1062,23 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "45ca7cab", + "execution_count": 53, + "id": "a070118c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJJCAYAAAB27EniAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABFpklEQVR4nO3deXhV1bnH8d+bmRlRRAUVtaLBWEFjnaI1WnGgKu1traAVS+pQNVrtrdqe21prcx3aq1WstrZBi5VjbVVqnadUjdZqEEUgCjig4IAoggwh03v/ODsYMJADrDMkfD/PkyfnrL3P2u/ZJCc/1l57b3N3AQAAIJycTBcAAADQ3RCwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAILC8TBeQCttss40PHTo002UAAIBubNq0aYvdfWBHy7plwBo6dKjq6uoyXQYAAOjGzGz++pZxiBAAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAICvF43GVlJQoNzdXJSUlisfjmS4paXmZLgAAAGBd8XhcsVhM1dXVKisrU21trSoqKiRJY8eOzXB1nTN3z3QNwZWWlnpdXV2mywAAAJuopKREEydOVHl5+Zq2mpoaVVZWaubMmRms7HNmNs3dSztcRsACAADZJjc3Vw0NDcrPz1/T1tTUpKKiIrW0tGSwss9tKGAxBwsAAGSd4uJi1dbWrtVWW1ur4uLiDFW0cQhYAAAg68RiMVVUVKimpkZNTU2qqalRRUWFYrFYpktLCpPcAQBA1mmbyF5ZWan6+noVFxerqqqqS0xwl5iDBQAAsEmYgwUAAJBGBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBpTRgmdnbZvaqmb1sZnVR2wAze8zM5kbft4razcxuMLN5ZjbDzPZt18/4aP25ZjY+lTUDAABsrnSMYJW7+wh3L42eXyrpCXffXdIT0XNJOlbS7tHXmZJulhKBTNJlkg6Q9BVJl7WFMgAAgGyUiUOEJ0r6c/T4z5LGtGuf7AnPS+pvZttLOlrSY+7+ibsvkfSYpGPSXDMAAEDSUh2wXNKjZjbNzM6M2ga5+/vR4w8kDYoeD5b0brvXLoja1tcOAACQlfJS3H+Zuy80s20lPWZmr7Vf6O5uZh5iQ1GAO1OSdtpppxBdAgAAbJKUjmC5+8Lo+yJJ9yoxh+rD6NCfou+LotUXStqx3cuHRG3ra193W7e4e6m7lw4cODD0WwEAAEhaygKWmfUysz5tjyWNkjRT0n2S2s4EHC/pH9Hj+ySdFp1NeKCkpdGhxEckjTKzraLJ7aOiNgAAgKyUykOEgyTda2Zt25ni7g+b2YuS7jKzCknzJZ0Urf+gpOMkzZO0UtL3JMndPzGzKyS9GK33S3f/JIV1AwAAbBZzDzIFKquUlpZ6XV1dpssAAADdmJlNa3cZqrVwJXcAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABBYygOWmeWa2XQzuz96vouZ/cfM5pnZX82sIGovjJ7Pi5YPbdfHT6L2183s6FTXDAAAsDnSMYJ1gaT6ds+vlnSdu39J0hJJFVF7haQlUft10Xoys+GSTpa0l6RjJN1kZrlpqBsAAGCTpDRgmdkQSaMl/Sl6bpKOkPT3aJU/SxoTPT4xeq5o+ZHR+idKutPdV7v7W5LmSfpKKusGAADYHKkewfqtpIsltUbPt5b0qbs3R88XSBocPR4s6V1JipYvjdZf097Ba9YwszPNrM7M6j766KPAbwMAACB5KQtYZvZ1SYvcfVqqttGeu9/i7qXuXjpw4MB0bBIAAKBDeSns+xBJJ5jZcZKKJPWVdL2k/maWF41SDZG0MFp/oaQdJS0wszxJ/SR93K69TfvXAAAAZJ2UjWC5+0/cfYi7D1VikvqT7n6KpBpJ34pWGy/pH9Hj+6LnipY/6e4etZ8cnWW4i6TdJb2QqroBAAA2VypHsNbnEkl3mtmvJE2XVB21V0u63czmSfpEiVAmd59lZndJmi2pWdK57t6S/rIBAACSY4lBou6ltLTU6+rqMl0GAADoxsxsmruXdrSMK7kDAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAILKmAZWa7mVlh9PhwMzvfzPqntDIAAIAuKtkRrLsltZjZlyTdImlHSVNSVhUAAEAXlmzAanX3ZknfkDTR3X8safvUlQUAANB1JRuwmsxsrKTxku6P2vJTUxIAAEDXlmzA+p6kgyRVuftbZraLpNtTVxYAAEDXlZfMSu4+W9L57Z6/JenqVBUFAADQlW0wYJnZq5J8fcvd/cvBKwIAAOjiOjtE+HVJx0t6OPo6Jfp6SNKDqS0NAABsyeLxuEpKSpSbm6uSkhLF4/FMl5S0DY5guft8STKzo9x9ZLtFl5jZS5IuTWVxAABgyxSPxxWLxVRdXa2ysjLV1taqoqJCkjR27NgMV9e5ZCe5m5kd0u7JwRvxWgAAgI1SVVWl6upqlZeXKz8/X+Xl5aqurlZVVVWmS0uKua93itXnK5ntJ2mSpH6STNISSRPc/aXUlrdpSktLva6uLtNlAACATZSbm6uGhgbl539+VaimpiYVFRWppaUlg5V9zsymuXtpR8uSPYtwmqR9zKxf9HxpwPoAAADWUlxcrMsvv1xTp05VfX29iouLNWbMGBUXF2e6tKQkey/CQjMbJ+lcSReY2c/N7OepLQ0AAGypysvLdfXVV2vChAn67LPPNGHCBF199dUqLy/PdGlJSXYe1T8knSipWdKKdl8AAADB1dTU6JJLLtGkSZPUp08fTZo0SZdccolqamoyXVpSkp2DNdPdS9JQTxDMwQIAoGvr6nOwkh3Bes7M9g5YEwAAwHoVFxertrZ2rbba2truNQdLUpmkaWb2upnNMLNXzWxGKgsDAABbrlgspoqKCtXU1KipqUk1NTWqqKhQLBbLdGlJSeosQknHprQKAACAdtouJlpZWbnmLMKqqqoucZFRKck5WJJkZvtIOjR6+oy7v5KyqjYTc7AAAECqbfYcLDO7QNIdkraNvv5iZpWdvKbIzF4ws1fMbJaZXR6172Jm/zGzeWb2VzMriNoLo+fzouVD2/X1k6j9dTM7Oql3DQAAkCHJzsGqkHSAu//c3X8u6UBJZ3TymtWSjnD3fSSNkHSMmR0o6WpJ17n7l5S4InxFu20sidqvi9aTmQ2XdLKkvSQdI+kmM8tNsm4AAIC0S/pehJLanxPZErWtlycsj57mR18u6QhJf4/a/yxpTPT4xOi5ouVHmplF7Xe6+2p3f0vSPElfSbJuAACAtEt2kvutkv5jZvdGz8dIqu7sRdFI0zRJX5L0O0lvSPrU3ZujVRZIGhw9HizpXUly92YzWypp66j9+Xbdtn9N+22dKelMSdppp52SfFsAAADhJTWC5e7XSvqepE+ir++5+2+TeF2Lu4+QNESJUac9N7nSzrd1i7uXunvpwIEDU7UZAACATiU1ghXNnZrl7i9Fz/ua2QHu/p9kXu/un5pZjaSDJPU3s7xoFGuIpIXRagsl7ShpgZnlSeon6eN27W3avwYAACDrJDsH62ZJy9s9Xx61rZeZDTSz/tHjHpKOklQvqUbSt6LVxitxn0NJui96rmj5k564hsR9kk6OzjLcRdLukl5Ism4AAIC0S3YOlnm7C2a5e2s0yrQh20v6czQPK0fSXe5+v5nNlnSnmf1K0nR9PperWtLtZjZPicOQJ0fbmmVmd0marcTNps919+y4CREAAEAHkg1Yb5rZ+fp81OocSW9u6AXuPkPSyA7a31QHZwG6e4Okb6+nrypJVUnWCgAAkFHJHiI8W9LBSsx9WiDpAEVn7AEAAGBtSY1gufsiRYfsAAAAsGHJ3ipnmJk9YWYzo+dfNrP/SW1pAAAAXVOyhwj/KOknkpqkNfOrGNECAADoQLIBq6e7r3tphOYO1wQAANjCJRuwFpvZbkrcS1Bm9i1J76esKgAAgC4s2cs0nCvpFkl7mtlCSW9JOjVlVQEAAHRhyZ5F+Kakr5lZL0k57v5ZassCAADoupI9i/ACM+sraaWk68zsJTMbldrSAAAAuqZk52BNcPdlkkZJ2lrSdyVdlbKqAAAAurBkA5ZF34+TNNndZ7VrAwAAQDvJBqxpZvaoEgHrETPrI6k1dWUBAAB0XcmeRVghaYSkN919pZltLel7KasKAACgC9tgwDKzPd39NSXClSTtasaRQQAAgA3pbATrR5LOkPR/HSxzSUcErwgAAKCL22DAcvczou/l6SkHAACg6+vsEOE3N7Tc3e8JWw4AAEDX19khwuM3sMwlEbAAAADW0dkhQs4UBAAA2EidHSK8aEPL3f3asOUAAAB0fZ0dIuyTlioAAAC6kc4OEV6erkIAAAC6i84OEV7s7teY2UQlJrWvxd3PT1llAAAAXVRnhwjro+91qS4EAACgu+jsEOE/o+9/Tk85AAAAXV9nhwjv29Bydz8hbDkAAABdX2eHCA+S9K6kuKT/SOJOzwAAAJ3oLGBtJ+koSWMljZP0gKS4u89KdWEAAABdVc6GFrp7i7s/7O7jJR0oaZ6kf5nZeWmpDgAAoAvqbARLZlYoabQSo1hDJd0g6d7UlgUAANB1dTbJfbKkEkkPSrrc3WempSoAAIAurLMRrFMlrZB0gaTzzdbMcTdJ7u59U1gbAABAl9TZdbA2OEcLAAAAX0SAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAkAbxeFwlJSXKzc1VSUmJ4vF4pktCCnV6L0IAALB54vG4YrGYqqurVVZWptraWlVUVEiSxo4dm+HqkArm7pmuIbjS0lKvq6vLdBkAAEiSSkpKNHHiRJWXl69pq6mpUWVlpWbO5Da/XZWZTXP30g6XEbAAAEit3NxcNTQ0KD8/f01bU1OTioqK1NLSksHKsDk2FLCYgwUAQIoVFxertrZ2rbba2loVFxdnqKLsYGZBv7IJAQsAgBSLxWKqqKhQTU2NmpqaVFNTo4qKCsVisUyXllHuntRXsutmEya5AwCQYm0T2SsrK1VfX6/i4mJVVVUxwb0bYw4WAADIamaWdSNUEnOwAAAA0oqABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIjYAEAAARGwAIAIA3i8bhKSkqUm5urkpISxePxTJeEFMrLdAEAAHR38XhcsVhM1dXVKisrU21trSoqKiRJY8eOzXB1SAVGsAAASLGqqipVV1ervLxc+fn5Ki8vV3V1taqqqjJdGlLE3D3TNQRXWlrqdXV1mS4DAABJUm5urhoaGpSfn7+mrampSUVFRWppaclgZV2DmSkb84qZTXP30o6WMYIFAECKFRcXq7a2dq222tpaFRcXZ6gipBoBCwCAFIvFYqqoqFBNTY2amppUU1OjiooKxWKxTJeGFGGSOwAAKdY2kb2yslL19fUqLi5WVVUVE9y7MeZgAQCArNYV52AxggUAAIJxd/3il7/S/HffDddpXoFO//6ZQbo6/5yzte+++wbpa0MIWAAAIJjVq1frV7+8XP2/dlawPgcc8X39M0BeW/XWSxrQbwoBCwAAdD05ubnqM/K4TJfxBa2NK9O2LQIWAAABmFnQ/rJxzhGSR8ACACCAZANRtk7YRlgpuw6Wme1oZjVmNtvMZpnZBVH7ADN7zMzmRt+3itrNzG4ws3lmNsPM9m3X1/ho/blmNj5VNQMAAISQyguNNkv6kbsPl3SgpHPNbLikSyU94e67S3oiei5Jx0raPfo6U9LNUiKQSbpM0gGSviLpsrZQBgBIv3g8rpKSEuXm5qqkpETxeDzTJQFZJ2UBy93fd/eXosefSaqXNFjSiZL+HK32Z0ljoscnSprsCc9L6m9m20s6WtJj7v6Juy+R9JikY1JVNwBg/eLxuGKxmCZOnKiGhgZNnDhRsViMkAWsIy23yjGzoZJGSvqPpEHu/n606ANJg6LHgyW1PwlzQdS2vvZ1t3GmmdWZWd1HH30U9g0AACRJVVVVqq6uVnl5ufLz81VeXq7q6mpVVVVlujQgq6Q8YJlZb0l3S/qhuy9rv8wTs/yCzPRz91vcvdTdSwcOHBiiSwDAOurr61VWVrZWW1lZmerr6zNUEZCdUhqwzCxfiXB1h7vfEzV/GB36U/R9UdS+UNKO7V4+JGpbXzsAIM2Ki4tVW1u7Vlttba2Ki4szVBGQnVJ5FqFJqpZU7+7Xtlt0n6S2MwHHS/pHu/bTorMJD5S0NDqU+IikUWa2VTS5fVTUBgBIs1gspoqKCtXU1KipqUk1NTWqqKhQLBbLdGlAVknldbAOkfRdSa+a2ctR208lXSXpLjOrkDRf0knRsgclHSdpnqSVkr4nSe7+iZldIenFaL1fuvsnKawbALAeY8eOlSRVVlaqvr5excXFqqqqWtMOICFlAcvdayWt77K2R3awvks6dz19TZI0KVx1AIBNNXbsWAIV0Im0nEUIAACwJSFgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAGyUej6ukpES5ubkqKSlRPB7PdElA1knlrXIAAN1MPB5XLBZTdXW1ysrKVFtbq4qKCkni6u5AO4xgAQCSVlVVperqapWXlys/P1/l5eWqrq5WVVVVpksDsgoBCwCQtPr6epWVla3VVlZWpvr6+gxVBGQnAhYAIGnFxcWqra1dq622tlbFxcUZqgjITgQsAEDSYrGYKioqVFNTo6amJtXU1KiiokKxWCzTpQFZhUnuAICktU1kr6ysVH19vYqLi1VVVcUEd2AdBCwAwEYZO3YsgQroBIcIAQBAMDk5OXJ3NX28INOlrMW9Va0fv6u8/PSMLRGwAABAMAUFBbr5ppu09G8/1ao3p2W6HElSa2ODlj/waw3NX6aLfvjDtGyTgAUAAII644zv6+H7/6HGJ2/UirqpcveM1dK8dJGW/e1SjRoxVC8894y22267tGyXgAV0I9zCBEC2KCsr0ysv1WnA+//RisdukDc3pr2Ghndn6tM7L1bsgh9oyu1/VmFhYdq2TcACuom2W5hMnDhRDQ0NmjhxomKxGCELQMbstNNOeumFf+vAnXpr2d0/U/PyT9K27RUzHtGqh36te/56h3783xfJzNK2bYmABXQbVVVVGjdunCorK1VUVKTKykqNGzeOW5ggOEZKsTF69eqlf957t84f/20tjf9Yq9+fm9LteUuzltfcop6vPaQXn39Oo0aNSun21ofLNADdxOzZs7VixQpNmjRpzU14J0yYoPnz52e6NHQj3OwZm8LMdPkvLtOIfb6s075Xoeavfl+9ir8afDstq5ZpxYO/0T47b6Opj9apX79+wbeRLEawgG6ioKBAlZWVa92Et7KyUgUFBZkuDd0II6XYHN/4xjf03DNPKe+lv2pF7e1ybw3Wd+NH87U0/mOddvzhevyRBzMariRGsIBuo7GxUTfeeKNGjhy5ZmThxhtvVGNj+ieWovtipBSba++999bLdS9oz+F7aUWfgeq9zzFB+l167+W66NwzdcUVVwTpb3MRsIBuYvjw4RozZsxatzAZN26cpk6dmunS0I20HymVtGak9Kc//WmGK0NXsWzZMo377umyrYZo8QGTJU0O0/H5Up/f/k6lpaU68cQTw/S5GQhYQDcRi8U6nBvDoRuExEgpNse8efN01DGj9dmAPdTnG5draEPYGNL7hNd16oSz9N8XzNDPf/Y/aT9zsD0CFtBNcBNepAMjpdhUjz/+uP7rpJNV8JWT1XvEsSnZRuEOeyj35Gv020lX6aVXZih++5/Vs2fPlGyrM5bJq6umSmlpqdfV1WW6DADodtZ3FmF3DfOrVq3Sjy/5qZYuWxaszzvuuEOnnHLKZvdjOaYrLvuZdt555wBVpY6767fX36CfXf4r9T72Ryraae/Ub7O5USueuEnbNC3SYw/drx133DEl2zGzae5e2tEyRrAAAEnb0kZK582bp1v/coeKvvKdYH1udeQZevCDze+n8bUaHXrQozrjjDM2v7MUWb16tSrOPFv3P/GM+n3nKuX3T89taiyvQL1GXaCPp03VPvuW6v5/3KuDDz44LdtuQ8ACAGyUsWPHdttA1ZGiXn3VZ0SYM91CWvnxG5kuYYMWLVqkY75+ouavzFPfk65STkGPtG7fzNSr9BtatdWOGnXc8frtb67R979fkbbtcx0sAAAQ1PTp01UyYl+9W7Sreo++OO3hqr0eu5Wq37erdNH//FI/OO98NTc3p2W7BCwAABBMU1OTyg47XDrgu+p18DiZZT5q5G+9o/qffI3iDz2la675dVq2mfl3DQAAuo2WlhY1rm5Qzz3KMl3KWnKKest22leLP/44PdtLy1YAAAC2IAQsAFu0eDyukpIS5ebmqqSkRPF4PNMlAegGOIsQwBYrHo/rggsuUK9eveTuWrFihS644AJJ2qLOkgNCc3c1vDsz02V8QfOnH0raOi3bImAB2GJdfPHFamxsVK9evdbcUqOxsVEXX3wxAQvYRPn5+Tru+BM1f869wfp89dWZ2nvvks3vKE86IrqPZqoRsABssRYsWKDttttOkyZNWnNV8nHjxmnBggWZLg3osnJzc3XfPX8L2qeZ6ZUXnw/aZ6oxBwvAFu2iiy5SeXm58vPzVV5erosuuijTJWU95q0BnWMEC8AWraqqSjfddJPmz5+vnXfeWUuWLMl0SVmNeWtAchjBAroRRhY2zoABA7Rs2TI1NDTIzNTQ0KBly5ZpwIABmS4ta1188cXKzc3VpEmTtHr1ak2aNEm5ubm6+OKLM11aSuTl5WnVsk/U8O5MuXumy1mj6eMFWv3hW8rLY5wkW/EvA3QT8XhcsVhM1dXVa+YTVVQk7rvFyELHevbsqdbWVhUVFcndVVRUpH79+qlnz56ZLi1rLViwQI8++qjKo4nC5eXlmjx5skaNGpXhylJjzz331HXXXKkrrrxGn6lQufucoJ57HCzLyU17Le6u1Qtmqfnl+9T4/us6/9xzdNJJJ6W9DiSHESygm6iqqlJ1dfVa84mqq6tVVVWV6dKy1nvvvacbbrhhzVmEvXr10g033KD33nsv06UhS5iZzjrrLL3z5lzdev2VGvL+U1py2w+0fNo/1dq4Ki01eGuLVrxWq8/uukS5tX/QL889VR8seEe/uuKX6tWrV1pqwMYjYAHdRH19vcrK1r41RVlZmerr6zNUUfYrLi7WkCFDNHPmTLW0tGjmzJkaMmSIiouLM11a1hoyZIjGjx+vmpoaNTU1qaamRuPHj9eQIUMyXVpK5eTk6MQTT9T0F/6tR++7Wwf0XKTFfzpDy2tvV/PyT1KyzdbGBn027Z9acts5GrywRpOuq9I7b87VOef8gFHWLoCABXQTxcXFqq2tXauttraWsLABsVhMFRUVa4WFiooKxWKxTJeWta655hotX75cRx99tAoKCnT00Udr+fLluuaaazJdWtoceOCBeuAf9+jV6XX65t4DtGRypZY/NlGtDcuDbWP5c1P0cfUZOqDHh3rkH3/Tyy8+rzFjxig3N/2HJrFpmIMFdBNtYWHdOVgcIly/trlplZWVqq+vV3Fxsaqqqpiz1omioiJtvfXWmj9/vgYPHqwVK1ZkuqSM2HXXXTXm+K/r+edf0JtvTdfi4/8drvMjpEHz+uibJ4zWyJEjw/WLtLFsOisilNLSUq+rq8t0GUDaxeNxVVVVrQkLsViMsICgSkpKNGbMGE2dOnXNz1nb85kzs+/WKKmwevVqTZkyRZf/79Va2tCq3BEnqNeeh8pyw41ZuLsa5r+illfuU8tHb+nCC87Xuef8QFtvnZ7bvGQbM8uqszjbmNk0dy/tcFk2Fry5CFgAkkUo3Tg5OTnaeeed17r6/YQJEzR//ny1trZmuryU+uSTT3TTzb/Xtb+9Xjlb76zcESeqaOd91txmKVUaP3pbjdPv08q5z+vUU0/VpT/+kXbdddeUbjPbdMWAxRwsoBvhOlgbp+3SFhMnTlRDQ4MmTpyoWCzGftuAgoICVVZWrnW2amVlpQoKCjJdWsq89dZbOvvcSu04dFf99u5/qej4n6n3mMvUY+iIlIcrSSoYOFS9R52vAadN1D0zFqtkxH76+pj/0gsvvJDybWPTMYIFdBPruw4Wc4rWj8NdGy8nJ0dDhw79ws/Z22+/3S1HsBYsWKDd9yhWrxHHqmjEaOX12SbTJal19UqtnPm4Guru0R23/UknnnhipktKua44gsUkd6CbaH8dLElrroNVWVlJwFqP2bNna+XKlR2GBXRs+PDhGjNmzFonBowbN05Tp07NdGkpsWTJEvUcMEi9Dx2f6VLWyCnsqd77naCcT9/VokWLMl0O1oNDhEA3wXWwNl5BQYHOO++8tQ53nXfeed36cNfmisVimjJlylqHVadMmcKlLYB1MIIFdBNt18FqG8GSuA5WZxobGzVx4kSNHDlyzQjWxIkT1djYmOnSshaXtgCSQ8ACugmug7Xxhg8frh49eujII4+Uu8vMtN9++3H7ESnpyduzZs3SuHHjNG7cuA2ul43zZ4BU4hAh0E2MHTtWo0eP1rHHHquCggIde+yxGj16NCMLGzB48GDV1dWpf//+ysnJUf/+/VVXV6fBgwdnurSMc/dOv5Jdj3CFLREjWEA3EY/H9cADD+ihhx5aawTr4IMPJmStx5NPPqn8/HwtWbJEUmJCc35+vp588skMV4ZsUVhYqOWL31Pu3dk3x2z5RwtUVMTvdrbiMg1AN1FSUqKJEyeuNQerpqZGlZWVXHJgPcxMZqZBgwZp0aJF2nbbbfXhhx8y6pKkbD11PrTp06dr+fJw9xk87LDD9PTTT292P2amgw46aIu4P2G2/qxxJXdgC5Cbm6uGhgbl5+evaWtqalJRUZFaWloyWFn2MjP16NFDDzzwwJpRv9GjR2vVqlVZ+WGebbL1j162Y799LvSFWtO9X7mSO7AFaDuLsD3OIuxcQ0ODpk+frqamJk2fPl0NDQ2ZLgnYYiQ7h68rzvUjYAHdRNtZhDU1NWpqalJNTY0qKiq4PlEnCgoKdOmll6pXr1669NJLuQYWgCCY5A50E1yfaOMNGDBAS5YsWTMHa+utt9aHH36oAQMGZLo0AF0cc7CALqarz1nIJvF4XGeffbZWrVqlpqYm5efnq0ePHvr9739PME0Cc4k2Dfut+2AOFtCNcH2icMaOHavf//73GjZsmHJycjRs2DDCFYAgGMECuiH+h4x04Ods07Dfug9GsAAAANKIgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAAC41Y5ALo9rn4PIN0IWAC6vWQCERd/BBAShwgBAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYFymAQCAADbmemvJrMtlQ7o2AhYAbCEWLVqkS376P2psag7Sn+UV6pTxE4L01aOoUL+5+kr1798/SH+ZQCBCewQsANhCPPvss7r74RrllxwTpL+tjjxDD38YpCs1vnyfTjn5JJWXl4fpEMgwAhYAbEF6DNhOPUaECVghrXzruUyXAATFJPc0icfjKikpUW5urkpKShSPxzNdUtZjnwEAuipGsNIgHo8rFoupurpaZWVlqq2tVUVFhSRp7NixGa4uO7HPAABdGSNYaVBVVaXq6mqVl5crPz9f5eXlqq6uVlVVVaZLy1rsMwBAV0bASoP6+nqVlZWt1VZWVqb6+voMVZT92GcAgK6MgJUGxcXFuvzyy9eaT3T55ZeruLg406VlreLiYtXW1q7VVltbyz4DAHQJBKw0KC8v15VXXqnFixfL3bV48WJdeeWVnI68AbFYTBUVFaqpqVFTU5NqampUUVGhWCyW6dIAAOgUk9zTYOrUqerbt6969OghM1OPHj3Ut29fTZ06VRMnTsx0eVmpbSJ7ZWWl6uvrVVxcrKqqKia4AwC6BAJWGixYsECPPvqojjrqqDVtjz32mEaNGpXBqrLf2LFjCVRAYC2rG+StLbKc3EyXsoa3tqilsSHTZQBBEbAAYAsxcuRIDchdrff+WKGiYYcob/cyFQ7eQ2bpny3irS1avWCWWuY9p5WvP6tdd9tVw4cPT3sdQKqk7LfKzCaZ2SIzm9mubYCZPWZmc6PvW0XtZmY3mNk8M5thZvu2e834aP25ZjY+VfWm0pAhQ3TaaaetNZ/otNNO05AhQzJdGoAtyNChQzVn9gy99J9ndd5x+6rw37doyaQztfzpW7X6g3kpv5eeu2v1wnot/9ef9PGfvq8+L0/RRd84RDNfnqZXX6rToEGDUrp9IJ0sVb9QZnaYpOWSJrt7SdR2jaRP3P0qM7tU0lbufomZHSepUtJxkg6QdL27H2BmAyTVSSqV5JKmSdrP3ZdsaNulpaVeV1eXkve1KeLxuC644AL16tVL8+fP184776wVK1bo+uuv5xAYUsLMuPHsRtoS95m7a+bMmbpjSlyT74hrRWOL8r50sAr3OFQFA4cG20bjh2+oaU6tGuc+q/59e+t73z1F48aerD322CPINoBMMbNp7l7a4bJUfqCY2VBJ97cLWK9LOtzd3zez7SX9y933MLM/RI/j7ddr+3L3s6L2tdZbn2wLWFIiZFVVVa2ZsB2LxQhXWONP1bfqf6/5TbD+3n77bQ0dOjRIX3vuMUwP3ndvkL6y2ZYYsNprbm7W//3f/+lnP/uZmlta1fqzXkH773FNk359zTU655xzlJPDCezoHrIpYH3q7v2jxyZpibv3N7P7JV3l7rXRsickXaJEwCpy919F7T+TtMrdN/iXKBsDFrAhp4yfoAfmrVLPPQ7OdClr8eYmLb7zJ2pqXJ3pUlJuSwxYra2tqq2t1eS/TNHf/n638voNlHY9WD32KFNe34HBttP06QdqeO0Z+ZvPSQ3LdPJJJ+m0U8fpgAMOUOJPAdA1bShgZWySu7u7mQX7NDOzMyWdKUk77bRTqG6BtMnts40Ktt0102WsxZsbM10CAnN3vfDCC5r8lym686675AW9ZbsdrN7fvlL5W22fkm3m999O+Qd+Wzrw22r6+F39dUatpnxzrArUrFPHnazvnjJOI0aMIGyhW0l3wPrQzLZvd4hwUdS+UNKO7dYbErUtVGIUq337vzrq2N1vkXSLlBjBCls2AHR9c+bM0WFHfE0NrTnK/dIhKjr+MuVvs2PnLwwof+sdlX/wWPlBJ6vpo7c0+d/Pqnry8erXq0j/rn1KgwcPTms9QKqkO2DdJ2m8pKui7/9o136emd2pxCT3pVEIe0TS/7adbShplKSfpLnmpKTif17d/XAF+wybo6amRhVnn6tQ/+RW0FO7DAtzmYCB22ytmsceVq9eYecxba5Zs2appe9g9Ts+lvHRIjNTwba7qmDbXeVlp2rF33+qOXPmELDQbaQsYJlZXInRp23MbIGky5QIVneZWYWk+ZJOilZ/UIkzCOdJWinpe5Lk7p+Y2RWSXozW+6W7f5KqmjdHsn/Yt8R5HuvDPsPmePHFF/Vx0WD12u/EIP1tVyaFmmk26+6fa8mSJVkXsCQpJy8v4+FqXWamnLz8TJcBBJWygOXu6ztF7sgO1nVJ566nn0mSJgUsDUA3kdurnwq23SXTZXwBYQEAV3IHgC2EmWnFe/PU+sTNmS7lC1YueifrRtaAzUHAAoAtxLHHHqvrr/6Vmpubg/R39tln6/e//32QvgoLv6WysrIgfQHZgIAFAFuIwsJCVVRUBOvv7LPP1llnnRWsP6A74XK6AAAAgRGwAAAAAuMQIZAFdtl5JzU9eIs+W7lERcPLld9/u4zW09rYoJVznpPmPqXtduC6RACwsRjBArLAFZdfpicfuk/fKumvz/56sZb/PabPXnlUratXpq0G91Y1zJ+h5Y9er49umaC9V8/STVdcrLmvzU5bDQDQXTCCBWQBM1NpaalKS0s18bfX6sEHH9TNf5ykp/94q3p/aX/lDPuqioaOkOXkBt920ycL1TD7STW9/pS23XqAzj5jgk49ZbK22y6zo2gA0JURsIAsU1BQoDFjxmjMmDFavHix4vG4bvrjJL37+I3qc8C3VLjP6CDbaVr0plY/dYuaP/1Qp54yTmf87mHts88+QfoGgC0dAQvIYnl5eSooKFBBQYG8tUXyVr1dNC5M5ztJ+q609U09VFCQr/z8rnX18YKCAjW/O1Mr33hRPYaOlOVm/uOsZeVSrXztGTWuXN7l9ieAsDL/iQRgLc3NzXrkkUd08x8n6YnHHlXv3faVDTtG25TvK8vN09CG44Nur/D4+Zr8XI1umXS4hgzeQeecMUHjxo3TNttsE3Q7oZ1xxhnKy8vTH2+7XXMfvUE99zhEecMOU+Hg4rReEby1cZVWzn1e9katVrwzW0cfe6x+8I97NWjQoLTVACD7WHe8iW5paanX1dVluowObQk3Lv7VVdforr/dHay/mbNmqmSvkiB9jTrqSP3mqv8N0ldor7zyiv5Yfav+cscU5fbbVhr2VfXc8zDlFvVOy/a9tUUN819R6+v/0vJ5L6rs0MN0zpkVGj16tAoKCtJSw6Z666239Jc7pqj6tsn6ZNlyFex+qAr2PEwFA3dOyfa8pVmr3p4un/uMls97UV858CCdNWG8TjjhBPXunZ5/r1QLHVK7++cetkxmNs3dSztc1h1/6AlYmbXfgWV6q/deKthut0yXspbmJR+o95yH9Pbc+kyX8gWXXX6Frr3hdyooPlxFw49Q/oDMXhqhdfVKrXy9Vj7nKfXxFXr7jbkZrSdZ7q4ZM2botsm36/Y7pqg1v5dyhx+lXiPDzFtrWblUq56Pa+Xrz2rYsGE64/Tv6qSTTtLAgQOD9A+ga9lQwOIQYSdef/11vfnmm0H7fOihh4L0M3LkyKw906tg4FAVDdkr02WspbGwlzQn01V0bN6bb6lg/2+rz4hjMl2KJCmnsKd6f3mUfPjhWnjDyZkuJ2lmpr322kvHHj1KCxa+p3vv/ru2Hjg33Ly1IknHSQPeLNToY47S1772NcIVgA4RsDrx1SOPUnPPbZSbH+YQScEOe+r0/758s/tpWPaJyvYt0QP/uCdAVUDX5u564YUXdOvkv+jOO/+q3L7bSLuVabuzqpXXe4CGNoTdVuHoufrDY8/o+hvLNGTIYJ35vdN08skna4cddgi3IQBdGgGrE02NTepxwgXK6xtmwm+PIL1IPuc5rV41I1BvyAatq5er+bPFmS5jLd7clOkSNuj111/X5Nv/ottuv0PLV7cob9ih6vVfv0rpIVYzU+H2w1S4/TD1Oux0LZk/Q1f+5RHFfn659hk5UmdNGK9vfvOb6tevX8pqAJD9CFhAFijdd6QeeqhKK2eFOXz86ZJP1X+r/kH62nf/A4L0E9odd9yhM86pVM/iw5V/+Pnqv92X0nr2oCRZTq567DJS2mWkepSfpTfeeFEX/98knf/Di7TgnbcJWcAWjICFlGj86G0VbL+7cgpCjdltntamBjUuekvZei7chRdU6sILKoP1Z2b6ZNEHwfrLRgsXLlTRXkeo92Hfy3QpkqSc/EL12rNM2rNMDX+coM8++4yABWzBCFgI7sLKc/Tr627Qazf/Rb0H7SgN2kM52xWrcEix8vqk59pKLSuWaPWCerV88Jrsw9f12Xtv6kt7Dtc5F12Qlu0jPVpXr8q6w6qS5K2tmS4BQIYRsJKShZdVyMKS2px6yjideso4rV69WtOmTVNtba0eefIpvTjlj1JeoYqGDFfLwGHqsdv+yuu3bZBtNi//RKvmvaCcj+aoaWG9mlcu0777H6BRXz9Mh5adr/333189e/YMsi1kh5KSEuX85lqtfHdakP5CHlbdftC2jF4BWziug9WJI48+Ts8996z67LSXmrfdQ4VD9lLBdl+S5ab3Nhitq1dq9XuvqXnhbOUsek3L3p2jCy+6SFdVXZHWOjbVRx99pGeffVbVk27V/f+8T5aTq9af9Qq+Hbt8mY782lE668wzdOihh2btZSxSbUu43lpo7DMAG4sLjW6mDz74QLW1tXq85ik9UfMvvfP2m+o7ZA+1brun8obspcId9gg+16hl5VKtXjBLre/Vyz+o1/IP39Hwvb+so48sV/nhX9VBBx2kvn37Bt1mKO6uOXPm6Nlnn9XjNU/rmdpafbToQ/XdqVjNA4cpf4filOyz1qbVavxgrhoXzlbeR3P02Tuz1a//Vio75BCNOuKrOuSQQ1RcXKycnJyg281GhIWNxz4DsLEIWIEtXbpUzzzzjG783e/0yMMPy3Jyte2YS1S0+8FB+l/x7F+0uPZO5eXn67Tvflenn3669t9/fxUVFQXpP9W+PfZUPfzoY+qxU4laBg5T4eDhyh+4sywnN611uLeqafG7Wr2wXjmLXtPqBbO17z4l+tdjj6S1jkwgLGw89hmAjUXACmD16tWqq6vT008/rQcfq9G0F59XYZ8Byhu8l3zQnlpc+qeg25Okbafup1XvzlJ+jnTwIWU69qgjdOihhybmnmTxKMx+B5Zp4S6jVbTzlzNdyloaP3pbBU/fmJW3ygmNsLDx2GcANha3ytkMN//hFv3p1sma+cp09Rm0k7RdsXK2319bnz5eub36r1lvaMMRwbfd8xiph7ual36o59+dpf/cer+af/VrNa34VPt95UDFLv6RRo06Kvh2AQDA5mEEqxNbb7u9cg78rnrstr9yCrPjLLSW5Uu07KX7tX+/FXr8oX9mupwvKD3oUM1d6srvm133aGteuVRbNbyvt+YwgoUvYp8B2FiMYG2mwiF7ZU24kqTc3lupcLvdpCy9Vc7NN1yrZ599Nlh/F154oa677rogfe23335B+kHXkuwV3pNdjyAGoDMELAS3//77a//99w/W34UXXqgf/vCHwfrDlodABCDdCFidsBzTqmdvV05hdp3B17jkA+UM2yHTZQAAgA4QsDpxz113avbs2cH6+8EPfqCbb745SF9f/epXg/QDAADCYpJ7mjGRduOxz9aW7DyhZLFvAWDTMMkd6EYIRACQ/bL3apUAAABdFAELAAAgMAIWAABAYAQsAACAwJjkjozZmLPhuMI2AKArIWAhYwhDAIDuikOEAAAAgRGwAAAAAiNgAQAABMYcrECYsA0AANoQsAIhDAEAgDYcIgQAAAiMgAUAABAYAQsAACAwAhYAAEBgBCwAAIDACFgAAACBEbAAAAACI2ABAAAERsACAAAIjIAFAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwAAAAAiNgAQAABEbAAgAACIyABQAAEBgBCwAAIDACFgAAQGAELAAAgMAIWAAAAIERsAAAAAIzd890DcGZ2UeS5me6jvXYRtLiTBfRxbDPNh77bOOxzzYe+2zTsN82Xrbus53dfWBHC7plwMpmZlbn7qWZrqMrYZ9tPPbZxmOfbTz22aZhv228rrjPOEQIAAAQGAELAAAgMAJW+t2S6QK6IPbZxmOfbTz22cZjn20a9tvG63L7jDlYAAAAgTGCBQAAEBgBazOZ2SQzW2RmM9u1/drMXjOzGWZ2r5n1j9rzzezPZvaqmdWb2U/avabFzF42s1fM7CUzOzgDbydtzOztaD+8bGZ1Udu3zWyWmbWaWWm7dY8ys2nR+tPM7Ij19POqmZ2YifeTbuv5uftX+/3Wrn2L3EdSx/spaq+Mfkdnmdk1UdvpZnZjB338wswWRvvvNTO72cy69WenmfU3s79H77fezA5qt+xHZuZmtk30/Bdm9t8d9HGbmb3Vbr9dls73kGohPvvNbOi6P5tR++FmtjTadzPM7HEz2zZtby5FzGxHM6sxs9nR794FUXv737GXzey4dq/5spn9O1r/VTMritqXd9D/UDNb1e5v6XNmtkf63uHauvWHRJrcJumYddoek1Ti7l+WNEdSW5D6tqRCd99b0n6SzjKzodGyVe4+wt33ida/MtWFZ4Hy6D23hYKZkr4p6el11lss6fhov42XdHtH/Uj6lqQbUlhvNrlNX/y525AtcR9JHewnMyuXdKKkfdx9L0m/SaKf66L9N1zS3pK+GrbMrHO9pIfdfU9J+0iqlxJ/ICWNkvROkv38ONpvIySNN7NdwpeaMbcpzGf/+jwTfT5+WdKLks4NVXgGNUv6kbsPl3SgpHPNbHi07Lro/Y5w9wclyczyJP1F0tnR7+rhkpo62cYb7f6W/lnST1PxRpJBwNpM7v60pE/WaXvU3Zujp89LGtK2SFKv6Iemh6RGScs66LavpCWpqTh7uXu9u7/eQft0d38vejpLUg8zK+ygiy1mv3X0c9fGzHKi0YNfdbB4i9lH0nr30w8kXeXuq6N1Fq37OjMbHf2veZt1FhVIKlI33odm1k/SYZKqJcndG93902jxdZIuVuKzrKPXnmFmD5lZj3UWFUXfV4SvODNCf/ab2a5mNt3M9l+n3ST1UTf4mXP39939pejxZ0oE98EbeMkoSTPc/ZXoNR+7e0v7Fcxsm+h3dXQHr8/o5x0BK/UmSHooevx3JT5g3lfif4C/cfe2X9AebUPpkv4k6Yq0V5peLunR6JDfmRvxuv+S9FLbH8dITTTM/pSk/wlZZBeUJ+kOSXPdvf2+YB99bpikQ83sP2b2VAd/0L4h6VJJx7l725WjLzSzl5X43Z3j7i+ns+A020XSR5Jujf7g/8nMekWHlhe2/bFbl5mdJ+nrksa4+6qo+dfRflsg6c6Owmw3luxnv6LDWHdLOt3dX4yaD4323TuSviZpUprqTotoBG+kpP9ETedFh0MnmdlWUdswSW5mj1hi6szF6/QxSNIDkn7u7g9EzbtFf0vfkHSRpGtT/mbWg4CVQmYWU2JI9I6o6SuSWiTtoMSH2I/MbNdoWdshwj2VGHaeHP3Ppbsqc/d9JR2rxDDxYZ29wMz2knS1pLPWWVTu7iVKHLq50cx6B6+26/iDpJnuXrVOO/voc3mSBihxiOLHku5q97t2hKRLJI129/b/8207RLitEiMRJ6ex3nTLk7SvpJvdfaQSweAXShxq+fl6XnOaEr/L31rnPz9thwi3k3SkdfO5pW028rN/oKR/SDplnfDadohwR0m3SromLcWnQfT5c7ekH7r7Mkk3S9pNiUPJ70v6v2jVPEllkk6Jvn/DzI6MluVLekLSxe7+WLvu2w4R7ibph8rg5R0IWCliZqcr8b+5U/zza2GMU2JeQ1P0P7lnJX1hUrK7/1uJ+y51eH+j7sDdF0bfF0m6V4kPoPUysyHReqe5+xvr6fMNSR8qMU9mS/WcpPK2iaDrYh9JSoym3OMJL0hqVeL3TZLeUOJwzLCOXujuTZIeVuIQWne1QNICd28bWfi7EoFrF0mvmNnbShz6esnMtovWeVXSUH1+SGwt7r5c0r+U+CPZrW3CZ/9SJUapNrRv7lM3+Zkzs3wlwtUd7n6PJLn7h+7e4u6tkv6oz/8eLJD0tLsvdveVkh5U4mdRSgTYaZKO3sDmMrrfCFgpYGbHKDFP4YToh6LNO0r8D1lm1kuJ/0G/1sHr95SUK+nj1FebftHhhj5tj5U4zv6FM2nard9fiWHgS9392Q2st60SfwSy9Ubf6VCtxIfQXdF8j7WwjyRJUyWVS5KZDVNiXlXbocD5ShyGnhyNmK4lGuk6RIkg1i25+weS3m139tWRShyW39bdh7r7UCX+8O0brStJ05UYWb7PzHZYt8/oZ/EAdeP9Jm3yZ3+jpG9IOs3Mxq2n6zJ1g30X/f5US6p392vbtW/fbrVv6PO/B49I2tvMekY/Q1+VNDta5kocht3TzC5ZzyYzut++8AGMjWNmcSXObNjGzBZIukyJM0cKJT0WHXl43t3PlvQ7JeY1zJJkkm519xlRVz2i4+2Klo1fdzJfNzJI0r3RvsmTNMXdH47mvkxUYuTuATN72d2PlnSepC9J+rmZtR2iGNVuPkeNmbUoMWR8qbt/mM43kwnr+bmTJLn7tdFE5dvN7JSoeYvbR9J699MkSZOiOWmNSvyuedtRQnd/LdpvfzOz46OuLjSzU5XYfzMk3ZTed5J2lZLuMLMCSW9K+l5nL3D3WktcruEBMzsqav61mf2PEiH2CUn3pKrgdAvx2R/NQ5K7rzCzr0evW67EBPi2OVimxCjX99P49lLlEEnflfRqu793P5U01sxGKBGa3lY0DcTdl5jZtUqcRemSHmw310ru3mJmY5UI9p8p8Z/L3drtt0ZlcL9xJXcAAIDAOEQIAAAQGAELAAAgMAIWAABAYAQsAACAwAhYAAAAgRGwACTFzLYzszvN7I3oFkcPRteR2tT+bjOzb23ia0eY2XHtnp9gZpd28prTzezGDtoHmdn9ZvaKmc02s7Ybze5gZn/flPrW6d/M7Ekz6xs9b4lu5fGKJW7/scGrm6/7Xjdy2wVm9nRH10QDkFoELACdii4QeK+kf7n7bu6+nxLX/Bm0znrp+kM+QtKa0OHu97n7VZvY1y8lPebu+7j7cCXuQyh3f8/dNykAruM4Sa9EtwSRPr8t1j5K7MMrO3n9CLV7rxvD3RuVuP7Udzbl9QA2HQELQDLKJTW5++/bGtz9FXd/xswON7NnzOw+SbPNLNfMfm1mL1ri5q1nSWtGcm40s9fN7HEl7uunaNl+lrjx8jRL3Nh1+6j9X2Z2tZm9YGZzzOzQ6OKXv5T0nWgk6DvtR6fM7HhL3Mh5upk9bokbwm7I9kpcmbztfc2I+hkaXYxUlrjh8cvR10dmdlnU/uN27/Py9fR/ihL3mutIX0lLor4mm9mYdvvkDkvcYHnd99rLEjfEfSF6jydG6+8Vtb0c1bN71NXUqAYAacSwMYBklChx36/12VdSibu/ZWZnSlrq7vubWaGkZ83sUUkjJe2hxH0QBylxy4tJlrg32URJJ7r7R2b2HUlVStwGQ5Ly3P0r0WGyy9z9a5a4on+pu58nrbn/W5taSQdGV2f/vhK3LvnRBmr/naS/mtl5kh5X4irb77Vfwd2/H21nZyXuRXibmY2StLsS900zJa4mfZi7P71O/4do7RuUt921oUiJcHdE1F4t6UJJUy1xJf6DJY2XtNU67/V/JT3p7hMscRupF6LAerak69297QrsuVG/MyXtv4H3DyAFCFgAQnjB3d+KHo+S9OV286v6KRFEDpMUj24B9Z6ZPRkt30OJANd2e5FcSe+367vt9irTlLihcGeGKBGYtlfiFi1vbWhld3/EzHaVdIykYyVNN7OSddezxA20/yap0t3nm1ll9F6nR6v0jt7nugFrgLt/1u75KncfEfV5kBL3PSxx96fM7CYzG6jE/RDvdvfmaJ+0N0rSCZa4LY2UCGo7Sfq3pJglbox+j7vPjd5fi5k1mlmfdeoAkEIELADJmCVpQ/ORVrR7bEqEkEfar7CBidomaZa7H7Se5auj7y1K7jNroqRr3f0+Mztc0i86e4G7fyJpiqQpZna/EmFw3RG73ysRXB5vV/eV7v6HTrpvNrMcd2/tYLv/NrNtlLj/5iJJkyWdKulkrf/+fybpv9z99XXa683sP5JGS3rQzM5y97YQWyipoZM6AQTEHCwAyXhSUmF0+E+SZGZfNrNDO1j3EUk/iA79ycyGmVkvJUZ2vhPN0dpeiXldkvS6pIHRaI7MLN/M9uqkns8k9VnPsn6SFkaPx3f2xszsCDPrGT3uI2k3Se+ss865kvqsM5H+EUkTzKx3tM5gM9tWX/S6pF3Xs+09lRix+zhquk3SDyXJ3WdHbeu+10ckVVo0tGVmI6Pvu0p6091vUGLO15ej9q0lLXb3pg3uCABBEbAAdMoTd4X/hqSvWeIyDbOUOPvtgw5W/5MS86teiiaJ/0GJkad7Jc2Nlk1W4pBW25lu35J0tZm9IullJeYfbUiNpOFtE7/XWfYLSX8zs2mSFifx9vaTVGdmM6Ka/uTuL66zzn9L2rvdRPez3f1RJUa9/m1mr0r6uzoOfQ9IOrzd8x5t/Uj6q6Tx0WFTufuHkuol3bqB93qFpHxJM6J/hyui9U6SNDPqt0SJfSwlguwDSewHAAFZ4nMTAJAK0WjdZHc/Kol1e0p6VdK+7r400PbvkXSpu88J0R+A5DCCBQAp5O7vS/qjRRcaXR8z+5oSo1cTA4arAklTCVdA+jGCBQAAEBgjWAAAAIERsAAAAAIjYAEAAARGwAIAAAiMgAUAABAYAQsAACCw/wd5ryFvnXlMeAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Import libraries\n", "import matplotlib.pyplot as plt\n", @@ -1209,7 +1106,7 @@ }, { "cell_type": "markdown", - "id": "8fc6aee6", + "id": "1cbacf50", "metadata": {}, "source": [ "## Averages" @@ -1217,10 +1114,23 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "c2693891", + "execution_count": 55, + "id": "608a33f3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJKCAYAAADweDtMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABwGklEQVR4nO3deZyN5f/H8ddlbNl3yU52xi4tQhKVhIg2RGn91vdXKeorKi3SqpQUoQXZopSoKCUVZd/37PswmDHL5/fHfWYazDDGmblneT8fj3mYc5/7nPM59xzj7XNf93U5M0NEREREgieb3wWIiIiIZDYKWCIiIiJBpoAlIiIiEmQKWCIiIiJBpoAlIiIiEmQKWCIiIiJBlt3vAlJLsWLFrEKFCn6XISIiIpnY4sWL95tZ8dO3Z9qAVaFCBRYtWuR3GSIiIpKJOee2JrZdpwhFREREgkwBS0RERCTIFLBEREREgizTjsFKTFRUFNu3byciIsLvUkQkE8mdOzdlypQhR44cfpciIulElgpY27dvJ3/+/FSoUAHnnN/liEgmYGYcOHCA7du3U7FiRb/LEZF0IkudIoyIiKBo0aIKVyISNM45ihYtqs64iJwiSwUsQOFKRIJOv1dE5HRZLmD5LSQkhHr16lG7dm1uuukmDh8+7FstW7ZsoXbt2one16JFi/OeR+y1116jevXq1KtXj8aNGzNu3LgU1zZv3jzatWuX4se/9NJLp9y+4oorzvmYfPnyJbo94c+sS5cuHD9+PMV1pdS8efNYsGDBee83YsSIC/o5nO6tt94id+7chIWFBe05RUQyIwWsNHbRRRexZMkSVqxYQZEiRRg+fLjfJQXFiBEjmDNnDn/88QdLlizhhx9+wMzO2C8mJiZN6jk9YCUnnCQl4c8sZ86cjBgx4pT7o6OjU/zcyZXSgHX//ffTvXv3oNUxfvx4GjduzNSpU4PyfGn1eRARSWsKWD66/PLL2bFjBwAbN26kbdu2NGzYkGbNmrFmzRrCwsIoX748sbGxABw7doyyZcsSFRXFkiVLaNq0KaGhoXTs2JFDhw4BsGHDBq699lrq1q1LgwYN2LhxI+Hh4bRq1YoGDRpQp04dpk+fHl9DdHQ0d9xxBzVq1KBz586Jdmdmz57N5ZdfToMGDejSpQvh4eFn7PPSSy/x/vvvU6BAAQAKFChAjx49AG9W/aeeeooGDRowadKkJJ9v1qxZVK9enQYNGpzyD/ixY8fo1asXTZo0oX79+vH1jxkzhk6dOtG2bVuqVKnCk08+CUC/fv04ceIE9erV44477gD+7U6d7VgkR7NmzdiwYQPz5s2jWbNmtG/fnpo1axITE0Pfvn1p3LgxoaGhfPDBBwDs2rWLq6++Or4DNn/+/LMe0woVKjBw4MD4+tasWcOWLVsYMWIEb775JvXq1WP+/Pl89dVXXHbZZdSvX59rr72WPXv2JLrfoEGDeO211wCS/My0aNGCp556iiZNmlC1atX4Gk8X91kaPHgw48ePB7xg3bdv3/h9xowZw8MPPwzAp59+SpMmTahXrx733XdffJjKly8fjz/+OHXr1uW3337j+eefp3HjxtSuXZs+ffrEB/M///yT0NBQ6tWrR9++feO7red7rEVEfGFmmfKrYcOGdrpVq1b9e+PRR82aNw/u16OPnvGap8ubN6+ZmUVHR1vnzp3t22+/NTOza665xtatW2dmZgsXLrSWLVuamVn79u3txx9/NDOzCRMmWO/evc3MrE6dOjZv3jwzMxswYIA9GnjtJk2a2NSpU83M7MSJE3bs2DGLioqysLAwMzPbt2+fVa5c2WJjY23z5s0G2C+//GJmZnfffbcNHTrUzMyaN29uf/75p+3bt8+aNWtm4eHhZmb2yiuv2HPPPXfKewoLC7NChQol+Z7Lly9vQ4YMiX/9xJ7vxIkTVqZMGVu3bp3FxsZaly5d7MYbbzQzs/79+9snn3xiZmaHDh2yKlWqWHh4uH388cdWsWJFO3z4sJ04ccLKlStn27ZtO+U4n37ckzoWiT0msce2b9/e3nvvPZs7d67lyZPHNm3aZGZmH3zwgb3wwgtmZhYREWENGza0TZs22WuvvWaDBw82M+9nfuTIkbMe0/Lly9uwYcPMzGz48OHxP++BAwfG/2zMzA4ePBhf94cffmiPPfZYovslvJ3UZ6Z58+bxj585c6a1atUq0eMwePBge/755y0mJsbKlStnu3fvtr1791rlypXj92nbtq3Nnz/fVq1aZe3atbOTJ0+amdkDDzxgY8eONTMzwCZOnBj/mAMHDsR/f+edd9qMGTPMzKxWrVq2YMECMzN76qmnrFatWud9rNPSKb9fRCTLABZZIjkkS03TkB7EdVZ27NhBjRo1aN26NeHh4SxYsIAuXbrE7xcZGQlA165dmThxIi1btmTChAk8+OCDhIWFcfjwYZo3bw5Ajx496NKlC0ePHmXHjh107NgR8ObmAW/+r6effpqff/6ZbNmysWPHDvbs2QNA2bJlufLKKwG48847GTZsGE888UR8HQsXLmTVqlXx+5w8eZLLL7/8vN93165dz/p8a9asoWLFilSpUiW+lpEjRwJet2fGjBnxnZiIiAi2bdsGQKtWrShYsCAANWvWZOvWrZQtWzbJOsws0WNx8cUXJ/mYuJ8ZeB2s3r17s2DBApo0aRJ/Wf7s2bNZtmwZkydPBiAsLIz169fTuHFjevXqRVRUFB06dKBevXr89NNPZz2mnTp1AqBhw4ZJnorbvn07Xbt2ZdeuXZw8efKc0wMk9ZlJ7DW3bNmS6HOMHz+eadOmkS1bNm655RYmTZrEww8/TKVKlVi4cCFVqlRhzZo1XHnllQwfPpzFixfTuHHj+GNYokQJwBvTdsstt8Q/79y5c3n11Vc5fvw4Bw8epFatWjRr1oyjR4/GH5fbb7+dr7/++ryPtYiIX7JuwHrrLV9eNm48z/Hjx2nTpg3Dhw+nZ8+eFCpUiCVLlpyxf/v27Xn66ac5ePAgixcv5pprrkn0FN3ZfPbZZ+zbt4/FixeTI0cOKlSoEH9J+elXP51+28xo3bp1/CmhxBQoUIB8+fKxadMmKlWqlOg+efPmPevzJfbeE9YwZcoUqlWrdsr233//nVy5csXfDgkJOed4qLMdi6TE/cySek9xNb7zzju0adPmjP1+/vlnZs6cSc+ePXnssccoXLjwWY9p3Hs62/v5z3/+w2OPPUb79u2ZN28egwYNOut7OJdzveby5ctZv349rVu3BogPdQ8//DDdunXjiy++oHr16nTs2BHnHGZGjx49ePnll894rty5cxMSEgJ4YfnBBx9k0aJFlC1blkGDBp3z53E+xzqY489ERM6HxmD5JE+ePAwbNozXX3+dPHnyULFiRSZNmgR4/4AsXboU8MarNG7cmEcffZR27doREhJCwYIFKVy4cPwYk08++YTmzZuTP39+ypQpw5dffgl4XbDjx48TFhZGiRIlyJEjB3PnzmXr1n8X/t62bRu//fYbAJ9//jlXXXXVKXU2bdqUX3/9lQ0bNgDeeKh169ad8X769+/PQw89xJEjRwBvrFNiV68l9XzVq1dny5YtbNy4EeCU8NGmTRveeeed+LE5f//99zmPb44cOYiKijpj+9mOxYVo06YN77//fvxrrlu3jmPHjrF161ZKlizJvffeyz333MNff/2V7GOaUP78+Tl69Ogp76N06dIAjB07Nsn94iT1mUmu8ePHM2jQILZs2cKWLVvYuXMnO3fuZOvWrXTs2JHp06czfvx4unXrBnidxcmTJ7N3714ADh48mOixjgtTxYoVIzw8PL4rVahQIfLnz8/vv/8OwIQJE+Ifcz7HWkTELwpYPqpfvz6hoaGMHz+ezz77jFGjRlG3bl1q1ap1yuDrrl278umnn8afZgPvH9W+ffsSGhrKkiVLePbZZwHvH85hw4YRGhrKFVdcwe7du7njjjtYtGgRderUYdy4cVSvXj3+eapVq8bw4cOpUaMGhw4d4oEHHjilxuLFizNmzBhuu+02QkND40/nne6BBx6gZcuW8YOVmzVrRrZsZ368knq+3LlzM3LkSG688UYaNGgQfzoJYMCAAURFRREaGkqtWrUYMGDAOY9tnz59CA0NjR/kHudsx+JC3HPPPdSsWZMGDRpQu3Zt7rvvPqKjo5k3bx5169alfv36TJw4kUcffTTZxzShm266iWnTpp0yeL1Lly40bNiQYsWKJblfQkl9ZpJjwoQJ8aee43Ts2JEJEyZQuHBhatSowdatW2nSpAngna4dPHgw1113HaGhobRu3Zpdu3ad8byFChXi3nvvpXbt2rRp0yb+lCLAqFGjuPfee6lXrx7Hjh2LPxV8PsdaRMQvLq4rkNk0atTITp/HafXq1dSoUcOnikTkfISHh8df/fnKK6+wa9cu3n77bZ+rSpp+v4hkTc65xWbW6PTtWXcMloikazNnzuTll18mOjqa8uXLM2bMGL9LEhFJNgUsEUmXunbtesppcRGRjERjsERERESCTAFLREREJMgUsERERESCTAFLREREMp+VK+GHH3x7eQWsNOac4/HHH4+//dprr13wLNxxQkJC4he6vemmmzh8+HBQnjcltmzZEr847+latGjB6VNonMtrr71G9erVqVevHo0bN050EtPkmjdvHu3atUvx41966aVTbl9xxRXnfEzcdAOnS/gz69KlS6KLbae2efPmsWDBgvPeb8SIERf0czjdW2+9Re7cuQkLCwvac4pIFhMWBiNHQtOmULs2PPKIb6UoYKWxXLlyMXXqVPbv3x/0545b0mXFihUUKVKE4cOHB/01/DBixAjmzJnDH3/8wZIlS/jhhx9IbP62mJiYNKnn9ICVnHCSlIQ/s5w5czJixIhT7j/X0j/BkNKAdf/99wd1KZrx48fTuHHjJNdfPF9p9XkQEZ+ZwU8/QffuUKoU3HcfHD0Kr78Oc+f6VpYCVhrLnj07ffr04c033zzjvi1btnDNNdcQGhpKq1at4hc07tmzJ4888ghXXHEFlSpVil9O5Gwuv/xyduzYAcDGjRtp27YtDRs2pFmzZqxZs4awsDDKly9PbGws4C3XUrZsWaKioliyZAlNmzYlNDSUjh07cujQIQA2bNjAtddeS926dWnQoAEbN24kPDycVq1a0aBBA+rUqXPKDPTR0dHccccd1KhRg86dOyfanZk9ezaXX345DRo0oEuXLomus/jSSy/x/vvvU6BAAcBb+7BHjx4AVKhQgaeeeooGDRowadKkJJ9v1qxZVK9enQYNGpzyD/ixY8fo1asXTZo0oX79+vH1jxkzhk6dOtG2bVuqVKnCk08+CUC/fv3iF3+OmyU+rjt1tmORHM2aNWPDhg3MmzePZs2a0b59e2rWrElMTAx9+/alcePGhIaG8sEHHwCwa9curr766vgOWNzM7UkdgwoVKjBw4MD4+tasWcOWLVsYMWIEb775Zvzs71999RWXXXYZ9evX59prr2XPnj2J7jdo0KD4BbiT+sy0aNGCp556iiZNmlC1atUzZpePE/dZGjx4cPwySSNGjKBv377x+4wZM4aHH34YgE8//ZQmTZpQr1497rvvvvgwlS9fPh5//HHq1q3Lb7/9xvPPPx+/ukCfPn3ig/mff/5JaGgo9erVo2/fvvHd1vM91iLio+3b4cUXoUoVaNECpk/3Qtbvv8OKFfDYY5BgVZA0Z2aZ8qthw4Z2ulWrVsV/P2jGCrt1xIKgfg2aseKM1zxd3rx5LSwszMqXL2+HDx+2oUOH2sCBA83MrF27djZmzBgzMxs1apTdfPPNZmbWo0cP69y5s8XExNjKlSutcuXKST63mVl0dLR17tzZvv32WzMzu+aaa2zdunVmZrZw4UJr2bKlmZm1b9/efvzxRzMzmzBhgvXu3dvMzOrUqWPz5s0zM7MBAwbYo48+amZmTZo0salTp5qZ2YkTJ+zYsWMWFRVlYWFhZma2b98+q1y5ssXGxtrmzZsNsF9++cXMzO6++24bOnSomZk1b97c/vzzT9u3b581a9bMwsPDzczslVdeseeee+6U9xQWFmaFChVK8niWL1/ehgwZEv/6iT3fiRMnrEyZMrZu3TqLjY21Ll262I033mhmZv3797dPPvnEzMwOHTpkVapUsfDwcPv444+tYsWKdvjwYTtx4oSVK1fOtm3bdspxPv24J3UsEntMYo9t3769vffeezZ37lzLkyePbdq0yczMPvjgA3vhhRfMzCwiIsIaNmxomzZtstdee80GDx5sZt7P/MiRI2c9puXLl7dhw4aZmdnw4cPjf94DBw6M/9mYmR08eDC+7g8//NAee+yxRPdLeDupz0zz5s3jHz9z5kxr1apVosdh8ODB9vzzz1tMTIyVK1fOdu/ebXv37j3ls962bVubP3++rVq1ytq1a2cnT540M7MHHnjAxo4da2ZmgE2cODH+MQcOHIj//s4777QZM2aYmVmtWrVswYIFZmb21FNPWa1atc77WJ8u4e8XEUklERFmkyaZtW1rli2bGZi1aGE2bpzZsWO+lAQsskRyiCYa9UGBAgXo3r07w4YN46KLLorf/ttvv8V3V+666674rglAhw4dyJYtGzVr1mTPnj2JPm9cZ2XHjh3UqFGD1q1bEx4ezoIFC+jSpUv8fpGRkYA3kePEiRNp2bIlEyZM4MEHHyQsLIzDhw/HLwTco0cPunTpwtGjR9mxY0f8enS5c+cGICoqiqeffpqff/6ZbNmysWPHjvj6ypYty5VXXgnAnXfeybBhw3jiiSfi61i4cCGrVq2K3+fkyZNcfvnl53084yajTOr51qxZQ8WKFalSpUp8LSNHjgS8bs+MGTPiOzERERHxncNWrVrFr39Xs2ZNtm7dStmyZZOsw8wSPRYXX3xxko+J+5mB18Hq3bs3CxYsoEmTJlSsWDG+xmXLlsV3LsPCwli/fj2NGzemV69eREVF0aFDB+rVq8dPP/101mPaqVMnABo2bJjkqbjt27fTtWtXdu3axcmTJ+PrSEpSn5nEXnPLli2JPsf48eOZNm0a2bJl45ZbbmHSpEk8/PDDVKpUiYULF1KlShXWrFnDlVdeyfDhw1m8eHH8uoUnTpyIX7syJCSEW265Jf55586dy6uvvsrx48c5ePAgtWrVolmzZhw9ejT+uNx+++18/fXX532sRSQNLVsGo0fDp5/C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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "fig = plt.figure(figsize =(10, 10))\n", " \n", @@ -1231,8 +1141,8 @@ "\n", "plt_points = [128,512,1024,16*1024,64*1024,128*1024,256*1024]\n", "\n", - "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", - "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "plt.plot(plt_points, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", + "plt.plot(plt_points, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", "\n", "plt.ylabel(\"Milliseconds\")\n", "plt.xlabel(\"Credential_size (Bytes)\")\n", @@ -1244,18 +1154,46 @@ }, { "cell_type": "markdown", - "id": "15decea2", + "id": "894045f9", "metadata": {}, "source": [ - "## Terminate Controller" + "## Save Experiments to File" ] }, { "cell_type": "code", - "execution_count": null, - "id": "cc9c5cca", + "execution_count": 57, + "id": "46bb2aea", "metadata": {}, "outputs": [], + "source": [ + "performance_service.save_experiments()" + ] + }, + { + "cell_type": "markdown", + "id": "45173471", + "metadata": {}, + "source": [ + "## Terminate Controller" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "1dbd6c61", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:aries_cloudcontroller.aries_webhook_server:Terminating webhooks listener failed! RuntimeError('Site is not registered in runner ') occurred.\n", + "WARNING:aries_cloudcontroller.aries_controller_base:Terminate webhooks listener exception!\n", + " RuntimeError('Site is not registered in runner ') occurred.\n" + ] + } + ], "source": [ "await agent_controller.terminate()" ] @@ -1263,7 +1201,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f0f505cc", + "id": "0211c865", "metadata": {}, "outputs": [], "source": [] diff --git a/playground/verifier/notebooks/verify_fixed_attrib.ipynb b/playground/verifier/notebooks/verify_fixed_attrib.ipynb index aa4ce41..8006695 100644 --- a/playground/verifier/notebooks/verify_fixed_attrib.ipynb +++ b/playground/verifier/notebooks/verify_fixed_attrib.ipynb @@ -2,17 +2,17 @@ "cells": [ { "cell_type": "markdown", - "id": "c5e4f52c", + "id": "6ff4eb46", "metadata": {}, "source": [ - "# ACA-Py & ACC-Py Verifier Template\n", + "# Performance Test\n", "\n", - "## Copy this template into the root folder of your notebook workspace to get started" + "## Verify Fixed Disclosure from Variable Attribute Schema" ] }, { "cell_type": "markdown", - "id": "ff969abc", + "id": "a86383bd", "metadata": {}, "source": [ "### Imports" @@ -20,8 +20,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "df5da339", + "execution_count": 1, + "id": "b9b77124", "metadata": {}, "outputs": [], "source": [ @@ -35,7 +35,7 @@ }, { "cell_type": "markdown", - "id": "f30bbc12", + "id": "56f80d4b", "metadata": {}, "source": [ "### Initialise the Agent Controller" @@ -43,10 +43,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "74b78395", - "metadata": {}, - "outputs": [], + "execution_count": 2, + "id": "810ad9d3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://verifier-agent:3021 and an api key of adminApiKey\n" + ] + } + ], "source": [ "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", "admin_url = os.getenv(\"ADMIN_URL\")\n", @@ -57,7 +65,7 @@ }, { "cell_type": "markdown", - "id": "fee28a17", + "id": "e1fbd596", "metadata": {}, "source": [ "### Start a Webhook Server" @@ -65,10 +73,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "5d2dfa11", - "metadata": {}, - "outputs": [], + "execution_count": 3, + "id": "65c14e24", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Listening for webhooks from agent at http://0.0.0.0:3010\n" + ] + } + ], "source": [ "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", "webhook_host = \"0.0.0.0\"\n", @@ -80,7 +96,7 @@ }, { "cell_type": "markdown", - "id": "270518cb", + "id": "aea617c4", "metadata": {}, "source": [ "## Store Issuing Schema and Cred Def Identifiers\n", @@ -92,8 +108,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "4ed2981e", + "execution_count": 4, + "id": "edd43b24", "metadata": {}, "outputs": [], "source": [ @@ -125,7 +141,7 @@ }, { "cell_type": "markdown", - "id": "2b5205a1", + "id": "2399ef01", "metadata": {}, "source": [ "## Init Performance Service" @@ -133,17 +149,17 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ecde0190", + "execution_count": 5, + "id": "567db3c9", "metadata": {}, "outputs": [], "source": [ - "performance_service = PerformanceService(agent_controller, iterations=20)" + "performance_service = PerformanceService(agent_controller, iterations=100)" ] }, { "cell_type": "markdown", - "id": "4482c9b8", + "id": "0f1959e0", "metadata": {}, "source": [ "## Establish Connection\n", @@ -153,10 +169,19 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ac73e3f5", - "metadata": {}, - "outputs": [], + "execution_count": 6, + "id": "f9367876", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'@type': 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', '@id': 'eb11d20d-eb3f-4147-9b27-df23e2b87376', 'serviceEndpoint': 'http://verifier-agent:3020', 'recipientKeys': ['6LrnLy49Ni63FHx5xBRwD9r5EhQwjuYqHHcV17VGUian'], 'label': 'Verifier'}\n", + "aa31be98-f92b-41b3-a464-79f041275849\n" + ] + } + ], "source": [ "# Alias for invited connection\n", "alias = \"Friend\"\n", @@ -183,262 +208,26 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "47054ba0", - "metadata": {}, - "outputs": [], - "source": [ - "connection_id = \"2782d60f-65d0-4e14-8e28-55fa38735468\"" - ] - }, - { - "cell_type": "markdown", - "id": "9f07e889", - "metadata": {}, - "source": [ - "## Issue Credentials" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "012a8b55", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"1\", \"value\":32*\"0\"}\n", - "]\n", - "await self.agent_controller.issuer.send_credential(connection_id, one_schema_id, one_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "97f2619f", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,6):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, five_schema_id, five_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3d530546", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,11):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, ten_schema_id, ten_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dcd3fc49", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,21):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, twenty_schema_id, twenty_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1f9813dc", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,51):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, fifty_schema_id, fifty_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b46549ab", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,101):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, hundred_schema_id, hundred_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3656b429", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = [\n", - " {\"name\": \"1\", \"value\":32*\"0\"}\n", - "]\n", - "await self.agent_controller.issuer.send_credential(connection_id, one_schema_id, one_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "792b7e9e", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,6):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, five_schema_id, five_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "761d4c00", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,11):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, ten_schema_id, ten_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ca93b14b", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,21):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, twenty_schema_id, twenty_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "79af4255", + "execution_count": 7, + "id": "06b5a279", "metadata": {}, "outputs": [], "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,51):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, fifty_schema_id, fifty_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bb21426d", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,101):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)\n", - "await self.agent_controller.issuer.send_credential(connection_id, hundred_schema_id, hundred_rev_cred_def_id, credential_attributes)" + "connection_id = \"3aaf07e2-d41b-4dff-903d-6acc4b21c3af\"" ] }, { "cell_type": "markdown", - "id": "1057caf4", + "id": "b694c9db", "metadata": {}, "source": [ - "## Define Presentation Request Object\n", - "\n", - "The below cell defines a generic presentation request object, that can be sent across specific connections requesting that they produce a presentation containing the identified attributes and meeting the restrictions.\n", - "\n", - "It is often useful to define your request objects first, then reuse these objects across many connections you wish to request a proof from. \n", - "\n", - "Duplicate and customise the below cell as many times as you need. It may be useful to save these request objects either to the jupyter store using %store or through\n", - "\n", - "TODO: Detail the full set of restrictions available to a verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bd4096ee", - "metadata": {}, - "outputs": [], - "source": [ - "# # We add a constraint that the attribute must originate from this schema\n", - "# schema_id = \"\"\n", - "\n", - "# trusted_issuer_did = \"\"\n", - "\n", - "# cred_def_id = \"\"\n", - "\n", - "# # Define the list of attributes and restrictions under which each attribute was issued that a prover must satisfy with a presentation\n", - "# # NOTE: if identifying a schema or credential definition then the attribute name must be contained within the corresponding schema.\n", - "# req_attrs = [\n", - "# {\"name\": \"\", \"restrictions\": [{\"schema_id\": schema_id}]},\n", - "# {\"name\": \"\", \"restrictions\": [{\"cred_def_id\": cred_def_id}]},\n", - "# #NOTE: you do not need to specify any restrictions. This means the prover can present a self-attested attribute to satisfy this request. \n", - "# # Although the business logic (this notebook) can still determine this is unacceptable.\n", - "# {\"name\": \"\", \"restrictions\":[]}\n", - "# # You can also specify individual attributes be non-revoked\n", - "# {\"name\": \"\", \"restrictions\": [], \"non_revoked\": {\"to\": int(time.time() - 1)}}\n", - "# ]\n", - "\n", - "# # We could extend this to request the name attribute aswell if we wanted.\n", - "\n", - "\n", - "# proof_request = {\n", - "# \"name\": \"Name of Proof Request\",\n", - "# \"version\": \"1.0\",\n", - "\n", - "# # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", - "# # We will ignore these for now.\n", - "# \"requested_predicates\": {\n", - "# # f\"0_{req_pred['name']}_GE_uuid\":\n", - "# # req_pred for req_pred in req_preds\n", - "# },\n", - "# # You can also request the entire proof request be non-revoked\n", - "# \"non_revoked\": {\"to\": int(time.time())}\n", - "# }" + "## Define Presentation Request Object\n" ] }, { "cell_type": "code", - "execution_count": null, - "id": "cadc2aa1", + "execution_count": 8, + "id": "c6a1c39e", "metadata": {}, "outputs": [], "source": [ @@ -459,7 +248,7 @@ }, { "cell_type": "markdown", - "id": "fd48db21", + "id": "c63c07b0", "metadata": {}, "source": [ "# Single Disclosed Attribute from Variable Size Credential Experiment\n" @@ -467,8 +256,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d0308d0a", + "execution_count": 9, + "id": "ebf4f680", "metadata": {}, "outputs": [], "source": [ @@ -477,8 +266,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "c9a6d36a", + "execution_count": 10, + "id": "4b701ced", "metadata": {}, "outputs": [], "source": [ @@ -487,7 +276,7 @@ }, { "cell_type": "markdown", - "id": "d6f06601", + "id": "91f3e279", "metadata": {}, "source": [ "## Performance Test - One Attribute Credential" @@ -495,8 +284,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "70e2d360", + "execution_count": 11, + "id": "8e54991a", "metadata": {}, "outputs": [], "source": [ @@ -514,8 +303,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "53b42246", + "execution_count": 12, + "id": "9dab722a", "metadata": {}, "outputs": [], "source": [ @@ -524,10 +313,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "6c6ad346", - "metadata": {}, - "outputs": [], + "execution_count": 13, + "id": "8b1dbcf5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.31204176397015543\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -536,8 +333,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "f0ed2d83", + "execution_count": 14, + "id": "2096020b", "metadata": {}, "outputs": [], "source": [ @@ -555,10 +352,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "5bfc8812", - "metadata": {}, - "outputs": [], + "execution_count": 15, + "id": "a514be88", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.0849647952197847\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -567,7 +372,7 @@ }, { "cell_type": "markdown", - "id": "7b7dbdb8", + "id": "880cb0ae", "metadata": {}, "source": [ "## Performance Test - Five Attribute Credential" @@ -575,8 +380,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "a0a98547", + "execution_count": 16, + "id": "e8b5db5b", "metadata": {}, "outputs": [], "source": [ @@ -594,8 +399,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "06a281c1", + "execution_count": 17, + "id": "d9ab8e58", "metadata": {}, "outputs": [], "source": [ @@ -604,10 +409,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "5bb5809d", - "metadata": {}, - "outputs": [], + "execution_count": 18, + "id": "43dd585d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.38819501604019024\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -616,8 +429,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "5c7af3c2", + "execution_count": 19, + "id": "b1da6a51", "metadata": {}, "outputs": [], "source": [ @@ -635,10 +448,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "17d7a71a", - "metadata": {}, - "outputs": [], + "execution_count": 20, + "id": "327d3e17", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.0826870859800692\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -647,16 +468,16 @@ }, { "cell_type": "markdown", - "id": "c45281b9", + "id": "7d126aa5", "metadata": {}, "source": [ - "## Performance Test - Fice Attribute Credential" + "## Performance Test - Ten Attribute Credential" ] }, { "cell_type": "code", - "execution_count": null, - "id": "c36dd02e", + "execution_count": 21, + "id": "93c427f4", "metadata": {}, "outputs": [], "source": [ @@ -674,8 +495,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d49b5575", + "execution_count": 22, + "id": "521cdca2", "metadata": {}, "outputs": [], "source": [ @@ -684,10 +505,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "edfd96cb", - "metadata": {}, - "outputs": [], + "execution_count": 23, + "id": "05811022", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.3906349734297328\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -696,8 +525,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "df7fd5e8", + "execution_count": 24, + "id": "0a5ac3cb", "metadata": {}, "outputs": [], "source": [ @@ -715,10 +544,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "55d44621", - "metadata": {}, - "outputs": [], + "execution_count": 25, + "id": "29c8298d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.1447029979201033\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -727,7 +564,7 @@ }, { "cell_type": "markdown", - "id": "5f3bbe1d", + "id": "cc3b676c", "metadata": {}, "source": [ "## Performance Test - Twenty Attribute Credential" @@ -735,8 +572,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "222ef333", + "execution_count": 26, + "id": "f68ee8fe", "metadata": {}, "outputs": [], "source": [ @@ -754,8 +591,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "dbc6a3dd", + "execution_count": 27, + "id": "471d4fcd", "metadata": {}, "outputs": [], "source": [ @@ -764,10 +601,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "3f248d0e", - "metadata": {}, - "outputs": [], + "execution_count": 28, + "id": "a96d9ce1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.6059880108198559\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -776,8 +621,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "236d46d1", + "execution_count": 29, + "id": "293f94e9", "metadata": {}, "outputs": [], "source": [ @@ -795,10 +640,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "4279aa6f", - "metadata": {}, - "outputs": [], + "execution_count": 30, + "id": "05bdc02d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.177648461190147\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -807,7 +660,7 @@ }, { "cell_type": "markdown", - "id": "57aaeed0", + "id": "9b96ae64", "metadata": {}, "source": [ "## Performance Test - Fifty Attribute Credential" @@ -815,8 +668,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ad6bedb0", + "execution_count": 31, + "id": "be868bcf", "metadata": {}, "outputs": [], "source": [ @@ -834,8 +687,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "bdc2719f", + "execution_count": 32, + "id": "d05aa926", "metadata": {}, "outputs": [], "source": [ @@ -844,10 +697,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "a799f51b", - "metadata": {}, - "outputs": [], + "execution_count": 33, + "id": "59027a03", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.6991257308398781\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -856,8 +717,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "4f396385", + "execution_count": 34, + "id": "9768f429", "metadata": {}, "outputs": [], "source": [ @@ -875,10 +736,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d2bb949f", - "metadata": {}, - "outputs": [], + "execution_count": 35, + "id": "969f99d5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.3821254891599528\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -887,7 +756,7 @@ }, { "cell_type": "markdown", - "id": "f4728a66", + "id": "b7731cc0", "metadata": {}, "source": [ "## Performance Test - Hundred Attribute Credential" @@ -895,8 +764,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "883b6ae6", + "execution_count": 36, + "id": "57789179", "metadata": {}, "outputs": [], "source": [ @@ -914,8 +783,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8e529824", + "execution_count": 37, + "id": "858c2501", "metadata": {}, "outputs": [], "source": [ @@ -924,10 +793,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "6d0d349b", - "metadata": {}, - "outputs": [], + "execution_count": 38, + "id": "51bb3c51", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 0.9033805357198799\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -936,8 +813,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "e668db16", + "execution_count": 39, + "id": "a87b3e7d", "metadata": {}, "outputs": [], "source": [ @@ -955,10 +832,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "6d9efc73", - "metadata": {}, - "outputs": [], + "execution_count": 40, + "id": "3f192a55", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average : 1.675720763590216\n" + ] + } + ], "source": [ "test = {\"name\": name, \"proof_request\": proof_request}\n", "\n", @@ -967,7 +852,7 @@ }, { "cell_type": "markdown", - "id": "2789bc50", + "id": "2d2a81cb", "metadata": {}, "source": [ "## Plot Results" @@ -975,7 +860,7 @@ }, { "cell_type": "markdown", - "id": "ae2c3346", + "id": "e09d5fda", "metadata": {}, "source": [ "### Non Revocable" @@ -983,8 +868,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "3bfa1514", + "execution_count": 49, + "id": "94ce4447", "metadata": {}, "outputs": [], "source": [ @@ -993,20 +878,32 @@ "non_revocable_averages = []\n", "for result in experiment[\"results\"]:\n", " \n", - " if result[\"name\"] != \"1\":\n", - " millitimings = [i * 1000 for i in result[\"timings\"]]\n", - " data.append(millitimings)\n", - " non_revocable_averages.append(result[\"average\"] * 1000)\n", - " labels.append(result[\"name\"])\n", + " millitimings = [i * 1000 for i in result[\"timings\"]]\n", + " data.append(millitimings)\n", + " non_revocable_averages.append(result[\"average\"] * 1000)\n", + " labels.append(result[\"name\"])\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, - "id": "6444fbe0", - "metadata": {}, - "outputs": [], + "execution_count": 50, + "id": "29995b49", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Import libraries\n", "import matplotlib.pyplot as plt\n", @@ -1027,14 +924,14 @@ "ax.set_xticklabels(labels)\n", "\n", "plt.ylabel(\"Milliseconds\")\n", - "plt.xlabel(\"Credential Size (Bytes)\")\n", + "plt.xlabel(\"Number of Attributes\")\n", "\n", "plt.savefig(\"results/verification/fixed_disclosure_variable_attrib_number/box_plot_non_revocable.png\")" ] }, { "cell_type": "markdown", - "id": "2ecaa86d", + "id": "c6ad6c79", "metadata": {}, "source": [ "### Revocable" @@ -1042,8 +939,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8959091d", + "execution_count": 51, + "id": "93c8680d", "metadata": {}, "outputs": [], "source": [ @@ -1061,10 +958,23 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "133d71a3", - "metadata": {}, - "outputs": [], + "execution_count": 52, + "id": "8c94e045", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Import libraries\n", "import matplotlib.pyplot as plt\n", @@ -1085,14 +995,14 @@ "ax.set_xticklabels(labels)\n", "\n", "plt.ylabel(\"Milliseconds\")\n", - "plt.xlabel(\"Credential Size (Bytes)\")\n", + "plt.xlabel(\"Number of Attributes\")\n", "\n", "plt.savefig(\"results/verification/fixed_disclosure_variable_attrib_number/box_plot_revocable.png\")" ] }, { "cell_type": "markdown", - "id": "13de0d1c", + "id": "ef206d6c", "metadata": {}, "source": [ "## Averages" @@ -1100,10 +1010,23 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "0f61a7ba", - "metadata": {}, - "outputs": [], + "execution_count": 54, + "id": "173554e3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJJCAYAAAB27EniAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABn5klEQVR4nO3dd3iUVfrG8e9JCISeUIJKCUUgtAChCCgioIKKKCpiW1FRbCi7uth2revad1UQRRTFtmBX1LX9KDZsgNggVOklgRRISEh7fn+8w2yABAJM8qbcn+vKlcw770yezGTIzTlnnuPMDBEREREJnTC/CxARERGpbBSwREREREJMAUtEREQkxBSwREREREJMAUtEREQkxBSwREREREKsmt8FlIZGjRpZy5Yt/S5DREREKrGFCxduM7PGRV1XKQNWy5YtWbBggd9liIiISCXmnFtb3HWaIhQREREJMQUsERERkRBTwBIREREJsUq5Bqsoubm5bNiwgezsbL9LEZFKJjIykmbNmhEREeF3KSJSTlSZgLVhwwbq1q1Ly5Ytcc75XY6IVBJmxvbt29mwYQOtWrXyuxwRKSeqzBRhdnY2DRs2VLgSkZByztGwYUONjovIXqpMwAIUrkSkVOjfFhHZV5UKWH4LDw+nW7dudO7cmTPPPJO0tDTfalmzZg2dO3cu8rqTTjrpkPuIPfbYY8TFxdGtWzd69erFyy+/fNi1zZs3j2HDhh327R944IG9Lvfr1++gt6lTp06Rxws/ZyNHjmTXrl2HXdfhmjdvHvPnzz/k86ZMmXJEz8O+nnjiCSIjI0lPTw/ZfYqIVFYKWGWoZs2aLF68mN9++40GDRowefJkv0sKiSlTpvD555/zww8/sHjxYmbPno2Z7Xdefn5+mdSzb8AqSTgpTuHnrHr16kyZMmWv6/Py8g77vkvqcAPWNddcw6WXXhqyOmbMmEGvXr145513QnJ/ZfX7ICLiBwUsn/Tt25eNGzcCsGrVKoYOHUqPHj3o378/iYmJpKenExsbS0FBAQCZmZk0b96c3NxcFi9eTJ8+fYiPj2fEiBGkpqYCsHLlSk4++WS6du1KQkICq1atIiMjg8GDB5OQkECXLl14//33gzXk5eVx8cUX06FDB84777wiR2c+++wz+vbtS0JCAiNHjiQjI2O/cx544AGeeeYZ6tWrB0C9evUYPXo04HXVv/XWW0lISODNN98s9v4++eQT4uLiSEhI2OsPeGZmJldccQW9e/eme/fuwfqnT5/OOeecw9ChQ2nbti233HILALfddhtZWVl069aNiy++GPjf6NSBHouS6N+/PytXrmTevHn079+f4cOH07FjR/Lz85kwYQK9evUiPj6eZ599FoDNmzdz4oknBkfAvvrqqwM+pi1btuTuu+8O1peYmMiaNWuYMmUKjz/+ON26deOrr77igw8+4LjjjqN79+6cfPLJbN26tcjz7rnnHh577DGAYn9nTjrpJG699VZ69+5Nu3btgjXua8/v0v3338+MGTMAL1hPmDAheM706dMZN24cAK+++iq9e/emW7duXH311cEwVadOHW6++Wa6du3Kt99+y3333UevXr3o3LkzY8eODQbzH3/8kfj4eLp168aECROCo62H+liLiPjGzCrdR48ePWxfS5Ys+d+F8ePNBgwI7cf48ft9z33Vrl3bzMzy8vLsvPPOs48//tjMzAYNGmTLly83M7PvvvvOBg4caGZmw4cPtzlz5piZ2cyZM23MmDFmZtalSxebN2+emZndeeedNj7wvXv37m3vvPOOmZllZWVZZmam5ebmWnp6upmZJScnW5s2baygoMD++OMPA+zrr782M7PLL7/cHn30UTMzGzBggP3444+WnJxs/fv3t4yMDDMze+ihh+zee+/d62dKT0+3qKioYn/m2NhYe/jhh4Pfv6j7y8rKsmbNmtny5cutoKDARo4caWeccYaZmd1+++32yiuvmJlZamqqtW3b1jIyMuzFF1+0Vq1aWVpammVlZVmLFi1s3bp1ez3O+z7uxT0WRd2mqNsOHz7cnn76aZs7d67VqlXLVq9ebWZmzz77rP3jH/8wM7Ps7Gzr0aOHrV692h577DG7//77zcx7znfs2HHAxzQ2NtYmTpxoZmaTJ08OPt9333138LkxM0tJSQnW/dxzz9lNN91U5HmFLxf3OzNgwIDg7T/66CMbPHhwkY/D/fffb/fdd5/l5+dbixYtbMuWLZaUlGRt2rQJnjN06FD76quvbMmSJTZs2DDLyckxM7Nrr73WXnrpJTMzA+z1118P3mb79u3Bry+55BKbNWuWmZl16tTJ5s+fb2Zmt956q3Xq1OmQH+uytte/MSJSJQALrJgsUmXaNJQHe0ZWNm7cSIcOHTjllFPIyMhg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jRq88847bNu2LeT3vWdLl99++40GDRowefLkkH8PP0yZMoXPP/+cH374gcWLFzN79myK6t2Wn59fJvXsG7BKEk6KU/g5q169OlOmTNnr+oNt/RMKhxuwrrnmmpBuRTNjxgx69epV7P6Lh6qsfh9EpJz47Te45hpo2hRuvtn7/MYbENghwg8KWGWoWrVqjB07lscff3y/69asWcOgQYOIj49n8ODBwQ2NL7vsMm688Ub69etH69atg9uJHEjfvn3ZuHEjAKtWrWLo0KH06NGD/v37k5iYSHp6OrGxsRQUFADedi3NmzcnNzeXxYsX06dPH+Lj4xkxYgSpqakArFy5kpNPPpmuXbuSkJDAqlWryMjIYPDgwSQkJNClS5e9OtDn5eVx8cUX06FDB84777wiR2c+++wz+vbtS0JCAiNHjixyn8UHHniAZ555hnr16gHe3oejR48GoGXLltx6660kJCTw5ptvFnt/n3zyCXFxcSQkJOz1BzwzM5MrrriC3r17071792D906dP55xzzmHo0KG0bduWW265BYDbbrstuPnzni7xe0anDvRYlET//v1ZuXIl8+bNo3///gwfPpyOHTuSn5/PhAkT6NWrF/Hx8Tz77LMAbN68mRNPPDE4Aranc3txj0HLli25++67g/UlJiayZs0apkyZwuOPPx7s/v7BBx9w3HHH0b17d04++WS2bt1a5Hn33HNPcAPu4n5nTjrpJG699VZ69+5Nu3bt9usuv8ee36X7778/uE3SlClTmDBhQvCc6dOnM27cOABeffVVevfuTbdu3bj66quDYapOnTrcfPPNdO3alW+//Zb77rsvuLvA2LFjg8H8xx9/JD4+nm7dujFhwoTgaOuhPtYi4rO8PHj3XRg0CLp0gZdeggsvhJ9+gi+/hJEjISLCv/rMrNJ99OjRw/a1ZMmS4Nf3zPrNzp8yP6Qf98z6bb/vua/atWtbenq6xcbGWlpamj366KN29913m5nZsGHDbPr06WZmNm3aNDvrrLPMzGz06NF23nnnWX5+vv3+++/Wpk2bYu/bzCwvL8/OO+88+/jjj83MbNCgQbZ8+XIzM/vuu+9s4MCBZmY2fPhwmzNnjpmZzZw508aMGWNmZl26dLF58+aZmdmdd95p48ePNzOz3r172zvvvGNmZllZWZaZmWm5ubmWnp5uZmbJycnWpk0bKygosD/++MMA+/rrr83M7PLLL7dHH33UzMwGDBhgP/74oyUnJ1v//v0tIyPDzMweeughu/fee/f6mdLT0y0qKqrYxzM2NtYefvjh4Pcv6v6ysrKsWbNmtnz5cisoKLCRI0faGWecYWZmt99+u73yyitmZpaammpt27a1jIwMe/HFF61Vq1aWlpZmWVlZ1qJFC1u3bt1ej/O+j3txj0VRtynqtsOHD7enn37a5s6da7Vq1bLVq1ebmdmzzz5r//jHP8zMLDs723r06GGrV6+2xx57zO6//34z857zHTt2HPAxjY2NtYkTJ5qZ2eTJk4PP99133x18bszMUlJSgnU/99xzdtNNNxV5XuHLxf3ODBgwIHj7jz76yAYPHlzk43D//ffbfffdZ/n5+daiRQvbsmWLJSUl7fW7PnToUPvqq69syZIlNmzYMMvJyTEzs2uvvdZeeuklMzMD7PXXXw/eZvv27cGvL7nkEps1a5aZmXXq1Mnmz59vZma33nqrderU6ZAf66IU/jdGRErRtm1mDz1k1qKFGXifH3rIO17GgAVWTBZRo9EyVq9ePS699FImTpxIzZo1g8e//fbb4OjKn/70p+CoCcDZZ59NWFgYHTt2ZOvWrUXe756RlY0bN9KhQwdOOeUUMjIymD9/PiNHjgyet3v3bsBr5Pj6668zcOBAZs6cyXXXXUd6ejppaWnBjYBHjx7NyJEj2blzJxs3bgzuRxcZGQlAbm4ud9xxB19++SVhYWFs3LgxWF/z5s05/vjjAbjkkkuYOHEif/3rX4N1fPfddyxZsiR4Tk5ODn379j3kx3NPM8ri7i8xMZFWrVrRtm3bYC1Tp04FvNGeWbNmBUdisrOzgyOHgwcPDu5/17FjR9auXUvz5s2LrcPMinwsjjrqqGJvs+c5A28Ea8yYMcyfP5/evXvTqlWrYI2//PJLcOQyPT2dFStW0KtXL6644gpyc3M5++yz6datG1988cUBH9NzzjkHgB49ehQ7FbdhwwZGjRrF5s2bycnJCdZRnOJ+Z4r6nmvWrCnyPmbMmMG7775LWFgY5557Lm+++Sbjxo2jdevWfPfdd7Rt25bExESOP/54Jk+ezMKFC4P7FmZlZQX3rgwPD+fcc88N3u/cuXN55JFH2LVrFykpKXTq1In+/fuzc+fO4ONy0UUX8eGHHx7yYy0iPvj5Z5g0CV57DbKzYeBAeOIJOPNMqFb+4kz5q6gM3H1mJ1+//5///GcSEhK4/PLLS3R+jRo1gl9bMXtH7lnPs2vXLoYMGcLkyZO57LLLiIqKYvHixfudP3z4cO644w5SUlJYuHAhgwYNKnKK7kBee+01kpOTWbhwIREREbRs2ZLs7GzAW9Bf2L6XzYxTTjklOCVUlHr16lGnTh1Wr15N69atizyndu3aB7y/on72wjW8/fbbtG/ffq/j33///V6PeXh4+EHXQx3osSjOnuesuJ9pT42TJk1iyJAh+5335Zdf8tFHH3HZZZdx0003ER0dfcDHdM/PdKCf54YbbuCmm25i+PDhzJs374jfhHGw7/nrr7+yYsUKTjnlFIBgqBs3bhwXXHABb7zxBnFxcYwYMQLnHGbG6NGjefDBB/e7r8jISMLDwwEvLF933XUsWLCA5s2bc8899xz0+TiUxzqU689E5AByc+G997xg9dVXUKsWjB4N48ZBMW+mKi+0BssHDRo04Pzzz2fatGnBY/369WPmzJmA98e6f//+h3XftWrVYuLEifzrX/+iVq1atGrVijfffBPw/oD8/PPPgLdepVevXowfP55hw4YRHh5O/fr1iY6ODq4xeeWVVxgwYAB169alWbNmvPfee4A3CrZr1y7S09OJiYkhIiKCuXPnsnbt2mAd69at49tvvwXgP//5DyeccMJedfbp04dvvvmGlStXAt56qOXLl+/389x+++1cf/317NixA/DWOhX17rXi7i8uLo41a9awatUqgL3Cx5AhQ5g0aVIwtP70008HfXwjIiLIzc3d7/iBHosjMWTIEJ555png91y+fDmZmZmsXbuWJk2acNVVV3HllVeyaNGiEj+mhdWtW5edO3fu9XM0bdoUgJdeeqnY8/Yo7nempGbMmME999zDmjVrWLNmDZs2bWLTpk2sXbuWESNG8P777zNjxgwuuOACwBtZfOutt0hKSgIgJSWlyMd6T5hq1KgRGRkZwVGpqKgo6taty/fffw8QfM3BoT3WIlLKkpPhn/+EVq3g/PNhwwZ47DHv85Qp5T5cgQKWb26++ea93k04adIkXnzxReLj43nllVd48sknD/u+u3fvTnx8PDNmzOC1115j2rRpdO3alU6dOu21+HrUqFG8+uqre+359tJLLzFhwgTi4+NZvHgxd911F+D94Zw4cSLx8fH069ePLVu2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hWkrHBEREdmfAtZhqF4tjOrVqvtdhoiIiJRTmiIUERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQU8ASERERCTEFLBEREZEQc2bmdw0h55xLBtaG8C4bAdtCeH9y+PRclB96LsoXPR/lh56L8qO0n4tYM2tc1BWVMmCFmnNugZn19LsO0XNRnui5KF/0fJQfei7KDz+fC00RioiIiISYApaIiIhIiClglcxUvwuQID0X5Yeei/JFz0f5oeei/PDtudAaLBEREZEQ0wiWiIiISIgpYB2Ec26oc26Zc26lc+42v+upSpxzzZ1zc51zS5xzvzvnxgeON3DOfe6cWxH4HO13rVWFcy7cOfeTc+7DwOVWzrnvA6+P151z1f2usSpwzkU5595yziU655Y65/rqdeEP59xfAv8+/eacm+Gci9Trouw4515wziU5534rdKzI14LzTAw8L7845xJKszYFrANwzoUDk4HTgI7Ahc65jv5WVaXkATebWUegD3B94PG/DZhtZm2B2YHLUjbGA0sLXX4YeNzMjgVSgTG+VFX1PAl8YmZxQFe850SvizLmnGsK3Aj0NLPOQDhwAXpdlKXpwNB9jhX3WjgNaBv4GAs8U5qFKWAdWG9gpZmtNrMcYCZwls81VRlmttnMFgW+3on3R6Qp3nPwUuC0l4CzfSmwinHONQPOAJ4PXHbAIOCtwCl6LsqAc64+cCIwDcDMcswsDb0u/FINqOmcqwbUAjaj10WZMbMvgZR9Dhf3WjgLeNk83wFRzrmjS6s2BawDawqsL3R5Q+CYlDHnXEugO/A90MTMNgeu2gI08auuKuYJ4BagIHC5IZBmZnmBy3p9lI1WQDLwYmC69nnnXG30uihzZrYReAxYhxes0oGF6HXht+JeC2X6N10BS8o951wd4G3gz2a2o/B15r0NVm+FLWXOuWFAkpkt9LsWoRqQADxjZt2BTPaZDtTromwE1vachRd6jwFqs/90lfjIz9eCAtaBbQSaF7rcLHBMyohzLgIvXL1mZu8EDm/dM6wb+Jzk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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "fig = plt.figure(figsize =(10, 10))\n", " \n", @@ -1112,11 +1035,13 @@ "\n", "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", "\n", - "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", - "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "plt_points = [1,5,10,20,50,100]\n", + "\n", + "plt.plot(plt_points, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", + "plt.plot(plt_points, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", "\n", "plt.ylabel(\"Milliseconds\")\n", - "plt.xlabel(\"Credential_size (Bytes)\")\n", + "plt.xlabel(\"Number of Attributes\")\n", "\n", "\n", "plt.legend()\n", @@ -1125,7 +1050,25 @@ }, { "cell_type": "markdown", - "id": "ad1f7137", + "id": "9681bc5a", + "metadata": {}, + "source": [ + "## Save Experiments to File" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "6a9168d0", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service.save_experiments()" + ] + }, + { + "cell_type": "markdown", + "id": "8d6c76e5", "metadata": {}, "source": [ "## Terminate Controller\n", @@ -1135,8 +1078,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8d9f94fd", + "execution_count": 55, + "id": "568e8483", "metadata": {}, "outputs": [], "source": [ @@ -1146,7 +1089,7 @@ { "cell_type": "code", "execution_count": null, - "id": "00c835cb", + "id": "0f85ddcf", "metadata": {}, "outputs": [], "source": [] diff --git a/playground/verifier/notebooks/verify_multiple_creds_fixed_attrib.ipynb b/playground/verifier/notebooks/verify_multiple_creds_fixed_attrib.ipynb index 2c538bb..5bb4c60 100644 --- a/playground/verifier/notebooks/verify_multiple_creds_fixed_attrib.ipynb +++ b/playground/verifier/notebooks/verify_multiple_creds_fixed_attrib.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "bce9037d", + "id": "e1d97e85", "metadata": {}, "source": [ "# Performance Test\n", @@ -11,7 +11,7 @@ }, { "cell_type": "markdown", - "id": "7b903fe9", + "id": "b22f0551", "metadata": {}, "source": [ "### Imports" @@ -19,8 +19,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d92ae7de", + "execution_count": 1, + "id": "67884149", "metadata": {}, "outputs": [], "source": [ @@ -34,7 +34,7 @@ }, { "cell_type": "markdown", - "id": "90900525", + "id": "534dd50d", "metadata": {}, "source": [ "### Initialise the Agent Controller" @@ -42,10 +42,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "b6b774ee", + "execution_count": 2, + "id": "ea343ff4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://verifier-agent:3021 and an api key of adminApiKey\n" + ] + } + ], "source": [ "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", "admin_url = os.getenv(\"ADMIN_URL\")\n", @@ -56,7 +64,7 @@ }, { "cell_type": "markdown", - "id": "da5dea6c", + "id": "75c999c7", "metadata": {}, "source": [ "### Start a Webhook Server" @@ -64,10 +72,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "e3c953fb", + "execution_count": 3, + "id": "50fbd2af", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Listening for webhooks from agent at http://0.0.0.0:3010\n" + ] + } + ], "source": [ "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", "webhook_host = \"0.0.0.0\"\n", @@ -79,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "fb84ade3", + "id": "331ca8c7", "metadata": {}, "source": [ "## Store Issuing Schema and Cred Def Identifiers\n", @@ -91,8 +107,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "f698a5dd", + "execution_count": 4, + "id": "bb886dd5", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +137,7 @@ }, { "cell_type": "markdown", - "id": "c184ac4b", + "id": "3d3eae3b", "metadata": {}, "source": [ "## Init Performance Service" @@ -129,17 +145,17 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "af052124", + "execution_count": 5, + "id": "fb6412e1", "metadata": {}, "outputs": [], "source": [ - "performance_service = PerformanceService(agent_controller, iterations=20)" + "performance_service = PerformanceService(agent_controller, iterations=100)" ] }, { "cell_type": "markdown", - "id": "6f9e10ee", + "id": "12a84b3d", "metadata": {}, "source": [ "## Establish Connection\n", @@ -150,7 +166,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fba8bfe8", + "id": "de5ec541", "metadata": {}, "outputs": [], "source": [ @@ -179,158 +195,26 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "90185f25", - "metadata": {}, - "outputs": [], - "source": [ - "connection_id = \"bf7d4d2b-1398-4079-a4fa-7cfecf815892\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6af98bf1", - "metadata": {}, - "outputs": [], - "source": [ - "## Issue Credentials" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "437d9d44", - "metadata": {}, - "outputs": [], - "source": [ - "credential_attributes = []\n", - "\n", - "for x in range(1,6):\n", - " attribute = {\"name\": str(x), \"value\": 32*\"0\"}\n", - " credential_attributes.append(attribute)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "efac27e1", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "await self.agent_controller.issuer.send_credential(connection_id, five1_schema_id, five1_cred_def_id, credential_attributes)\n", - "await self.agent_controller.issuer.send_credential(connection_id, five1_schema_id, five1_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "938f80ac", - "metadata": {}, - "outputs": [], - "source": [ - "await self.agent_controller.issuer.send_credential(connection_id, five2_schema_id, five2_cred_def_id, credential_attributes)\n", - "await self.agent_controller.issuer.send_credential(connection_id, five2_schema_id, five2_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b39287b9", - "metadata": {}, - "outputs": [], - "source": [ - "await self.agent_controller.issuer.send_credential(connection_id, five3_schema_id, five3_cred_def_id, credential_attributes)\n", - "await self.agent_controller.issuer.send_credential(connection_id, five3_schema_id, five3_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a0ccda27", + "execution_count": 6, + "id": "4e8712d2", "metadata": {}, "outputs": [], "source": [ - "await self.agent_controller.issuer.send_credential(connection_id, five4_schema_id, five4_cred_def_id, credential_attributes)\n", - "await self.agent_controller.issuer.send_credential(connection_id, five4_schema_id, five4_rev_cred_def_id, credential_attributes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0bb5a57d", - "metadata": {}, - "outputs": [], - "source": [ - "await self.agent_controller.issuer.send_credential(connection_id, five5_schema_id, five5_cred_def_id, credential_attributes)\n", - "await self.agent_controller.issuer.send_credential(connection_id, five5_schema_id, five5_rev_cred_def_id, credential_attributes)" + "connection_id = \"3aaf07e2-d41b-4dff-903d-6acc4b21c3af\"" ] }, { "cell_type": "markdown", - "id": "7c9a780d", - "metadata": {}, - "source": [ - "## Define Presentation Request Object\n", - "\n", - "The below cell defines a generic presentation request object, that can be sent across specific connections requesting that they produce a presentation containing the identified attributes and meeting the restrictions.\n", - "\n", - "It is often useful to define your request objects first, then reuse these objects across many connections you wish to request a proof from. \n", - "\n", - "Duplicate and customise the below cell as many times as you need. It may be useful to save these request objects either to the jupyter store using %store or through\n", - "\n", - "TODO: Detail the full set of restrictions available to a verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f374987b", + "id": "30f43ba5", "metadata": {}, - "outputs": [], "source": [ - "# # We add a constraint that the attribute must originate from this schema\n", - "# schema_id = \"\"\n", - "\n", - "# trusted_issuer_did = \"\"\n", - "\n", - "# cred_def_id = \"\"\n", - "\n", - "# # Define the list of attributes and restrictions under which each attribute was issued that a prover must satisfy with a presentation\n", - "# # NOTE: if identifying a schema or credential definition then the attribute name must be contained within the corresponding schema.\n", - "# req_attrs = [\n", - "# {\"name\": \"\", \"restrictions\": [{\"schema_id\": schema_id}]},\n", - "# {\"name\": \"\", \"restrictions\": [{\"cred_def_id\": cred_def_id}]},\n", - "# #NOTE: you do not need to specify any restrictions. This means the prover can present a self-attested attribute to satisfy this request. \n", - "# # Although the business logic (this notebook) can still determine this is unacceptable.\n", - "# {\"name\": \"\", \"restrictions\":[]}\n", - "# # You can also specify individual attributes be non-revoked\n", - "# {\"name\": \"\", \"restrictions\": [], \"non_revoked\": {\"to\": int(time.time() - 1)}}\n", - "# ]\n", - "\n", - "# # We could extend this to request the name attribute aswell if we wanted.\n", - "\n", - "\n", - "# proof_request = {\n", - "# \"name\": \"Name of Proof Request\",\n", - "# \"version\": \"1.0\",\n", - "\n", - "# # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", - "# # We will ignore these for now.\n", - "# \"requested_predicates\": {\n", - "# # f\"0_{req_pred['name']}_GE_uuid\":\n", - "# # req_pred for req_pred in req_preds\n", - "# },\n", - "# # You can also request the entire proof request be non-revoked\n", - "# \"non_revoked\": {\"to\": int(time.time())}\n", - "# }" + "## Define Presentation Request Object\n" ] }, { "cell_type": "code", - "execution_count": null, - "id": "dd0427b6", + "execution_count": 7, + "id": "f9e5dddb", "metadata": {}, "outputs": [], "source": [ @@ -351,7 +235,7 @@ }, { "cell_type": "markdown", - "id": "5d3a0f35", + "id": "366b910f", "metadata": {}, "source": [ "# Fixed Attributes Disclosed Variable Credentials in Presentation" @@ -359,8 +243,8 @@ }, { "cell_type": "code", - "execution_count": 159, - "id": "857f1b78", + "execution_count": 8, + "id": "8e33cfd9", "metadata": {}, "outputs": [], "source": [ @@ -369,17 +253,17 @@ }, { "cell_type": "code", - "execution_count": 160, - "id": "e77f18de", + "execution_count": 9, + "id": "668e4a05", "metadata": {}, "outputs": [], "source": [ - "revocable_experiment = performance_service.new_experiment(\"Fixed Attributes Variable Credentials in Presentation\")" + "revocable_experiment = performance_service.new_experiment(\"Fixed Attributes Variable Credentials in Presentation - Revocable\")" ] }, { "cell_type": "markdown", - "id": "e3beca79", + "id": "a49f42d3", "metadata": {}, "source": [ "## Five Attributes One Cred" @@ -387,8 +271,8 @@ }, { "cell_type": "code", - "execution_count": 161, - "id": "07791a34", + "execution_count": 10, + "id": "518b318e", "metadata": {}, "outputs": [], "source": [ @@ -410,8 +294,8 @@ }, { "cell_type": "code", - "execution_count": 162, - "id": "e75b0667", + "execution_count": 11, + "id": "2fc6a8f0", "metadata": {}, "outputs": [], "source": [ @@ -420,15 +304,15 @@ }, { "cell_type": "code", - "execution_count": 163, - "id": "a3c8b560", + "execution_count": 12, + "id": "92e7e111", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 1.8861745626498305\n" + "Average : 0.3872079749700424\n" ] } ], @@ -440,8 +324,8 @@ }, { "cell_type": "code", - "execution_count": 164, - "id": "828492b5", + "execution_count": 13, + "id": "cc6a25c0", "metadata": {}, "outputs": [], "source": [ @@ -463,15 +347,15 @@ }, { "cell_type": "code", - "execution_count": 165, - "id": "c34d337e", + "execution_count": 14, + "id": "5c780958", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 2.888445556750412\n" + "Average : 1.2421532671599562\n" ] } ], @@ -483,7 +367,7 @@ }, { "cell_type": "markdown", - "id": "3ca44112", + "id": "96c142e7", "metadata": {}, "source": [ "## Five Attributes Two Cred" @@ -491,8 +375,8 @@ }, { "cell_type": "code", - "execution_count": 166, - "id": "f8389c68", + "execution_count": 15, + "id": "01ffe39d", "metadata": {}, "outputs": [], "source": [ @@ -514,8 +398,8 @@ }, { "cell_type": "code", - "execution_count": 167, - "id": "f93fec4c", + "execution_count": 16, + "id": "21ed2120", "metadata": {}, "outputs": [], "source": [ @@ -524,15 +408,15 @@ }, { "cell_type": "code", - "execution_count": 168, - "id": "f12f25c2", + "execution_count": 17, + "id": "8eb140fa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 2.3859419959000663\n" + "Average : 0.5053336611699342\n" ] } ], @@ -544,8 +428,8 @@ }, { "cell_type": "code", - "execution_count": 169, - "id": "34984a80", + "execution_count": 18, + "id": "ccd0b676", "metadata": {}, "outputs": [], "source": [ @@ -567,15 +451,15 @@ }, { "cell_type": "code", - "execution_count": 170, - "id": "c7308857", + "execution_count": 19, + "id": "8d4a02ae", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 3.760751254099887\n" + "Average : 2.23844429206998\n" ] } ], @@ -587,7 +471,7 @@ }, { "cell_type": "markdown", - "id": "ee16d305", + "id": "109dde40", "metadata": {}, "source": [ "## Five Attributes Three Cred" @@ -595,8 +479,8 @@ }, { "cell_type": "code", - "execution_count": 171, - "id": "6ad12a8c", + "execution_count": 20, + "id": "327b607c", "metadata": {}, "outputs": [], "source": [ @@ -618,8 +502,8 @@ }, { "cell_type": "code", - "execution_count": 172, - "id": "3b272100", + "execution_count": 21, + "id": "b94cc52d", "metadata": {}, "outputs": [], "source": [ @@ -628,15 +512,15 @@ }, { "cell_type": "code", - "execution_count": 173, - "id": "980e69d7", + "execution_count": 22, + "id": "42645e25", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 2.2802539874501235\n" + "Average : 0.72070491460021\n" ] } ], @@ -648,8 +532,8 @@ }, { "cell_type": "code", - "execution_count": 174, - "id": "f51a1cb7", + "execution_count": 23, + "id": "53adbb6a", "metadata": {}, "outputs": [], "source": [ @@ -671,15 +555,15 @@ }, { "cell_type": "code", - "execution_count": 175, - "id": "c232c104", + "execution_count": 24, + "id": "a96dae69", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 4.044143925350181\n" + "Average : 2.9264750552998886\n" ] } ], @@ -691,7 +575,7 @@ }, { "cell_type": "markdown", - "id": "cf90216c", + "id": "a6043f22", "metadata": {}, "source": [ "## Five Attributes Four Cred" @@ -699,8 +583,8 @@ }, { "cell_type": "code", - "execution_count": 176, - "id": "ec7f11d1", + "execution_count": 25, + "id": "ff817fcf", "metadata": {}, "outputs": [], "source": [ @@ -722,8 +606,8 @@ }, { "cell_type": "code", - "execution_count": 177, - "id": "046d1726", + "execution_count": 26, + "id": "f6c7b00e", "metadata": {}, "outputs": [], "source": [ @@ -732,15 +616,15 @@ }, { "cell_type": "code", - "execution_count": 178, - "id": "34af48cc", + "execution_count": 27, + "id": "e5dd6193", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 2.808775784350291\n" + "Average : 0.8269366388402705\n" ] } ], @@ -752,8 +636,8 @@ }, { "cell_type": "code", - "execution_count": 179, - "id": "0e68a5d7", + "execution_count": 28, + "id": "0e5dcf91", "metadata": {}, "outputs": [], "source": [ @@ -775,15 +659,15 @@ }, { "cell_type": "code", - "execution_count": 180, - "id": "b67f82f5", + "execution_count": 29, + "id": "31f33b5a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 5.397983192500033\n" + "Average : 3.898376299889824\n" ] } ], @@ -795,7 +679,7 @@ }, { "cell_type": "markdown", - "id": "af3daa79", + "id": "be44a7b8", "metadata": {}, "source": [ "## Five Attributes Five Cred" @@ -803,8 +687,8 @@ }, { "cell_type": "code", - "execution_count": 181, - "id": "37e612b5", + "execution_count": 30, + "id": "700f898c", "metadata": {}, "outputs": [], "source": [ @@ -826,8 +710,8 @@ }, { "cell_type": "code", - "execution_count": 182, - "id": "7454b8de", + "execution_count": 31, + "id": "dbb132c0", "metadata": {}, "outputs": [], "source": [ @@ -836,15 +720,15 @@ }, { "cell_type": "code", - "execution_count": 183, - "id": "06dece15", + "execution_count": 32, + "id": "69c19e97", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 4.092076107749927\n" + "Average : 0.6805043853700409\n" ] } ], @@ -856,8 +740,8 @@ }, { "cell_type": "code", - "execution_count": 184, - "id": "2bb609f1", + "execution_count": 33, + "id": "86d6851e", "metadata": {}, "outputs": [], "source": [ @@ -879,15 +763,15 @@ }, { "cell_type": "code", - "execution_count": 185, - "id": "16be2f3b", + "execution_count": 34, + "id": "128b9428", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 6.604865062400313\n" + "Average : 3.288517092999791\n" ] } ], @@ -899,7 +783,7 @@ }, { "cell_type": "markdown", - "id": "943efbdf", + "id": "ef1e7ccc", "metadata": {}, "source": [ "## Plot Results" @@ -907,7 +791,7 @@ }, { "cell_type": "markdown", - "id": "aa704c30", + "id": "b4028b49", "metadata": {}, "source": [ "### Non Revocable" @@ -915,8 +799,8 @@ }, { "cell_type": "code", - "execution_count": 193, - "id": "a74f2511", + "execution_count": 35, + "id": "9672b985", "metadata": {}, "outputs": [], "source": [ @@ -935,13 +819,13 @@ }, { "cell_type": "code", - "execution_count": 194, - "id": "01b92b5f", + "execution_count": 36, + "id": "55a3044b", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -979,7 +863,7 @@ }, { "cell_type": "markdown", - "id": "4c5b406f", + "id": "89d2d682", "metadata": {}, "source": [ "### Revocable" @@ -987,8 +871,8 @@ }, { "cell_type": "code", - "execution_count": 195, - "id": "7182956b", + "execution_count": 37, + "id": "a0d9f804", "metadata": {}, "outputs": [], "source": [ @@ -1006,13 +890,13 @@ }, { "cell_type": "code", - "execution_count": 196, - "id": "c2d197e4", + "execution_count": 38, + "id": "a27e80c9", "metadata": {}, "outputs": [ { "data": { - "image/png": "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USRRsAAAaJP2228/nXPWr1T17Di518cdZ6PULvpCVRX36LGHH1D79u3jjiOJggUAQJt12e9/px4FUtVrk+KOssG8vk7Vk2/UpZeUavfdd487zmoULAAA2qjc3Fw9+uD9qp72kL5b8HHccTZI1bRH1Lf75vrNeefGHWUNFCwAANqwPn366PrrrlXV5BvlK2vjjrNeVnz2vla88ZQeKv+7srLSq9KkVxoAAJByp5/+M+27286qeun+uKMkrP67Gi2ffKPG336LevToEXec76FgAQDQxpmZ7rv3LtXN+q9qPnkz7jgJqXrhLh128I80YsSIuKM0iYIFAAC0xRZb6P5779byyTeprmZZ3HFaVDX7FeV8/qbuvO2WuKM0i4IFAAAkSUOGDNGo445W9dTb447SrLrl36rquVv1cPl96ty5c9xxmkXBAgAAq934pz+q4/L5Wv7u83FH+R53V9Wzf9Gvfv4zHXjggXHHaREFCwAArJafn69/PFSu6v/+VSsXfxV3nDVUvfEvdcut0ZWXj407yjpRsAAAwBr22msvXfTb36hqyk3yNLkodO0381T98v36x0PlysvLizvOOlGwAADA91x4wQXaccuOWj79n3FHkdetVNXkG3TdVWXq27dv3HESQsECAADfk52drUceuE/fzXhc3305J9YsVS+Va6+dt9cvf/mLWHOsDwoWAABo0rbbbqtbb75Jy5+5QfW1K2LJUPPp21r53r91/9/ulpnFkmFDULAAAECzTjjhBA384T6qqrgn5WPXr1iuqsk36d67Jqhbt24pH39jULAAAECLJtxxm7I+na7qOZUpHbfq+fE65sihOuKII1I6bggULAAA0KJNN91UD973Ny1/7i+qq16SkjGr3n9RHRbN0c033ZiS8ULLiTsAAABIf3369JHqavXppilaaL5Hw83z81MzXmAULAAA0KL6+nodN+pEtd/zSPWqSc3FlX1lrZY8eIGu3Wa8zjjj9JSMGRK7CAEAQIv++Kcb9P78hSrY55iUjWk5ueow+Fydd8FvNWvWrJSNGwoFCwAANOvNN9/U2CvL1GHQObKs7JSOnbfFtmq/zwj9ZMQo1dbWpnTsjUXBAgAATaqpqdHRx41U/oGnKLfLVrFkyN9zmD6rztJll18Ry/gbioIFAACadN4FF2pRXlfl73pwbBnMstRh4Fn688236KWXXoot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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1050,7 +934,7 @@ }, { "cell_type": "markdown", - "id": "a9193105", + "id": "238d9385", "metadata": {}, "source": [ "## Averages" @@ -1058,13 +942,13 @@ }, { "cell_type": "code", - "execution_count": 197, - "id": "acc274cc", + "execution_count": 39, + "id": "cc84844b", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJJCAYAAAB27EniAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABweElEQVR4nO3deZyNdf/H8dfXGMa+k30QWccYjC0JiYQIUfYlbUp3e/3udnfLXd2VbndaZC2kEhWVQpF9K5KsMxj7NsyYfb6/P65jGpphMDPXmXPez8djHnOWa675XOeMmbfvaqy1iIiIiEj2yed2ASIiIiK+RgFLREREJJspYImIiIhkMwUsERERkWymgCUiIiKSzRSwRERERLJZfrcLyAlly5a1wcHBbpchIiIiPmzdunVHrbXlMnrOJwNWcHAwa9eudbsMERER8WHGmMjMnlMXoYiIiEg2U8ASERERyWYKWCIiIiLZzCfHYGUkKSmJffv2ER8f73YpIuJDgoKCqFKlCoGBgW6XIiJexG8C1r59+yhWrBjBwcEYY9wuR0R8gLWWY8eOsW/fPmrUqOF2OSLiRfymizA+Pp4yZcooXIlItjHGUKZMGbWMi8jf+E3AAhSuRCTb6feKiGTErwKW2wICAggNDaVhw4Z0796dkydPulZLREQEDRs2zPC566+//pLXEXv99depW7cuoaGhNG/enKlTp152bUuWLKFbt26X/fUvvfTSOfdbt2590a8pWrRoho+nf8/69u3LmTNnLruuy7VkyRKWL19+ycdNmDDhit6H87311lsEBQURHR2dbecUEfFVCli5qFChQmzcuJHNmzdTunRpxo8f73ZJ2WLChAksXLiQ1atXs3HjRn788UestX87LiUlJVfqOT9gZSWcZCb9e1agQAEmTJhwzvPJycmXfe6sutyAdffddzN48OBsq2PGjBk0b96cL774IlvOl1s/DyIiblDAckmrVq2IiooCYOfOnXTp0oWmTZvStm1btm7dSnR0NNWrVyc1NRWA2NhYqlatSlJSEhs3bqRly5aEhITQq1cvTpw4AcCOHTu44YYbaNy4MWFhYezcuZOYmBg6duxIWFgYjRo1Yu7cuWk1JCcnM2DAAOrVq0efPn0ybJ35/vvvadWqFWFhYfTt25eYmJi/HfPSSy/x7rvvUrx4cQCKFy/OkCFDAGdV/ccff5ywsDBmz56d6fm+/fZb6tatS1hY2Dl/wGNjYxk+fDjh4eE0adIkrf7Jkydz66230qVLF2rXrs1jjz0GwBNPPEFcXByhoaEMGDAA+Kt16kKvRVa0bduWHTt2sGTJEtq2bUuPHj2oX78+KSkpPProozRv3pyQkBDee+89AA4cOMB1112X1gK2dOnSC76mwcHBPPvss2n1bd26lYiICCZMmMCbb75JaGgoS5cu5auvvqJFixY0adKEG264gUOHDmV43HPPPcfrr78OkOnPzPXXX8/jjz9OeHg4derUSavxfGd/lsaOHcuMGTMAJ1g/+uijacdMnjyZ0aNHAzB9+nTCw8MJDQ3lrrvuSgtTRYsW5eGHH6Zx48asWLGCF154gebNm9OwYUNGjRqVFszXrFlDSEgIoaGhPProo2mtrZf6WouIuMZa63MfTZs2tefbsmXLX3fGjLG2Xbvs/Rgz5m/f83xFihSx1lqbnJxs+/TpYxcsWGCttbZDhw5227Zt1lprV65cadu3b2+ttbZHjx520aJF1lprZ86caUeMGGGttbZRo0Z2yZIl1lprn376aTvG873Dw8PtF198Ya21Ni4uzsbGxtqkpCQbHR1trbX2yJEjtlatWjY1NdXu3r3bAnbZsmXWWmuHDRtmX3vtNWutte3atbNr1qyxR44csW3btrUxMTHWWmtfeeUV+/zzz59zTdHR0bZkyZKZXnP16tXtq6++mvb9MzpfXFycrVKlit22bZtNTU21ffv2tTfffLO11tonn3zSTps2zVpr7YkTJ2zt2rVtTEyMnTRpkq1Ro4Y9efKkjYuLs9WqVbN79uw553U+/3XP7LXI6Gsy+toePXrY//3vf3bx4sW2cOHCdteuXdZaa9977z374osvWmutjY+Pt02bNrW7du2yr7/+uh07dqy11nnPT506dcHXtHr16nbcuHHWWmvHjx+f9n4/++yzae+NtdYeP348re4PPvjAPvTQQxkel/5+Zj8z7dq1S/v6b775xnbs2DHD12Hs2LH2hRdesCkpKbZatWr24MGD9vDhw7ZWrVppx3Tp0sUuXbrUbtmyxXbr1s0mJiZaa62955577JQpU6y11gJ21qxZaV9z7NixtNsDBw608+bNs9Za26BBA7t8+XJrrbWPP/64bdCgwSW/1rnpnN8vIuI3gLU2kyziN8s0eIOzLStRUVHUq1ePTp06ERMTw/Lly+nbt2/acQkJCQD069ePWbNm0b59e2bOnMm9995LdHQ0J0+epF27dgAMGTKEvn37cvr0aaKioujVqxfgrM0DzvpfTz31FD///DP58uUjKiqKQ4cOAVC1alXatGkDwMCBAxk3bhyPPPJIWh0rV65ky5YtacckJibSqlWrS77ufv36XfB8W7dupUaNGtSuXTutlvfffx9wWnvmzZuX1hITHx/Pnj17AOjYsSMlSpQAoH79+kRGRlK1atVM67DWZvhaXHXVVZl+zdn3DJwWrBEjRrB8+XLCw8PTpuV///33/Pbbb3z22WcAREdHs337dpo3b87w4cNJSkqiZ8+ehIaG8tNPP13wNb311lsBaNq0aaZdcfv27aNfv34cOHCAxMTEiy4PkNnPTEbfMyIiIsNzzJgxgzlz5pAvXz569+7N7NmzGT16NDVr1mTlypXUrl2brVu30qZNG8aPH8+6deto3rx52mtYvnx5wBnT1rt377TzLl68mH//+9+cOXOG48eP06BBA9q2bcvp06fTXpc77riDr7/++pJfaxERN/lnwHrrLVe+7dnxPGfOnKFz586MHz+eoUOHUrJkSTZu3Pi343v06MFTTz3F8ePHWbduHR06dMiwi+5CPv74Y44cOcK6desIDAwkODg4bUr5+bOfzr9vraVTp05pXUIZKV68OEWLFmXXrl3UrFkzw2OKFClywfNldO3pa/j888+55pprznl81apVFCxYMO1+QEDARcdDXei1yMzZ9yyzazpb4zvvvEPnzp3/dtzPP//MN998w9ChQ3nooYcoVarUBV/Ts9d0oeu5//77eeihh+jRowdLlizhueeeu+A1XMzFvuemTZvYvn07nTp1AkgLdaNHj6Z///58+umn1K1bl169emGMwVrLkCFDePnll/92rqCgIAICAgAnLN97772sXbuWqlWr8txzz130/biU1zo7x5+JiFwqjcFyQeHChRk3bhxvvPEGhQsXpkaNGsyePRtw/oD8+uuvgDNepXnz5owZM4Zu3boREBBAiRIlKFWqVNoYk2nTptGuXTuKFStGlSpV+PLLLwGnFezMmTNER0dTvnx5AgMDWbx4MZGRf238vWfPHlasWAHAJ598wrXXXntOnS1btuSXX35hx44dgDMeatu2bX+7nieffJL77ruPU6dOAc5Yp4xmr2V2vrp16xIREcHOnTsBzgkfnTt35p133kkbm7Nhw4aLvr6BgYEkJSX97fELvRZXonPnzrz77rtp33Pbtm3ExsYSGRlJhQoVuPPOOxk5ciTr16/P8muaXrFixTh9+vQ511G5cmUApkyZkulxZ2X2M5NVM2bM4LnnniMiIoKIiAj279/P/v37iYyMpFevXsydO5cZM2bQv39/wGlZ/Oyzzzh8+DAAx48fz/C1PhumypYtS0xMTFqrVMmSJSlWrBirVq0CYObMmWlfcymvtYiImxSwXNKkSRNCQkKYMWMGH3/8MRMnTqRx48Y0aNDgnMHX/fr1Y/r06WndbOD8UX300UcJCQlh48aNPPPMM4Dzh3PcuHGEhITQunVrDh48yIABA1i7di2NGjVi6tSp1K1bN+0811xzDePHj6devXqcOHGCe+6555way5Urx+TJk7n99tsJCQlJ68473z333EP79u3TBiu3bduWfPn+/qOV2fmCgoJ4//33ufnmmwkLC0vrTgJ4+umnSUpKIiQkhAYNGvD0009f9LUdNWoUISEhaYPcz7rQa3ElRo4cSf369QkLC6Nhw4bcddddJCcns2TJEho3bkyTJk2YNWsWY8aMyfJrml737t2ZM2fOOYPX+/btS9OmTSlbtmymx6WX2c9MVsycOTOt6/msXr16MXPmTEqVKkW9evWIjIwkPDwccLprx44dy4033khISAidOnXiwIEDfztvyZIlufPOO2nYsCGdO3dO61IEmDhxInfeeSehoaHExsamdQVfymstIuImc7ZlwJc0a9bMnr+O0x9//EG9evVcqkhELkVMTEza7M9XXnmFAwcO8Pbbb7tcVeb0+0XEPxlj1llrm2X0nH+OwRIRr/bNN9/w8ssvk5ycTPXq1Zk8ebLbJYmIXBIFLBHxOv369TunW1xEJK/RGCwRERGRbKaAJSIiIpLNFLBEREREspkCloiIiPieDz6ATHanyA0KWLnIGMPDDz+cdv/111+/4lW4zwoICEjb6LZ79+6cPHkyW857OSIiItI25z3f9ddfz/lLaFzM66+/Tt26dQkNDaV58+YZLmKaVUuWLKFbt26X/fUvvfTSOfdbt2590a85u9zA+dK/Z3379s1ws+2ctmTJEpYvX37Jx02YMOGK3ofzvfXWWwQFBREdHZ1t5xQRPzZuHIwaBW++6VoJCli5qGDBgnzxxRccPXo02899dkuXzZs3U7p0acaPH5/t38MNEyZMYOHChaxevZqNGzfy448/ktHabSkpKblSz/kBKyvhJDPp37MCBQowYcKEc56/2NY/2eFyA9bdd9+drVvRzJgxg+bNm2e6/+Klyq2fBxHxQu++C2PGQK9e4NnH1g0KWLkof/78jBo1ijczSNQRERF06NCBkJAQOnbsmLah8dChQ3nggQdo3bo1NWvWTNtO5EJatWpFVFQUADt37qRLly40bdqUtm3bsnXrVqKjo6levTqpqamAs11L1apVSUpKYuPGjbRs2ZKQkBB69erFiRMnANixYwc33HADjRs3JiwsjJ07dxITE0PHjh0JCwujUaNG56xAn5yczIABA6hXrx59+vTJsHXm+++/p1WrVoSFhdG3b98M91l86aWXePfddylevDjg7H04ZMgQAIKDg3n88ccJCwtj9uzZmZ7v22+/pW7duoSFhZ3zBzw2Npbhw4cTHh5OkyZN0uqfPHkyt956K126dKF27do89thjADzxxBNpmz+fXSX+bOvUhV6LrGjbti07duxgyZIltG3blh49elC/fn1SUlJ49NFHad68OSEhIbz33nsAHDhwgOuuuy6tBezsyu2ZvQbBwcE8++yzafVt3bqViIgIJkyYwJtvvpm2+vtXX31FixYtaNKkCTfccAOHDh3K8LjnnnsubQPuzH5mrr/+eh5//HHCw8OpU6fO31aXP+vsz9LYsWPTtkmaMGECjz76aNoxkydPZvTo0QBMnz6d8PBwQkNDueuuu9LCVNGiRXn44Ydp3LgxK1as4IUXXkjbXWDUqFFpwXzNmjWEhIQQGhrKo48+mtbaeqmvtYh4oYkT4d57oVs3mDkTAgPdq8Va63MfTZs2tefbsmVL2u3n5m22t01Ynq0fz83b/Lfveb4iRYrY6OhoW716dXvy5En72muv2WeffdZaa223bt3s5MmTrbXWTpw40d5yyy3WWmuHDBli+/TpY1NSUuzvv/9ua9Wqlem5rbU2OTnZ9unTxy5YsMBaa22HDh3stm3brLXWrly50rZv395aa22PHj3sokWLrLXWzpw5044YMcJaa22jRo3skiVLrLXWPv3003bMmDHWWmvDw8PtF198Ya21Ni4uzsbGxtqkpCQbHR1trbX2yJEjtlatWjY1NdXu3r3bAnbZsmXWWmuHDRtmX3vtNWutte3atbNr1qyxR44csW3btrUxMTHWWmtfeeUV+/zzz59zTdHR0bZkyZKZvp7Vq1e3r776atr3z+h8cXFxtkqVKnbbtm02NTXV9u3b1958883WWmuffPJJO23aNGuttSdOnLC1a9e2MTExdtKkSbZGjRr25MmTNi4uzlarVs3u2bPnnNf5/Nc9s9cio6/J6Gt79Ohh//e//9nFixfbwoUL2127dllrrX3vvffsiy++aK21Nj4+3jZt2tTu2rXLvv7663bs2LHWWuc9P3Xq1AVf0+rVq9tx48ZZa60dP3582vv97LPPpr031lp7/PjxtLo/+OAD+9BDD2V4XPr7mf3MtGvXLu3rv/nmG9uxY8cMX4exY8faF154waakpNhq1arZgwcP2sOHD5/zs96lSxe7dOlSu2XLFtutWzebmJhorbX2nnvusVOmTLHWWgvYWbNmpX3NsWPH0m4PHDjQzps3z1prbYMGDezy5cuttdY+/vjjtkGDBpf8Wp8v/e8XEXHJlCnWGmNtly7WxsfnyrcE1tpMsogWGs1lxYsXZ/DgwYwbN45ChQqlPb5ixYq01pVBgwaltZoA9OzZk3z58lG/fn0OHTqU4XnPtqxERUVRr149OnXqRExMDMuXL6dv375pxyUkJADOQo6zZs2iffv2zJw5k3vvvZfo6GhOnjyZthHwkCFD6Nu3L6dPnyYqKiptP7qgoCAAkpKSeOqpp/j555/Jly8fUVFRafVVrVqVNm3aADBw4EDGjRvHI488klbHypUr2bJlS9oxiYmJtGrV6pJfz7OLUWZ2vq1bt1KjRg1q166dVsv7778POK098+bNS2uJiY+PT2s57NixY9r+d/Xr1ycyMpKqVatmWoe1NsPX4qqrrsr0a86+Z+C0YI0YMYLly5cTHh5OjRo10mr87bff0louo6Oj2b59O82bN2f48OEkJSXRs2dPQkND+emnny74mt56660ANG3aNNOuuH379tGvXz8OHDhAYmJiWh2ZyexnJqPvGZHJYNMZM2YwZ84c8uXLR+/evZk9ezajR4+mZs2arFy5ktq1a7N161batGnD+PHjWbduXdq+hXFxcWl7VwYEBNC7d++08y5evJh///vfnDlzhuPHj9OgQQPatm3L6dOn016XO+64g6+//vqSX2sR8TKffALDhkHHjvDFF1CwoNsV+WfAerZ7A1e//4MPPkhYWBjDhg3L0vEF0/2g2Ez2jjw7nufMmTN07tyZ8ePHM3ToUEqWLMnGjRv/dnyPHj146qmnOH78OOvWraNDhw4ZdtFdyMcff8yRI0dYt24dgYGBBAcHEx8fDzgD+tM7/761lk6dOqV1CWWkePHiFC1alF27dlGzZs0MjylSpMgFz5fRtaev4fPPP+eaa6455/FVq1ad85oHBARcdDzUhV6LzJx9zzK7prM1vvPOO3Tu3Plvx/3888988803DB06lIceeohSpUpd8DU9e00Xup7777+fhx56iB49erBkyZIrnoRxse+5adMmtm/fTqdOnQDSQt3o0aPp378/n376KXXr1qVXr14YY7DWMmTIEF5++eW/nSsoKIiAgADACcv33nsva9eupWrVqjz33HMXfT8u5bXOzvFnInKFZs+GwYPhuutg7lxI13jhJo3BckHp0qW57bbbmDhxYtpjrVu3ZubMmYDzx7pt27aXde7ChQszbtw43njjDQoXLkyNGjWYPXs24PwB+fXXXwFnvErz5s0ZM2YM3bp1IyAggBIlSlCqVKm0MSbTpk2jXbt2FCtWjCpVqvDll18CTivYmTNniI6Opnz58gQGBrJ48WIiIyPT6tizZw8rVqwA4JNPPuHaa689p86WLVvyyy+/sGPHDsAZD7Vt27a/Xc+TTz7Jfffdx6lTpwBnrFNGs9cyO1/dunWJiIhg586dAOeEj86dO/POO++khdYNGzZc9PUNDAwkKSnpb49f6LW4Ep07d+bdd99N+57btm0jNjaWyMhIKlSowJ133snIkSNZv359ll/T9IoVK8bp06fPuY7KlSsDMGXKlEyPOyuzn5msmjFjBs899xwRERFERESwf/9+9u/fT2RkJL169WLu3LnMmDGD/v37A07L4meffcbhw4cBOH78eIav9dkwVbZsWWJiYtJapUqWLEmxYsVYtWoVQNq/Obi011pEvMSXX8Idd0DLlvDVV1C4sNsVpVHAcsnDDz98zmzCd955h0mTJhESEsK0adN4++23L/vcTZo0ISQkhBkzZvDxxx8zceJEGjduTIMGDc4ZfN2vXz+mT59+zp5vU6ZM4dFHHyUkJISNGzfyzDPPAM4fznHjxhESEkLr1q05ePAgAwYMYO3atTRq1IipU6dSt27dtPNcc801jB8/nnr16nHixAnuueeec2osV64ckydP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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJJCAYAAAB27EniAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABpQElEQVR4nO3dd3hUZfrG8e8DIqFDaLp0FKQZEEITWRRFUBFERexgAUVR1rbq7qrouq7707XAooiri1gAWRuCYsey0hUbuog0KQJSAqGG5Pn9cQ6zARIIMJOTcn+uK1dmzpyZeWYmJDfvec/zmrsjIiIiIvFTIuoCRERERIoaBSwRERGROFPAEhEREYkzBSwRERGROFPAEhEREYkzBSwRERGRODsi6gISoVq1al6/fv2oyxAREZEibO7cub+6e/WcbiuSAat+/frMmTMn6jJERESkCDOzpbndpkOEIiIiInGmgCUiIiISZwpYIiIiInFWJOdg5SQjI4Ply5ezffv2qEsRkSImKSmJ2rVrU6pUqahLEZECotgErOXLl1OhQgXq16+PmUVdjogUEe7OunXrWL58OQ0aNIi6HBEpIBJ+iNDMSprZl2Y2ObzewMxmmtlCM5tgZkeG20uH1xeGt9fP9hh3htv/a2bdD6WO7du3U7VqVYUrEYkrM6Nq1aoaHReRPeTHHKyhwPfZrv8NeNTdjwU2AFeF268CNoTbHw33w8yaARcCzYEewBNmVvJQClG4EpFE0O8WEdlbQgOWmdUGzgL+GV43oCvw73CX54Bzwsu9w+uEt58a7t8bGO/uO9x9MbAQaJfIuhOlZMmStGrVihYtWnD22WezcePGyGpZsmQJLVq0yPG2k08++aD7iD388MM0adKEVq1a0bZtW8aOHXvItU2bNo2ePXse8v0feOCBPa6feOKJB7xP+fLlc9ye/TPr27cvW7duPeS6DtW0adP4/PPPD3q/UaNGHdbnsLfHHnuMpKQk0tLS4vaYIiJFVaJHsB4Dfg9khderAhvdfVd4fTlQK7xcC/gZILw9Ldw/tj2H+8SY2SAzm2Nmc9auXRvnlxEfZcqUYd68eXz77bckJyczcuTIqEuKi1GjRvHee+8xa9Ys5s2bxwcffIC777NfZmZmvtSzd8DKSzjJTfbP7Mgjj2TUqFF73L5r165c7hk/hxqwrr32Wi6//PK41TFu3Djatm3Lq6++GpfHy6+fBxGRKCQsYJlZT2CNu89N1HNk5+6j3T3V3VOrV8+xa32B0rFjR1asWAHATz/9RI8ePWjTpg2dO3fmhx9+IC0tjXr16pGVFWTTLVu2UKdOHTIyMpg3bx4dOnQgJSWFPn36sGHDBgAWLlzIaaedRsuWLWndujU//fQT6enpnHrqqbRu3Zrjjz+eN954I1bDrl27uOSSS2jatCnnn39+jqMz7777Lh07dqR169b07duX9PT0ffZ54IEHePLJJ6lYsSIAFStWpH///kDQVf/222+ndevWTJw4MdfHmzp1Kk2aNKF169Z7/AHfsmULV155Je3ateOEE06I1T9mzBjOPfdcevToQaNGjfj9738PwB133MG2bdto1aoVl1xyCfC/0an9vRd50blzZxYuXMi0adPo3LkzvXr1olmzZmRmZnLbbbfRtm1bUlJSeOqppwBYtWoVv/3tb2MjYJ9++ul+39P69etzzz33xOr74YcfWLJkCaNGjeLRRx+lVatWfPrpp7z55pu0b9+eE044gdNOO43Vq1fnuN+wYcN4+OGHAXL9mTn55JO5/fbbadeuHY0bN47VuLfdP0v3338/48aNA4Jgfdttt8X2GTNmDEOGDAHghRdeoF27drRq1YprrrkmFqbKly/PLbfcQsuWLZk+fTr33Xcfbdu2pUWLFgwaNCgWzGfPnk1KSgqtWrXitttui422Hux7LSISGXdPyBfwV4LRpiXAL8BW4EXgV+CIcJ+OwDvh5XeAjuHlI8L9DLgTuDPb48b2y+2rTZs2vrf58+f/78rQoe5dusT3a+jQfZ5zb+XKlXN39127dvn555/vb7/9tru7d+3a1RcsWODu7jNmzPBTTjnF3d179erlH374obu7jx8/3q+66ip3dz/++ON92rRp7u5+1113+dDwudu1a+evvvqqu7tv27bNt2zZ4hkZGZ6Wlubu7mvXrvVjjjnGs7KyfPHixQ74Z5995u7uV1xxhT/00EPu7t6lSxefPXu2r1271jt37uzp6enu7v7ggw/6vffeu8drSktL88qVK+f6muvVq+d/+9vfYs+f0+Nt27bNa9eu7QsWLPCsrCzv27evn3XWWe7ufuedd/rzzz/v7u4bNmzwRo0aeXp6uv/rX//yBg0a+MaNG33btm1et25dX7Zs2R7v897ve27vRU73yem+vXr18ieeeMI/+ugjL1u2rC9atMjd3Z966in/85//7O7u27dv9zZt2viiRYv84Ycf9vvvv9/dg89806ZN+31P69Wr58OHD3d395EjR8Y+73vuuSf22bi7r1+/Plb3008/7TfffHOO+2W/ntvPTJcuXWL3nzJlip966qk5vg/333+/33fffZ6Zmel169b1X375xdesWePHHHNMbJ8ePXr4p59+6vPnz/eePXv6zp073d198ODB/txzz7m7O+ATJkyI3WfdunWxy5deeqlPmjTJ3d2bN2/un3/+ubu733777d68efODfq/z2x6/Y0SkWADmeC5ZJGFtGtz9zjAcYWYnA7e6+yVmNhE4HxgP9Ad2DyNMCq9PD2//0N3dzCYBL5nZI8BvgEbArETVnUi7R1ZWrFhB06ZN6datG+np6Xz++ef07ds3tt+OHTsA6NevHxMmTOCUU05h/PjxXHfddaSlpbFx40a6dOkCQP/+/enbty+bN29mxYoV9OnTBwj68kDQ/+sPf/gDn3zyCSVKlGDFihWsXr0agDp16tCpUycALr30UoYPH86tt94aq2PGjBnMnz8/ts/OnTvp2LHjQb/ufv367ffxfvjhBxo0aECjRo1itYwePRoIRnsmTZoUG4nZvn07y5YtA+DUU0+lUqVKADRr1oylS5dSp06dXOtw9xzfi6OOOirX++z+zCAYwbrqqqv4/PPPadeuXeyU/HfffZevv/6af/87mFqYlpbGjz/+SNu2bbnyyivJyMjgnHPOoVWrVnz88cf7fU/PPfdcANq0aZProbjly5fTr18/Vq1axc6dOw/YGiC3n5mcnnPJkiU5Psa4ceN47bXXKFGiBOeddx4TJ05kyJAhNGzYkBkzZtCoUSN++OEHOnXqxMiRI5k7dy5t27aNvYc1atQAgjlt5513XuxxP/roI/7v//6PrVu3sn79epo3b07nzp3ZvHlz7H25+OKLmTx58kG/1yIiUYqiD9btwHgzux/4Engm3P4M8LyZLQTWE5w5iLt/Z2YvA/OBXcD17n54kzcee+yw7n6ods/n2bp1K927d2fkyJEMGDCAypUrM2/evH3279WrF3/4wx9Yv349c+fOpWvXrjkeotufF198kbVr1zJ37lxKlSpF/fr1Y6eT733m097X3Z1u3brFDgnlpGLFipQvX55FixbRsGHDHPcpV67cfh8vp9ee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WsVvf/vb2AjY7s7tub0H9evX55577onV98MPP7BkyRJGjRrFo48+Guv+/uabb9K+fXtOOOEETjvtNFavXp3jfsOGDYstwJ3bz8zJJ5/M7bffTrt27WjcuPE+3eV32/2zdP/998eWSRo1ahS33XZbbJ8xY8YwZMgQAF544QXatWtHq1atuOaaa2Jhqnz58txyyy20bNmS6dOnc99998VWFxg0aFAsmM+ePZuUlBRatWrFbbfdFhttPdj3WgqR7duhd2/44Qd49dVgPdoZM6BCBejWLQhc27ZFXaUUNe5e5L7atGnje5s/f37s8rBJ3/oFoz6P69ewSd/u85x7K1eunKelpXm9evV848aN/tBDD/k999zj7u49e/b0MWPGuLv7M888471793Z39/79+/v555/vmZmZ/t133/kxxxyT62O7u+/atcvPP/98f/vtt93dvWvXrr5gwQJ3d58xY4afcsop7u7eq1cv//DDD93dffz48X7VVVe5u/vxxx/v06ZNc3f3u+66y4cOHeru7u3atfNXX33V3d23bdvmW7Zs8YyMDE9LS3N397Vr1/oxxxzjWVlZvnjxYgf8s88+c3f3K664wh966CF3d+/SpYvPnj3b165d6507d/b09HR3d3/wwQf93nvv3eM1paWleeXKlXN9P+vVq+d/+9vfYs+f0+Nt27bNa9eu7QsWLPCsrCzv27evn3XWWe7ufuedd/rzzz/v7u4bNmzwRo0aeXp6uv/rX//yBg0a+MaNG33btm1et25dX7Zs2R7v897ve27vRU73yem+vXr18ieeeMI/+ugjL1u2rC9atMjd3Z966in/85//7O7u27dv9zZt2viiRYv84Ycf9vvvv9/dg89806ZN+31P69Wr58OHD3d395EjR8Y+73vuuSf22bi7r1+/Plb3008/7TfffHOO+2W/ntvPTJcuXWL3nzJlip966qk5vg/333+/33fffZ6Zmel169b1X375xdesWbPHz3qPHj38008/9fnz53vPnj19586d7u4+ePBgf+6559zdHfAJEybE7rNu3brY5UsvvdQnTZrk7u7Nmzf3zz//3N3db7/9dm/evPlBv9c5yf47RgqQXbvczz3XHdxfemnP27Zudb/xxuC2pk3d58yJpkYptIA5nksWUaPRfFaxYkUuv/xyhg8fTpkyZWLbp0+fHhtdueyyy2Kj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f32wtuCTTwbzr0RERKTI0hys/PDXv8Lo0XDnnXDttVFXIyIiIgmmgJVozz8Pf/xj0JLhL3+JuhoRERHJBwpYifT++3DlldC1Kzz7rBqJioiIFBMKWIny9ddw7rnQpEnQsf3II6OuSERERPKJAlYi/PwznHkmVKwIb70FlSpFXZGIiIjkI51FGG8bNwbhavNm+PTToFu7iIiIFCsKWPG0c2dwWPCHH2DqVEhJiboiERERiYACVry4BxPaP/oIxo6FU0+NuiIRERGJiOZgxcsf/wgvvhi0YrjssqirERERkQgpYMXDqFFBM9FrrgmaiYqIiEixpoB1uN58M1gGp2dP+Mc/1OtKREREFLAOy6xZwQLOrVvD+PFwhKa0iYiIiALWofvpp2DU6qijYPJkKFcu6opERESkgFDAOhRr10KPHpCVFbRjqFkz6opERESkANExrYOVlRX0ulq+HD74ABo3jroiERERKWAUsA5WiRLw+9/Drl1w4olRVyMiIiIFkALWoTj77KgrEBERkQJMc7BERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOFLBERERE4kwBS0RERCTOEhawzOxZM1tjZt9m25ZsZu+Z2Y/h9yrhdjOz4Wa20My+NrPW2e7TP9z/RzPrn6h6RUREROIlkSNYY4Aee227A/jA3RsBH4TXAc4AGoVfg4AnIQhkwD1Ae6AdcM/uUCYiIiJSUCUsYLn7J8D6vTb3Bp4LLz8HnJNt+1gPzAAqm9nRQHfgPXdf7+4bgPfYN7SJiIiIFCj5PQerpruvCi//AtQML9cCfs623/JwW27bRURERAqsyCa5u7sDHq/HM7NBZjbHzOasXbs2Xg8rIiIictDyO2CtDg/9EX5fE25fAdTJtl/tcFtu2/fh7qPdPdXdU6tXrx73wkVERETyKr8D1iRg95mA/YE3sm2/PDybsAOQFh5KfAc43cyqhJPbTw+3iYiIiBRY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\n", "text/plain": [ "
" ] @@ -1087,6 +971,8 @@ "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", "\n", + "plt.xticks([1,2,3,4,5])\n", + "\n", "plt.ylabel(\"Milliseconds\")\n", "plt.xlabel(\"Credentials in Presentation\")\n", "\n", @@ -1096,7 +982,35 @@ }, { "cell_type": "markdown", - "id": "e482bc34", + "id": "6535aa6d", + "metadata": {}, + "source": [ + "## Save Experiments to File" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "65a3a3b8", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service.experiments[1][\"name\"] = 'Fixed Attributes Variable Credentials in Presentation - Revocable'" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "c17d3247", + "metadata": {}, + "outputs": [], + "source": [ + "performance_service.save_experiments()" + ] + }, + { + "cell_type": "markdown", + "id": "a629b6fc", "metadata": {}, "source": [ "## Terminate Controller\n", @@ -1106,8 +1020,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "75928622", + "execution_count": 40, + "id": "a6a94b19", "metadata": {}, "outputs": [], "source": [ @@ -1117,7 +1031,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9e1010e9", + "id": "29bc0ba1", "metadata": {}, "outputs": [], "source": [] diff --git a/playground/verifier/notebooks/verify_variable_attrib_fixed_cred.ipynb b/playground/verifier/notebooks/verify_variable_attrib_fixed_cred.ipynb index 62849c6..5136356 100644 --- a/playground/verifier/notebooks/verify_variable_attrib_fixed_cred.ipynb +++ b/playground/verifier/notebooks/verify_variable_attrib_fixed_cred.ipynb @@ -2,17 +2,17 @@ "cells": [ { "cell_type": "markdown", - "id": "89b3126a", + "id": "7eae5984", "metadata": {}, "source": [ - "# ACA-Py & ACC-Py Verifier Template\n", + "# Performance Test\n", "\n", - "## Copy this template into the root folder of your notebook workspace to get started" + "## Variable Attribute Disclosed, Fixed Credential" ] }, { "cell_type": "markdown", - "id": "da515798", + "id": "3e854052", "metadata": {}, "source": [ "### Imports" @@ -20,8 +20,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "106c4c1c", + "execution_count": 1, + "id": "8b4d1579", "metadata": {}, "outputs": [], "source": [ @@ -35,7 +35,7 @@ }, { "cell_type": "markdown", - "id": "12ba2c76", + "id": "3eaf3a62", "metadata": {}, "source": [ "### Initialise the Agent Controller" @@ -43,10 +43,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8ebafb07", + "execution_count": 2, + "id": "c1f6c437", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initialising a controller with admin api at http://verifier-agent:3021 and an api key of adminApiKey\n" + ] + } + ], "source": [ "api_key = os.getenv(\"ACAPY_ADMIN_API_KEY\")\n", "admin_url = os.getenv(\"ADMIN_URL\")\n", @@ -57,7 +65,7 @@ }, { "cell_type": "markdown", - "id": "2c34464b", + "id": "1a87e21e", "metadata": {}, "source": [ "### Start a Webhook Server" @@ -65,10 +73,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "faf3599e", + "execution_count": 3, + "id": "e8ec0ef0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Listening for webhooks from agent at http://0.0.0.0:3010\n" + ] + } + ], "source": [ "webhook_port = int(os.getenv(\"WEBHOOK_PORT\"))\n", "webhook_host = \"0.0.0.0\"\n", @@ -80,7 +96,7 @@ }, { "cell_type": "markdown", - "id": "6136fc48", + "id": "174ed749", "metadata": {}, "source": [ "## Store Issuing Schema and Cred Def Identifiers\n", @@ -92,1613 +108,179 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "f3661c66", - "metadata": {}, - "outputs": [], - "source": [ - "schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:one-attrib:0.0.2'\n", - "cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:default'\n", - "rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:8:revocable'\n", - "\n", - "five_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-attrib:0.0.1'\n", - "five_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:default'\n", - "five_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:9:revocable'\n", - "\n", - "ten_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:ten-attrib:0.0.1'\n", - "ten_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:default'\n", - "ten_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:10:revocable'\n", - "\n", - "twenty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:twenty-attrib:0.0.1'\n", - "twenty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:default'\n", - "twenty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:11:revocable'\n", - "\n", - "fifty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:fifty-attrib:0.0.1'\n", - "fifty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:default'\n", - "fifty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:12:revocable'\n", - "\n", - "hundred_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:hundred-attrib:0.0.1'\n", - "hundred_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:default'\n", - "hundred_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:13:revocable'\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "9b1599a8", - "metadata": {}, - "source": [ - "## Init Performance Service" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c2dfc8e4", - "metadata": {}, - "outputs": [], - "source": [ - "performance_service = PerformanceService(agent_controller, iterations=20)" - ] - }, - { - "cell_type": "markdown", - "id": "79d77b12", - "metadata": {}, - "source": [ - "## Establish Connection\n", - "\n", - "Before you can issue a credential you must first establish a connection across which the credential will be issued to a holder. (see recipes/connection)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3c9815cc", - "metadata": {}, - "outputs": [], - "source": [ - "# Alias for invited connection\n", - "alias = \"Friend\"\n", - "auto_accept = \"true\"\n", - "# Use public DID?\n", - "public = \"false\"\n", - "# Should this invitation be usable by multiple invitees?\n", - "multi_use = \"false\"\n", - "\n", - "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", - "# Is equivalent to above. Arguments are optionally\n", - "# invitation_response = await agent_controller.connections.create_invitation()\n", - "\n", - "\n", - "\n", - "# You will use this identifier to issue a credential across this connection\n", - "connection_id = invitation_response[\"connection_id\"]\n", - "\n", - "invitation = invitation_response[\"invitation\"]\n", - "## Copy this output\n", - "print(invitation)\n", - "print(connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5973d717", - "metadata": {}, - "outputs": [], - "source": [ - "connection_id = \"2782d60f-65d0-4e14-8e28-55fa38735468\"" - ] - }, - { - "cell_type": "markdown", - "id": "e8832bb5", - "metadata": {}, - "source": [ - "## Define Presentation Request Object\n", - "\n", - "The below cell defines a generic presentation request object, that can be sent across specific connections requesting that they produce a presentation containing the identified attributes and meeting the restrictions.\n", - "\n", - "It is often useful to define your request objects first, then reuse these objects across many connections you wish to request a proof from. \n", - "\n", - "Duplicate and customise the below cell as many times as you need. It may be useful to save these request objects either to the jupyter store using %store or through\n", - "\n", - "TODO: Detail the full set of restrictions available to a verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6d0ab80e", - "metadata": {}, - "outputs": [], - "source": [ - "# # We add a constraint that the attribute must originate from this schema\n", - "# schema_id = \"\"\n", - "\n", - "# trusted_issuer_did = \"\"\n", - "\n", - "# cred_def_id = \"\"\n", - "\n", - "# # Define the list of attributes and restrictions under which each attribute was issued that a prover must satisfy with a presentation\n", - "# # NOTE: if identifying a schema or credential definition then the attribute name must be contained within the corresponding schema.\n", - "# req_attrs = [\n", - "# {\"name\": \"\", \"restrictions\": [{\"schema_id\": schema_id}]},\n", - "# {\"name\": \"\", \"restrictions\": [{\"cred_def_id\": cred_def_id}]},\n", - "# #NOTE: you do not need to specify any restrictions. This means the prover can present a self-attested attribute to satisfy this request. \n", - "# # Although the business logic (this notebook) can still determine this is unacceptable.\n", - "# {\"name\": \"\", \"restrictions\":[]}\n", - "# # You can also specify individual attributes be non-revoked\n", - "# {\"name\": \"\", \"restrictions\": [], \"non_revoked\": {\"to\": int(time.time() - 1)}}\n", - "# ]\n", - "\n", - "# # We could extend this to request the name attribute aswell if we wanted.\n", - "\n", - "\n", - "# proof_request = {\n", - "# \"name\": \"Name of Proof Request\",\n", - "# \"version\": \"1.0\",\n", - "\n", - "# # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", - "# # We will ignore these for now.\n", - "# \"requested_predicates\": {\n", - "# # f\"0_{req_pred['name']}_GE_uuid\":\n", - "# # req_pred for req_pred in req_preds\n", - "# },\n", - "# # You can also request the entire proof request be non-revoked\n", - "# \"non_revoked\": {\"to\": int(time.time())}\n", - "# }" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cdc61a21", - "metadata": {}, - "outputs": [], - "source": [ - "proof_request = {\n", - " \"name\": \"Name of Proof Request\",\n", - " \"version\": \"1.0\",\n", - "\n", - " # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", - " # We will ignore these for now.\n", - " \"requested_predicates\": {\n", - "# f\"0_{req_pred['name']}_GE_uuid\":\n", - "# req_pred for req_pred in req_preds\n", - " },\n", - " # You can also request the entire proof request be non-revoked\n", - " \"non_revoked\": {\"to\": int(time.time())}\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "0877f5ad", - "metadata": {}, - "source": [ - "# Single Disclosed Attribute from Variable Size Credential Experiment\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bb6948b5", - "metadata": {}, - "outputs": [], - "source": [ - "experiment = performance_service.new_experiment(\"Single Attribute from Variable Credentials - Non Revocable\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3beb7658", - "metadata": {}, - "outputs": [], - "source": [ - "revocable_experiment = performance_service.new_experiment(\"Single Attribute from Variable Credential - Revocable\")" - ] - }, - { - "cell_type": "markdown", - "id": "1d1f5840", - "metadata": {}, - "source": [ - "## Performance Test - One Attribute Credential" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0d21d6d0", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": schema_id, \"cred_def_id\": cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ff91f730", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"1\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5caae1ec", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "097a4137", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": schema_id, \"cred_def_id\": rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "75ef50e8", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "411b3329", - "metadata": {}, - "source": [ - "## Performance Test - Five Attribute Credential" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f0627ab4", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ea381dbb", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"5\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "08ce41a3", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3dc44bce", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8944a986", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "5ec33453", - "metadata": {}, - "source": [ - "## Performance Test - Fice Attribute Credential" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "93289da3", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "32464b92", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"10\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4fdfeedd", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7e9b8196", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59f3ddeb", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "c4055b08", - "metadata": {}, - "source": [ - "## Performance Test - Twenty Attribute Credential" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a19ea559", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b63f1ce6", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"20\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "77d0dab0", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fccfe138", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1a75b134", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "6aace5fe", - "metadata": {}, - "source": [ - "## Performance Test - Fifty Attribute Credential" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a61627fb", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "df6703d1", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"50\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "437ec141", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ce2acbda", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1297b7b3", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "fa460244", - "metadata": {}, - "source": [ - "## Performance Test - Hundred Attribute Credential" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "95b76c63", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8fac1e76", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"100\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "50ad832f", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "56aec046", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21e16e42", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "08b7acf2", - "metadata": {}, - "source": [ - "## Plot Results" - ] - }, - { - "cell_type": "markdown", - "id": "acbc72bf", - "metadata": {}, - "source": [ - "### Non Revocable" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dfbb5a49", - "metadata": {}, - "outputs": [], - "source": [ - "data = []\n", - "labels = []\n", - "non_revocable_averages = []\n", - "for result in experiment[\"results\"]:\n", - " \n", - " if result[\"name\"] != \"1\":\n", - " millitimings = [i * 1000 for i in result[\"timings\"]]\n", - " data.append(millitimings)\n", - " non_revocable_averages.append(result[\"average\"] * 1000)\n", - " labels.append(result[\"name\"])\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9d5cf877", - "metadata": {}, - "outputs": [], - "source": [ - "# Import libraries\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - " \n", - "\n", - " \n", - "fig = plt.figure(figsize =(10, 10))\n", - " \n", - "# Creating axes instance\n", - "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", - " \n", - "# Creating plot`\n", - "bp = ax.boxplot(data, patch_artist = True,\n", - " notch ='True')\n", - "\n", - "# x-axis labels\n", - "ax.set_xticklabels(labels)\n", - "\n", - "plt.ylabel(\"Milliseconds\")\n", - "plt.xlabel(\"Credential Size (Bytes)\")\n", - "\n", - "plt.savefig(\"single_attrib_variable_cred_box_plot_non_revocable.png\")" - ] - }, - { - "cell_type": "markdown", - "id": "4faeb8d9", - "metadata": {}, - "source": [ - "### Revocable" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a816e7cc", - "metadata": {}, - "outputs": [], - "source": [ - "data = []\n", - "labels = []\n", - "revocable_averages = []\n", - "for result in revocable_experiment[\"results\"]:\n", - " \n", - " millitimings = [i * 1000 for i in result[\"timings\"]]\n", - " data.append(millitimings)\n", - " revocable_averages.append(result[\"average\"] * 1000)\n", - " labels.append(result[\"name\"])\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "723f0477", - "metadata": {}, - "outputs": [], - "source": [ - "# Import libraries\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - " \n", - "\n", - " \n", - "fig = plt.figure(figsize =(10, 10))\n", - " \n", - "# Creating axes instance\n", - "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", - " \n", - "# Creating plot`\n", - "bp = ax.boxplot(data, patch_artist = True,\n", - " notch ='True')\n", - "\n", - "# x-axis labels\n", - "ax.set_xticklabels(labels)\n", - "\n", - "plt.ylabel(\"Milliseconds\")\n", - "plt.xlabel(\"Credential Size (Bytes)\")\n", - "\n", - "plt.savefig(\"single_attrib_variable_cred_box_plot_revocable.png\")" - ] - }, - { - "cell_type": "markdown", - "id": "88c60c0f", - "metadata": {}, - "source": [ - "## Averages" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d0857ba3", - "metadata": {}, - "outputs": [], - "source": [ - "fig = plt.figure(figsize =(10, 10))\n", - " \n", - "# Creating axes instance\n", - "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", - "\n", - "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", - "\n", - "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", - "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", - "\n", - "plt.ylabel(\"Milliseconds\")\n", - "plt.xlabel(\"Credential_size (Bytes)\")\n", - "\n", - "\n", - "plt.legend()\n", - "plt.savefig(\"single_attrib_variable_cred_averages.png\")" - ] - }, - { - "cell_type": "markdown", - "id": "6a4a7e06", - "metadata": {}, - "source": [ - "# Fixed Credential Variable Attributes Disclosed" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0499076e", - "metadata": {}, - "outputs": [], - "source": [ - "experiment = performance_service.new_experiment(\"Fixed Credential Variable Attributes Disclosed\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1fa15d95", - "metadata": {}, - "outputs": [], - "source": [ - "revocable_experiment = performance_service.new_experiment(\"Fixed Credential Variable Attributes Disclosed - Revocable\")" - ] - }, - { - "cell_type": "markdown", - "id": "8935f43a", - "metadata": {}, - "source": [ - "## One Attribute" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "070b8705", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "87cc2c1f", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"1\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6c8f9e1a", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23e0fa07", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6843e524", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "ea57c768", - "metadata": {}, - "source": [ - "## Two Attribute" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "60621fd2", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8d4616a0", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"2\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "303a5c43", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a514754b", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2aa7dea7", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "abd4b319", - "metadata": {}, - "source": [ - "## Five Attribute" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3cf57768", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7d4b6e7f", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"5\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "496d5112", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "76ad6382", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "86a43b17", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "8ee6a192", - "metadata": {}, - "source": [ - "## Ten Attribute" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "42016326", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7e6d0695", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"10\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cb67ba00", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "47285159", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "821e0ae6", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "markdown", - "id": "0a8ea5a4", - "metadata": {}, - "source": [ - "## Twenty Attribute" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e5212a59", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"11\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"12\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"13\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"14\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"15\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"16\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"17\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"18\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"19\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"20\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "db218fd1", - "metadata": {}, - "outputs": [], - "source": [ - "name = \"20\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1a6bbf77", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6abb521e", - "metadata": {}, - "outputs": [], - "source": [ - "req_attrs = [\n", - " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"11\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"12\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"13\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"14\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"15\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"16\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"17\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"18\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"19\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"20\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - "]\n", - "\n", - "proof_request[\"requested_attributes\"] = {\n", - " # They generally follow this uuid pattern. Unique identifier for attribute within context of this proof request\n", - " # Note that req_attr['name'] gets the attribute name of each object. E.g. domain and name in this case\n", - " f\"0_{req_attr['name']}_uuid\":\n", - " req_attr for req_attr in req_attrs\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6e7d29a7", - "metadata": {}, - "outputs": [], - "source": [ - "test = {\"name\": name, \"proof_request\": proof_request}\n", - "\n", - "await performance_service.run_verification(revocable_experiment, test, connection_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e8ad33bf", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "fc788c2c", - "metadata": {}, - "source": [ - "## Plot Results" - ] - }, - { - "cell_type": "markdown", - "id": "6e78c969", - "metadata": {}, - "source": [ - "### Non Revocable" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5ff422af", - "metadata": {}, - "outputs": [], - "source": [ - "data = []\n", - "labels = []\n", - "non_revocable_averages = []\n", - "for result in experiment[\"results\"]:\n", - " \n", - "\n", - " millitimings = [i * 1000 for i in result[\"timings\"]]\n", - " data.append(millitimings)\n", - " non_revocable_averages.append(result[\"average\"] * 1000)\n", - " labels.append(result[\"name\"])\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "66fab458", - "metadata": {}, - "outputs": [], - "source": [ - "# Import libraries\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - " \n", + "execution_count": 4, + "id": "b7f59401", + "metadata": {}, + "outputs": [], + "source": [ + "one_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:one-attrib:0.0.2'\n", + "one_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:default'\n", + "one_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:15:revocable'\n", "\n", - " \n", - "fig = plt.figure(figsize =(10, 10))\n", - " \n", - "# Creating axes instance\n", - "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", - " \n", - "# Creating plot`\n", - "bp = ax.boxplot(data, patch_artist = True,\n", - " notch ='True')\n", + "five_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:five-attrib:0.0.1'\n", + "five_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:default'\n", + "five_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:16:revocable'\n", "\n", - "# x-axis labels\n", - "ax.set_xticklabels(labels)\n", + "ten_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:ten-attrib:0.0.1'\n", + "ten_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:default'\n", + "ten_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:17:revocable'\n", "\n", - "plt.ylabel(\"Milliseconds\")\n", - "plt.xlabel(\"Attributes Disclosed\")\n", + "twenty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:twenty-attrib:0.0.1'\n", + "twenty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:default'\n", + "twenty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:18:revocable'\n", + "\n", + "fifty_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:fifty-attrib:0.0.1'\n", + "fifty_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:default'\n", + "fifty_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:19:revocable'\n", "\n", - "plt.savefig(\"fixed_cred_variable_disclosure_box_plot_non_revocable.png\")" + "hundred_schema_id='H7zAaLJRZrdbPqbVMMfL5t:2:hundred-attrib:0.0.1'\n", + "hundred_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:default'\n", + "hundred_rev_cred_def_id='H7zAaLJRZrdbPqbVMMfL5t:3:CL:20:revocable'\n" ] }, { "cell_type": "markdown", - "id": "b8578765", + "id": "a7f7f380", "metadata": {}, "source": [ - "### Revocable" + "## Init Performance Service" ] }, { "cell_type": "code", - "execution_count": null, - "id": "3d0f85b8", + "execution_count": 5, + "id": "411bbca9", "metadata": {}, "outputs": [], "source": [ - "help(plt.axes)" + "performance_service = PerformanceService(agent_controller, iterations=100)" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "eb4fb2f2", + "cell_type": "markdown", + "id": "2281d473", "metadata": {}, - "outputs": [], "source": [ - "data = []\n", - "labels = []\n", - "revocable_averages = []\n", - "for result in revocable_experiment[\"results\"]:\n", - " \n", - " millitimings = [i * 1000 for i in result[\"timings\"]]\n", - " data.append(millitimings)\n", - " revocable_averages.append(result[\"average\"] * 1000)\n", - " labels.append(result[\"name\"])\n", - " \n" + "## Establish Connection\n", + "\n", + "Before you can issue a credential you must first establish a connection across which the credential will be issued to a holder. (see recipes/connection)" ] }, { "cell_type": "code", "execution_count": null, - "id": "b07d768e", + "id": "9603425e", "metadata": {}, "outputs": [], "source": [ - "print(labels)" + "# Alias for invited connection\n", + "alias = \"Friend\"\n", + "auto_accept = \"true\"\n", + "# Use public DID?\n", + "public = \"false\"\n", + "# Should this invitation be usable by multiple invitees?\n", + "multi_use = \"false\"\n", + "\n", + "invitation_response = await agent_controller.connections.create_invitation(alias, auto_accept, public, multi_use)\n", + "# Is equivalent to above. Arguments are optionally\n", + "# invitation_response = await agent_controller.connections.create_invitation()\n", + "\n", + "\n", + "\n", + "# You will use this identifier to issue a credential across this connection\n", + "connection_id = invitation_response[\"connection_id\"]\n", + "\n", + "invitation = invitation_response[\"invitation\"]\n", + "## Copy this output\n", + "print(invitation)\n", + "print(connection_id)" ] }, { "cell_type": "code", - "execution_count": 186, - "id": "131f8e3d", + "execution_count": 6, + "id": "9d37037f", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "# Import libraries\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - " \n", - "\n", - " \n", - "fig = plt.figure(figsize =(10, 10))\n", - " \n", - "# Creating axes instance\n", - "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", - " \n", - "# Creating plot`\n", - "bp = ax.boxplot(data, patch_artist = True,\n", - " notch ='True')\n", - "\n", - "# x-axis labels\n", - "ax.set_xticklabels(labels)\n", - "\n", - "plt.ylabel(\"Milliseconds\")\n", - "plt.xlabel(\"Attributes Disclosed\")\n", - "\n", - "plt.savefig(\"fixed_cred_variable_disclosure_box_plot_revocable.png\")" + "connection_id = \"3aaf07e2-d41b-4dff-903d-6acc4b21c3af\"" ] }, { "cell_type": "markdown", - "id": "4e740e17", + "id": "20dca195", "metadata": {}, "source": [ - "## Averages" + "## Define Presentation Request Object\n" ] }, { "cell_type": "code", - "execution_count": 191, - "id": "8b919bcf", + "execution_count": 7, + "id": "02c7d5b6", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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P3482Y99YWqb9evXky9fPj744INkL8MNEydO5Ndff2Xp0qWsXr2a3377jaTGpYuLi0uReC5NvLxJWi4n8d8sc+bMTJw48aL1V5sCKTlcb+L1+OOPJ+uUPCEhIdSvX/+y81Neq5R6PYhI6vPyt+vZdTKacV+/SvbYc67EoMQrlciUKRN9+vRh3Lhx/1m3e/dubrvtNoKCgrj99tsTJoLu3r07AwYMoEmTJpQrVy5hWpUrady4MQcOHABgx44dtG7dmrp169K0aVM2b95MeHg4pUuXJj4+HnCmrSlZsiQxMTGsXr2aRo0aERQURLt27Th58iQA27dvp0WLFtSqVYs6deqwY8cOIiIiuP3226lTpw41a9a8aMT92NhYunbtStWqVWnfvn2StTm//PILjRs3pk6dOnTo0CHJeShfe+01PvroI3LlygU4c0N269YNgDJlyjB06FDq1KnDrFmzLnu8n376iSpVqlCnTp2LPtgjIyPp2bMnDRo0oHbt2gnxT5o0ifvvv5/WrVtTsWJFnn32WQCGDRuWMGn2hVHxL9RmXelaeKNp06Zs376dhQsX0rRpU9q2bUu1atWIi4tjyJAh1K9fn6CgID7++GMADh06RLNmzRJqzC6MVH+5a1CmTBlGjBiREN/mzZvZvXs3EydOZNy4cQmj3X/33Xc0bNiQ2rVr06JFC44cOZLkdiNHjkyYuPxyr5lbbrmFoUOH0qBBAypVqvSf0fQvuPBaGj16dMJ0URMnTmTIkCEJ20yaNIl+/foBMHXqVBo0aEBwcDCPPfZYQpKVI0cOBg8eTK1atfj3338ZNWpUwmwKffr0SUjYly1bRlBQEMHBwQwZMiShdvZar7WIpD7z1x5ixooD9F08iybP94NE8+qmKGtthvqpW7euvdTGjRsTHo+ct952nLgoWX9Gzlv/nzIvlT17dhseHm5Lly5tT506Zd966y07YsQIa621bdq0sZMmTbLWWvv555/be++911prbbdu3Wz79u1tXFyc3bBhgy1fvvxlj22ttbGxsbZ9+/b2xx9/tNZae9ttt9mtW7daa61dvHixvfXWW6211rZt29b+/vvv1lprQ0NDba9evay11tasWdMuXLjQWmvtiy++aAcOHGittbZBgwZ2zpw51lprz549ayMjI21MTIwNDw+31lp77NgxW758eRsfH2937dplAfv3339ba63t0aOHfeutt6y11jZv3twuW7bMHjt2zDZt2tRGRERYa61944037Msvv3zROYWHh9s8efJc9nqWLl3ajhkzJqH8pI539uxZW6JECbt161YbHx9vO3ToYO+++25rrbXDhw+3U6ZMsdZae/LkSVuxYkUbERFhv/zyS1u2bFl76tQpe/bsWVuqVCm7d+/ei67zpdf9ctciqX2S2rdt27b2ww8/tAsWLLDZsmWzO3futNZa+/HHH9tXXnnFWmttdHS0rVu3rt25c6cdO3asHT16tLXW+ZufPn36ite0dOnSdvz48dZaaz/44IOEv/eIESMS/jbWWhsWFpYQ96effmoHDRqU5HaJn1/uNdO8efOE/efPn29vv/32JK/D6NGj7ahRo2xcXJwtVaqUPXz4sD169OhFr/XWrVvbv/76y27cuNG2adPGnj9/3lprbd++fe3kyZOttdYCdsaMGQn7nDhxIuHxQw89ZOfNm2ettbZ69ep20aJF1lprhw4daqtXr37N1/pSid9fRMQd+8IibY3nvrdtH37bnu/zWIqUCSy3SeQhGkA1FcmVKxePPPII48ePJ2vWrAnL//3334TamIcffjihlgXgvvvuw8/Pj2rVqnHkyJEkj3uhJubAgQNUrVqVli1bEhERwaJFi+jQoUPCdufOOdWunTp1YsaMGdx6662EhobyxBNPEB4ezqlTpxImUO7WrRsdOnTgzJkzHDhwIGG+vsDAQABiYmJ47rnn+PPPP/Hz8+PAgQMJ8ZUsWZKbbroJgIceeojx48fzzDPPJMSxePFiNm7cmLDN+fPnady48TVfzwuDbF7ueJs3b6Zs2bJUrFgxIZZPPvkEcGqH5s2bl1BzEx0dnVDTePvttyfMD1itWjX27NlDyZIlLxuHtTbJa1GkSJHL7nPhbwZOjVevXr1YtGgRDRo0oGzZsgkxrl27NqGmMzw8nG3btlG/fn169uxJTEwM9913H8HBwfzxxx9XvKb3338/AHXr1r1sk97+/fvp1KkThw4d4vz58wlxXM7lXjNJlbl79+4kjxESEsLcuXPx8/PjgQceYNasWfTr149y5cqxePFiKlasyObNm7npppv44IMPWLFiRcK8jmfPnk2Y29Pf358HHngg4bgLFizgzTffJCoqirCwMKpXr07Tpk05c+ZMwnV58MEH+f7776/5WotI6hIbF89TXy3F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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "fig = plt.figure(figsize =(10, 10))\n", - " \n", - "# Creating axes instance\n", - "ax = fig.add_axes([0.1,0.1,0.75,0.75]) \n", - "\n", - "new_labels = [int(i) for i in labels]\n", - "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", - "\n", - "\n", - "\n", - "plt.plot(new_labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", - "plt.plot(new_labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", - "\n", - "plt.xticks(range(1,21))\n", - "\n", - "plt.ylabel(\"Milliseconds\")\n", - "plt.xlabel(\"Attributes Disclosed\")\n", + "proof_request = {\n", + " \"name\": \"Name of Proof Request\",\n", + " \"version\": \"1.0\",\n", "\n", - "plt.legend()\n", - "plt.savefig(\"fixed_cred_variable_disclosure_averages.png\")" + " # Predicates allow us to specify range proofs or set membership on attributes. For example greater than 10.\n", + " # We will ignore these for now.\n", + " \"requested_predicates\": {\n", + "# f\"0_{req_pred['name']}_GE_uuid\":\n", + "# req_pred for req_pred in req_preds\n", + " },\n", + " # You can also request the entire proof request be non-revoked\n", + " \"non_revoked\": {\"to\": int(time.time())}\n", + "}" ] }, { "cell_type": "markdown", - "id": "ffced940", + "id": "5dd64eef", "metadata": {}, "source": [ - "# Fixed Attributes Disclosed Variable Credentials in Presentation" + "# Fixed Credential Variable Attributes Disclosed" ] }, { "cell_type": "code", - "execution_count": 159, - "id": "eaedbb9d", + "execution_count": 8, + "id": "2bb948a7", "metadata": {}, "outputs": [], "source": [ - "experiment = performance_service.new_experiment(\"Fixed Attributes Disclosed Variable Credentials in Presentation\")" + "experiment = performance_service.new_experiment(\"Fixed Credential Variable Attributes Disclosed\")" ] }, { "cell_type": "code", - "execution_count": 160, - "id": "11ec6b68", + "execution_count": 9, + "id": "9532839d", "metadata": {}, "outputs": [], "source": [ - "revocable_experiment = performance_service.new_experiment(\"Fixed Attributes Disclosed Variable Credentials in Presentation\")" + "revocable_experiment = performance_service.new_experiment(\"Fixed Credential Variable Attributes Disclosed - Revocable\")" ] }, { "cell_type": "markdown", - "id": "5443d82b", + "id": "7b62aa71", "metadata": {}, "source": [ - "## Five Attributes One Cred" + "## One Attribute" ] }, { "cell_type": "code", - "execution_count": 161, - "id": "5dd73818", + "execution_count": 10, + "id": "8707a3bb", "metadata": {}, "outputs": [], "source": [ "req_attrs = [\n", " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -1711,8 +293,8 @@ }, { "cell_type": "code", - "execution_count": 162, - "id": "30ad59a6", + "execution_count": 11, + "id": "5388971d", "metadata": {}, "outputs": [], "source": [ @@ -1721,15 +303,15 @@ }, { "cell_type": "code", - "execution_count": 163, - "id": "849cf49f", + "execution_count": 12, + "id": "ad46e5bd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 1.8861745626498305\n" + "Average : 0.7871727362801175\n" ] } ], @@ -1741,17 +323,13 @@ }, { "cell_type": "code", - "execution_count": 164, - "id": "bbba5837", + "execution_count": 13, + "id": "8ed81856", "metadata": {}, "outputs": [], "source": [ "req_attrs = [\n", " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -1764,15 +342,15 @@ }, { "cell_type": "code", - "execution_count": 165, - "id": "ec3fdac8", + "execution_count": 14, + "id": "c4c4baae", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 2.888445556750412\n" + "Average : 2.3920921443698173\n" ] } ], @@ -1784,25 +362,22 @@ }, { "cell_type": "markdown", - "id": "8430f021", + "id": "70d17b3b", "metadata": {}, "source": [ - "## Five Attributes Two Cred" + "## Two Attribute" ] }, { "cell_type": "code", - "execution_count": 166, - "id": "82b01938", + "execution_count": 15, + "id": "062e9aa5", "metadata": {}, "outputs": [], "source": [ "req_attrs = [\n", " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -1815,8 +390,8 @@ }, { "cell_type": "code", - "execution_count": 167, - "id": "08aacf81", + "execution_count": 16, + "id": "e7bcd265", "metadata": {}, "outputs": [], "source": [ @@ -1825,15 +400,15 @@ }, { "cell_type": "code", - "execution_count": 168, - "id": "29c7b93c", + "execution_count": 17, + "id": "d933052a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 2.3859419959000663\n" + "Average : 0.9971387444399443\n" ] } ], @@ -1845,17 +420,14 @@ }, { "cell_type": "code", - "execution_count": 169, - "id": "044aaa38", + "execution_count": 18, + "id": "20833764", "metadata": {}, "outputs": [], "source": [ "req_attrs = [\n", " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -1868,15 +440,15 @@ }, { "cell_type": "code", - "execution_count": 170, - "id": "25681622", + "execution_count": 19, + "id": "eb367016", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 3.760751254099887\n" + "Average : 2.360116968230177\n" ] } ], @@ -1888,16 +460,16 @@ }, { "cell_type": "markdown", - "id": "73c39334", + "id": "8cc62ab7", "metadata": {}, "source": [ - "## Five Attributes Three Cred" + "## Five Attribute" ] }, { "cell_type": "code", - "execution_count": 171, - "id": "3c7efa7d", + "execution_count": 20, + "id": "ee66b4f6", "metadata": {}, "outputs": [], "source": [ @@ -1905,8 +477,8 @@ " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -1919,25 +491,25 @@ }, { "cell_type": "code", - "execution_count": 172, - "id": "29f83aac", + "execution_count": 21, + "id": "b4eaf12b", "metadata": {}, "outputs": [], "source": [ - "name = \"3\"" + "name = \"5\"" ] }, { "cell_type": "code", - "execution_count": 173, - "id": "a6c2a110", + "execution_count": 22, + "id": "cacf5d05", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 2.2802539874501235\n" + "Average : 1.1925786461499228\n" ] } ], @@ -1949,8 +521,8 @@ }, { "cell_type": "code", - "execution_count": 174, - "id": "dd9d69d7", + "execution_count": 23, + "id": "5c2dbffb", "metadata": {}, "outputs": [], "source": [ @@ -1958,8 +530,8 @@ " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -1972,15 +544,15 @@ }, { "cell_type": "code", - "execution_count": 175, - "id": "3fd4c417", + "execution_count": 24, + "id": "d6a80617", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 4.044143925350181\n" + "Average : 2.5418957518700336\n" ] } ], @@ -1992,25 +564,30 @@ }, { "cell_type": "markdown", - "id": "8896b048", + "id": "039d7450", "metadata": {}, "source": [ - "## Five Attributes Four Cred" + "## Ten Attribute" ] }, { "cell_type": "code", - "execution_count": 176, - "id": "f0941727", + "execution_count": 25, + "id": "5849fe37", "metadata": {}, "outputs": [], "source": [ "req_attrs = [\n", " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -2023,25 +600,25 @@ }, { "cell_type": "code", - "execution_count": 177, - "id": "39a1a967", + "execution_count": 26, + "id": "70db478a", "metadata": {}, "outputs": [], "source": [ - "name = \"4\"" + "name = \"10\"" ] }, { "cell_type": "code", - "execution_count": 178, - "id": "3ca2e7ba", + "execution_count": 27, + "id": "0bd714df", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 2.808775784350291\n" + "Average : 1.5043526757697692\n" ] } ], @@ -2053,17 +630,22 @@ }, { "cell_type": "code", - "execution_count": 179, - "id": "a1054aaa", + "execution_count": 28, + "id": "003d5e27", "metadata": {}, "outputs": [], "source": [ "req_attrs = [\n", " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_rev_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -2076,15 +658,15 @@ }, { "cell_type": "code", - "execution_count": 180, - "id": "fcbff82d", + "execution_count": 29, + "id": "a2c28701", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 5.397983192500033\n" + "Average : 2.9880735643801017\n" ] } ], @@ -2096,25 +678,40 @@ }, { "cell_type": "markdown", - "id": "7ea2fb45", + "id": "269a4848", "metadata": {}, "source": [ - "## Five Attributes Five Cred" + "## Twenty Attribute" ] }, { "cell_type": "code", - "execution_count": 181, - "id": "b5ec64d3", + "execution_count": 30, + "id": "fadd5c89", "metadata": {}, "outputs": [], "source": [ "req_attrs = [\n", " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"11\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"12\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"13\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"14\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"15\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"16\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"17\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"18\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"19\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", + " {\"name\": \"20\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -2127,25 +724,25 @@ }, { "cell_type": "code", - "execution_count": 182, - "id": "1c5c46ef", + "execution_count": 31, + "id": "61ef7f6d", "metadata": {}, "outputs": [], "source": [ - "name = \"5\"" + "name = \"20\"" ] }, { "cell_type": "code", - "execution_count": 183, - "id": "880e29aa", + "execution_count": 32, + "id": "abb3e06a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 4.092076107749927\n" + "Average : 2.4622074139899635\n" ] } ], @@ -2157,17 +754,32 @@ }, { "cell_type": "code", - "execution_count": 184, - "id": "08dd9b64", + "execution_count": 33, + "id": "5745cdb8", "metadata": {}, "outputs": [], "source": [ "req_attrs = [\n", " {\"name\": \"1\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", - " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": hundred_schema_id, \"cred_def_id\": hundred_rev_cred_def_id}]},\n", - " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": fifty_schema_id, \"cred_def_id\": fifty_rev_cred_def_id}]},\n", - " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": five_schema_id, \"cred_def_id\": five_rev_cred_def_id}]},\n", - " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": ten_schema_id, \"cred_def_id\": ten_rev_cred_def_id}]},\n", + " {\"name\": \"2\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"3\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"4\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"5\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"6\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"7\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"8\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"9\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"10\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"11\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"12\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"13\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"14\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"15\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"16\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"17\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"18\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"19\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", + " {\"name\": \"20\", \"restrictions\": [{\"schema_id\": twenty_schema_id, \"cred_def_id\": twenty_rev_cred_def_id}]},\n", "]\n", "\n", "proof_request[\"requested_attributes\"] = {\n", @@ -2180,15 +792,15 @@ }, { "cell_type": "code", - "execution_count": 185, - "id": "4b9308ea", + "execution_count": 34, + "id": "22332d67", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Average : 6.604865062400313\n" + "Average : 2.636129469530024\n" ] } ], @@ -2198,9 +810,17 @@ "await performance_service.run_verification(revocable_experiment, test, connection_id)" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1f488f6", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", - "id": "287815b8", + "id": "411828df", "metadata": {}, "source": [ "## Plot Results" @@ -2208,7 +828,7 @@ }, { "cell_type": "markdown", - "id": "a09cd455", + "id": "56b9e963", "metadata": {}, "source": [ "### Non Revocable" @@ -2216,8 +836,8 @@ }, { "cell_type": "code", - "execution_count": 193, - "id": "614569d2", + "execution_count": 35, + "id": "7517d8d0", "metadata": {}, "outputs": [], "source": [ @@ -2230,19 +850,20 @@ " millitimings = [i * 1000 for i in result[\"timings\"]]\n", " data.append(millitimings)\n", " non_revocable_averages.append(result[\"average\"] * 1000)\n", - " labels.append(int(result[\"name\"]))\n", + " labels.append(result[\"name\"])\n", + " \n", "\n" ] }, { "cell_type": "code", - "execution_count": 194, - "id": "d0858796", + "execution_count": 36, + "id": "3990d2bc", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -2275,12 +896,12 @@ "plt.ylabel(\"Milliseconds\")\n", "plt.xlabel(\"Attributes Disclosed\")\n", "\n", - "plt.savefig(\"fixed_attributes_disclosed_variables_credentials_presented_box_plot_non_revocable.png\")" + "plt.savefig(\"results/verification/fixed_cred_variable_disclosure/box_plot_non_revocable.png\")" ] }, { "cell_type": "markdown", - "id": "0ddc8f50", + "id": "5f8b4bac", "metadata": {}, "source": [ "### Revocable" @@ -2288,8 +909,8 @@ }, { "cell_type": "code", - "execution_count": 195, - "id": "5168cc44", + "execution_count": 37, + "id": "bb630d6a", "metadata": {}, "outputs": [], "source": [ @@ -2301,19 +922,19 @@ " millitimings = [i * 1000 for i in result[\"timings\"]]\n", " data.append(millitimings)\n", " revocable_averages.append(result[\"average\"] * 1000)\n", - " labels.append(int(result[\"name\"]))\n", + " labels.append(result[\"name\"])\n", " \n" ] }, { "cell_type": "code", - "execution_count": 196, - "id": "baa999b2", + "execution_count": 38, + "id": "8f0a8b21", "metadata": {}, "outputs": [ { "data": { - "image/png": "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USRRsAAAaJP2228/nXPWr1T17Di518cdZ6PULvpCVRX36LGHH1D79u3jjiOJggUAQJt12e9/px4FUtVrk+KOssG8vk7Vk2/UpZeUavfdd487zmoULAAA2qjc3Fw9+uD9qp72kL5b8HHccTZI1bRH1Lf75vrNeefGHWUNFCwAANqwPn366PrrrlXV5BvlK2vjjrNeVnz2vla88ZQeKv+7srLSq9KkVxoAAJByp5/+M+27286qeun+uKMkrP67Gi2ffKPG336LevToEXec76FgAQDQxpmZ7rv3LtXN+q9qPnkz7jgJqXrhLh128I80YsSIuKM0iYIFAAC0xRZb6P5779byyTeprmZZ3HFaVDX7FeV8/qbuvO2WuKM0i4IFAAAkSUOGDNGo445W9dTb447SrLrl36rquVv1cPl96ty5c9xxmkXBAgAAq934pz+q4/L5Wv7u83FH+R53V9Wzf9Gvfv4zHXjggXHHaREFCwAArJafn69/PFSu6v/+VSsXfxV3nDVUvfEvdcut0ZWXj407yjpRsAAAwBr22msvXfTb36hqyk3yNLkodO0381T98v36x0PlysvLizvOOlGwAADA91x4wQXaccuOWj79n3FHkdetVNXkG3TdVWXq27dv3HESQsECAADfk52drUceuE/fzXhc3305J9YsVS+Va6+dt9cvf/mLWHOsDwoWAABo0rbbbqtbb75Jy5+5QfW1K2LJUPPp21r53r91/9/ulpnFkmFDULAAAECzTjjhBA384T6qqrgn5WPXr1iuqsk36d67Jqhbt24pH39jULAAAECLJtxxm7I+na7qOZUpHbfq+fE65sihOuKII1I6bggULAAA0KJNN91UD973Ny1/7i+qq16SkjGr3n9RHRbN0c033ZiS8ULLiTsAAABIf3369JHqavXppilaaL5Hw83z81MzXmAULAAA0KL6+nodN+pEtd/zSPWqSc3FlX1lrZY8eIGu3Wa8zjjj9JSMGRK7CAEAQIv++Kcb9P78hSrY55iUjWk5ueow+Fydd8FvNWvWrJSNGwoFCwAANOvNN9/U2CvL1GHQObKs7JSOnbfFtmq/zwj9ZMQo1dbWpnTsjUXBAgAATaqpqdHRx41U/oGnKLfLVrFkyN9zmD6rztJll18Ry/gbioIFAACadN4FF2pRXlfl73pwbBnMstRh4Fn688236KWXXoot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\n", + "image/png": "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32Mv1b8dU8nuFX6X1Cnn1qrhiWt17hmVGjVqlN/lbBB/Rbth6NChuuw3v1TJa7dpSc14rai9TfGvP/G7rE3m1jZr1fuvqv6xP2jxzHEq67lYN828we+ygI165513tPd+B2r6X25X39OvUu99vp/yf+jklfRV72N/roY9TtZRx56g0KQL1NDAfoPIPH369NFDD9yrVc/XKP7lx36X06mGV+7VjiVOv79qut+ldIiA1Q1mpskXXKD/vjtPz81+VJV7b6f6e36pFXdN04rXH1Fz40q/S+xU0+IPtfK5m/XVX3+ofu/cp1+NO0EfLXhfsx99SIceeqjf5QEdWrNmjS6/Yrr22f9AffqtMvU56VIVbLW9rzWV7Faurc68VtFn3tCuQ7+n2trMvSoLuWuPPfbQH666UisfvVJrmxr9LmeDGj+eq/gbD+kf9/1dBQXpu9iwOef8rsFzZWVlbs6cOb4cOx6P64knntCMv96kJ2c/od7f2Us25DD13HmftNhDrblhmRrqnpX7z7OyxmU656wzNe6cs7X77rv7XVrSLVq0SIN3Daho71EqKTsxLc5Hd61ZvlirYjO096CtNfvRh/0uJyXefvttnTb2LH1a79TziPPTchXqhv/8Uw3P3Kgzx5yuq6f/TiUlJX6XlHXMTNn49ysdOOd0+tgz9WTdF+o94icyM79LWqe5fqmWzJqsu/92s4455hi/y5GZveqcK9vgY9n4P6ifAautJUuW6O6779afZlZr/vz56rnboSoMVKhgm++k9H9Ytyauhv++LL33rOoXvKVjjjteE354roYPH668vLyU1ZEOPvzwQ5017jy98Z8F6nnE+Sra7rt+l7RZnFurhjceU8O/ovrZBZMUvugXKixM3dIEflizZo1+N326rrjyavU6cKx67Tkyrec9Nq9arlXPVqvo6/9q1m0367DDDvO7pKxCwEqu+vp6lQ7bRysHj1TJHiP8LkdSy3SWFfdfquCJR+mq6b/zuxxJBKy0MH/+fNXcdLP++Mc/qqDvttrqzOtSctzVH7+lpQ/+TjvuuKMumvoznXTSSerTp09Kjp2unHO67bbbFPrpZBUGjlDPA05Tj4L0ury3M/GvP9Gqp/+sHbcsVPS2m3NiQcu33npLp409S5835qnnEecrf8tt/C6pyxree0kNsRkac9opuuaq6erdu7ffJWUFAlbyzZs3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qQnnjdNVV1zud1kAMtyqVat03KgfqHj/01O6Jc6mKDlojN6+99e69LeX6ZLfXOx3OR1KWsAysx0l3SppW0lO0kzn3LVm1k/SnWpZUnGBpFOdc0uspQ/yWknHSmqQdI5z7rXEe50t6ZeJt77MOXdLsureFFtvvbWa65fo0+tOTcnx1qxpVn5+ahY1HX7U0Sk5TiotWLBAXyxZri3OvDxtury7q9d391de76119z0zCFjIWJv7+7i5r2OT6I793/khfZX/LfUedqzfpXTIeuSp18jJ+v21U3TYoYdo+PDhfpe0QcnswVojaYpz7jUz6yPpVTObLekcSU85564wswslXShpmqRjJA1OfO0v6QZJ+ycC2cWSytQS1F41swedc0uSWHuX7LDDDlq25OuUHc/MFG9K7y7RdMfmwZmjsLBQK7/8TPkPXup3KZ5a09igLXqlx1Wq6YLAkx5uu+023ffIbG1ZeXXaf07m99laJSN/qpNPq9Tbb76u7bff3u+SviFpn8zOuc8kfZa4vcLM6iQNkDRK0uGJp90i6Rm1BKxRkm51Lb9pL5pZXzPbPvHc2c65ryUpEdKOlhRNVu0A/Lfrrrsq9tRsrVixIiXHO/roo/XYY4+l5FhDhgxJyXGArpo3b57+LzRJW/zg0pQvrry5eg4aprVDR2j0Safqhediys9Pr39spqQaMxskaS9JL0naNhG+JGmRWoYQpZbw9XGbly1MtHXUvv4xxksaL0k77bSTh9UD8MtBBx2U0uONHDkypccD/PTJJ5+osbFR9fX12nff/dRrn1GygmLFl3y28RenicJdD9Gb9zylyrFn6IrLI5Kk/v37a4st/FkUta2kBywz6y3pHkk/dc4tb9vt6JxzZuZJ37BzbqakmZJUVlZGfzMAAB344IMPtFtgqIq33FrLv/hEktT3oxfV/NGLSTneF198oW22SdKFRauW6e933am/33WnevfbRoN3+Y5ee/lfyTnWJkhqwDKzArWEq9udc/cmmj83s+2dc58lhgBbF7P4RNKObV4+MNH2if43pNja/kwy6wYAIJutXLlSvfsPkH3vOA1673HNff1VlZSUJO14ZqZFCz9M2vs/99xzOnbUD9Rr+P/p69fvTNpxNkXS1sFKXBVYLanOOXdNm4celHR24vbZkh5o036WtThA0rLEUOLjkkaY2VZmtpWkEYk2AACw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\n", "text/plain": [ "
" ] @@ -2346,12 +967,12 @@ "plt.ylabel(\"Milliseconds\")\n", "plt.xlabel(\"Attributes Disclosed\")\n", "\n", - "plt.savefig(\"fixed_attributes_disclosed_variables_credentials_presented_box_plot_revocable.png\")" + "plt.savefig(\"results/verification/fixed_cred_variable_disclosure/box_plot_revocable.png\")" ] }, { "cell_type": "markdown", - "id": "268b2d3e", + "id": "e6f4c6c2", "metadata": {}, "source": [ "## Averages" @@ -2359,13 +980,13 @@ }, { "cell_type": "code", - "execution_count": 197, - "id": "13ab51f9", + "execution_count": 39, + "id": "311ea7ce", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJJCAYAAAB27EniAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABweElEQVR4nO3deZyNdf/H8dfXGMa+k30QWccYjC0JiYQIUfYlbUp3e/3udnfLXd2VbndaZC2kEhWVQpF9K5KsMxj7NsyYfb6/P65jGpphMDPXmXPez8djHnOWa675XOeMmbfvaqy1iIiIiEj2yed2ASIiIiK+RgFLREREJJspYImIiIhkMwUsERERkWymgCUiIiKSzRSwRERERLJZfrcLyAlly5a1wcHBbpchIiIiPmzdunVHrbXlMnrOJwNWcHAwa9eudbsMERER8WHGmMjMnlMXoYiIiEg2U8ASERERyWYKWCIiIiLZzCfHYGUkKSmJffv2ER8f73YpIuJDgoKCqFKlCoGBgW6XIiJexG8C1r59+yhWrBjBwcEYY9wuR0R8gLWWY8eOsW/fPmrUqOF2OSLiRfymizA+Pp4yZcooXIlItjHGUKZMGbWMi8jf+E3AAhSuRCTb6feKiGTErwKW2wICAggNDaVhw4Z0796dkydPulZLREQEDRs2zPC566+//pLXEXv99depW7cuoaGhNG/enKlTp152bUuWLKFbt26X/fUvvfTSOfdbt2590a8pWrRoho+nf8/69u3LmTNnLruuy7VkyRKWL19+ycdNmDDhit6H87311lsEBQURHR2dbecUEfFVCli5qFChQmzcuJHNmzdTunRpxo8f73ZJ2WLChAksXLiQ1atXs3HjRn788UestX87LiUlJVfqOT9gZSWcZCb9e1agQAEmTJhwzvPJycmXfe6sutyAdffddzN48OBsq2PGjBk0b96cL774IlvOl1s/DyIiblDAckmrVq2IiooCYOfOnXTp0oWmTZvStm1btm7dSnR0NNWrVyc1NRWA2NhYqlatSlJSEhs3bqRly5aEhITQq1cvTpw4AcCOHTu44YYbaNy4MWFhYezcuZOYmBg6duxIWFgYjRo1Yu7cuWk1JCcnM2DAAOrVq0efPn0ybJ35/vvvadWqFWFhYfTt25eYmJi/HfPSSy/x7rvvUrx4cQCKFy/OkCFDAGdV/ccff5ywsDBmz56d6fm+/fZb6tatS1hY2Dl/wGNjYxk+fDjh4eE0adIkrf7Jkydz66230qVLF2rXrs1jjz0GwBNPPEFcXByhoaEMGDAA+Kt16kKvRVa0bduWHTt2sGTJEtq2bUuPHj2oX78+KSkpPProozRv3pyQkBDee+89AA4cOMB1112X1gK2dOnSC76mwcHBPPvss2n1bd26lYiICCZMmMCbb75JaGgoS5cu5auvvqJFixY0adKEG264gUOHDmV43HPPPcfrr78OkOnPzPXXX8/jjz9OeHg4derUSavxfGd/lsaOHcuMGTMAJ1g/+uijacdMnjyZ0aNHAzB9+nTCw8MJDQ3lrrvuSgtTRYsW5eGHH6Zx48asWLGCF154gebNm9OwYUNGjRqVFszXrFlDSEgIoaGhPProo2mtrZf6WouIuMZa63MfTZs2tefbsmXLX3fGjLG2Xbvs/Rgz5m/f83xFihSx1lqbnJxs+/TpYxcsWGCttbZDhw5227Zt1lprV65cadu3b2+ttbZHjx520aJF1lprZ86caUeMGGGttbZRo0Z2yZIl1lprn376aTvG873Dw8PtF198Ya21Ni4uzsbGxtqkpCQbHR1trbX2yJEjtlatWjY1NdXu3r3bAnbZsmXWWmuHDRtmX3vtNWutte3atbNr1qyxR44csW3btrUxMTHWWmtfeeUV+/zzz59zTdHR0bZkyZKZXnP16tXtq6++mvb9MzpfXFycrVKlit22bZtNTU21ffv2tTfffLO11tonn3zSTps2zVpr7YkTJ2zt2rVtTEyMnTRpkq1Ro4Y9efKkjYuLs9WqVbN79uw553U+/3XP7LXI6Gsy+toePXrY//3vf3bx4sW2cOHCdteuXdZaa9977z374osvWmutjY+Pt02bNrW7du2yr7/+uh07dqy11nnPT506dcHXtHr16nbcuHHWWmvHjx+f9n4/++yzae+NtdYeP348re4PPvjAPvTQQxkel/5+Zj8z7dq1S/v6b775xnbs2DHD12Hs2LH2hRdesCkpKbZatWr24MGD9vDhw7ZWrVppx3Tp0sUuXbrUbtmyxXbr1s0mJiZaa62955577JQpU6y11gJ21qxZaV9z7NixtNsDBw608+bNs9Za26BBA7t8+XJrrbWPP/64bdCgwSW/1rnpnN8vIuI3gLU2kyziN8s0eIOzLStRUVHUq1ePTp06ERMTw/Lly+nbt2/acQkJCQD069ePWbNm0b59e2bOnMm9995LdHQ0J0+epF27dgAMGTKEvn37cvr0aaKioujVqxfgrM0DzvpfTz31FD///DP58uUjKiqKQ4cOAVC1alXatGkDwMCBAxk3bhyPPPJIWh0rV65ky5YtacckJibSqlWrS77ufv36XfB8W7dupUaNGtSuXTutlvfffx9wWnvmzZuX1hITHx/Pnj17AOjYsSMlSpQAoH79+kRGRlK1atVM67DWZvhaXHXVVZl+zdn3DJwWrBEjRrB8+XLCw8PTpuV///33/Pbbb3z22WcAREdHs337dpo3b87w4cNJSkqiZ8+ehIaG8tNPP13wNb311lsBaNq0aaZdcfv27aNfv34cOHCAxMTEiy4PkNnPTEbfMyIiIsNzzJgxgzlz5pAvXz569+7N7NmzGT16NDVr1mTlypXUrl2brVu30qZNG8aPH8+6deto3rx52mtYvnx5wBnT1rt377TzLl68mH//+9+cOXOG48eP06BBA9q2bcvp06fTXpc77riDr7/++pJfaxERN/lnwHrrLVe+7dnxPGfOnKFz586MHz+eoUOHUrJkSTZu3Pi343v06MFTTz3F8ePHWbduHR06dMiwi+5CPv74Y44cOcK6desIDAwkODg4bUr5+bOfzr9vraVTp05pXUIZKV68OEWLFmXXrl3UrFkzw2OKFClywfNldO3pa/j888+55pprznl81apVFCxYMO1+QEDARcdDXei1yMzZ9yyzazpb4zvvvEPnzp3/dtzPP//MN998w9ChQ3nooYcoVarUBV/Ts9d0oeu5//77eeihh+jRowdLlizhueeeu+A1XMzFvuemTZvYvn07nTp1AkgLdaNHj6Z///58+umn1K1bl169emGMwVrLkCFDePnll/92rqCgIAICAgAnLN97772sXbuWqlWr8txzz130/biU1zo7x5+JiFwqjcFyQeHChRk3bhxvvPEGhQsXpkaNGsyePRtw/oD8+uuvgDNepXnz5owZM4Zu3boREBBAiRIlKFWqVNoYk2nTptGuXTuKFStGlSpV+PLLLwGnFezMmTNER0dTvnx5AgMDWbx4MZGRf238vWfPHlasWAHAJ598wrXXXntOnS1btuSXX35hx44dgDMeatu2bX+7nieffJL77ruPU6dOAc5Yp4xmr2V2vrp16xIREcHOnTsBzgkfnTt35p133kkbm7Nhw4aLvr6BgYEkJSX97fELvRZXonPnzrz77rtp33Pbtm3ExsYSGRlJhQoVuPPOOxk5ciTr16/P8muaXrFixTh9+vQ511G5cmUApkyZkulxZ2X2M5NVM2bM4LnnniMiIoKIiAj279/P/v37iYyMpFevXsydO5cZM2bQv39/wGlZ/Oyzzzh8+DAAx48fz/C1PhumypYtS0xMTFqrVMmSJSlWrBirVq0CYObMmWlfcymvtYiImxSwXNKkSRNCQkKYMWMGH3/8MRMnTqRx48Y0aNDgnMHX/fr1Y/r06WndbOD8UX300UcJCQlh48aNPPPMM4Dzh3PcuHGEhITQunVrDh48yIABA1i7di2NGjVi6tSp1K1bN+0811xzDePHj6devXqcOHGCe+6555way5Urx+TJk7n99tsJCQlJ68473z333EP79u3TBiu3bduWfPn+/qOV2fmCgoJ4//33ufnmmwkLC0vrTgJ4+umnSUpKIiQkhAYNGvD0009f9LUdNWoUISEhaYPcz7rQa3ElRo4cSf369QkLC6Nhw4bcddddJCcns2TJEho3bkyTJk2YNWsWY8aMyfJrml737t2ZM2fOOYPX+/btS9OmTSlbtmymx6WX2c9MVsycOTOt6/msXr16MXPmTEqVKkW9evWIjIwkPDwccLprx44dy4033khISAidOnXiwIEDfztvyZIlufPOO2nYsCGdO3dO61IEmDhxInfeeSehoaHExsamdQVfymstIuImc7ZlwJc0a9bMnr+O0x9//EG9evVcqkhELkVMTEza7M9XXnmFAwcO8Pbbb7tcVeb0+0XEPxlj1llrm2X0nH+OwRIRr/bNN9/w8ssvk5ycTPXq1Zk8ebLbJYmIXBIFLBHxOv369TunW1xEJK/RGCwRERGRbKaAJSIiIpLNFLBEREREspkCloiIiPieDz6ATHanyA0KWLnIGMPDDz+cdv/111+/4lW4zwoICEjb6LZ79+6cPHkyW857OSIiItI25z3f9ddfz/lLaFzM66+/Tt26dQkNDaV58+YZLmKaVUuWLKFbt26X/fUvvfTSOfdbt2590a85u9zA+dK/Z3379s1ws+2ctmTJEpYvX37Jx02YMOGK3ofzvfXWWwQFBREdHZ1t5xQRPzZuHIwaBW++6VoJCli5qGDBgnzxxRccPXo02899dkuXzZs3U7p0acaPH5/t38MNEyZMYOHChaxevZqNGzfy448/ktHabSkpKblSz/kBKyvhJDPp37MCBQowYcKEc56/2NY/2eFyA9bdd9+drVvRzJgxg+bNm2e6/+Klyq2fBxHxQu++C2PGQK9e4NnH1g0KWLkof/78jBo1ijczSNQRERF06NCBkJAQOnbsmLah8dChQ3nggQdo3bo1NWvWTNtO5EJatWpFVFQUADt37qRLly40bdqUtm3bsnXrVqKjo6levTqpqamAs11L1apVSUpKYuPGjbRs2ZKQkBB69erFiRMnANixYwc33HADjRs3JiwsjJ07dxITE0PHjh0JCwujUaNG56xAn5yczIABA6hXrx59+vTJsHXm+++/p1WrVoSFhdG3b98M91l86aWXePfddylevDjg7H04ZMgQAIKDg3n88ccJCwtj9uzZmZ7v22+/pW7duoSFhZ3zBzw2Npbhw4cTHh5OkyZN0uqfPHkyt956K126dKF27do89thjADzxxBNpmz+fXSX+bOvUhV6LrGjbti07duxgyZIltG3blh49elC/fn1SUlJ49NFHad68OSEhIbz33nsAHDhwgOuuuy6tBezsyu2ZvQbBwcE8++yzafVt3bqViIgIJkyYwJtvvpm2+vtXX31FixYtaNKkCTfccAOHDh3K8LjnnnsubQPuzH5mrr/+eh5//HHCw8OpU6fO31aXP+vsz9LYsWPTtkmaMGECjz76aNoxkydPZvTo0QBMnz6d8PBwQkNDueuuu9LCVNGiRXn44Ydp3LgxK1as4IUXXkjbXWDUqFFpwXzNmjWEhIQQGhrKo48+mtbaeqmvtYh4oYkT4d57oVs3mDkTAgPdq8Va63MfTZs2tefbsmVL2u3n5m22t01Ynq0fz83b/Lfveb4iRYrY6OhoW716dXvy5En72muv2WeffdZaa223bt3s5MmTrbXWTpw40d5yyy3WWmuHDBli+/TpY1NSUuzvv/9ua9Wqlem5rbU2OTnZ9unTxy5YsMBaa22HDh3stm3brLXWrly50rZv395aa22PHj3sokWLrLXWzpw5044YMcJaa22jRo3skiVLrLXWPv3003bMmDHWWmvDw8PtF198Ya21Ni4uzsbGxtqkpCQbHR1trbX2yJEjtlatWjY1NdXu3r3bAnbZsmXWWmuHDRtmX3vtNWutte3atbNr1qyxR44csW3btrUxMTHWWmtfeeUV+/zzz59zTdHR0bZkyZKZvp7Vq1e3r776atr3z+h8cXFxtkqVKnbbtm02NTXV9u3b1958883WWmuffPJJO23aNGuttSdOnLC1a9e2MTExdtKkSbZGjRr25MmTNi4uzlarVs3u2bPnnNf5/Nc9s9cio6/J6Gt79Ohh//e//9nFixfbwoUL2127dllrrX3vvffsiy++aK21Nj4+3jZt2tTu2rXLvv7663bs2LHWWuc9P3Xq1AVf0+rVq9tx48ZZa60dP3582vv97LPPpr031lp7/PjxtLo/+OAD+9BDD2V4XPr7mf3MtGvXLu3rv/nmG9uxY8cMX4exY8faF154waakpNhq1arZgwcP2sOHD5/zs96lSxe7dOlSu2XLFtutWzebmJhorbX2nnvusVOmTLHWWgvYWbNmpX3NsWPH0m4PHDjQzps3z1prbYMGDezy5cuttdY+/vjjtkGDBpf8Wp8v/e8XEXHJlCnWGmNtly7WxsfnyrcE1tpMsogWGs1lxYsXZ/DgwYwbN45ChQqlPb5ixYq01pVBgwaltZoA9OzZk3z58lG/fn0OHTqU4XnPtqxERUVRr149OnXqRExMDMuXL6dv375pxyUkJADOQo6zZs2iffv2zJw5k3vvvZfo6GhOnjyZthHwkCFD6Nu3L6dPnyYqKiptP7qgoCAAkpKSeOqpp/j555/Jly8fUVFRafVVrVqVNm3aADBw4EDGjRvHI488klbHypUr2bJlS9oxiYmJtGrV6pJfz7OLUWZ2vq1bt1KjRg1q166dVsv7778POK098+bNS2uJiY+PT2s57NixY9r+d/Xr1ycyMpKqVatmWoe1NsPX4qqrrsr0a86+Z+C0YI0YMYLly5cTHh5OjRo10mr87bff0louo6Oj2b59O82bN2f48OEkJSXRs2dPQkND+emnny74mt56660ANG3aNNOuuH379tGvXz8OHDhAYmJiWh2ZyexnJqPvGZHJYNMZM2YwZ84c8uXLR+/evZk9ezajR4+mZs2arFy5ktq1a7N161batGnD+PHjWbduXdq+hXFxcWl7VwYEBNC7d++08y5evJh///vfnDlzhuPHj9OgQQPatm3L6dOn016XO+64g6+//vqSX2sR8TKffALDhkHHjvDFF1CwoNsV+WfAerZ7A1e//4MPPkhYWBjDhg3L0vEF0/2g2Ez2jjw7nufMmTN07tyZ8ePHM3ToUEqWLMnGjRv/dnyPHj146qmnOH78OOvWraNDhw4ZdtFdyMcff8yRI0dYt24dgYGBBAcHEx8fDzgD+tM7/761lk6dOqV1CWWkePHiFC1alF27dlGzZs0MjylSpMgFz5fRtaev4fPPP+eaa6455/FVq1ad85oHBARcdDzUhV6LzJx9zzK7prM1vvPOO3Tu3Plvx/3888988803DB06lIceeohSpUpd8DU9e00Xup7777+fhx56iB49erBkyZIrnoRxse+5adMmtm/fTqdOnQDSQt3o0aPp378/n376KXXr1qVXr14YY7DWMmTIEF5++eW/nSsoKIiAgADACcv33nsva9eupWrVqjz33HMXfT8u5bXOzvFnInKFZs+GwYPhuutg7lxI13jhJo3BckHp0qW57bbbmDhxYtpjrVu3ZubMmYDzx7pt27aXde7ChQszbtw43njjDQoXLkyNGjWYPXs24PwB+fXXXwFnvErz5s0ZM2YM3bp1IyAggBIlSlCqVKm0MSbTpk2jXbt2FCtWjCpVqvDll18CTivYmTNniI6Opnz58gQGBrJ48WIiIyPT6tizZw8rVqwA4JNPPuHaa689p86WLVvyyy+/sGPHDsAZD7Vt27a/Xc+TTz7Jfffdx6lTpwBnrFNGs9cyO1/dunWJiIhg586dAOeEj86dO/POO++khdYNGzZc9PUNDAwkKSnpb49f6LW4Ep07d+bdd99N+57btm0jNjaWyMhIKlSowJ133snIkSNZv359ll/T9IoVK8bp06fPuY7KlSsDMGXKlEyPOyuzn5msmjFjBs899xwRERFERESwf/9+9u/fT2RkJL169WLu3LnMmDGD/v37A07L4meffcbhw4cBOH78eIav9dkwVbZsWWJiYtJapUqWLEmxYsVYtWoVQNq/Obi011pEvMSXX8Idd0DLlvDVV1C4sNsVpVHAcsnDDz98zmzCd955h0mTJhESEsK0adN4++23L/vcTZo0ISQkhBkzZvDxxx8zceJEGjduTIMGDc4ZfN2vXz+mT59+zp5vU6ZM4dFHHyUkJISNGzfyzDPPAM4fznHjxhESEkLr1q05ePAgAwYMYO3atTRq1IipU6dSt27dtPNcc801jB8/nnr16nHixAnuueeec2osV64ckydP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\n", + "image/png": "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UwEnWA8bNiz1PuPHj2fIkCEATJ48mebNmxMcHMygQYNSw1Tx4sV58sknadKkCUuXLuWVV14hLCyMRo0aMXDgwNRg/ueffxIUFERwcDDDhg1L3dt6qa91jmWtzXNfISEhNrv0n/CnbfjvefbIqTPZtk0RydiGDRvSrgwdam27dt79Gjr0ojUUK1bMWmttYmKiveuuu+zcuXOttdbecMMNdsuWLdZaa5ctW2Y7dOhgrbW2e/fu9pdffrHWWjtt2jTbr18/a621jRs3tosWLbLWWvviiy/aoZ5tN2/e3H799dfWWmtPnz5tY2NjbUJCgo2OjrbWWhsVFWVr1aplk5OT7c6dOy1gf//9d2uttQ899JB9++23rbXWtmvXzv755582KirKtm3b1sbExFhrrX3jjTfsyy+/fM5zio6OtoGBgZk+52rVqtk333wzdfsZre/06dO2cuXKdsuWLTY5Odn27NnTdu3a1Vpr7bPPPmsnTZpkrbX2+PHjtnbt2jYmJsZ+/vnntkaNGvbEiRP29OnTtmrVqnb37t3nvM7nv+6ZvRYZPSajx3bv3t1+9NFHduHChbZo0aJ2x44d1lprP/74Y/vqq69aa609c+aMDQkJsTt27LDvvPOOHTFihLXW+ZmfPHnygq9ptWrV7MiRI6211o4aNSr15/3SSy+l/mystfbYsWOpdX/yySf2iSeeyPB+6a9n9jvTrl271MfPmTPHduzYMcPXYcSIEfaVV16xSUlJtmrVqvbgwYP28OHDtlatWqn36dKli128eLHdsGGD7datm42Pj7fWWjt48GA7YcIEa621gJ0+fXrqY44ePZp6uXfv3nb27NnWWmsbNmxolyxZYq219umnn7YNGza85Nc6O53z/uIBhNtMsojaNFyB5TuOsmDDIYZ1rstVxQu7XY6I5AApe1b27dtH/fr16dSpEzExMSxZsoSePXum3u/s2bMA9OrVi+nTp9OhQwemTZvGo48+SnR0NCdOnKBdu3YA9O3bl549e3Lq1Cn27dtHjx49AKc3Dzj9v5577jl+++03ChQowL59+zh06BAAVapUoU2bNgD07t2bkSNH8q9//Su1jmXLlrFhw4bU+8THx9OqVatLft69evW64Po2bdpEjRo1qF27dmotY8eOBZy9PbNnz07dE3PmzBl2794NQMeOHSlVqhQADRo0YNeuXVSpUiXT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MnDgQN57772/3RYZGckNN9xAUFAQHTt2TD2h8YMPPsg///lPWrduTc2aNVNPJ3IhrVq1Yt++fQBs376dLl26EBISQtu2bdm0aRPR0dFUq1aN5ORkwDldS5UqVUhISGD16tW0bNmSoKAgevTowfHjxwHYtm0bN954I02aNKFZs2Zs376dmJgYOnbsSLNmzWjcuPE5HegTExO5//77qV+/PnfddVeGe2fmz59Pq1ataNasGT179szwPIuvvfYao0ePpmTJkoBz7sO+ffsCUL16dZ5++mmaNWvGV199len65s2bR7169WjWrNk5H+CxsbE8/PDDNG/enKZNm6bWP378eO644w66dOlC7dq1eeqppwB45plnUk/+nNIlPmXv1IVei6xo27Yt27ZtY9GiRbRt25bu3bvToEEDkpKSGDZsGGFhYQQFBfHxxx8DcODAAa6//vrUPWApndszew2qV6/OSy+9lFrfpk2biIyMZMyYMbz33nup3d+/++47WrRoQdOmTbnxxhs5dOhQhvcbPnx46gm4M/udad++PU8//TTNmzenTp06f+sunyLld2nEiBGpp0kaM2YMw4YNS73P+PHjGTJkCACTJ0+mefPmBAcHM2jQoNQwVbx4cZ588kmaNGnC0qVLeeWVV1LPLjBw4MDUYP7nn38SFBREcHAww4YNS93beqmv9RWx1ua5r5CQECsi+c+GDRtSLw+fvc7ePWaJV7+Gz1530RqKFStmo6OjbbVq1eyJEyfs22+/bV966SVrrbXdunWz48ePt9ZaO27cOHvbbbdZa63t27evveuuu2xSUpJdv369rVWrVqbrttbaxMREe9ddd9m5c+daa6294YYb7JYtW6y11i5btsx26NDBWmtt9+7d7S+//GKttXbatGm2X79+1lprGzdubBctWmSttfbFF1+0Q4cOtdZa27x5c/v1119ba609ffq0jY2NtQkJCTY6Otpaa21UVJStVauWTU5Otjt37rSA/f3336211j700EP27bffttZa265dO/vnn3/aqKgo27ZtWxsTE2OttfaNN96wL7/88jnPKTo62gYGBmb6elarVs2++eabqdvPaH2nT5+2lStXtlu2bLHJycm2Z8+etmvXrtZaa5999lk7adIka621x48ft7Vr17YxMTH2888/tzVq1LAnTpywp0+ftlWrVrW7d+8+53U+/3XP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\n", "text/plain": [ "
" ] @@ -2385,19 +1006,41 @@ "new_labels = [int(i) for i in labels]\n", "# avg_ploy = plt.plot(labels, revocable_averages, non_revoked_averages)\n", "\n", - "plt.plot(labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", - "plt.plot(labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "\n", + "\n", + "plt.plot(new_labels, revocable_averages,'r-',label='Revocable Credential Presentation Averages')\n", + "plt.plot(new_labels, non_revocable_averages,label='Non Revocable Credential Presentation Averages')\n", + "\n", + "plt.xticks(range(1,21))\n", "\n", "plt.ylabel(\"Milliseconds\")\n", "plt.xlabel(\"Attributes Disclosed\")\n", "\n", "plt.legend()\n", - "plt.savefig(\"fixed_attributes_disclosed_variables_credentials_presented_averages.png\")" + "plt.savefig(\"results/verification/fixed_cred_variable_disclosure/averages.png\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0aa7d84", + "metadata": {}, + "outputs": [], + "source": [ + "## Save Experiments" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "75504fd3", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", - "id": "1c95eb4a", + "id": "389b7d96", "metadata": {}, "source": [ "## Terminate Controller\n", @@ -2408,7 +1051,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fa96d3b4", + "id": "a92d1763", "metadata": {}, "outputs": [], "source": [ @@ -2418,7 +1061,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a7f7db47", + "id": "a10b4624", "metadata": {}, "outputs": [], "source": [] diff --git a/requirements.txt b/requirements.txt index 37b651a..94e7c89 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,4 @@ termcolor -aries_cloudcontroller>=0.2.6 \ No newline at end of file +aries_cloudcontroller==0.2.6 +matplotlib +numpy \ No newline at end of file