usawa

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

commit 4f8d01efcde28f332edbf9c574f645f906f007ab
parent 38394a237e54d06ad18dc5ab400a6a9aa39d7a8c
Author: lash <dev@holbrook.no>
Date:   Mon,  9 Feb 2026 16:40:33 +0000

Implement XML export for wallet

Diffstat:
Mdummy/usawa/crypto.py | 27+++++++++++++++++++++------
Mdummy/usawa/ledger.py | 32+++-----------------------------
Mdummy/usawa/runnable/add.py | 5+----
Mdummy/usawa/store.py | 4+++-
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.