usawa

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

commit 284d8ad7a58c3ed3d8dbeea48316d18cddf1a646
parent c03fb9adb502269c138e27bb995dd574836a7f6c
Author: lash <dev@holbrook.no>
Date:   Sun, 16 Nov 2025 00:37:18 +0000

Enable ledger scratch

Diffstat:
Mdummy/svcontas/constant.py | 2+-
Mdummy/svcontas/ledger.py | 80++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mdummy/svcontas/unit.py | 20++++++++++++++++----
Mdummy/svcontas/xml.py | 16++++++++++++++++
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)