tlnbase: add some comments - electrum - Electrum Bitcoin wallet (HTM) git clone https://git.parazyd.org/electrum (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules --- (DIR) commit fc822ab9278c73cf3c1ec864baf29978fbadb3f8 (DIR) parent f174609158ab1bd139cd40a15794f10d3cae30f0 (HTM) Author: Janus <ysangkok@gmail.com> Date: Wed, 18 Apr 2018 16:14:52 +0200 lnbase: add some comments Diffstat: M lib/lnbase.py | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+), 0 deletions(-) --- (DIR) diff --git a/lib/lnbase.py b/lib/lnbase.py t@@ -45,6 +45,19 @@ class LightningError(Exception): message_types = {} def handlesingle(x, ma): + """ + Evaluate a term of the simple language used + to specify lightning message field lengths. + + If `x` is an integer, it is returned as is, + otherwise it is treated as a variable and + looked up in `ma`. + + It the value in `ma` was no integer, it is + assumed big-endian bytes and decoded. + + Returns int + """ try: x = int(x) except ValueError: t@@ -56,11 +69,28 @@ def handlesingle(x, ma): return x def calcexp(exp, ma): + """ + Evaluate simple mathematical expression given + in `exp` with variables assigned in the dict `ma` + + Returns int + """ exp = str(exp) assert "*" not in exp return sum(handlesingle(x, ma) for x in exp.split("+")) def make_handler(k, v): + """ + Generate a message handler function (taking bytes) + for message type `k` with specification `v` + + Check lib/lightning.json, `k` could be 'init', + and `v` could be + + { type: 16, payload: { 'gflen': ..., ... }, ... } + + Returns function taking bytes + """ def handler(data): nonlocal k, v ma = {} t@@ -84,6 +114,9 @@ with open(path) as f: for k in structured: v = structured[k] + # these message types are skipped since their types collide + # (for example with pong, which also uses type=19) + # we don't need them yet if k in ["final_incorrect_cltv_expiry", "final_incorrect_htlc_amount"]: continue if len(v["payload"]) == 0: t@@ -103,11 +136,21 @@ for k in structured: assert message_types[b"\x00\x10"].__name__ == "init_handler" def decode_msg(data): + """ + Decode Lightning message by reading the first + two bytes to determine message type. + + Returns message type string and parsed message contents dict + """ typ = data[:2] k, parsed = message_types[typ](data[2:]) return k, parsed def gen_msg(msg_type, **kwargs): + """ + Encode kwargs into a Lightning message (bytes) + of the type given in the msg_type string + """ typ = structured[msg_type] data = int(typ["type"]).to_bytes(byteorder="big", length=2) lengths = {}