From 3581f7ccd248b2b1d27a6674a009b4d25f96c426 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Mon, 3 Oct 2022 00:05:13 +0200 Subject: [PATCH] p2sh working --- cashu/core/settings.py | 16 ++++++++++++---- cashu/mint/ledger.py | 27 +++++++++++++-------------- cashu/mint/startup.py | 17 +++++++++-------- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/cashu/core/settings.py b/cashu/core/settings.py index 7e23474..0767d6e 100644 --- a/cashu/core/settings.py +++ b/cashu/core/settings.py @@ -1,17 +1,25 @@ +import os import sys from pathlib import Path - from environs import Env # type: ignore +from loguru import logger env = Env() -env.read_env() + +ENV_FILE = os.path.join(str(Path.home()), ".cashu", ".env") +if not os.path.isfile(ENV_FILE): + ENV_FILE = os.path.join(os.getcwd(), ".env") +if os.path.isfile(ENV_FILE): + logger.info("Using .env: " + ENV_FILE) + env.read_env(ENV_FILE) +else: + env.read_env() DEBUG = env.bool("DEBUG", default=False) if not DEBUG: sys.tracebacklimit = 0 -CASHU_DIR = env.str("CASHU_DIR", default="~/.cashu") -CASHU_DIR = CASHU_DIR.replace("~", str(Path.home())) +CASHU_DIR = env.str("CASHU_DIR", default=os.path.join(str(Path.home()), ".cashu")) assert len(CASHU_DIR), "CASHU_DIR not defined" LIGHTNING = env.bool("LIGHTNING", default=True) diff --git a/cashu/mint/ledger.py b/cashu/mint/ledger.py index 797618d..9b94261 100644 --- a/cashu/mint/ledger.py +++ b/cashu/mint/ledger.py @@ -95,6 +95,11 @@ class Ledger: return b_dhke.verify(secret_key, C, proof.secret) def _verify_script(self, idx: int, proof: Proof): + """ + Verify bitcoin script in proof.script commited to by
in proof.secret. + proof.secret format: P2SH:
: + """ + # if no script is given if ( proof.script is None or proof.script.script is None @@ -106,23 +111,17 @@ class Ledger: else: # secret indicates no script, so treat script as valid return True + # execute and verify P2SH txin_p2sh_address, valid = verify_script( proof.script.script, proof.script.signature ) if valid: # check if secret commits to script address # format: P2SH:
: - assert len(proof.secret.split(":")) == 3, "secret format wrong" + assert len(proof.secret.split(":")) == 3, "secret format wrong." assert proof.secret.split(":")[1] == str( txin_p2sh_address - ), f"secret does not contain P2SH address: {proof.secret.split(':')[1]}!={txin_p2sh_address}" - # print( - # f"Script {proof.script.script.__repr__()} {'valid' if valid else 'invalid'}." - # ) - # if valid: - # print(f"{idx}:P2SH:{txin_p2sh_address}") - # print("proof.secret", proof.secret) - # proof.secret = f"{idx}:P2SH:{txin_p2sh_address}" + ), f"secret does not contain correct P2SH address: {proof.secret.split(':')[1]}!={txin_p2sh_address}." return valid def _verify_outputs( @@ -276,16 +275,15 @@ class Ledger: """Consumes proofs and prepares new promises based on the amount split.""" total = sum([p.amount for p in proofs]) - # if not all([self._verify_secret_or_script(p) for p in proofs]): - # raise Exception("can't use secret and script at the same time.") - # Verify scripts - if not all([self._verify_script(i, p) for i, p in enumerate(proofs)]): - raise Exception("could not verify scripts.") # verify that amount is kosher self._verify_split_amount(amount) # verify overspending attempt if amount > total: raise Exception("split amount is higher than the total sum.") + + # Verify scripts + if not all([self._verify_script(i, p) for i, p in enumerate(proofs)]): + raise Exception("script verification failed.") # Verify secret criteria if not all([self._verify_secret_criteria(p) for p in proofs]): raise Exception("secrets do not match criteria.") @@ -309,5 +307,6 @@ class Ledger: prom_fst, prom_snd = await self._generate_promises( outs_fst, B_fst ), await self._generate_promises(outs_snd, B_snd) + # verify amounts in produced proofs self._verify_equation_balanced(proofs, prom_fst + prom_snd) return prom_fst, prom_snd diff --git a/cashu/mint/startup.py b/cashu/mint/startup.py index a2c4653..1207091 100644 --- a/cashu/mint/startup.py +++ b/cashu/mint/startup.py @@ -2,7 +2,7 @@ import asyncio from loguru import logger -from cashu.core.settings import CASHU_DIR +from cashu.core.settings import CASHU_DIR, LIGHTNING from cashu.lightning import WALLET from cashu.mint.migrations import m001_initial @@ -13,13 +13,14 @@ async def load_ledger(): await asyncio.wait([m001_initial(ledger.db)]) await ledger.load_used_proofs() - error_message, balance = await WALLET.status() - if error_message: - logger.warning( - f"The backend for {WALLET.__class__.__name__} isn't working properly: '{error_message}'", - RuntimeWarning, - ) + if LIGHTNING: + error_message, balance = await WALLET.status() + if error_message: + logger.warning( + f"The backend for {WALLET.__class__.__name__} isn't working properly: '{error_message}'", + RuntimeWarning, + ) + logger.info(f"Lightning balance: {balance} sat") - logger.info(f"Lightning balance: {balance} sat") logger.info(f"Data dir: {CASHU_DIR}") logger.info("Mint started.")