commit 2ca83af1252567530bc0a6c88450055e9edf39d6
parent b7f02d9064e2615043978e48e109dfef3fd0b2c9
Author: lash <dev@holbrook.no>
Date: Thu, 6 Nov 2025 00:29:45 +0000
Complete example with xml tree add of entry
Diffstat:
2 files changed, 26 insertions(+), 9 deletions(-)
diff --git a/dummy/create.py b/dummy/create.py
@@ -69,9 +69,12 @@ if __name__ == '__main__':
state_serial += 1
entry = Entry(arg.t, amount, arg.u, state_serial, arg.a, arg.date)
wallet = DemoWallet()
+ entry.sign(wallet)
ledger.add_entry(entry)
- entry.package(wallet)
- r = lxml.etree.tostring(entry.to_tree())
+ #r = lxml.etree.tostring(entry.to_tree())
+ #print(r.decode('utf-8'))
+ tree = ledger.to_tree()
+ r = lxml.etree.tostring(tree, method='c14n2', strip_text=True)
print(r.decode('utf-8'))
save_state()
diff --git a/dummy/svcontas/__init__.py b/dummy/svcontas/__init__.py
@@ -146,7 +146,7 @@ class Entry:
return rencode.dumps(d)
- def package(self, wallet):
+ def sign(self, wallet):
b = self.serialize()
h = hashlib.new('sha512')
h.update(b)
@@ -274,7 +274,14 @@ class Ledger:
o = tree.find('data/parent')
+ # TODO: add allowed pubkey and actually verify sig
+ def check_sigs(self, entry):
+ return len(entry.sigs) > 0
+
+
def add_entry(self, entry):
+ if not self.check_sigs(entry):
+ raise ValueError('entry must have at least one valid signature')
self.running[entry.unit].apply_entry(entry)
try:
entries = self.entries[entry.serial]
@@ -282,6 +289,8 @@ class Ledger:
self.entries[entry.serial] = []
entries = self.entries[entry.serial]
self.entries[entry.serial].append(entry)
+ if self.tree != None:
+ self.tree.append(entry.to_tree())
def add_signature(self, sigdata, identity):
@@ -292,20 +301,21 @@ class Ledger:
@staticmethod
def from_tree(tree, unitindex, verifier=None):
- o = tree.find('digest').text # verify that is sha512
+ part = tree.find('incoming')
+ o = part.find('digest').text # verify that is sha512
r = Ledger(o, unitindex, verifier=verifier, tree=tree)
- for sig in tree.iter('sig'):
+ for sig in part.iter('sig'):
keyid = sig.get('keyid')
digest = sig.text
r.add_signature(digest, keyid)
- o = tree.find('real')
+ o = part.find('real')
asset = int(o.find('asset').text)
liability = int(o.find('liability').text)
r.real = RunningTotal('.', unitindex, asset=asset, liability=liability)
logg.debug(r.real)
- for v in tree.iter('virt'):
+ for v in part.iter('virt'):
income = int(v.find('income').text)
expense = int(v.find('expense').text)
asset = int(v.find('asset').text)
@@ -323,6 +333,9 @@ class Ledger:
self.entries[o.serial] = o
self.running[o.unit].apply_entry(o)
+ def to_tree(self):
+ return self.tree
+
def check(self):
return self
@@ -333,8 +346,9 @@ class Ledger:
def init_ledger(tree, units):
- o = tree.find('incoming')
- return Ledger.from_tree(o, units)
+ return Ledger.from_tree(tree, units)
+ #o = tree.find('incoming')
+ #return Ledger.from_tree(o, units)
def get_units(tree):