usawa

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | Submodules | LICENSE

commit 933ecbb807e82c8593f4823de35e26d2e040a054
parent 9ffbc9070f4366d046e60291c55bee1f2bd87b91
Author: lash <dev@holbrook.no>
Date:   Sat,  6 Dec 2025 17:58:20 +0000

WIP implement ledger store solution

Diffstat:
Mdummy/running.xml | 1+
Mdummy/schema.xsd | 1+
Adummy/svcontas/error.py | 2++
Mdummy/svcontas/ledger.py | 14+++++++++++++-
Adummy/svcontas/store.py | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdummy/svcontas/unit.py | 2++
Mdummy/tests/entry.py | 1-
Adummy/tests/ledger.py | 32++++++++++++++++++++++++++++++++
8 files changed, 107 insertions(+), 2 deletions(-)

diff --git a/dummy/running.xml b/dummy/running.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ledger> + <topic>fca5eb40383af54fb270283251683f97f8804f35036264bb657e72f1d53b6bcf6afc532b02d2216dff01a2df69f5515c887833b98ed15a8bc6433fb28c5b4834</topic> <retrieved>2025-11-02T13:09:55Z</retrieved> <src>playalastunas.org</src> <units base="BTC"> diff --git a/dummy/schema.xsd b/dummy/schema.xsd @@ -8,6 +8,7 @@ <xs:element name="ledger"> <xs:complexType> <xs:sequence> + <xs:element name="topic" type="xs:string" /> <xs:element name="retrieved" type="xs:dateTime" /> <xs:element name="src" type="xs:string" minOccurs="1" maxOccurs="1" /> <xs:element name="units" type="Units" minOccurs="1" maxOccurs="1" /> diff --git a/dummy/svcontas/error.py b/dummy/svcontas/error.py @@ -0,0 +1,2 @@ +class ACLError(Exception): + pass diff --git a/dummy/svcontas/ledger.py b/dummy/svcontas/ledger.py @@ -1,7 +1,10 @@ +import os import datetime import logging +import hashlib import lxml +import rencode from .crypto import DemoWallet from .xml import nsmap, XML_FORMAT_VERSION @@ -72,7 +75,7 @@ class RunningTotal: class Ledger: - def __init__(self, unitindex, tree=None, acl=None, serial=0, base=DEFAULTPARENT): + def __init__(self, unitindex, tree=None, acl=None, serial=0, base=None, topic=None): self.uidx = unitindex self.sigs = {} self.entries = {} @@ -81,8 +84,17 @@ class Ledger: if self.tree == None: self.reset() self.serial = serial + if topic == None: + topic = os.urandom(64) + if base == None: + h = hashlib.sha512() + h.update(topic) + h.update(DEFAULTPARENT) + base = h.digest() self.base = base + self.topic = topic self.acl = acl + logg.debug('ledger base {} from topic {}'.format(self.base.hex(), self.topic.hex())) def next_serial(self): diff --git a/dummy/svcontas/store.py b/dummy/svcontas/store.py @@ -0,0 +1,56 @@ +import enum +import os + +from whee import Interface + +from .ledger import Ledger +from .entry import Entry + + +PFX_LEDGER = b'\x01' +PFX_ENTRY = b'\x02' + + +def pfx_ledger_topic(topic): + r = PFX_LEDGER + topic + return r + + +def pfx_ledger(ledger): + if not isintance(ledger, Ledger): + raise ValueError('invalid ledger') + return pfx_ledger_topic(topic) + + +def pfx_entry(ledger, entry): + if not isintance(entry, Entry): + raise ValueError('invalid entry') + if not isintance(ledger, Ledger): + raise ValueError('invalid ledger') + + +class LedgerStore(Interface): + + def __init__(self, implementation, ledger): + if not isinstance(implementation, Interface): + raise ValueError('store must be whee interface instance') + if not isinstance(ledger, Ledger): + raise ValueError('invalid ledger') + self.ledger = ledger + self.__o = implementation + + + def start(self): + serial = 0 + k = pfx_ledger_topic(self.ledger.topic) + try: + b = self.__o.get(k) + serial = int.from_bytes(8, byteorder='big') + except FileNotFoundError: + v = serial.to_bytes(8, byteorder='big') + self.__o.put(k, v) + self.ledger.serial = serial + + + def put(self): + pass diff --git a/dummy/svcontas/unit.py b/dummy/svcontas/unit.py @@ -5,6 +5,8 @@ from .xml import nsmap logg = logging.getLogger('svcontas.unit') +BASE_UNIT = 'BTC' + class UnitIndex: diff --git a/dummy/tests/entry.py b/dummy/tests/entry.py @@ -71,4 +71,3 @@ class TestEntry(unittest.TestCase): if __name__ == '__main__': unittest.main() - diff --git a/dummy/tests/ledger.py b/dummy/tests/ledger.py @@ -0,0 +1,32 @@ +import logging +import datetime +import unittest +import os +import copy + +from whee.mem import MemStore + +from svcontas import Ledger, UnitIndex +from svcontas.store import LedgerStore + +logging.basicConfig(level=logging.DEBUG) +logg = logging.getLogger() + +testdir = os.path.realpath(os.path.dirname(__file__)) + + +class TestLedger(unittest.TestCase): + + def setUp(self): + self.store = MemStore() + + + def test_ledger_create(self): + uidx = UnitIndex('FOO') + o = Ledger(uidx) + store = LedgerStore(self.store, ledger=o) + store.start() + + +if __name__ == '__main__': + unittest.main()