From 15d278721687686aba496bf08ab49c5175ba7676 Mon Sep 17 00:00:00 2001 From: Nicholas Massad Date: Mon, 17 Feb 2025 13:49:25 -0500 Subject: [PATCH] Upgrading from indy-sdk to indy_vdr *ongoing* Signed-off-by: Nicholas Massad --- indy_node/test/anon_creds/conftest.py | 15 ++- indy_node/test/anon_creds/helper.py | 34 +++--- indy_node/test/api/helper.py | 16 +-- indy_node/test/api/test_attrib_reply.py | 4 +- indy_node/test/api/test_claim_def_reply.py | 17 +-- indy_node/test/api/test_nym_reply.py | 4 +- .../test/attrib_txn/test_attrib_txn_digest.py | 5 +- .../test/attrib_txn/test_send_get_attr.py | 4 +- indy_node/test/helper.py | 21 ++-- indy_node/test/utils.py | 103 ++++++++++++++++++ 10 files changed, 160 insertions(+), 63 deletions(-) create mode 100644 indy_node/test/utils.py diff --git a/indy_node/test/anon_creds/conftest.py b/indy_node/test/anon_creds/conftest.py index ddfeb37dc..80e7dd4b4 100644 --- a/indy_node/test/anon_creds/conftest.py +++ b/indy_node/test/anon_creds/conftest.py @@ -2,11 +2,11 @@ import time import json -from indy.anoncreds import issuer_create_and_store_credential_def -from indy.ledger import build_cred_def_request +from indy_vdr import ledger from indy_common.state.domain import make_state_path_for_claim_def from indy_node.test.anon_creds.helper import get_cred_def_id, create_revoc_reg, create_revoc_reg_entry +from indy_node.test.utils import create_and_store_cred_def from plenum.common.util import randomString from indy_common.constants import REVOC_REG_ENTRY, REVOC_REG_DEF_ID, ISSUED, \ REVOKED, PREV_ACCUM, ACCUM, REVOC_REG_DEF, ISSUANCE_BY_DEFAULT, \ @@ -27,7 +27,10 @@ CRED_DEF_VERSION = '1.0' SCHEMA_VERSION = '1.0' - +# Is sdk_wallet_handle same as wallet handle? +# Is sdk wallet_steward a issuer/submitter did? +# is the schema the same with vdr upgrade as with the sdk? +# Is tag here a string? @pytest.fixture(scope="module") def claim_def(looper, sdk_wallet_handle, sdk_wallet_steward, send_schema_req): schema = json.loads(send_schema_req[0]) @@ -36,10 +39,10 @@ def claim_def(looper, sdk_wallet_handle, sdk_wallet_steward, send_schema_req): schema['seqNo'] = schema_seq_no definition_id, definition_json = \ - looper.loop.run_until_complete(issuer_create_and_store_credential_def( + looper.loop.run_until_complete(create_and_store_cred_def( sdk_wallet_handle, sdk_wallet_steward[1], json.dumps(schema), - tag, "CL", json.dumps({"support_revocation": True}))) - cred_def = looper.loop.run_until_complete(build_cred_def_request(sdk_wallet_steward[1], definition_json)) + tag, "CL", True)) + cred_def = looper.loop.run_until_complete(ledger.build_cred_def_request(sdk_wallet_steward[1], definition_json)) return json.loads(cred_def)['operation'] diff --git a/indy_node/test/anon_creds/helper.py b/indy_node/test/anon_creds/helper.py index d9f4bcfa5..fc109403b 100644 --- a/indy_node/test/anon_creds/helper.py +++ b/indy_node/test/anon_creds/helper.py @@ -1,9 +1,7 @@ -import json import time -from indy import blob_storage -from indy.anoncreds import issuer_create_and_store_revoc_reg -from indy.ledger import build_revoc_reg_def_request, build_revoc_reg_entry_request +from indy_node.test.utils import create_and_store_revoc_reg +from indy_vdr import ledger from plenum.common.types import f @@ -40,35 +38,29 @@ def get_revoc_reg_entry_id(submitter_did, def_revoc_id): entry_revoc_id = ':'.join([submitter_did, domain.MARKER_REVOC_REG_ENTRY, def_revoc_id]) return entry_revoc_id - +# create_and_store_revoc_reg does not seem to store tails in blob storage is this +# taken care of in the wallet_hanlde insert now? def create_revoc_reg(looper, wallet_handle, submitter_did, tag, cred_def_id, issuance): - tails_writer_config = json.dumps({'base_dir': 'tails', 'uri_pattern': ''}) - tails_writer = looper.loop.run_until_complete(blob_storage.open_writer( - 'default', tails_writer_config)) _, revoc_reg_def_json, revoc_reg_entry_json = \ - looper.loop.run_until_complete(issuer_create_and_store_revoc_reg( + looper.loop.run_until_complete(create_and_store_revoc_reg( wallet_handle, submitter_did, "CL_ACCUM", tag, cred_def_id, - json.dumps({"max_cred_num": 5, "issuance_type": issuance}), - tails_writer)) + max_cred_num= 5, issuance_type= issuance)) return looper.loop.run_until_complete( - build_revoc_reg_def_request(submitter_did, revoc_reg_def_json)) - + ledger.build_revoc_reg_def_request(submitter_did, revoc_reg_def_json)) +# Removed tail writer from blob storage does this need to be added using a different +# method or it's taken care of in wallet handle? def create_revoc_reg_entry(looper, wallet_handle, submitter_did, tag, cred_def_id, issuance): - tails_writer_config = json.dumps({'base_dir': 'tails', 'uri_pattern': ''}) - tails_writer = looper.loop.run_until_complete(blob_storage.open_writer( - 'default', tails_writer_config)) revoc_reg_def_id, revoc_reg_def_json, revoc_reg_entry_json = \ - looper.loop.run_until_complete(issuer_create_and_store_revoc_reg( + looper.loop.run_until_complete(create_and_store_revoc_reg( wallet_handle, submitter_did, "CL_ACCUM", tag, cred_def_id, - json.dumps({"max_cred_num": 5, "issuance_type": issuance}), - tails_writer)) + max_cred_num= 5, issuance_type= issuance)) revoc_reg_def = looper.loop.run_until_complete( - build_revoc_reg_def_request(submitter_did, revoc_reg_def_json)) + ledger.build_revoc_reg_def_request(submitter_did, revoc_reg_def_json)) entry_revoc_request = looper.loop.run_until_complete( - build_revoc_reg_entry_request( + ledger.build_revoc_reg_entry_request( submitter_did, revoc_reg_def_id, "CL_ACCUM", revoc_reg_entry_json)) return revoc_reg_def, entry_revoc_request diff --git a/indy_node/test/api/helper.py b/indy_node/test/api/helper.py index 9d23df191..1f400781d 100644 --- a/indy_node/test/api/helper.py +++ b/indy_node/test/api/helper.py @@ -2,8 +2,8 @@ import random import base58 -from indy.anoncreds import issuer_create_schema -from indy.ledger import build_schema_request +from indy_node.test.utils import create_schema +from indy_vdr import ledger from indy_common.constants import RS_ID, RS_TYPE, RS_NAME, RS_VERSION, RS_CONTENT from plenum.common.constants import TXN_TYPE @@ -203,19 +203,19 @@ def validate_rich_schema_txn(txn, txn_type): # Misc utility - +# sdk_wallet_client must be the wallet_handle def sdk_build_schema_request(looper, sdk_wallet_client, attributes=[], name="", version=""): _, identifier = sdk_wallet_client _, schema_json = looper.loop.run_until_complete( - issuer_create_schema( + create_schema(sdk_wallet_client, identifier, name, version, json.dumps(attributes) )) return looper.loop.run_until_complete( - build_schema_request(identifier, schema_json) + ledger.build_schema_request(identifier, schema_json) ) @@ -265,11 +265,11 @@ def sdk_write_schema(looper, sdk_pool_handle, sdk_wallet_client, multi_attribute _, identifier = sdk_wallet_client if multi_attribute: _, schema_json = looper.loop.run_until_complete( - issuer_create_schema(identifier, name, version, json.dumps(multi_attribute))) + create_schema(sdk_wallet_client, identifier, name, version, json.dumps(multi_attribute))) else: _, schema_json = looper.loop.run_until_complete( - issuer_create_schema(identifier, "name", "1.0", json.dumps(["first", "last"]))) - request = looper.loop.run_until_complete(build_schema_request(identifier, schema_json)) + create_schema(sdk_wallet_client, identifier, "name", "1.0", json.dumps(["first", "last"]))) + request = looper.loop.run_until_complete(ledger.build_schema_request(identifier, schema_json)) return schema_json, \ sdk_get_reply(looper, sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_client, request))[1] diff --git a/indy_node/test/api/test_attrib_reply.py b/indy_node/test/api/test_attrib_reply.py index 1af7ccb09..a8fb58761 100644 --- a/indy_node/test/api/test_attrib_reply.py +++ b/indy_node/test/api/test_attrib_reply.py @@ -1,6 +1,6 @@ import json -from indy.ledger import build_attrib_request +from indy_vdr import ledger from indy_node.test.api.helper import validate_write_reply, validate_attrib_txn from plenum.test.helper import sdk_get_reply, sdk_sign_and_submit_req from hashlib import sha256 @@ -8,7 +8,7 @@ def execute_attrib_txn(looper, sdk_pool_handle, sdk_wallet_steward, xhash, raw, enc): _, identifier = sdk_wallet_steward - request = looper.loop.run_until_complete(build_attrib_request(identifier, identifier, xhash, raw, enc)) + request = looper.loop.run_until_complete(ledger.build_attrib_request(identifier, identifier, xhash, raw, enc)) return sdk_get_reply(looper, sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_steward, request))[1] diff --git a/indy_node/test/api/test_claim_def_reply.py b/indy_node/test/api/test_claim_def_reply.py index 35153e513..e4f39fe00 100644 --- a/indy_node/test/api/test_claim_def_reply.py +++ b/indy_node/test/api/test_claim_def_reply.py @@ -1,24 +1,27 @@ import json -from indy.anoncreds import issuer_create_and_store_credential_def -from indy.ledger import build_cred_def_request, build_get_schema_request, parse_get_schema_response +from indy.ledger import parse_get_schema_response +from indy_node.test.utils import create_and_store_cred_def +from indy_vdr import ledger from indy_node.test.api.helper import validate_write_reply, validate_claim_def_txn, sdk_write_schema from plenum.test.helper import sdk_get_reply, sdk_sign_and_submit_req - +# need to look a how the reply is formatted to replace the parsing method +# build_cred_def_request and build_get_schema_requests already returns a request might not need to use the looper to create one +# Needs to be tested once plenum is updated to use indy-vdr def test_claim_def_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward): wallet_handle, identifier = sdk_wallet_steward schema_json, _ = sdk_write_schema(looper, sdk_pool_handle, sdk_wallet_steward) schema_id = json.loads(schema_json)['id'] - request = looper.loop.run_until_complete(build_get_schema_request(identifier, schema_id)) + request = looper.loop.run_until_complete(ledger.build_get_schema_request(identifier, schema_id)) reply = sdk_get_reply(looper, sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_steward, request))[1] _, schema_json = looper.loop.run_until_complete(parse_get_schema_response(json.dumps(reply))) - _, definition_json = looper.loop.run_until_complete(issuer_create_and_store_credential_def( - wallet_handle, identifier, schema_json, "some_tag", "CL", json.dumps({"support_revocation": True}))) - request = looper.loop.run_until_complete(build_cred_def_request(identifier, definition_json)) + _, definition_json = looper.loop.run_until_complete(create_and_store_cred_def( + wallet_handle, identifier, schema_json, "some_tag", "CL", True)) + request = looper.loop.run_until_complete(ledger.build_cred_def_request(identifier, definition_json)) reply = sdk_get_reply(looper, sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_steward, request))[1] validate_write_reply(reply) diff --git a/indy_node/test/api/test_nym_reply.py b/indy_node/test/api/test_nym_reply.py index b04063b97..2888146a2 100644 --- a/indy_node/test/api/test_nym_reply.py +++ b/indy_node/test/api/test_nym_reply.py @@ -1,4 +1,4 @@ -from indy.ledger import build_nym_request +from indy_vdr import ledger from indy_node.test.helper import createHalfKeyIdentifierAndAbbrevVerkey from indy_node.test.api.helper import validate_write_reply, validate_nym_txn from plenum.test.helper import sdk_get_reply, sdk_sign_and_submit_req @@ -8,7 +8,7 @@ def test_nym_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward): idr, verkey = createHalfKeyIdentifierAndAbbrevVerkey() _, identifier = sdk_wallet_steward - request = looper.loop.run_until_complete(build_nym_request(identifier, idr, verkey, None, None)) + request = ledger.build_nym_request(identifier, idr, verkey, None, None, None, None) reply = sdk_get_reply(looper, sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_steward, request))[1] validate_write_reply(reply) diff --git a/indy_node/test/attrib_txn/test_attrib_txn_digest.py b/indy_node/test/attrib_txn/test_attrib_txn_digest.py index 7332f499b..d6ec69cdb 100644 --- a/indy_node/test/attrib_txn/test_attrib_txn_digest.py +++ b/indy_node/test/attrib_txn/test_attrib_txn_digest.py @@ -1,7 +1,8 @@ import json import pytest -from indy.ledger import build_attrib_request, sign_request +from indy_vdr import ledger +from indy_node.test.utils import sign_request from indy_common.types import Request from plenum.common.request import Request as PRequest @@ -16,7 +17,7 @@ def req_json(looper, sdk_wallet_steward): wallet_handle, identifier = sdk_wallet_steward raw = json.dumps({'answer': 42}) return looper.loop.run_until_complete( - build_attrib_request(identifier, identifier, raw=raw, xhash=None, enc=None)) + ledger.build_attrib_request(identifier, identifier, raw=raw, xhash=None, enc=None)) @pytest.fixture(scope="module") diff --git a/indy_node/test/attrib_txn/test_send_get_attr.py b/indy_node/test/attrib_txn/test_send_get_attr.py index 6764189c5..4a0c56659 100644 --- a/indy_node/test/attrib_txn/test_send_get_attr.py +++ b/indy_node/test/attrib_txn/test_send_get_attr.py @@ -4,7 +4,7 @@ import time from typing import Optional -from indy.ledger import build_get_attrib_request +from indy_vdr import ledger from libnacl.secret import SecretBox from plenum.common.exceptions import RequestNackedException from plenum.test.helper import sdk_get_and_check_replies @@ -76,7 +76,7 @@ def test_send_get_attr_fails_for_nonexistent_uuid_dest( looper, sdk_pool_handle, sdk_wallet_trustee, send_raw_attrib): _, submitter_did = sdk_wallet_trustee req = looper.loop.run_until_complete( - build_get_attrib_request(submitter_did, submitter_did, attrib_name, None, None)) + ledger.build_get_attrib_request(submitter_did, submitter_did, attrib_name, None, None, None, None)) req = modify_field(req, submitter_did[:-10], 'operation', 'dest') request_couple = sdk_sign_and_send_prepared_request(looper, sdk_wallet_trustee, sdk_pool_handle, req) diff --git a/indy_node/test/helper.py b/indy_node/test/helper.py index a5c1fd2dc..8219b616d 100644 --- a/indy_node/test/helper.py +++ b/indy_node/test/helper.py @@ -3,10 +3,7 @@ import base58 from indy.did import replace_keys_start, replace_keys_apply -from indy.ledger import ( - build_attrib_request, build_get_attrib_request, - build_get_auth_rule_request, build_auth_rule_request, - build_auth_rules_request) +from indy_vdr import ledger from libnacl import randombytes from indy_common.authorize.auth_actions import ADD_PREFIX, EDIT_PREFIX @@ -105,20 +102,18 @@ def sdk_send_and_check_req_json( resp = sdk_get_and_check_replies(looper, [req]) return resp - def sdk_add_attribute_and_check(looper, sdk_pool_handle, sdk_wallet_handle, attrib, dest=None, xhash=None, enc=None): _, s_did = sdk_wallet_handle t_did = dest or s_did attrib_req = looper.loop.run_until_complete( - build_attrib_request(s_did, t_did, xhash, attrib, enc)) + ledger.build_attrib_request(s_did, t_did, xhash, attrib, enc)) return sdk_send_and_check_req_json(looper, sdk_pool_handle, sdk_wallet_handle, attrib_req) - def sdk_get_attribute_and_check(looper, sdk_pool_handle, submitter_wallet, target_did, attrib_name): _, submitter_did = submitter_wallet req = looper.loop.run_until_complete( - build_get_attrib_request(submitter_did, target_did, attrib_name, None, None)) + ledger.build_get_attrib_request(submitter_did, target_did, attrib_name, None, None, None, None)) return sdk_send_and_check_req_json(looper, sdk_pool_handle, submitter_wallet, req) @@ -136,7 +131,7 @@ def build_auth_rule_request_json( auth_action, auth_type, field, constraint, old_value=None, new_value=None ): return looper.loop.run_until_complete( - build_auth_rule_request( + ledger.build_auth_rule_request( submitter_did=submitter_did, txn_type=auth_type, action=auth_action, @@ -157,7 +152,7 @@ def build_get_auth_rule_request_json( new_value=None ): return looper.loop.run_until_complete( - build_get_auth_rule_request( + ledger.build_get_auth_rule_request( submitter_did=submitter_did, txn_type=auth_type, action=auth_action, @@ -173,7 +168,7 @@ def sdk_send_and_check_auth_rule_request( auth_action, auth_type, field, constraint, old_value=None, new_value=None, no_wait=False ): - req_json = build_auth_rule_request_json( + req_json = ledger.build_auth_rule_request_json( looper, sdk_wallet[1], auth_action=auth_action, auth_type=auth_type, @@ -196,7 +191,7 @@ def sdk_send_and_check_auth_rules_request(looper, sdk_pool_handle, generate_auth_rule(EDIT_PREFIX, NYM, ROLE, ENDORSER, TRUSTEE)] req_json = looper.loop.run_until_complete( - build_auth_rules_request(submitter_did=sdk_wallet[1], data=json.dumps(rules))) + ledger.build_auth_rules_request(submitter_did=sdk_wallet[1], data=json.dumps(rules))) return sdk_send_and_check_req_json( looper, sdk_pool_handle, sdk_wallet, req_json, no_wait=no_wait ) @@ -210,7 +205,7 @@ def sdk_send_and_check_get_auth_rule_request( old_value=None, new_value=None ): - req_json = build_get_auth_rule_request_json( + req_json = ledger.build_get_auth_rule_request_json( looper, sdk_wallet[1], auth_type=auth_type, auth_action=auth_action, diff --git a/indy_node/test/utils.py b/indy_node/test/utils.py new file mode 100644 index 000000000..70e9b415c --- /dev/null +++ b/indy_node/test/utils.py @@ -0,0 +1,103 @@ +import time +from datetime import datetime, timedelta, timezone +import os +import string +from typing import Optional +import subprocess +import base58 +import asyncio +from random import sample, shuffle, randrange +from collections import Counter +from collections.abc import Iterable +from inspect import isawaitable +import random +import itertools +import functools +import testinfra +import json +from json import JSONDecodeError +import hashlib +import indy_vdr +from indy_vdr import ledger, open_pool +from aries_askar import Store, Key, KeyAlg, AskarError, AskarErrorCode +from indy_credx import Schema, CredentialDefinition, RevocationRegistryDefinition +from indy_vdr.error import VdrError + +import logging + +logger = logging.getLogger(__name__) + + +async def create_and_store_cred_def(wallet_handle, submitter_did, schema, tag, signature_type, support_revocation): + ( + cred_def, + cred_def_private, + key_proof, + ) = await asyncio.get_event_loop().run_in_executor( + None, + lambda: CredentialDefinition.create( + submitter_did, + schema, + signature_type or "CL", + tag or "default", + support_revocation=support_revocation, + ), + ) + cred_def_id = cred_def.id + cred_def_json = cred_def.to_json() + + await wallet_handle.insert("credential_def", cred_def_id, cred_def_json, tags={"schema_id": schema["id"]}) + await wallet_handle.insert("credential_def_private", cred_def_id, cred_def_private.to_json_buffer()) + await wallet_handle.insert("credential_def_key_proof", cred_def_id, key_proof.to_json_buffer()) + return cred_def_id, cred_def_json + +async def create_and_store_revoc_reg(wallet_handle, submitter_did, revoc_def_type, tag, cred_def_id, max_cred_num=1, + issuance_type=None): + cred_def = await wallet_handle.fetch("credential_def", cred_def_id) + ( + rev_reg_def, + rev_reg_def_private, + rev_reg, + _rev_reg_delta, + ) = await asyncio.get_event_loop().run_in_executor( + None, + lambda: RevocationRegistryDefinition.create( + submitter_did, + cred_def.raw_value, + tag, + revoc_def_type, + max_cred_num, + issuance_type=issuance_type + ), + ) + + rev_reg_def_id = rev_reg_def.id + rev_reg_def_json = rev_reg_def.to_json() + rev_reg_json = rev_reg.to_json() + + await wallet_handle.insert("revocation_reg", rev_reg_def_id, rev_reg_json) + await wallet_handle.insert("revocation_reg_info", rev_reg_def_id, value_json={"curr_id": 0, "used_ids": []}) + await wallet_handle.insert("revocation_reg_def", rev_reg_def_id, rev_reg_def_json) + await wallet_handle.insert("revocation_reg_def_private", rev_reg_def_id, rev_reg_def_private.to_json_buffer()) + return rev_reg_def_id, rev_reg_def_json, rev_reg_json + +async def create_schema(wallet_handle, submitter_did, schema_name, schema_version, schema_attrs): + schema = Schema.create(submitter_did, schema_name, schema_version, schema_attrs) + schema_id = schema.id + schema_json = schema.to_json() + await wallet_handle.insert("schema", schema_id, schema_json) + return schema_id, schema_json + +async def get_did_signing_key(wallet_handle, did): + item = await wallet_handle.fetch("did", did, for_update=False) + if item: + kp = await wallet_handle.fetch_key(item.value_json.get("verkey")) + return kp.key + return None + +async def sign_request(wallet_handle, submitter_did, req): + key = await get_did_signing_key(wallet_handle, submitter_did) + if not key: + raise Exception(f"Key for DID {submitter_did} is empty") + req.set_signature(key.sign_message(req.signature_input)) + return req \ No newline at end of file