commit 284d8ad7a58c3ed3d8dbeea48316d18cddf1a646
parent c03fb9adb502269c138e27bb995dd574836a7f6c
Author: lash <dev@holbrook.no>
Date: Sun, 16 Nov 2025 00:37:18 +0000
Enable ledger scratch
Diffstat:
4 files changed, 112 insertions(+), 6 deletions(-)
diff --git a/dummy/svcontas/constant.py b/dummy/svcontas/constant.py
@@ -1,4 +1,4 @@
DEFAULTPARENT = b'\x00' * 64
-NS = 'http://svcontas.defalsify.org'
+NS = 'http://svcontas.defalsify.org/'
NAMESPACES = {None: NS}
NSPREFIX = '{' + NS + '}'
diff --git a/dummy/svcontas/ledger.py b/dummy/svcontas/ledger.py
@@ -1,9 +1,12 @@
+import datetime
import logging
+import lxml
+
from .crypto import DemoWallet
from .xml import nsmap
from .state import State
-from .constant import NSPREFIX
+from .constant import NSPREFIX, DEFAULTPARENT
from .entry import Entry
logg = logging.getLogger('svcontas.ledger')
@@ -64,11 +67,82 @@ class Ledger:
self.entries = {}
self.running = {}
self.tree = tree
+ if self.tree == None:
+ self.reset()
self.state = State()
self.state.poke(serial, base)
self.acl = acl
+
+
+ def reset(self, src='defalsify.org'):
+ self.tree = lxml.etree.XML('<ledger xmlns="http://svcontas.defalsify.org/"></ledger>')
+ #self.tree = lxml.etree.Element('ledger', nsmap=nsmap())
+ o = lxml.etree.SubElement(self.tree, NSPREFIX + 'retrieved', nsmap=nsmap())
+ o.text = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%dT%H:%M:%SZ')
+ #self.tree.append(o)
+ o = lxml.etree.SubElement(self.tree, NSPREFIX + 'src', nsmap=nsmap())
+ o.text = src
+
+ units = lxml.etree.SubElement(self.tree, NSPREFIX + 'units', nsmap=nsmap())
+ units.attrib['base'] = self.uidx.base
+ for v in self.uidx.syms():
+ unit = lxml.etree.SubElement(units, NSPREFIX + 'unit', nsmap=nsmap())
+ unit.attrib['sym'] = v
+ o = lxml.etree.SubElement(unit, NSPREFIX + 'precision', nsmap=nsmap())
+ o.text = str(self.uidx.get(v))
+ #unit.append(o)
+ o = lxml.etree.SubElement(unit, NSPREFIX + 'exchange', nsmap=nsmap())
+ o.text = str(self.uidx.ex(v))
+ #unit.append(o)
+ #units.append(unit)
+ #self.tree.append(units)
+
+ incoming = lxml.etree.SubElement(self.tree, NSPREFIX + 'incoming', nsmap=nsmap())
+ incoming.attrib['serial'] = '0'
+
+ real = lxml.etree.SubElement(incoming, NSPREFIX + 'real', nsmap=nsmap())
+ real.attrib['unit'] = self.uidx.base
+ o = lxml.etree.SubElement(real, NSPREFIX + 'asset', nsmap=nsmap())
+ o.text = '0'
+ #real.append(o)
+ o = lxml.etree.SubElement(real, NSPREFIX + 'liability', nsmap=nsmap())
+ o.text = '0'
+ #real.append(o)
+ #incoming.append(real)
+
+ o = lxml.etree.SubElement(incoming, NSPREFIX + 'digest', nsmap=nsmap())
+ o.attrib['algo'] = 'sha512'
+ o.text = DEFAULTPARENT.hex()
+ #incoming.append(o)
+ #self.tree.append(incoming)
+
+
+ # TODO: should append after last
+ def add_identity(self, keyid, did, typ='web'):
+ root = self.tree
+ tree = root.find('resolver', namespaces=nsmap())
+ if tree == None:
+ tree = root.find('units', namespaces=nsmap())
+ if tree == None:
+ logg.debug('exception treeĀ {}'.format(lxml.etree.tostring(self.tree)))
+ raise Exception('cannot find units node')
+ o = lxml.etree.Element(NSPREFIX + 'identity', nsmap=nsmap())
+ o.attrib['keyid'] = keyid
+ o.attrib['didtype'] = typ
+ o.text = did
+ tree.addnext(o)
+ # TODO: should append after last
+ def add_resolver(self, uri, algo='sha256', proto='https'):
+ tree = self.tree.find('units', namespaces=nsmap())
+ o = lxml.etree.Element(NSPREFIX + 'resolver', nsmap=nsmap())
+ o.attrib['algo'] = algo
+ o.attrib['proto'] = proto
+ o.text = uri
+ tree.addnext(o)
+
+
# TODO: add check against trusted pubkey list
def check_sigs(self, entry):
have = False
@@ -159,5 +233,9 @@ class Ledger:
return self
+ def to_string(self):
+ return lxml.etree.tostring(self.tree)
+
+
def __str__(self):
return "state: " + self.state.base.hex()
diff --git a/dummy/svcontas/unit.py b/dummy/svcontas/unit.py
@@ -10,8 +10,13 @@ class UnitIndex:
def __init__(self, base):
self.base = base
- self.detail = {}
- self.exchange = {}
+ self.detail = {base: 0}
+ self.exchange = {base: 1}
+
+
+ def add(self, sym, precision=2, ex=1):
+ self.detail[sym] = precision
+ self.exchange[sym] = ex
@staticmethod
@@ -32,8 +37,15 @@ class UnitIndex:
def get(self, k):
- self.detail[k]
- return k
+ return self.detail[k]
+
+
+ def ex(self, k):
+ return self.exchange[k]
+
+
+ def syms(self):
+ return list(self.detail.keys())
def to_floatstring(self, sym, v, allow_negative=True):
diff --git a/dummy/svcontas/xml.py b/dummy/svcontas/xml.py
@@ -1,4 +1,20 @@
+import os
+import datetime
+
+import lxml
+
from .constant import NAMESPACES
+script_dir = os.path.realpath(os.path.dirname(__file__))
+
+
def nsmap():
return NAMESPACES
+
+
+def parse(v):
+ return lxml.etree.fromstring(v)
+
+
+def dump(v):
+ return lxml.etree.tostring(v)