diff --git a/dev-setup/ubuntu/ubuntu-2004/SetupVMTest.txt b/dev-setup/ubuntu/ubuntu-2004/SetupVMTest.txt index e09b761922..de58f0869e 100644 --- a/dev-setup/ubuntu/ubuntu-2004/SetupVMTest.txt +++ b/dev-setup/ubuntu/ubuntu-2004/SetupVMTest.txt @@ -72,7 +72,9 @@ python-dateutil==2.6.1 \ python-rocksdb==0.7.0 \ python-ursa==0.1.1 \ - python3-indy==1.13.0 \ + indy_vdr==0.4.0.dev5 \ + aries-askar==0.2.7 \ + indy-credx==0.3.1 \ pyzmq==22.3.0 --install-option=--zmq=bundled \ rlp==0.6.0 \ semver==2.13.0 \ diff --git a/plenum/test/common/test_digest_validation.py b/plenum/test/common/test_digest_validation.py index 0df35c724d..c618044a38 100644 --- a/plenum/test/common/test_digest_validation.py +++ b/plenum/test/common/test_digest_validation.py @@ -2,7 +2,8 @@ import types import pytest -from indy.did import create_and_store_my_did + +from plenum.test.wallet_helper import create_and_store_did from plenum.server.consensus.ordering_service import OrderingService @@ -28,7 +29,7 @@ def op(looper, sdk_wallet_stewards): wh, did = sdk_wallet_stewards[0] seed = randomString(32) new_did, new_verkey = looper.loop.run_until_complete( - create_and_store_my_did(wh, json.dumps({'seed': seed}))) + create_and_store_did(wh, seed)) op = {'type': '1', 'dest': new_did, 'verkey': new_verkey, diff --git a/plenum/test/conftest.py b/plenum/test/conftest.py index c21d1959b2..b2a7cc670b 100644 --- a/plenum/test/conftest.py +++ b/plenum/test/conftest.py @@ -14,7 +14,8 @@ from indy.pool import create_pool_ledger_config, open_pool_ledger, close_pool_ledger from indy.wallet import create_wallet, open_wallet, close_wallet -from indy.did import create_and_store_my_did +from plenum.test.wallet_helper import create_and_store_did, wallet_helper +from indy_vdr import set_protocol_version from ledger.genesis_txn.genesis_txn_file_util import create_genesis_txn_init_ledger from plenum.bls.bls_crypto_factory import create_default_bls_crypto_factory @@ -77,6 +78,7 @@ ROCKSDB_WRITE_BUFFER_SIZE = 256 * 1024 + def get_data_for_role(pool_txn_data, role): name_and_seeds = [] for txn in pool_txn_data['txns']: @@ -897,18 +899,21 @@ def sdk_pool_handle(looper, txnPoolNodeSet, tdirWithPoolTxns, sdk_pool_data): logger.debug("Unhandled exception: {}".format(e)) -async def _gen_wallet_handler(wallet_data): - wallet_config, wallet_credentials = wallet_data - await create_wallet(wallet_config, wallet_credentials) - wallet_handle = await open_wallet(wallet_config, wallet_credentials) - return wallet_handle +@pytest.fixture(scope="session", autouse=True) +def set_proto_ver(): + """ + Sets sdk protocol version to 2 + """ + yield set_protocol_version(2) -@pytest.fixture(scope='module') -def sdk_wallet_handle(looper, sdk_wallet_data): - wallet_handle = looper.loop.run_until_complete(_gen_wallet_handler(sdk_wallet_data)) +@pytest.fixture(scope="module") +async def sdk_wallet_handle(set_proto_ver): + """ + Creates a wallet handle and yields it + """ + wallet_handle, _, _ = await wallet_helper() yield wallet_handle - looper.loop.run_until_complete(close_wallet(wallet_handle)) @pytest.fixture(scope='module') @@ -944,16 +949,14 @@ def sdk_new_client_seed(): @pytest.fixture(scope='module') def sdk_wallet_trustee(looper, sdk_wallet_handle, sdk_trustee_seed): (trustee_did, trustee_verkey) = looper.loop.run_until_complete( - create_and_store_my_did(sdk_wallet_handle, - json.dumps({'seed': sdk_trustee_seed}))) + create_and_store_did(sdk_wallet_handle,sdk_trustee_seed)) return sdk_wallet_handle, trustee_did @pytest.fixture(scope='module') def sdk_wallet_steward(looper, sdk_wallet_handle, sdk_steward_seed): (steward_did, steward_verkey) = looper.loop.run_until_complete( - create_and_store_my_did(sdk_wallet_handle, - json.dumps({'seed': sdk_steward_seed}))) + create_and_store_did(sdk_wallet_handle,sdk_steward_seed)) return sdk_wallet_handle, steward_did @@ -972,8 +975,7 @@ def sdk_wallet_stewards(looper, sdk_wallet_handle, poolTxnStewardNames, poolTxnD for name in poolTxnStewardNames: seed = poolTxnData["seeds"][name] (steward_did, steward_verkey) = looper.loop.run_until_complete( - create_and_store_my_did(sdk_wallet_handle, - json.dumps({'seed': seed}))) + create_and_store_did(sdk_wallet_handle,seed)) stewards.append((sdk_wallet_handle, steward_did)) yield stewards @@ -982,16 +984,14 @@ def sdk_wallet_stewards(looper, sdk_wallet_handle, poolTxnStewardNames, poolTxnD @pytest.fixture(scope='module') def sdk_wallet_client(looper, sdk_wallet_handle, sdk_client_seed): (client_did, _) = looper.loop.run_until_complete( - create_and_store_my_did(sdk_wallet_handle, - json.dumps({'seed': sdk_client_seed}))) + create_and_store_did(sdk_wallet_handle, sdk_client_seed)) return sdk_wallet_handle, client_did @pytest.fixture(scope='module') def sdk_wallet_client2(looper, sdk_wallet_handle, sdk_client_seed2): (client_did, _) = looper.loop.run_until_complete( - create_and_store_my_did(sdk_wallet_handle, - json.dumps({'seed': sdk_client_seed2}))) + create_and_store_did(sdk_wallet_handle, sdk_client_seed2)) return sdk_wallet_handle, client_did diff --git a/plenum/test/pool_transactions/helper.py b/plenum/test/pool_transactions/helper.py index decf030033..cda08ce127 100644 --- a/plenum/test/pool_transactions/helper.py +++ b/plenum/test/pool_transactions/helper.py @@ -1,6 +1,6 @@ import json -from indy.did import create_and_store_my_did +from plenum.test.wallet_helper import create_and_store_did from indy.ledger import build_node_request, build_nym_request, \ build_get_txn_request from indy.pool import refresh_pool_ledger @@ -34,7 +34,7 @@ def new_client_request(role, name, looper, sdk_wallet): wh, did = sdk_wallet seed = randomString(32) (named_did, named_verkey) = looper.loop.run_until_complete( - create_and_store_my_did(wh, json.dumps({'seed': seed}))) + create_and_store_did(wh, seed)) nym_request = looper.loop.run_until_complete( build_nym_request(did, named_did, named_verkey, name, role)) @@ -263,7 +263,7 @@ async def prepare_nym_request(wallet, named_seed, alias, role, dest=None, verkey=None, skipverkey=False): wh, submitter_did = wallet (named_did, named_verkey) = \ - await create_and_store_my_did(wh, json.dumps({'seed': named_seed})) + await create_and_store_did(wh, named_seed) named_did = dest or named_did named_verkey = verkey or named_verkey named_verkey = None if skipverkey else named_verkey diff --git a/plenum/test/primary_selection/test_promotion_leads_to_correct_primary_selection.py b/plenum/test/primary_selection/test_promotion_leads_to_correct_primary_selection.py index 5d9b359e22..985af585f7 100644 --- a/plenum/test/primary_selection/test_promotion_leads_to_correct_primary_selection.py +++ b/plenum/test/primary_selection/test_promotion_leads_to_correct_primary_selection.py @@ -1,7 +1,6 @@ import json import pytest -from indy.did import create_and_store_my_did from plenum.test.node_catchup.helper import ensure_all_nodes_have_same_data from plenum.test.node_catchup.test_config_ledger import start_stopped_node diff --git a/plenum/test/signing/test_create_did_without_endorser.py b/plenum/test/signing/test_create_did_without_endorser.py index 5e4ac88ce6..e85c07dda9 100644 --- a/plenum/test/signing/test_create_did_without_endorser.py +++ b/plenum/test/signing/test_create_did_without_endorser.py @@ -2,7 +2,7 @@ import types import pytest -from indy.did import create_and_store_my_did +from plenum.test.wallet_helper import create_and_store_did from indy.ledger import build_nym_request from plenum.common.constants import NYM, STEWARD, ROLE, VERKEY @@ -45,7 +45,7 @@ def nym_txn_data(looper, sdk_wallet_client): wh, _ = sdk_wallet_client sender_did, sender_verkey = \ - looper.loop.run_until_complete(create_and_store_my_did(wh, json.dumps({'seed': seed}))) + looper.loop.run_until_complete(create_and_store_did(wh, seed)) return wh, randomString(5), sender_did, sender_verkey diff --git a/plenum/test/signing/test_signing_without_identifier.py b/plenum/test/signing/test_signing_without_identifier.py index 29bd2806a4..7a82b54a15 100644 --- a/plenum/test/signing/test_signing_without_identifier.py +++ b/plenum/test/signing/test_signing_without_identifier.py @@ -2,7 +2,7 @@ from plenum.common.constants import TXN_PAYLOAD, TXN_PAYLOAD_DATA from indy.ledger import multi_sign_request, build_nym_request, sign_and_submit_request -from indy.did import create_and_store_my_did +from plenum.test.wallet_helper import create_and_store_did def test_sigining_without_identifier(looper, txnPoolNodeSet, sdk_pool_handle, sdk_steward_seed, sdk_wallet_handle): @@ -14,10 +14,10 @@ def test_sigining_without_identifier(looper, txnPoolNodeSet, sdk_pool_handle, sd } } - steward_did_future = create_and_store_my_did(sdk_wallet_handle, json.dumps({"seed": sdk_steward_seed})) + steward_did_future = create_and_store_did(sdk_wallet_handle, sdk_steward_seed) steward_did, _ = looper.loop.run_until_complete(steward_did_future) - did_future = create_and_store_my_did(sdk_wallet_handle, json.dumps({})) + did_future = create_and_store_did(sdk_wallet_handle) did, verkey = looper.loop.run_until_complete(did_future) nym_future = build_nym_request(steward_did, did, verkey, None, None) diff --git a/plenum/test/test_get_txn_after_bls_key_rotation.py b/plenum/test/test_get_txn_after_bls_key_rotation.py index 0d8424af86..f2d7adfa06 100644 --- a/plenum/test/test_get_txn_after_bls_key_rotation.py +++ b/plenum/test/test_get_txn_after_bls_key_rotation.py @@ -1,6 +1,6 @@ from plenum.test.bls.helper import check_update_bls_key from indy import ledger -from indy.did import create_and_store_my_did +from plenum.test.wallet_helper import create_and_store_did from plenum.test.delayers import cDelay from plenum.test.stasher import delay_rules, delay_rules_without_processing @@ -43,7 +43,7 @@ def test_get_txn_after_bls_key_rotation(looper, txnPoolNodeSet, with delay_rules_without_processing(txnPoolNodeSet[1].nodeIbStasher, cDelay(delay=1200, sender_filter=txnPoolNodeSet[0].name)): with delay_rules_without_processing(txnPoolNodeSet[2].nodeIbStasher, cDelay(delay=1200, sender_filter=txnPoolNodeSet[1].name)): with delay_rules_without_processing(txnPoolNodeSet[3].nodeIbStasher, cDelay(delay=1200, sender_filter=txnPoolNodeSet[2].name)): - did_future = create_and_store_my_did(sdk_wallet_client[0], "{}") + did_future = create_and_store_did(sdk_wallet_client[0]) did, verkey = looper.loop.run_until_complete(did_future) nym_request_future = ledger.build_nym_request(sdk_wallet_trustee[1], did, verkey, None, None) nym_request = looper.loop.run_until_complete(nym_request_future) diff --git a/plenum/test/test_get_txn_state_proof.py b/plenum/test/test_get_txn_state_proof.py index c7be247377..b6494cda84 100644 --- a/plenum/test/test_get_txn_state_proof.py +++ b/plenum/test/test_get_txn_state_proof.py @@ -6,12 +6,13 @@ from plenum.common.constants import TXN_METADATA, TXN_METADATA_SEQ_NO, OP_FIELD_NAME from plenum.test.delayers import req_delay from plenum.test.stasher import delay_rules -from indy.did import create_and_store_my_did + +from plenum.test.wallet_helper import create_and_store_did from indy.ledger import build_nym_request, build_get_txn_request, sign_and_submit_request, submit_request, build_attrib_request, build_acceptance_mechanisms_request def nym_on_ledger(looper, sdk_pool_handle, sdk_wallet_client, sdk_wallet_steward, seed=None): - did_future = create_and_store_my_did(sdk_wallet_client[0], json.dumps({"seed": seed}) if seed else "{}") + did_future = create_and_store_did(sdk_wallet_client[0], seed) did, vk = looper.loop.run_until_complete(did_future) nym_req_future = build_nym_request(sdk_wallet_steward[1], did, vk, None, None) nym_req = looper.loop.run_until_complete(nym_req_future) diff --git a/plenum/test/wallet_helper.py b/plenum/test/wallet_helper.py new file mode 100644 index 0000000000..a4b2f35a08 --- /dev/null +++ b/plenum/test/wallet_helper.py @@ -0,0 +1,80 @@ +import base58 +import json + +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 + +# TODO: This code is copied from indy-test-automation, we should move it to a common place +# and use it from there in both places + + +def key_helper(seed=None): + """ + Generate a new keypair and DID + """ + alg = KeyAlg.ED25519 + if seed: + keypair = Key.from_secret_bytes(alg, seed) + else: + keypair = Key.generate(alg) + verkey_bytes = keypair.get_public_bytes() + verkey = base58.b58encode(verkey_bytes).decode("ascii") + did = base58.b58encode(verkey_bytes[:16]).decode("ascii") + return keypair, did, verkey + + +async def key_insert_helper(wallet_handle, keypair, did, verkey): + ''' + Insert a keypair into the wallet + ''' + try: + await wallet_handle.insert_key(verkey, keypair, metadata=json.dumps({})) + except AskarError as err: + if err.code == AskarErrorCode.DUPLICATE: + pass + else: + raise err + item = await wallet_handle.fetch("did", did, for_update=True) + if item: + did_info = item.value_json + if did_info.get("verkey") != verkey: + raise Exception("DID already present in wallet") + did_info["metadata"] = {} + await wallet_handle.replace("did", did, value_json=did_info, tags=item.tags) + else: + await wallet_handle.insert( + "did", + did, + value_json={ + "did": did, + "method": "sov", + "verkey": verkey, + "verkey_type": "ed25519", + "metadata": {}, + }, + tags={ + "method": "sov", + "verkey": verkey, + "verkey_type": "ed25519", + }, + ) + + +async def create_and_store_did(wallet_handle, seed=None): + ''' + Create a new DID and store it in the wallet + ''' + keypair, did, verkey = key_helper(seed=seed) + await key_insert_helper(wallet_handle, keypair, did, verkey) + return did, verkey + +async def wallet_helper(wallet_key='', wallet_key_derivation_method='kdf:argon2i:mod'): + wuri = "sqlite://:memory:" + wallet_h = await Store.provision(wuri, wallet_key_derivation_method, wallet_key, recreate=False) + session_handle = await wallet_h.session() + wallet_config = json.dumps({"id": wuri}) + wallet_credentials = json.dumps({"key": wallet_key, "key_derivation_method": wallet_key_derivation_method}) + + return session_handle, wallet_config, wallet_credentials diff --git a/scripts/generate_txns.py b/scripts/generate_txns.py index be586a6c9c..38dadde39c 100644 --- a/scripts/generate_txns.py +++ b/scripts/generate_txns.py @@ -8,6 +8,7 @@ from contextlib import ExitStack from typing import Sequence +from plenum.test.wallet_helper import create_and_store_did from indy import did, wallet from indy.ledger import sign_request @@ -33,10 +34,11 @@ async def get_wallet_and_pool(): await wallet.create_wallet(pool_name, their_wallet_name, None, None, None) their_wallet_handle = await wallet.open_wallet(their_wallet_name, None, None) - await did.create_and_store_my_did(my_wallet_handle, "{}") + await create_and_store_did(my_wallet_handle) - (their_did, their_verkey) = await did.create_and_store_my_did(their_wallet_handle, - json.dumps({"seed": seed_trustee1})) + (their_did, their_verkey) = await create_and_store_did( + their_wallet_handle, seed_trustee1 + ) await did.store_their_did(my_wallet_handle, json.dumps({'did': their_did, 'verkey': their_verkey})) diff --git a/setup.py b/setup.py index 96aa05298d..7d123337c9 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ exec(f.read(), metadata) tests_require = ['attrs==20.3.0', 'pytest==6.2.5', 'pytest-xdist==2.2.1', 'pytest-forked==1.3.0', - 'python3-indy==1.16.0.post236', 'pytest-asyncio==0.14.0'] + 'pytest-asyncio==0.14.0', 'indy_vdr==0.4.0.dev5', 'aries-askar==0.2.7', 'indy-credx==0.3.1'] class PyZMQCommand(distutils.cmd.Command):