commit 933ecbb807e82c8593f4823de35e26d2e040a054
parent 9ffbc9070f4366d046e60291c55bee1f2bd87b91
Author: lash <dev@holbrook.no>
Date: Sat, 6 Dec 2025 17:58:20 +0000
WIP implement ledger store solution
Diffstat:
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()