packages feed

ppad-bolt7-0.1.0: bench/Fixtures.hs

{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module: Fixtures
-- Copyright: (c) 2025 Jared Tobin
-- License: MIT
-- Maintainer: Jared Tobin <jared@ppad.tech>
--
-- Benchmark inputs: real mainnet gossip, a signed node_announcement, and
-- large gossip query replies.

module Fixtures (
    Fixtures(..)
  , fixtures
  ) where

import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as B16
import qualified Lightning.Protocol.BOLT1 as BOLT1
import Lightning.Protocol.BOLT7

data Fixtures = Fixtures
  { f_ann_bytes  :: !BS.ByteString
  , f_ann        :: !ChannelAnnouncement
  , f_upd_bytes  :: !BS.ByteString
  , f_upd        :: !ChannelUpdate
  , f_upd_key    :: !BOLT1.Point
  , f_node_bytes :: !BS.ByteString
  , f_node       :: !NodeAnnouncement
  , f_qsci_bytes :: !BS.ByteString
  , f_qsci       :: !QueryShortChannelIds
  , f_rcr_bytes  :: !BS.ByteString
  , f_rcr        :: !ReplyChannelRange
  }

-- | The fixtures, or 'Nothing' if one fails to build.
fixtures :: Maybe Fixtures
fixtures = do
  ann_bytes <- B16.decode ann_hex
  ann <- right (decode_channel_announcement ann_bytes)
  upd_bytes <- B16.decode upd_hex
  upd <- right (decode_channel_update upd_bytes)
  node_bytes <- B16.decode node_hex
  node <- right (decode_node_announcement node_bytes)
  ch <- BOLT1.chain_hash (BS.replicate 32 0x6f)
  let ids = [ BOLT1.ShortChannelId (0x0cf88400000000 + 0x10000 * i)
            | i <- [1 .. 1000] ]
      qsci = QueryShortChannelIds ch ids
        (Just (map (\i -> QueryFlags (i `mod` 32)) [1 .. 1000]))
        BOLT1.empty_tlv_stream
      rcr = ReplyChannelRange ch 850000 10000 True ids
        (Just [ ChannelUpdateTimestamps (1776493010 + i) (1776493020 + i)
              | i <- [1 .. 1000] ])
        (Just [ ChannelUpdateChecksums (0x1da953bd + i) (0xf0a89fda + i)
              | i <- [1 .. 1000] ])
        BOLT1.empty_tlv_stream
  qsci_bytes <- right (encode_query_short_channel_ids qsci)
  rcr_bytes <- right (encode_reply_channel_range rcr)
  pure Fixtures
    { f_ann_bytes  = ann_bytes
    , f_ann        = ann
    , f_upd_bytes  = upd_bytes
    , f_upd        = upd
    , f_upd_key    = ca_node_id_1 ann
    , f_node_bytes = node_bytes
    , f_node       = node
    , f_qsci_bytes = qsci_bytes
    , f_qsci       = qsci
    , f_rcr_bytes  = rcr_bytes
    , f_rcr        = rcr
    }
  where
    right :: Either e a -> Maybe a
    right = either (const Nothing) Just

-- channel_announcement for 850052x2992x1
ann_hex :: BS.ByteString
ann_hex = mconcat
  [ "3c256c270126d2c52ab5464fa959d627e9baec8c76bd2b81d34b47c4efb03290"
  , "40126ea7a0f8d31420976dc28ff684dc63f62620fa10dbac4fe3d417ca5690c1"
  , "b7fe1de61f5dd2b8368886d6c98f625c9110198e57c14fac93d4eff34e19ce5f"
  , "5dc6fef4501e8105c8f9b82d6d0b348f5840864445b071ae7a741b5eb92d2ec0"
  , "ab85681e4e1e85144bbbd8757c14cee92468d2c5ac84345cb28931b6fed5e339"
  , "00ed9dd363db630f31248cfa933a3667cbf87bb78a48a442e81c652686355365"
  , "ff33164c7588f0a753d50c4d52dd4a81c611fa47b4e950dfc9e3379a12ef7834"
  , "781c0900b90f56a5a49893446d03c8d283c3c093e3c8c682ff6cb40d70d9eebc"
  , "00006fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d619000000"
  , "00000cf884000bb0000102bb5e47ee26aca1654ce092d9d06eac15d953210c73"
  , "7f2220e2d7e54c4f108677030b828fd1e42549fbc2f1d0960ec3663362c41777"
  , "d3d87fe1b8e1d4bf063abcaa02bc3f260955062a4f427704edef1864c76d6777"
  , "fe81bed43a5f6297dda1c7ca9203523e164f4f9fbdea978c6570d56b13ca8338"
  , "430e6794ff74cf6aa0dbda71dd2d"
  ]

-- a channel_update for it from node_id_1, with an inbound-fee extension
upd_hex :: BS.ByteString
upd_hex = mconcat
  [ "1c3f0859cb3f4494919c3dcc80d22bbf1e25e378bd95f071530833c2371c33d7"
  , "0766012ebef1cd79b299a54d0d29bea2ef6feca1d6cfa188864c95d7eea7e9a4"
  , "6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000"
  , "0cf884000bb000016a0a1c760100006400000000000003e80000000000001388"
  , "00000000b1069a80fdd9030800000000ffffffed"
  ]

-- a node_announcement with one address descriptor of each type
node_hex :: BS.ByteString
node_hex = mconcat
  [ "edbd2df19aee2f072d9665e2d9a2807fbcd4be6876f6863955ea11870e411e66"
  , "063a31dcef14f1983524f87e108ee556b3a6646c873cd4bbcc07512c8f5e8f6a"
  , "000908000000000002aaa26553f1000324653eac434488002cc06bbfb7f10fe1"
  , "8991e35f9fe4302dbea6d2353dc0ab1c314159707061642d626f6c7437000000"
  , "000000000000000000000000000000000000000063017f000001260702000000"
  , "00000000000000000000000001260703aaaaaaaaaaaaaaaaaaaaaaaa04bbbbbb"
  , "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
  , "2607050e6c6e2e6578616d706c652e636f6d2607060102036503657874"
  ]