bolt7

Routing gossip protocol, per BOLT #7 (docs.ppad.tech/bolt7).
git clone git://git.ppad.tech/bolt7.git
Log | Files | Refs | README | LICENSE

Fixtures.hs (4594B)


      1 {-# LANGUAGE OverloadedStrings #-}
      2 
      3 -- |
      4 -- Module: Fixtures
      5 -- Copyright: (c) 2025 Jared Tobin
      6 -- License: MIT
      7 -- Maintainer: Jared Tobin <jared@ppad.tech>
      8 --
      9 -- Benchmark inputs: real mainnet gossip, a signed node_announcement, and
     10 -- large gossip query replies.
     11 
     12 module Fixtures (
     13     Fixtures(..)
     14   , fixtures
     15   ) where
     16 
     17 import qualified Data.ByteString as BS
     18 import qualified Data.ByteString.Base16 as B16
     19 import qualified Lightning.Protocol.BOLT1 as BOLT1
     20 import Lightning.Protocol.BOLT7
     21 
     22 data Fixtures = Fixtures
     23   { f_ann_bytes  :: !BS.ByteString
     24   , f_ann        :: !ChannelAnnouncement
     25   , f_upd_bytes  :: !BS.ByteString
     26   , f_upd        :: !ChannelUpdate
     27   , f_upd_key    :: !BOLT1.Point
     28   , f_node_bytes :: !BS.ByteString
     29   , f_node       :: !NodeAnnouncement
     30   , f_qsci_bytes :: !BS.ByteString
     31   , f_qsci       :: !QueryShortChannelIds
     32   , f_rcr_bytes  :: !BS.ByteString
     33   , f_rcr        :: !ReplyChannelRange
     34   }
     35 
     36 -- | The fixtures, or 'Nothing' if one fails to build.
     37 fixtures :: Maybe Fixtures
     38 fixtures = do
     39   ann_bytes <- B16.decode ann_hex
     40   ann <- right (decode_channel_announcement ann_bytes)
     41   upd_bytes <- B16.decode upd_hex
     42   upd <- right (decode_channel_update upd_bytes)
     43   node_bytes <- B16.decode node_hex
     44   node <- right (decode_node_announcement node_bytes)
     45   ch <- BOLT1.chain_hash (BS.replicate 32 0x6f)
     46   let ids = [ BOLT1.ShortChannelId (0x0cf88400000000 + 0x10000 * i)
     47             | i <- [1 .. 1000] ]
     48       qsci = QueryShortChannelIds ch ids
     49         (Just (map (\i -> QueryFlags (i `mod` 32)) [1 .. 1000]))
     50         BOLT1.empty_tlv_stream
     51       rcr = ReplyChannelRange ch 850000 10000 True ids
     52         (Just [ ChannelUpdateTimestamps (1776493010 + i) (1776493020 + i)
     53               | i <- [1 .. 1000] ])
     54         (Just [ ChannelUpdateChecksums (0x1da953bd + i) (0xf0a89fda + i)
     55               | i <- [1 .. 1000] ])
     56         BOLT1.empty_tlv_stream
     57   qsci_bytes <- right (encode_query_short_channel_ids qsci)
     58   rcr_bytes <- right (encode_reply_channel_range rcr)
     59   pure Fixtures
     60     { f_ann_bytes  = ann_bytes
     61     , f_ann        = ann
     62     , f_upd_bytes  = upd_bytes
     63     , f_upd        = upd
     64     , f_upd_key    = ca_node_id_1 ann
     65     , f_node_bytes = node_bytes
     66     , f_node       = node
     67     , f_qsci_bytes = qsci_bytes
     68     , f_qsci       = qsci
     69     , f_rcr_bytes  = rcr_bytes
     70     , f_rcr        = rcr
     71     }
     72   where
     73     right :: Either e a -> Maybe a
     74     right = either (const Nothing) Just
     75 
     76 -- channel_announcement for 850052x2992x1
     77 ann_hex :: BS.ByteString
     78 ann_hex = mconcat
     79   [ "3c256c270126d2c52ab5464fa959d627e9baec8c76bd2b81d34b47c4efb03290"
     80   , "40126ea7a0f8d31420976dc28ff684dc63f62620fa10dbac4fe3d417ca5690c1"
     81   , "b7fe1de61f5dd2b8368886d6c98f625c9110198e57c14fac93d4eff34e19ce5f"
     82   , "5dc6fef4501e8105c8f9b82d6d0b348f5840864445b071ae7a741b5eb92d2ec0"
     83   , "ab85681e4e1e85144bbbd8757c14cee92468d2c5ac84345cb28931b6fed5e339"
     84   , "00ed9dd363db630f31248cfa933a3667cbf87bb78a48a442e81c652686355365"
     85   , "ff33164c7588f0a753d50c4d52dd4a81c611fa47b4e950dfc9e3379a12ef7834"
     86   , "781c0900b90f56a5a49893446d03c8d283c3c093e3c8c682ff6cb40d70d9eebc"
     87   , "00006fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d619000000"
     88   , "00000cf884000bb0000102bb5e47ee26aca1654ce092d9d06eac15d953210c73"
     89   , "7f2220e2d7e54c4f108677030b828fd1e42549fbc2f1d0960ec3663362c41777"
     90   , "d3d87fe1b8e1d4bf063abcaa02bc3f260955062a4f427704edef1864c76d6777"
     91   , "fe81bed43a5f6297dda1c7ca9203523e164f4f9fbdea978c6570d56b13ca8338"
     92   , "430e6794ff74cf6aa0dbda71dd2d"
     93   ]
     94 
     95 -- a channel_update for it from node_id_1, with an inbound-fee extension
     96 upd_hex :: BS.ByteString
     97 upd_hex = mconcat
     98   [ "1c3f0859cb3f4494919c3dcc80d22bbf1e25e378bd95f071530833c2371c33d7"
     99   , "0766012ebef1cd79b299a54d0d29bea2ef6feca1d6cfa188864c95d7eea7e9a4"
    100   , "6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000"
    101   , "0cf884000bb000016a0a1c760100006400000000000003e80000000000001388"
    102   , "00000000b1069a80fdd9030800000000ffffffed"
    103   ]
    104 
    105 -- a node_announcement with one address descriptor of each type
    106 node_hex :: BS.ByteString
    107 node_hex = mconcat
    108   [ "edbd2df19aee2f072d9665e2d9a2807fbcd4be6876f6863955ea11870e411e66"
    109   , "063a31dcef14f1983524f87e108ee556b3a6646c873cd4bbcc07512c8f5e8f6a"
    110   , "000908000000000002aaa26553f1000324653eac434488002cc06bbfb7f10fe1"
    111   , "8991e35f9fe4302dbea6d2353dc0ab1c314159707061642d626f6c7437000000"
    112   , "000000000000000000000000000000000000000063017f000001260702000000"
    113   , "00000000000000000000000001260703aaaaaaaaaaaaaaaaaaaaaaaa04bbbbbb"
    114   , "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    115   , "2607050e6c6e2e6578616d706c652e636f6d2607060102036503657874"
    116   ]