Double-entry accounting system with cryptographic audit trail and optional cryptographic transaction verification.
Project description
BookChain
BookChain is an accounting library that provides a cryptographic audit trail of every identity, ledger, account, transaction, and entry to ensure data integrity. It also uses the tapescript package to ensure account security and reject invalid transactions if controls are configured on the involved accounts. Included are tools for establishing correspondent credit relations as well as accomplishing basic bookkeeping tasks.
Status
All initially planned features have been implemented and tested.
Open issues can be found here.
The async implementation has an upstream issue from the sqloquent dependency that can be tracked here. Once that is fixed, the dependency will be updated, and this notice will be removed.
Overview
This library provides an accounting system using sqloquent for persistence, packify for deterministic encoding, tapescript for authorization, and the classic rules of double-entry bookkeeping. All entries and transactions have deterministic content IDs determined by hashing the relevant contents, and the inclusion of tapescript allows for Bitcoin-style locking and unlocking scripts to encode access controls at the account level.
Class organization
Currency
represents a currency/unit of account for a Ledger
. It includes the
number of subunits to track and optionally the base for conversion to decimal
(defaults to 10), FX symbol, prefix symbol, and/or postfix symbol to be used with
the format
method (e.g. USD.format(1200)
could result in "12.00 USD",
"$12.00", or "12.00$", respectively). It also includes to_decimal
method for
formatting int amounts into Decimal
s, and get_units
method for getting a
tuple of whole units and remainders.
Identity
represents a legal person or other entity that can sign contracts
or engage in transactions. It includes the name, details, and optionally public
key bytes and private key seed bytes.
Ledger
represents a general ledger for a given Identity
using a specific
Currency
. It includes a name, the Identity
id, and the Currency
id.
Account
represents an account for a given Ledger
. It includes a name, a type
(one of the AccountType
enum options), the Ledger
id, an optional locking
script for access control, and optional details.
AccountType
is an enum representing the valid account types. The options are
DEBIT_BALANCE
, ASSET
, CONTRA_ASSET
, CREDIT_BALANCE
, LIABILITY
,
EQUITY
, CONTRA_LIABILITY
, and CONTRA_EQUITY
.
Entry
represents an entry in the general ledger for a given Account
. It
includes a type (one of the EntryType
enum options), an amount, a nonce, the
Account
id, and optional details.
EntryType
is an enum representing the valid entry types. The options are
CREDIT and DEBIT.
Transaction
represents a transaction made of Entry
s. It includes the Entry
ids, Ledger
ids, a timestamp, details, and the auth script(s). Each
Transaction
must include entries that balance the number of credits and debits
applied to each ledger affected by the transaction. Use Transaction.prepare
to
prepare a transaction -- it will raise validation errors if the transaction is
not valid -- then call .save()
on the result to persist it to the database.
Transactions in the database can be validated by using .validate()
, which will
return True
if it is valid and False
if it is not (it will also raise errors
in some situations that require more information about the validation failure).
Correspondence
represents a correspondent credit relationship between several
Identity
s.
Identity
has manyLedger
s and is withinCorrespondence
sLedger
belongs toIdentity
andCurrency
, has manyAccount
s, and is withinTransaction
sAccount
belongs toLedger
and has manyEntry
sEntry
belongs toAccount
and is withinTransaction
sTransaction
containsLedger
s andEntry
sCorrespondence
containsIdentity
s
Cryptographic audit trail
Models inherit from sqloquent.HashedModel
, so all data is hashed into the ID,
guaranteeing a unique, deterministic ID for each unique model.
Whenever something is deleted, it will be encoded and inserted into the
deleted_models
table to maintain an audit trail.
Accounts may be created with locking scripts, which will require associated
Entries to provide valid auth scripts. These scripts are executed using
tapescript. If some tapescript runtime values are required for validation,
e.g. cache or plugins, they can be saved in Transaction.details and passed to
Transaction.validate
and Account.validate_script
.
Installation and Setup
Install with pip install bookchain
. If you want to use the async version,
instead install with pip install bookchain[asyncql]
.
Once installed, use the following to setup your project as appropriate:
import bookchain
bookchain.publish_migrations(folder_for_migration_files)
bookchain.automigrate(folder_for_migration_files, db_file_path)
bookchain.set_connection_info(db_file_path)
To use the async version:
import bookchain
import bookchain.asyncql
bookchain.publish_migrations(folder_for_migration_files)
bookchain.automigrate(folder_for_migration_files, db_file_path)
bookchain.asyncql.set_connection_info(db_file_path)
More Resources
Documentation generated by autodox can be found here. Docs for the async version can be found here.
Check out the Pycelium discord server. If you experience a problem, please discuss it on the Discord server. All suggestions for improvement are also welcome, and the best place for that is also Discord. If you experience a bug and do not use Discord, open an issue on Github.
Tests
There are a total of 12 tests (6 e2e tests and 6 tests for miscellaneous
tools/features). To run them, clone the repo, set up a virtual environment
(e.g. python -m venv venv && source venv/bin/activate
), install the
dependencies with pip install -r requirements.txt
, and then run the following:
find tests -name test_*.py -print -exec python {} \;
. On Windows, the 7 test
files will have to be individually run with the following:
python tests/test_advanced_e2e.py
python tests/test_async_advanced_e2e.py
python tests/test_async_basic_e2e.py
python tests/test_async_correspondences_e2e.py
python tests/test_basic_e2e.py
python tests/test_correspondences_e2e.py
python tests/test_misc.py
Personal, Non-commercial Use License
Copyright (c) 2024 Jonathan Voss (k98kurz)
Permission to use, copy, modify, and/or distribute this software for any personal, non-commercial purpose is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. For other uses, contact the software author.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file bookchain-0.1.2.tar.gz
.
File metadata
- Download URL: bookchain-0.1.2.tar.gz
- Upload date:
- Size: 33.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.11.0rc1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 65f50ad1c843402490db8d8cfae46934c0af45d1445080a39c1a069fd814a391 |
|
MD5 | 8fe3f11005f27091c6e7d29916d753fb |
|
BLAKE2b-256 | 22064c443e19802ed398932082786821c7cb831310e84e7e6d4fdd5f735179e9 |
File details
Details for the file bookchain-0.1.2-py3-none-any.whl
.
File metadata
- Download URL: bookchain-0.1.2-py3-none-any.whl
- Upload date:
- Size: 30.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.11.0rc1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 22f7f24bef6255f00761e74ad332d27ac73a2bc332ae6f46e5f7b23146dc6638 |
|
MD5 | 5e240b5dd101007c90a29315ee3cc49f |
|
BLAKE2b-256 | eb4d5b196e28af5d8cd73e4efea427557fa30e3efad6a05cf35822fc8e7a54b9 |