usawa

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

commit 2c751e8f991b3c92d74fad75b000fea32f68e0a7
parent cda525146ad2c2471aae7ced4656b7a22e40806d
Author: lash <dev@holbrook.no>
Date:   Thu,  6 Nov 2025 03:41:23 +0000

Correct handling of serial state

Diffstat:
Mdummy/create.py | 28++--------------------------
Mdummy/svcontas/__init__.py | 55+++++++++++++++++++++++++++++++++++++++++++++----------
2 files changed, 47 insertions(+), 36 deletions(-)

diff --git a/dummy/create.py b/dummy/create.py @@ -5,7 +5,7 @@ import lxml.etree import confini import nacl.signing -from svcontas import Ledger, Entry, DemoWallet, get_units, init_ledger +from svcontas import Ledger, Entry, DemoWallet, State, get_units, init_ledger seed = bytes.fromhex('2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae') @@ -14,24 +14,6 @@ state_serial = 0 state_digest = b'00' * 64 -def save_state(): - f = open('.state', 'wb') - b = state_serial.to_bytes(8, byteorder='big') - f.write(b) - f.close() - return state_serial - - -def load_state(): - try: - f = open('.state', 'rb') - except FileNotFoundError: - return save_state() - b = f.read(8) - f.close() - state_serial = int.from_bytes(b, byteorder='big') - return state_serial - if __name__ == '__main__': now = datetime.datetime.now() @@ -46,7 +28,6 @@ if __name__ == '__main__': argp.add_argument('--xml-file', dest='xml_file', type=str, default='running.xml', help='xml file to manipulate') arg = argp.parse_args() - load_state() tree = lxml.etree.parse(arg.xml_file) root = tree.getroot() units = get_units(root) @@ -54,15 +35,10 @@ if __name__ == '__main__': amount = units.from_floatstring(arg.u, arg.amount, allow_negative=False) - state_serial += 1 - entry = Entry(arg.t, amount, arg.u, state_serial, arg.a, arg.date, parent=ledger.base) + entry = Entry(arg.t, amount, arg.u, ledger.state.serial + 1, arg.a, arg.date, parent=ledger.state.base) wallet = DemoWallet(privatekey=seed) entry.sign(wallet) ledger.add_entry(entry) - #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 @@ -14,6 +14,40 @@ logg = logging.getLogger() DEFAULTPARENT = b'\x00' * 64 +class State: + + def __init__(self): + self.serial = 0 + self.base = DEFAULTPARENT + + + def poke(self, serial, base): + if serial > self.serial: + logg.debug('new latest state {} {}'.format(serial, base.hex())) + self.serial = serial + self.base = base + return self.serial + + + def save(self): + f = open('.state', 'wb') + b = self.serial.to_bytes(8, byteorder='big') + f.write(b) + f.close() + return self.serial + + + def load(self): + try: + f = open('.state', 'rb') + except FileNotFoundError: + return self.save() + b = f.read(8) + f.close() + self.serial = int.from_bytes(b, byteorder='big') + return self.serial + + class DemoWallet: def __init__(self, privatekey=None, publickey=None): @@ -300,20 +334,18 @@ class RunningTotal: class Ledger: - def __init__(self, base, unitindex, tree=None): + def __init__(self, serial, base, unitindex, tree=None): self.uidx = unitindex - self.base = bytes.fromhex(base) + #self.base = bytes.fromhex(base) self.sigs = {} self.entries = {} self.running = {} self.tree = tree + self.state = State() + self.state.poke(serial, base) - def add_entry_from_tree(self, tree): - o = tree.find('data/parent') - - - # TODO: add allowed pubkey and actually verify sig + # TODO: add check against trusted pubkey list def check_sigs(self, entry): for k in entry.sigs.keys(): b = bytes.fromhex(k) @@ -334,7 +366,8 @@ class Ledger: except KeyError: self.entries[entry.serial] = [] entries = self.entries[entry.serial] - self.base = entry.sum() + #self.state.base = entry.sum() + self.state.poke(entry.serial, entry.sum()) self.entries[entry.serial].append(entry) self.running[entry.unit].apply_entry(entry) if self.tree != None and modify_tree: @@ -349,8 +382,10 @@ class Ledger: @staticmethod def from_tree(tree, unitindex): part = tree.find('incoming') + serial = int(part.get('serial')) o = part.find('digest').text # verify that is sha512 - r = Ledger(o, unitindex, tree=tree) + r = Ledger(serial, bytes.fromhex(o), unitindex, tree=tree) + for sig in part.iter('sig'): keyid = sig.get('keyid') digest = sig.text @@ -391,7 +426,7 @@ class Ledger: def __str__(self): - return "state: " + self.base.hex() + return "state: " + self.state.base.hex() def init_ledger(tree, units):