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.")