def get_blinded_reply_paths(
        lnwallet: 'LNWallet',
        path_id: bytes,
        *,
        max_paths: int = REQUEST_REPLY_PATHS_MAX,
        preferred_node_id: bytes = None
) -> Sequence[dict]:
    """construct a list of blinded reply_paths.
       current logic:
       - uses current onion_message capable channel peers if exist
       - otherwise, uses current onion_message capable peers
       - prefers preferred_node_id if given
       - reply_path introduction points are direct peers only (TODO: longer reply paths)"""
    # TODO: build longer paths and/or add dummy hops to increase privacy
    my_active_channels = [chan for chan in lnwallet.channels.values() if chan.is_active()]
    my_onionmsg_channels = [chan for chan in my_active_channels if lnwallet.peers.get(chan.node_id) and
                            lnwallet.peers.get(chan.node_id).their_features.supports(LnFeatures.OPTION_ONION_MESSAGE_OPT)]
    my_onionmsg_peers = [peer for peer in lnwallet.peers.values() if peer.their_features.supports(LnFeatures.OPTION_ONION_MESSAGE_OPT)]

    result = []
    mynodeid = lnwallet.node_keypair.pubkey
    mydata = {'path_id': {'data': path_id}}  # same path_id used in every reply path
    if len(my_onionmsg_channels):
        # randomize list, but prefer preferred_node_id
        rchans = sorted(my_onionmsg_channels, key=lambda x: random() if x.node_id != preferred_node_id else 0)
        for chan in rchans[:max_paths]:
            blinded_path = create_blinded_path(os.urandom(32), [chan.node_id, mynodeid], mydata)
            result.append(blinded_path)
    elif len(my_onionmsg_peers):
        # randomize list, but prefer preferred_node_id
        rpeers = sorted(my_onionmsg_peers, key=lambda x: random() if x.pubkey != preferred_node_id else 0)
        for peer in rpeers[:max_paths]:
            blinded_path = create_blinded_path(os.urandom(32), [peer.pubkey, mynodeid], mydata)
            result.append(blinded_path)

    return result
construct a list of blinded reply_paths.
       current logic:
       - uses current onion_message capable channel peers if exist
       - otherwise, uses current onion_message capable peers
       - prefers preferred_node_id if given
       - reply_path introduction points are direct peers only (TODO: longer reply paths)
electrum/onion_message.py