refactor deterministic key generation

This commit is contained in:
callebtc
2022-10-01 02:52:48 +02:00
parent 5d640efc75
commit b6c4d676f6
4 changed files with 17 additions and 11 deletions

View File

@@ -239,7 +239,7 @@ class Ledger:
raise Exception("split amount is higher than the total sum.") raise Exception("split amount is higher than the total sum.")
# verify that only unique proofs and outputs were used # verify that only unique proofs and outputs were used
if not self._verify_no_duplicates(proofs, outputs): if not self._verify_no_duplicates(proofs, outputs):
raise Exception("duplicate proofs or promises.") raise Exception("empty or duplicate proofs or promises.")
# verify that outputs have the correct amount # verify that outputs have the correct amount
if not self._verify_outputs(total, amount, outputs): if not self._verify_outputs(total, amount, outputs):
raise Exception("split of promises is not as expected.") raise Exception("split of promises is not as expected.")

View File

@@ -172,9 +172,11 @@ async def pending(ctx):
wallet.load_mint() wallet.load_mint()
reserved_proofs = await get_reserved_proofs(wallet.db) reserved_proofs = await get_reserved_proofs(wallet.db)
if len(reserved_proofs): if len(reserved_proofs):
print(f"--------------------------\n")
sorted_proofs = sorted(reserved_proofs, key=itemgetter("send_id")) sorted_proofs = sorted(reserved_proofs, key=itemgetter("send_id"))
grouped_proofs = groupby(sorted_proofs, key=itemgetter("send_id")) for i, (key, value) in enumerate(
for i, (key, value) in enumerate(grouped_proofs): groupby(sorted_proofs, key=itemgetter("send_id"))
):
grouped_proofs = list(value) grouped_proofs = list(value)
token = await wallet.serialize_proofs(grouped_proofs) token = await wallet.serialize_proofs(grouped_proofs)
token_hidden_secret = await wallet.serialize_proofs( token_hidden_secret = await wallet.serialize_proofs(
@@ -184,11 +186,10 @@ async def pending(ctx):
int(grouped_proofs[0].time_reserved) int(grouped_proofs[0].time_reserved)
).strftime("%Y-%m-%d %H:%M:%S") ).strftime("%Y-%m-%d %H:%M:%S")
print( print(
f"Amount: {sum([p['amount'] for p in grouped_proofs])} sat Sent: {reserved_date} ID: {key} #{i+1}/{len(grouped_proofs)}\n" f"#{i} Amount: {sum([p['amount'] for p in grouped_proofs])} sat Time: {reserved_date} ID: {key}\n"
) )
print(f"With secret: {token}\n\nSecretless: {token_hidden_secret}\n") print(f"With secret: {token}\n\nSecretless: {token_hidden_secret}\n")
if i < len(grouped_proofs) - 1: print(f"--------------------------\n")
print(f"--------------------------\n")
wallet.status() wallet.status()

View File

@@ -103,6 +103,11 @@ class LedgerAPI:
if await secret_used(s, db=self.db): if await secret_used(s, db=self.db):
raise Exception(f"secret already used: {s}") raise Exception(f"secret already used: {s}")
@staticmethod
def generate_deterministic_secrets(secret, n):
"""`secret` is the base string that will be tweaked n times"""
return [f"{secret}_{i}" for i in range(n)]
async def mint(self, amounts, payment_hash=None): async def mint(self, amounts, payment_hash=None):
"""Mints new coins and returns a proof of promise.""" """Mints new coins and returns a proof of promise."""
secrets = [self._generate_secret() for s in range(len(amounts))] secrets = [self._generate_secret() for s in range(len(amounts))]
@@ -146,8 +151,9 @@ class LedgerAPI:
secrets = [self._generate_secret() for _ in range(len(amounts))] secrets = [self._generate_secret() for _ in range(len(amounts))]
else: else:
logger.debug(f"Creating proofs with custom secret: {snd_secret}") logger.debug(f"Creating proofs with custom secret: {snd_secret}")
# TODO: serialize them here snd_secrets = self.generate_deterministic_secrets(
snd_secrets = [f"{snd_secret}_{i}" for i in range(len(snd_outputs))] snd_secret, len(snd_outputs)
)
assert len(snd_secrets) == len( assert len(snd_secrets) == len(
snd_outputs snd_outputs
), "number of snd_secrets does not match number of ouptus." ), "number of snd_secrets does not match number of ouptus."
@@ -241,8 +247,7 @@ class Wallet(LedgerAPI):
async def redeem(self, proofs: List[Proof], snd_secret: str = None): async def redeem(self, proofs: List[Proof], snd_secret: str = None):
if snd_secret: if snd_secret:
logger.debug(f"Redeption secret: {snd_secret}") logger.debug(f"Redeption secret: {snd_secret}")
# TODO: serialize them here snd_secrets = self.generate_deterministic_secrets(snd_secret, len(proofs))
snd_secrets = [f"{snd_secret}_{i}" for i in range(len(proofs))]
assert len(proofs) == len(snd_secrets) assert len(proofs) == len(snd_secrets)
# overload proofs with custom secrets for redemption # overload proofs with custom secrets for redemption
for p, s in zip(proofs, snd_secrets): for p, s in zip(proofs, snd_secrets):

View File

@@ -135,7 +135,7 @@ async def run_test():
p.secret = "" p.secret = ""
await assert_err( await assert_err(
wallet2.redeem(w1_snd_proofs_manipulated), wallet2.redeem(w1_snd_proofs_manipulated),
"Error: duplicate proofs or promises.", "Error: empty or duplicate proofs or promises.",
) )
# redeem with wrong secret # redeem with wrong secret