commit 2c751e8f991b3c92d74fad75b000fea32f68e0a7
parent cda525146ad2c2471aae7ced4656b7a22e40806d
Author: lash <dev@holbrook.no>
Date: Thu, 6 Nov 2025 03:41:23 +0000
Correct handling of serial state
Diffstat:
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):