mirror of
https://github.com/aljazceru/nutshell.git
synced 2026-02-23 09:34:22 +01:00
[Mint] Migrate duplicate keysets to db (#511)
* wip * remove all deprecated keyset tests * fix more tests * fixups
This commit is contained in:
@@ -73,28 +73,25 @@ class UvicornServer(multiprocessing.Process):
|
||||
self.server.run()
|
||||
|
||||
|
||||
# # This fixture is used for tests that require API access to the mint
|
||||
@pytest.fixture(autouse=True, scope="session")
|
||||
def mint():
|
||||
config = uvicorn.Config(
|
||||
"cashu.mint.app:app",
|
||||
port=settings.mint_listen_port,
|
||||
host=settings.mint_listen_host,
|
||||
)
|
||||
|
||||
server = UvicornServer(config=config)
|
||||
server.start()
|
||||
time.sleep(1)
|
||||
yield server
|
||||
server.stop()
|
||||
|
||||
|
||||
# This fixture is used for all other tests
|
||||
@pytest_asyncio.fixture(scope="function")
|
||||
async def ledger():
|
||||
async def start_mint_init(ledger: Ledger):
|
||||
async def start_mint_init(ledger: Ledger) -> Ledger:
|
||||
await migrate_databases(ledger.db, migrations_mint)
|
||||
# add a new keyset (with a new ID) which will be duplicated with a keyset with an
|
||||
# old ID by mint migration m018_duplicate_deprecated_keyset_ids
|
||||
# await ledger.activate_keyset(derivation_path=settings.mint_derivation_path, version="0.15.0")
|
||||
# await migrations_mint.m018_duplicate_deprecated_keyset_ids(ledger.db)
|
||||
|
||||
ledger = Ledger(
|
||||
db=Database("mint", settings.mint_database),
|
||||
seed=settings.mint_private_key,
|
||||
derivation_path=settings.mint_derivation_path,
|
||||
backends=backends,
|
||||
crud=LedgerCrudSqlite(),
|
||||
)
|
||||
await ledger.startup_ledger()
|
||||
return ledger
|
||||
|
||||
if not settings.mint_database.startswith("postgres"):
|
||||
# clear sqlite database
|
||||
@@ -120,6 +117,22 @@ async def ledger():
|
||||
backends=backends,
|
||||
crud=LedgerCrudSqlite(),
|
||||
)
|
||||
await start_mint_init(ledger)
|
||||
ledger = await start_mint_init(ledger)
|
||||
yield ledger
|
||||
print("teardown")
|
||||
|
||||
|
||||
# # This fixture is used for tests that require API access to the mint
|
||||
@pytest.fixture(autouse=True, scope="session")
|
||||
def mint():
|
||||
config = uvicorn.Config(
|
||||
"cashu.mint.app:app",
|
||||
port=settings.mint_listen_port,
|
||||
host=settings.mint_listen_host,
|
||||
)
|
||||
|
||||
server = UvicornServer(config=config)
|
||||
server.start()
|
||||
time.sleep(1)
|
||||
yield server
|
||||
server.stop()
|
||||
|
||||
@@ -58,17 +58,6 @@ async def test_keysets(ledger: Ledger):
|
||||
assert ledger.keyset.id == "009a1f293253e41e"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_keysets_backwards_compatibility_pre_v0_15(ledger: Ledger):
|
||||
"""Backwards compatibility test for keysets pre v0.15.0
|
||||
We expect two instances of the same keyset but with different IDs.
|
||||
First one is the new hex ID, second one is the old base64 ID.
|
||||
"""
|
||||
assert len(ledger.keysets) == 2
|
||||
assert list(ledger.keysets.keys()) == ["009a1f293253e41e", "eGnEWtdJ0PIM"]
|
||||
assert ledger.keyset.id == "009a1f293253e41e"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_keyset(ledger: Ledger):
|
||||
keyset = ledger.get_keyset()
|
||||
@@ -136,55 +125,6 @@ async def test_generate_promises(ledger: Ledger):
|
||||
assert promises[0].dleq.e
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_generate_promises_deprecated_keyset_id(ledger: Ledger):
|
||||
blinded_messages_mock = [
|
||||
BlindedMessage(
|
||||
amount=8,
|
||||
B_="02634a2c2b34bec9e8a4aba4361f6bf202d7fa2365379b0840afe249a7a9d71239",
|
||||
id="eGnEWtdJ0PIM",
|
||||
)
|
||||
]
|
||||
promises = await ledger._generate_promises(blinded_messages_mock)
|
||||
assert (
|
||||
promises[0].C_
|
||||
== "031422eeffb25319e519c68de000effb294cb362ef713a7cf4832cea7b0452ba6e"
|
||||
)
|
||||
assert promises[0].amount == 8
|
||||
assert promises[0].id == "eGnEWtdJ0PIM"
|
||||
|
||||
# DLEQ proof present
|
||||
assert promises[0].dleq
|
||||
assert promises[0].dleq.s
|
||||
assert promises[0].dleq.e
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_generate_promises_keyset_backwards_compatibility_pre_v0_15(
|
||||
ledger: Ledger,
|
||||
):
|
||||
"""Backwards compatibility test for keysets pre v0.15.0
|
||||
We want to generate promises using the old keyset ID.
|
||||
We expect the promise to have the old base64 ID.
|
||||
"""
|
||||
blinded_messages_mock = [
|
||||
BlindedMessage(
|
||||
amount=8,
|
||||
B_="02634a2c2b34bec9e8a4aba4361f6bf202d7fa2365379b0840afe249a7a9d71239",
|
||||
id="eGnEWtdJ0PIM",
|
||||
)
|
||||
]
|
||||
promises = await ledger._generate_promises(
|
||||
blinded_messages_mock, keyset=ledger.keysets["eGnEWtdJ0PIM"]
|
||||
)
|
||||
assert (
|
||||
promises[0].C_
|
||||
== "031422eeffb25319e519c68de000effb294cb362ef713a7cf4832cea7b0452ba6e"
|
||||
)
|
||||
assert promises[0].amount == 8
|
||||
assert promises[0].id == "eGnEWtdJ0PIM"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_generate_change_promises(ledger: Ledger):
|
||||
# Example slightly adapted from NUT-08 because we want to ensure the dynamic change
|
||||
|
||||
@@ -90,13 +90,6 @@ async def test_api_keysets(ledger: Ledger):
|
||||
"unit": "sat",
|
||||
"active": True,
|
||||
},
|
||||
# for backwards compatibility of the new keyset ID format,
|
||||
# we also return the same keyset with the old base64 ID
|
||||
{
|
||||
"id": "eGnEWtdJ0PIM",
|
||||
"unit": "sat",
|
||||
"active": True,
|
||||
},
|
||||
]
|
||||
}
|
||||
assert response.json() == expected
|
||||
@@ -132,17 +125,17 @@ async def test_api_keyset_keys(ledger: Ledger):
|
||||
reason="settings.debug_mint_only_deprecated is set",
|
||||
)
|
||||
async def test_api_keyset_keys_old_keyset_id(ledger: Ledger):
|
||||
response = httpx.get(f"{BASE_URL}/v1/keys/eGnEWtdJ0PIM")
|
||||
response = httpx.get(f"{BASE_URL}/v1/keys/009a1f293253e41e")
|
||||
assert response.status_code == 200, f"{response.url} {response.status_code}"
|
||||
assert ledger.keyset.public_keys
|
||||
expected = {
|
||||
"keysets": [
|
||||
{
|
||||
"id": "eGnEWtdJ0PIM",
|
||||
"id": "009a1f293253e41e",
|
||||
"unit": "sat",
|
||||
"keys": {
|
||||
str(k): v.serialize().hex()
|
||||
for k, v in ledger.keysets["eGnEWtdJ0PIM"].public_keys.items() # type: ignore
|
||||
for k, v in ledger.keysets["009a1f293253e41e"].public_keys.items() # type: ignore
|
||||
},
|
||||
}
|
||||
]
|
||||
|
||||
@@ -9,7 +9,6 @@ from cashu.core.base import (
|
||||
PostRestoreResponse,
|
||||
Proof,
|
||||
)
|
||||
from cashu.core.settings import settings
|
||||
from cashu.mint.ledger import Ledger
|
||||
from cashu.wallet.crud import bump_secret_derivation
|
||||
from cashu.wallet.wallet import Wallet
|
||||
@@ -141,10 +140,7 @@ async def test_mint(ledger: Ledger, wallet: Wallet):
|
||||
assert len(result["promises"]) == 2
|
||||
assert result["promises"][0]["amount"] == 32
|
||||
assert result["promises"][1]["amount"] == 32
|
||||
if settings.debug_mint_only_deprecated:
|
||||
assert result["promises"][0]["id"] == "eGnEWtdJ0PIM"
|
||||
else:
|
||||
assert result["promises"][0]["id"] == "009a1f293253e41e"
|
||||
assert result["promises"][0]["id"] == "009a1f293253e41e"
|
||||
assert result["promises"][0]["dleq"]
|
||||
assert "e" in result["promises"][0]["dleq"]
|
||||
assert "s" in result["promises"][0]["dleq"]
|
||||
|
||||
@@ -56,31 +56,8 @@ async def wallet(ledger: Ledger):
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_init_keysets_with_duplicates(ledger: Ledger):
|
||||
async def test_init_keysets(ledger: Ledger):
|
||||
ledger.keysets = {}
|
||||
await ledger.init_keysets(duplicate_keysets=True)
|
||||
assert len(ledger.keysets) == 2
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_init_keysets_with_duplicates_via_settings(ledger: Ledger):
|
||||
ledger.keysets = {}
|
||||
settings.mint_duplicate_old_keysets = True
|
||||
await ledger.init_keysets()
|
||||
assert len(ledger.keysets) == 2
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_init_keysets_without_duplicates(ledger: Ledger):
|
||||
ledger.keysets = {}
|
||||
await ledger.init_keysets(duplicate_keysets=False)
|
||||
assert len(ledger.keysets) == 1
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_init_keysets_without_duplicates_via_settings(ledger: Ledger):
|
||||
ledger.keysets = {}
|
||||
settings.mint_duplicate_old_keysets = False
|
||||
await ledger.init_keysets()
|
||||
assert len(ledger.keysets) == 1
|
||||
|
||||
|
||||
@@ -82,10 +82,7 @@ async def test_get_keys(wallet1: Wallet):
|
||||
keyset = keysets[0]
|
||||
assert keyset.id is not None
|
||||
# assert keyset.id_deprecated == "eGnEWtdJ0PIM"
|
||||
if settings.debug_mint_only_deprecated:
|
||||
assert keyset.id == "eGnEWtdJ0PIM"
|
||||
else:
|
||||
assert keyset.id == "009a1f293253e41e"
|
||||
assert keyset.id == "009a1f293253e41e"
|
||||
assert isinstance(keyset.id, str)
|
||||
assert len(keyset.id) > 0
|
||||
|
||||
@@ -441,14 +438,10 @@ async def test_token_state(wallet1: Wallet):
|
||||
@pytest.mark.asyncio
|
||||
async def test_load_mint_keys_specific_keyset(wallet1: Wallet):
|
||||
await wallet1._load_mint_keys()
|
||||
if settings.debug_mint_only_deprecated:
|
||||
assert list(wallet1.keysets.keys()) == ["eGnEWtdJ0PIM"]
|
||||
else:
|
||||
assert list(wallet1.keysets.keys()) == ["009a1f293253e41e", "eGnEWtdJ0PIM"]
|
||||
assert list(wallet1.keysets.keys()) == ["009a1f293253e41e"]
|
||||
await wallet1._load_mint_keys(keyset_id=wallet1.keyset_id)
|
||||
await wallet1._load_mint_keys(keyset_id="009a1f293253e41e")
|
||||
# expect deprecated keyset id to be present
|
||||
await wallet1._load_mint_keys(keyset_id="eGnEWtdJ0PIM")
|
||||
await assert_err(
|
||||
wallet1._load_mint_keys(keyset_id="nonexistent"),
|
||||
KeysetNotFoundError(),
|
||||
|
||||
@@ -8,7 +8,6 @@ import pytest_asyncio
|
||||
from cashu.core.base import Proof
|
||||
from cashu.core.crypto.secp import PrivateKey
|
||||
from cashu.core.errors import CashuError
|
||||
from cashu.core.settings import settings
|
||||
from cashu.wallet.wallet import Wallet
|
||||
from cashu.wallet.wallet import Wallet as Wallet1
|
||||
from cashu.wallet.wallet import Wallet as Wallet2
|
||||
@@ -86,10 +85,6 @@ async def wallet3():
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.skipif(
|
||||
settings.debug_mint_only_deprecated,
|
||||
reason="settings.debug_mint_only_deprecated is set",
|
||||
)
|
||||
async def test_bump_secret_derivation(wallet3: Wallet):
|
||||
await wallet3._init_private_key(
|
||||
"half depart obvious quality work element tank gorilla view sugar picture"
|
||||
|
||||
Reference in New Issue
Block a user