commit 4f8d01efcde28f332edbf9c574f645f906f007ab
parent 38394a237e54d06ad18dc5ab400a6a9aa39d7a8c
Author: lash <dev@holbrook.no>
Date: Mon, 9 Feb 2026 16:40:33 +0000
Implement XML export for wallet
Diffstat:
4 files changed, 28 insertions(+), 40 deletions(-)
diff --git a/dummy/usawa/crypto.py b/dummy/usawa/crypto.py
@@ -1,6 +1,7 @@
import logging
import rencode
+import lxml.etree
import nacl.signing
import nacl.exceptions
@@ -89,20 +90,34 @@ class Wallet:
"""
raise NotImplementedError
+ """Verify signature data against the given message.
+ :returns: True if signature is valid.
+ :rtype: boolean
+ """
def verify(self, v, sig):
- """Verify signature data against the given message.
+ raise NotImplementedError
- :returns: True if signature is valid.
- :rtype: boolean
- """
- raise NotImplementedError
+
+ """Generate an identity XML tree entry from the wallet.
+
+ The element generated is valid to be inserted as an identity sub-element in the ledger element.
+
+ :returns: XML tree.
+ :rtype: lxml.etree.Element
+ """
+ def to_tree(self):
+ pubkey = self.pubkey()
+ o = lxml.etree.Element('identity')
+ o.set('keyid', pubkey.hex())
+ did = self.did()
+ o.set('didtype', did.method())
+ return o
class DemoWallet(Wallet):
"""DemoWallet is an unsafe wallet implementation used during development. It implements the Wallet interface class.
"""
-
def __init__(self, privatekey=None, publickey=None):
super(DemoWallet, self).__init__()
self.pk = None
diff --git a/dummy/usawa/ledger.py b/dummy/usawa/ledger.py
@@ -357,13 +357,9 @@ class Ledger:
tree.append(units_tree)
# identity entry for the key signing the ledger state.
- pubkey = self.wallet.pubkey()
- o = lxml.etree.Element('identity')
- o.set('keyid', pubkey.hex())
- did = self.wallet.did()
- o.set('didtype', did.method())
+ o = self.wallet.to_tree()
tree.append(o)
-
+
# incoming state
incoming = lxml.etree.SubElement(tree, 'incoming')
@@ -500,33 +496,11 @@ class Ledger:
logg.debug('applied entry {} src {} dst {}'.format(entry.serial, entry.debit, entry.credit))
-# """
-#
-# :todo: handle canonical hex
-# """
-# def apply_signatures(self, root, identity):
-# sig = self.sigs[identity]
-# sig_hx = sig.hex()
-# #tree = self.tree.find('incoming', namespaces=nsmap())
-# tree = root.find('incoming')
-#
-# #for v in tree.iter(NSPREFIX + 'sig'):
-# for v in tree.iter('sig', namespaces=nsmap()):
-# if v.get('keyid') == identity.hex():
-# v.text = sig_hx
-# return
-# #o = lxml.etree.SubElement(tree, NSPREFIX + 'sig', nsmap=nsmap())
-# #o = lxml.etree.SubElement(tree, 'sig', nsmap=nsmap())
-# o = lxml.etree.SubElement(tree, 'sig')
-# o.set('keyid', identity.hex())
-# o.set('type', 'ed25519')
-# o.text = sig_hx
-
-
"""Add a signature on the ledger.
:todo: not an appropriate API function?
:todo: implement validity checks for signature.
+ :todo: canonlicalize identity
"""
def add_signature(self, sigdata, identity):
self.sigs[identity] = sigdata
diff --git a/dummy/usawa/runnable/add.py b/dummy/usawa/runnable/add.py
@@ -178,10 +178,7 @@ entry.add_part(ctx.part[0], debit=True)
entry.add_part(ctx.part[1])
entry.sign(wallet)
logg.debug('storing entry {}'.format(entry))
-store.add_entry(entry)
-#ledger.add_entry(entry, modify_tree=True)
-ledger.add_entry(entry)
-#ledger.truncate(modify_tree=True)
+store.add_entry(entry, update_ledger=True)
ledger.truncate()
ledger.sign()
ctx.f.write(ledger.to_string())
diff --git a/dummy/usawa/store.py b/dummy/usawa/store.py
@@ -127,10 +127,12 @@ class LedgerStore(Interface):
:raises: ValueError if the entry is not the right object type.
:raises: FileExistsError if entry is already in store.
"""
- def add_entry(self, entry):
+ def add_entry(self, entry, update_ledger=False):
k = pfx_entry(self.ledger, entry)
v = entry.wrap()
self.__o.put(k, v)
+ if update_ledger:
+ self.ledger.add_entry(entry)
"""Restore an entry from data from the store.