From a66437f399297b43cb677557b0a68f0af816b6d4 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 24 Mar 2020 12:12:36 +0100 Subject: [PATCH] lnonion: implement basis of varonion support --- electrum/lnmsg.py | 28 ++++- electrum/lnonion.py | 199 ++++++++++++++++++++++---------- electrum/lnpeer.py | 19 ++- electrum/lnutil.py | 8 ++ electrum/tests/test_lnrouter.py | 179 ++++++++++++++++++++++------ 5 files changed, 326 insertions(+), 107 deletions(-) diff --git a/electrum/lnmsg.py b/electrum/lnmsg.py index 6b04ae351..ae6ded83c 100644 --- a/electrum/lnmsg.py +++ b/electrum/lnmsg.py @@ -4,6 +4,8 @@ import io from typing import Callable, Tuple, Any, Dict, List, Sequence, Union, Optional from collections import OrderedDict +from .lnutil import OnionFailureCodeMetaFlag + class MalformedMsg(Exception): pass class UnknownMsgFieldType(MalformedMsg): pass @@ -254,8 +256,19 @@ def _resolve_field_count(field_count_str: str, *, vars_dict: dict, allow_any=Fal return field_count +def _parse_msgtype_intvalue_for_onion_wire(value: str) -> int: + msg_type_int = 0 + for component in value.split("|"): + try: + msg_type_int |= int(component) + except ValueError: + msg_type_int |= OnionFailureCodeMetaFlag[component] + return msg_type_int + + class LNSerializer: - def __init__(self): + + def __init__(self, *, for_onion_wire: bool = False): # TODO msg_type could be 'int' everywhere... self.msg_scheme_from_type = {} # type: Dict[bytes, List[Sequence[str]]] self.msg_type_from_name = {} # type: Dict[str, bytes] @@ -264,7 +277,10 @@ class LNSerializer: self.in_tlv_stream_get_record_type_from_name = {} # type: Dict[str, Dict[str, int]] self.in_tlv_stream_get_record_name_from_type = {} # type: Dict[str, Dict[int, str]] - path = os.path.join(os.path.dirname(__file__), "lnwire", "peer_wire.csv") + if for_onion_wire: + path = os.path.join(os.path.dirname(__file__), "lnwire", "onion_wire.csv") + else: + path = os.path.join(os.path.dirname(__file__), "lnwire", "peer_wire.csv") with open(path, newline='') as f: csvreader = csv.reader(f) for row in csvreader: @@ -272,7 +288,10 @@ class LNSerializer: if row[0] == "msgtype": # msgtype,,[,