Browse Source

channel_announcements:

- construct_channel_announcement: return also whether
   node ids are in reverse order
 - maybe_send_channel_announcement:
   return early if signatures have not been received
master
ThomasV 2 years ago
parent
commit
026a64de94
  1. 3
      electrum/channel_db.py
  2. 10
      electrum/lnchannel.py
  3. 15
      electrum/lnpeer.py

3
electrum/channel_db.py

@ -251,7 +251,8 @@ def get_mychannel_info(short_channel_id: ShortChannelID,
chan = my_channels.get(short_channel_id) chan = my_channels.get(short_channel_id)
if not chan: if not chan:
return return
ci = ChannelInfo.from_raw_msg(chan.construct_channel_announcement_without_sigs()) raw_msg, _ = chan.construct_channel_announcement_without_sigs()
ci = ChannelInfo.from_raw_msg(raw_msg)
return ci._replace(capacity_sat=chan.constraints.capacity) return ci._replace(capacity_sat=chan.constraints.capacity)
def get_mychannel_policy(short_channel_id: bytes, node_id: bytes, def get_mychannel_policy(short_channel_id: bytes, node_id: bytes,

10
electrum/lnchannel.py

@ -806,9 +806,9 @@ class Channel(AbstractChannel):
self.config[REMOTE].multisig_key.pubkey, self.config[REMOTE].multisig_key.pubkey,
self.config[LOCAL].multisig_key.pubkey] self.config[LOCAL].multisig_key.pubkey]
node_ids = [self.node_id, self.get_local_pubkey()] node_ids = [self.node_id, self.get_local_pubkey()]
sorted_node_ids = list(sorted(node_ids)) is_reverse = node_ids[0] > node_ids[1]
if sorted_node_ids != node_ids: if is_reverse:
node_ids = sorted_node_ids node_ids.reverse()
bitcoin_keys.reverse() bitcoin_keys.reverse()
chan_ann = encode_msg( chan_ann = encode_msg(
"channel_announcement", "channel_announcement",
@ -821,10 +821,10 @@ class Channel(AbstractChannel):
bitcoin_key_1=bitcoin_keys[0], bitcoin_key_1=bitcoin_keys[0],
bitcoin_key_2=bitcoin_keys[1], bitcoin_key_2=bitcoin_keys[1],
) )
return chan_ann return chan_ann, is_reverse
def get_channel_announcement_hash(self): def get_channel_announcement_hash(self):
chan_ann = self.construct_channel_announcement_without_sigs() chan_ann, _ = self.construct_channel_announcement_without_sigs()
return sha256d(chan_ann[256+2:]) return sha256d(chan_ann[256+2:])
def is_static_remotekey_enabled(self) -> bool: def is_static_remotekey_enabled(self) -> bool:

15
electrum/lnpeer.py

@ -476,7 +476,7 @@ class Peer(Logger):
self.send_node_announcement(alias) self.send_node_announcement(alias)
for chan in public_channels: for chan in public_channels:
if chan.is_open() and chan.peer_state == PeerState.GOOD: if chan.is_open() and chan.peer_state == PeerState.GOOD:
self.send_channel_announcement(chan) self.maybe_send_channel_announcement(chan)
await asyncio.sleep(600) await asyncio.sleep(600)
async def query_gossip(self): async def query_gossip(self):
@ -1379,18 +1379,15 @@ class Peer(Logger):
raw_msg = encode_msg(message_type, **payload) raw_msg = encode_msg(message_type, **payload)
self.transport.send_bytes(raw_msg) self.transport.send_bytes(raw_msg)
def send_channel_announcement(self, chan: Channel): def maybe_send_channel_announcement(self, chan: Channel):
node_ids = [chan.node_id, chan.get_local_pubkey()]
node_sigs = [chan.config[REMOTE].announcement_node_sig, chan.config[LOCAL].announcement_node_sig] node_sigs = [chan.config[REMOTE].announcement_node_sig, chan.config[LOCAL].announcement_node_sig]
bitcoin_sigs = [chan.config[REMOTE].announcement_bitcoin_sig, chan.config[LOCAL].announcement_bitcoin_sig] bitcoin_sigs = [chan.config[REMOTE].announcement_bitcoin_sig, chan.config[LOCAL].announcement_bitcoin_sig]
bitcoin_keys = [chan.config[REMOTE].multisig_key.pubkey, chan.config[LOCAL].multisig_key.pubkey] if not bitcoin_sigs[0] or not bitcoin_sigs[1]:
sorted_node_ids = list(sorted(node_ids)) return
if sorted_node_ids != node_ids: raw_msg, is_reverse = chan.construct_channel_announcement_without_sigs()
if is_reverse:
node_sigs.reverse() node_sigs.reverse()
bitcoin_sigs.reverse() bitcoin_sigs.reverse()
node_ids.reverse()
bitcoin_keys.reverse()
raw_msg = chan.construct_channel_announcement_without_sigs()
message_type, payload = decode_msg(raw_msg) message_type, payload = decode_msg(raw_msg)
payload['node_signature_1'] = node_sigs[0] payload['node_signature_1'] = node_sigs[0]
payload['node_signature_2'] = node_sigs[1] payload['node_signature_2'] = node_sigs[1]

Loading…
Cancel
Save