callebtc 6a0a370ba5 Mint: table locks (#566)
* clean up db

* db: table lock

* db.table_with_schema

* fix encrypt.py

* postgres nowait

* add timeout to lock

* melt quote state in db

* kinda working

* kinda working with postgres

* remove dispose

* getting there

* porperly clean up db for tests

* faster tests

* configure connection pooling

* try github with connection pool

* invoice dispatcher does not lock db

* fakewallet: pay_if_regtest waits

* pay fakewallet invoices

* add more

* faster

* slower

* pay_if_regtest async

* do not lock the invoice dispatcher

* test: do I get disk I/O errors if we disable the invoice_callback_dispatcher?

* fix fake so it workss without a callback dispatchert

* test on github

* readd tasks

* refactor

* increase time for lock invoice disatcher

* try avoiding a race

* remove task

* github actions: test regtest with postgres

* mint per module

* no connection pool for testing

* enable pool

* do not resend paid event

* reuse connection

* close db connections

* sessions

* enable debug

* dispose engine

* disable connection pool for tests

* enable connection pool for postgres only

* clean up shutdown routine

* remove wait for lightning fakewallet lightning invoice

* cancel invoice listener tasks on shutdown

* fakewallet conftest: decrease outgoing delay

* delay payment and set postgres only if needed

* disable fail fast for regtest

* clean up regtest.yml

* change order of tests_db.py

* row-specific mint_quote locking

* refactor

* fix lock statement

* refactor swap

* refactor

* remove psycopg2

* add connection string example to .env.example

* remove unnecessary pay

* shorter sleep in test_wallet_subscription_swap
2024-07-08 18:05:57 +02:00
2024-07-08 18:05:57 +02:00
2024-07-08 18:05:57 +02:00
2024-07-08 18:05:57 +02:00
2024-07-08 18:05:57 +02:00
2023-08-06 18:35:34 +02:00
2024-02-17 21:43:26 +01:00
2023-07-29 11:14:48 +02:00
2024-02-17 12:02:26 +01:00
2022-09-24 09:12:20 +03:00
2023-07-29 11:14:48 +02:00
2023-10-21 14:38:16 +02:00
2024-07-08 18:05:57 +02:00
2024-07-08 18:05:57 +02:00
2024-07-08 18:05:57 +02:00
2024-02-26 01:50:37 +01:00

Cashu Nutshell

Cashu Nutshell is a Chaumian Ecash wallet and mint for Bitcoin Lightning. Cashu Nutshell is the reference implementation in Python.

Release Downloads Coverage

Disclaimer: The author is NOT a cryptographer and this work has not been reviewed. This means that there is very likely a fatal flaw somewhere. Cashu is still experimental and not production-ready.

Cashu is an Ecash implementation based on David Wagner's variant of Chaumian blinding (protocol specs). Token logic based on minicash (description) which implements a Blind Diffie-Hellman Key Exchange scheme written down here.

Cashu protocol · Quick Install · Manual install · Configuration · Using Cashu · Run a mint

Feature overview of Nutshell

  • Bitcoin Lightning support
  • Standalone Cashu CLI wallet and mint server
  • Wallet and mint library to include in Python projects
  • PostgreSQL and SQLite
  • Wallet with builtin Tor
  • Use multiple mints in one wallet
  • Send and receive tokens on nostr

Advanced features

  • Deterministic wallet with seed phrase backup
  • Programmable ecash with, e.g., Pay-to-Pubkey support
  • Wallet and mint support for keyset rotations
  • DLEQ proofs for offline transactions

The Cashu protocol

Different Cashu clients and mints use the same protocol to achieve interoperability. See the documentation page for more information on other projects. If you are interested in developing on your own Cashu project, please refer to the protocol specs protocol specs.

Easy Install

The easiest way to use Cashu is to install the package it via pip:

pip install cashu

To update Cashu, use pip install cashu -U.

If you have problems running the command above on Ubuntu, run sudo apt install -y pip pkg-config and pip install wheel. On macOS, you might have to run pip install wheel and brew install pkg-config.

You can skip the entire next section about Poetry and jump right to Using Cashu.

Manual install: Poetry

These steps help you install Python via pyenv and Poetry. If you already have Poetry running on your computer, you can skip this step and jump right to Install Cashu.

Poetry: Prerequisites

# on ubuntu:
sudo apt install -y build-essential pkg-config libffi-dev libpq-dev zlib1g-dev libssl-dev python3-dev libsqlite3-dev ncurses-dev libbz2-dev libreadline-dev lzma-dev

# install python using pyenv
curl https://pyenv.run | bash

# !! follow the instructions of pyenv init to setup pyenv !!
pyenv init

# restart your shell (or source your .rc file), then install python:
pyenv install 3.10.4

# install poetry
curl -sSL https://install.python-poetry.org | python3 -
echo export PATH=\"$HOME/.local/bin:$PATH\" >> ~/.bashrc
source ~/.bashrc

Poetry: Install Cashu

# install cashu
git clone https://github.com/cashubtc/nutshell.git cashu
cd cashu
git checkout <latest_tag>
pyenv local 3.10.4
poetry install

Poetry: Update Cashu

To update Cashu to the newest version enter

git pull && poetry install

Poetry: Using the Nutshell wallet

Cashu should be now installed. To execute the following commands, activate your virtual Poetry environment via

poetry shell

If you don't activate your environment, just prepend poetry run to all following commands.

Configuration

mv .env.example .env
# edit .env file
vim .env

To use the wallet with the public test mint, you need to change the appropriate entries in the .env file.

Test instance

Warning: this instance is just for demonstration purposes and development only. The satoshis are not real.

Change the appropriate .env file settings to

MINT_URL=https://testnut.cashu.space

Using Cashu

cashu info

This command shows information about your wallet.

Check balance

cashu balance

Generate a Lightning invoice

This command will return a Lightning invoice that you need to pay to mint new ecash tokens.

cashu invoice 420

The client will check every few seconds if the invoice has been paid. If you abort this step but still pay the invoice, you can use the command cashu invoice <amount> --id <id>.

Pay a Lightning invoice

cashu pay lnbc120n1p3jfmdapp5r9jz...

Send tokens

To send tokens to another user, enter

cashu send 69

You should see the encoded token. Copy the token and send it to another user such as via email or a messenger. The token looks like this:

cashuAeyJwcm9vZnMiOiBbey...

Receive tokens

To receive tokens, another user enters:

cashu receive cashuAeyJwcm9vZnMiOiBbey...

Starting the wallet API daemon

Nutshell wallet can be used in daemon mode that can be controlled through a REST API:

cashu -d

You can find the API docs at http://localhost:4448/docs.

Running a mint

This command runs the mint on your local computer. Skip this step if you want to use the public test mint instead.

Docker

docker run -d -p 3338:3338 --name nutshell -e MINT_BACKEND_BOLT11_SAT=FakeWallet -e MINT_LISTEN_HOST=0.0.0.0 -e MINT_LISTEN_PORT=3338 -e MINT_PRIVATE_KEY=TEST_PRIVATE_KEY cashubtc/nutshell:0.15.3 poetry run mint

From this repository

Before you can run your own mint, make sure to enable a Lightning backend in MINT_BACKEND_BOLT11_SAT and set MINT_PRIVATE_KEY in your .env file.

poetry run mint

For testing, you can use Nutshell without a Lightning backend by setting MINT_BACKEND_BOLT11_SAT=FakeWallet in the .env file.

Running tests

To run the tests in this repository, first install the dev dependencies with

poetry install --with dev

Then, make sure to set up your mint's .env file to use a fake Lightning backend and disable Tor:

MINT_BACKEND_BOLT11_SAT=FakeWallet
TOR=FALSE

You can run the tests with

poetry run pytest tests
Description
No description provided
Readme 25 MiB
Languages
Python 99.7%
Shell 0.2%