-
Notifications
You must be signed in to change notification settings - Fork 0
/
extension.py
72 lines (62 loc) · 3 KB
/
extension.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# Copyright (c) 2020 Jarret Dyrbye
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php
from bolt.util import h2b
from bolt.bigsize import BigSize
from bolt.tlv import Tlv
from bolt.namespace import Namespace
from bolt.hop_payload import HopPayload, TlvHopPayload
from onionstudio.pixel import Pixel, PIXEL_BYTE_SIZE
# According to BOLT 1, extension TLVs must be greater than 2^16. Odd types
# allow the TLV to be ignored if it isn't understood.
PIXEL_TLV_TYPE = 65555
class Extension:
def _encode_pixels(pixels):
encoded = b''.join([p.to_bin() for p in pixels])
return Tlv(PIXEL_TLV_TYPE, encoded).encode()
def encode_non_final(amt_to_forward, outgoing_cltv_value, short_channel_id,
pixels):
unextended = TlvHopPayload.encode_non_final(amt_to_forward,
outgoing_cltv_value,
short_channel_id)
old_len, content, err = BigSize.pop(unextended)
assert err is None
pixel_content = Extension._encode_pixels(pixels)
new_content = content + pixel_content
return BigSize.encode(len(new_content)) + new_content
def encode_final(amt_to_forward, outgoing_cltv_value, payment_secret,
total_msat, pixels):
unextended = TlvHopPayload.encode_final(amt_to_forward,
outgoing_cltv_value,
pament_secret=payment_secret,
totol_msat= total_msat)
old_len, content, err = BigSize.pop(unextended)
assert err is None
pixel_content = Extension._encode_pixels(pixels)
new_content = content + pixel_content
return BigSize.encode(len(new_content)) + new_content
###########################################################################
def parse_pixels(tlv):
pixels = []
if tlv.l % PIXEL_BYTE_SIZE != 0:
return None, "unexpected length"
remainder = tlv.v
while len(remainder) > 0:
pixel_hex, remainder, err = Namespace.pop_bytes(PIXEL_BYTE_SIZE,
remainder)
if err:
return None, err
pixels.append(Pixel.from_bin(h2b(pixel_hex)))
return {'tlv_type_name': "onion_studio_pixels",
'pixels': pixels}, None
def parse(byte_string):
extension_parsers = {PIXEL_TLV_TYPE: Extension.parse_pixels}
parsed, err = HopPayload.parse(byte_string,
extension_parsers=extension_parsers)
if err:
return None, err
if parsed['format'] != "tlv":
return None, "non-tlv payload byte string"
if PIXEL_TLV_TYPE not in parsed['tlvs']:
return None, "no pixel data tlv in payload"
return parsed, None