Skip to content

PoC: Asmap for relay selection#1452

Draft
bc1cindy wants to merge 4 commits intopayjoin:masterfrom
bc1cindy:asmap
Draft

PoC: Asmap for relay selection#1452
bc1cindy wants to merge 4 commits intopayjoin:masterfrom
bc1cindy:asmap

Conversation

@bc1cindy
Copy link
Copy Markdown
Contributor

this is a proof of concept based on #919

first of all, I want to congrats @nothingmuch , this is a very smart algorithm! its really interesting

the proposal of this PoC is to unblock the discussion, I think its a great and important privacy path

Bitcoin core uses a pre-compiled binary trie (.dat, bitcoin-core/asmap-data), but to simplify I used Kartograf text file as the Asmap source (https://github.com/asmap/kartograf)

I made a manual ASN field that user can write to filter directories and relays by AS

the code enables multiple directories

left some notes around it

running:

RUST_LOG=debug cargo run -p payjoin-cli -- \
  --rpcuser user \
  --rpcpassword password \
  --rpchost http://127.0.0.1:18443/wallet/receiver \
  --asmap /kartograf/out/1774697080/final_result.txt \
  --user-asn 13335 \
  --ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \
  --pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
  receive 10000

test analysis:

Captura de Tela 2026-03-30 às 00 15 31

I used claude and big pickle to research and code assistance

Logs
RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/receiver \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 63949 \ 
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/" \
receive 10000
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.63s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/receiver' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 63949 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/' receive 10000`
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:14:20.837872Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded successfully, using AS-aware directory selection
2026-03-30T01:14:21.149816Z DEBUG payjoin_cli::app::v2::ohttp: Selected directory: https://payjo.in/
2026-03-30T01:14:21.219239Z DEBUG reqwest::connect: starting new connection: https://payjo.in/
2026-03-30T01:14:21.219285Z DEBUG reqwest::connect: proxy(https://ohttp.achow101.com/) intercepts 'https://payjo.in/'
2026-03-30T01:14:21.220816Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:14:21.366281Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
2026-03-30T01:14:21.670868Z DEBUG payjoin_cli::app::v2::ohttp: Failed to connect to relay: https://ohttp.achow101.com/, Internal(InternalError(Reqwest(reqwest::Error { kind: Request, url: "https://payjo.in/.well-known/ohttp-gateway", source: hyper_util::client::legacy::Error(Connect, TunnelUnexpectedEof) })))
2026-03-30T01:14:21.671210Z DEBUG reqwest::connect: starting new connection: https://payjo.in/
2026-03-30T01:14:21.671258Z DEBUG reqwest::connect: proxy(https://pj.bobspacebkk.com/) intercepts 'https://payjo.in/'
2026-03-30T01:14:21.674298Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:14:21.999785Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
2026-03-30T01:14:24.631847Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", payjo.in)
Receive session established
Request Payjoin by sharing this Payjoin Uri:
bitcoin:bcrt1qa5veuc78ful4mhrryvyzqu83w9c7xrjwz9356z?amount=0.0001&pjos=0&pj=HTTPS://PAYJO.IN/YYUXGHLL89SWY%23EX17Q0UK6G-OH1QYPFLM8XL59R0XV4VGPLS7FRDSSM4TUXL07TXCWC4S0GLVLNK2SE4NQ-RK1Q22KCMC4XGHXTQY3GU8WW4W0Y37VFR9P3KR39SXM7UZU2F39MD6K6
Polling receive request...
2026-03-30T01:14:24.663352Z DEBUG reqwest::connect: starting new connection: https://pj.bobspacebkk.com/
2026-03-30T01:14:24.671455Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:14:24.982896Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
Polling receive request...
2026-03-30T01:14:57.059408Z DEBUG reqwest::connect: starting new connection: https://pj.bobspacebkk.com/
2026-03-30T01:14:57.089915Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:14:57.418855Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
Polling receive request...
2026-03-30T01:15:28.468183Z DEBUG reqwest::connect: starting new connection: https://pj.bobspacebkk.com/
2026-03-30T01:15:28.476565Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:15:28.819341Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
Got a request from the sender. Responding with a Payjoin proposal.
Fallback transaction received. Consider broadcasting this to get paid if the Payjoin fails:
0200000000010117690b3837442e4ccc394c361d45bb7e7c0397ac94bc9ffdfdddc952792b0a9b0100000000fdffffff022490f50500000000160014f6b790eb33291f401dc2a0b77525a008ab1ca2d81027000000000000160014ed199e63c74f3f5ddc6323082070f17171e30e4e0247304402201c38e23f0caf6b025ae48acd427869aa9505721d39a292eb66a166fa25ea3aa502204bc03160833d542f4d1331eb63705d7774bdc4261849fe5250fdf5a882e9525b012103d116917ae30d509217d0c03e3e8f0e1f48af295e91136a8118988f07b1503ec6a4010000
2026-03-30T01:15:49.049889Z DEBUG payjoin::core::receive::common: min_fee_rate: FeeRate(500)
2026-03-30T01:15:49.062877Z DEBUG reqwest::connect: starting new connection: https://pj.bobspacebkk.com/
2026-03-30T01:15:49.064702Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:15:49.388793Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
Response successful. Watch mempool for successful Payjoin. TXID: b4fc96418aeb41947c4b42041d3736ee9107c853ad5a592021ab9b4181889505
2026-03-30T01:15:50.371341Z DEBUG payjoin_cli::app::v2: Polling for payment confirmation
Payjoin transaction detected in the mempool!







RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/sender \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 402106 \
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/" \
send --fee-rate 2 "bitcoin:bcrt1qa5veuc78ful4mhrryvyzqu83w9c7xrjwz9356z?amount=0.0001&pjos=0&pj=HTTPS://PAYJO.IN/YYUXGHLL89SWY%23EX17Q0UK6G-OH1QYPFLM8XL59R0XV4VGPLS7FRDSSM4TUXL07TXCWC4S0GLVLNK2SE4NQ-RK1Q22KCMC4XGHXTQY3GU8WW4W0Y37VFR9P3KR39SXM7UZU2F39MD6K6"
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.62s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/sender' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 402106 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/' send --fee-rate 2 'bitcoin:bcrt1qa5veuc78ful4mhrryvyzqu83w9c7xrjwz9356z?amount=0.0001&pjos=0&pj=HTTPS://PAYJO.IN/YYUXGHLL89SWY%23EX17Q0UK6G-OH1QYPFLM8XL59R0XV4VGPLS7FRDSSM4TUXL07TXCWC4S0GLVLNK2SE4NQ-RK1Q22KCMC4XGHXTQY3GU8WW4W0Y37VFR9P3KR39SXM7UZU2F39MD6K6'`
2026-03-30T01:15:46.822004Z DEBUG payjoin_cli::app::wallet: Fee rate sat/vb: 2
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:15:46.872129Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded, using for relay selection with fixed directory
2026-03-30T01:15:46.977381Z DEBUG reqwest::connect: starting new connection: https://payjo.in/
2026-03-30T01:15:46.977419Z DEBUG reqwest::connect: proxy(https://ohttp.cakewallet.com/) intercepts 'https://payjo.in/'
2026-03-30T01:15:46.979032Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:15:47.173628Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
2026-03-30T01:15:48.107550Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", payjo.in)
2026-03-30T01:15:48.123439Z DEBUG payjoin::core::send::v2: ohttp_relay_url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("ohttp.cakewallet.com")), port: None, path: "/https://payjo.in/", query: None, fragment: None }
2026-03-30T01:15:48.123998Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:15:48.126530Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:15:48.321205Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Posted original proposal...
2026-03-30T01:15:48.901200Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:15:48.904622Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:15:49.099976Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Proposal received. Processing...
Payjoin sent. TXID: b4fc96418aeb41947c4b42041d3736ee9107c853ad5a592021ab9b4181889505






RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/receiver \
--asmap //kartograf/out/1774697080/final_result.txt \
--user-asn 63949 \
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
receive 10000
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.68s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/receiver' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 63949 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' receive 10000`
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:21:45.713033Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded successfully, using AS-aware directory selection
2026-03-30T01:21:46.027821Z DEBUG payjoin_cli::app::v2::ohttp: Selected directory: https://mailroom.luisschwab.net/
2026-03-30T01:21:46.082013Z DEBUG reqwest::connect: starting new connection: https://mailroom.luisschwab.net/
2026-03-30T01:21:46.082047Z DEBUG reqwest::connect: proxy(https://ohttp.achow101.com/) intercepts 'https://mailroom.luisschwab.net/'
2026-03-30T01:21:46.083512Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:21:46.228389Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
2026-03-30T01:21:47.694241Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", mailroom.luisschwab.net)
Receive session established
Request Payjoin by sharing this Payjoin Uri:
bitcoin:bcrt1qp4538q7jp7tvke0ya23hzpmzjx7pdlkrd0tjes?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/AJN903NGUAMGW%23EX14VSUK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1QFR0E5G6YNZRDPYXR90S85Z598WYTDA5J8HJFHHNPUK6GA7DS5YZV
Polling receive request...
2026-03-30T01:21:47.708668Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:21:47.717460Z DEBUG hyper_util::client::legacy::connect::http: connecting to 208.68.4.72:443
2026-03-30T01:21:47.832776Z DEBUG hyper_util::client::legacy::connect::http: connected to 208.68.4.72:443
Polling receive request...
2026-03-30T01:22:18.718562Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:22:18.884672Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:22:19.032505Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
Polling receive request...
2026-03-30T01:22:49.739923Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:22:49.770549Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:22:49.919589Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
Polling receive request...
2026-03-30T01:23:20.551532Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:23:20.565763Z DEBUG hyper_util::client::legacy::connect::http: connecting to 208.68.4.72:443
2026-03-30T01:23:20.680011Z DEBUG hyper_util::client::legacy::connect::http: connected to 208.68.4.72:443
Got a request from the sender. Responding with a Payjoin proposal.
Fallback transaction received. Consider broadcasting this to get paid if the Payjoin fails:
0200000000010105958881419bab2120595aad53c80791ee36371d04424b7c9441eb8a4196fcb40000000000fdffffff0210270000000000001600140d691383d20f96cb65e4eaa371076291bc16fec37267f505000000001600143d48ac6a7ca14e14a0d0bf055838ed717a9d1b920247304402205bcd75f1c8dedca8a05369cad4c3ad76b4537c3878d4cc1171f13fa1634c8af50220578453ff966aa25901ceefb1b5215ab093d4b3b1ad47dd927e945421d61a3f320121037bafefe278aa956bce37a40440fb665078b0d6ccac867a725027e7c3b174af97af010000
2026-03-30T01:23:24.248638Z DEBUG payjoin::core::receive::common: min_fee_rate: FeeRate(500)
2026-03-30T01:23:24.266358Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:23:24.274823Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:23:24.419549Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
Response successful. Watch mempool for successful Payjoin. TXID: 421bcd0ee2be8b42835aa10a761aaf20c443d5125ea3cf9fad71932eca152860
2026-03-30T01:23:24.913404Z DEBUG payjoin_cli::app::v2: Polling for payment confirmation
Payjoin transaction detected in the mempool!



RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/sender \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 14061 \
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
send --fee-rate 2 "bitcoin:bcrt1qp4538q7jp7tvke0ya23hzpmzjx7pdlkrd0tjes?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/AJN903NGUAMGW%23EX14VSUK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1QFR0E5G6YNZRDPYXR90S85Z598WYTDA5J8HJFHHNPUK6GA7DS5YZV"
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.63s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/sender' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 14061 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' send --fee-rate 2 'bitcoin:bcrt1qp4538q7jp7tvke0ya23hzpmzjx7pdlkrd0tjes?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/AJN903NGUAMGW%23EX14VSUK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1QFR0E5G6YNZRDPYXR90S85Z598WYTDA5J8HJFHHNPUK6GA7DS5YZV'`
2026-03-30T01:23:20.870728Z DEBUG payjoin_cli::app::wallet: Fee rate sat/vb: 2
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:23:20.995644Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded, using for relay selection with fixed directory
2026-03-30T01:23:21.259170Z DEBUG reqwest::connect: starting new connection: https://mailroom.luisschwab.net/
2026-03-30T01:23:21.259223Z DEBUG reqwest::connect: proxy(https://ohttp.cakewallet.com/) intercepts 'https://mailroom.luisschwab.net/'
2026-03-30T01:23:21.260474Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:23:21.457624Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
2026-03-30T01:23:23.017746Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", mailroom.luisschwab.net)
2026-03-30T01:23:23.024840Z DEBUG payjoin::core::send::v2: ohttp_relay_url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("ohttp.cakewallet.com")), port: None, path: "/https://mailroom.luisschwab.net/", query: None, fragment: None }
2026-03-30T01:23:23.025254Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:23:23.031048Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:23:23.224924Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Posted original proposal...
2026-03-30T01:23:24.397162Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:23:24.400207Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:23:24.594561Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Proposal received. Processing...
Payjoin sent. TXID: 421bcd0ee2be8b42835aa10a761aaf20c443d5125ea3cf9fad71932eca152860



RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/receiver \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 13335 \
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
receive 10000
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.59s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/receiver' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 13335 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' receive 10000`
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:24:58.300148Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded successfully, using AS-aware directory selection
2026-03-30T01:24:58.446226Z DEBUG payjoin_cli::app::v2::ohttp: Selected directory: https://payjo.in/
2026-03-30T01:24:58.542325Z DEBUG reqwest::connect: starting new connection: https://payjo.in/
2026-03-30T01:24:58.542394Z DEBUG reqwest::connect: proxy(https://ohttp.achow101.com/) intercepts 'https://payjo.in/'
2026-03-30T01:24:58.543772Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:24:58.689532Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
2026-03-30T01:24:59.343803Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", payjo.in)
Receive session established
Request Payjoin by sharing this Payjoin Uri:
bitcoin:bcrt1qq4k0csz0h0f30wgg5t5veqkfs82xnvgp2l9kyv?amount=0.0001&pjos=0&pj=HTTPS://PAYJO.IN/CY9XCF3AKHAQU%23EX1DV3VK6G-OH1QYPFLM8XL59R0XV4VGPLS7FRDSSM4TUXL07TXCWC4S0GLVLNK2SE4NQ-RK1QTZRL0THNEWHDS57DFQNFUUQ0P7UQAT8NDD04VCEJRAZYES64GQ9X
Polling receive request...
2026-03-30T01:24:59.360002Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:24:59.366506Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:24:59.511453Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
Polling receive request...
2026-03-30T01:25:29.965440Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:25:29.978859Z DEBUG hyper_util::client::legacy::connect::http: connecting to 208.68.4.72:443
2026-03-30T01:25:30.095236Z DEBUG hyper_util::client::legacy::connect::http: connected to 208.68.4.72:443
Polling receive request...
2026-03-30T01:26:00.452441Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:26:00.460813Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:26:00.607577Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
Got a request from the sender. Responding with a Payjoin proposal.
Fallback transaction received. Consider broadcasting this to get paid if the Payjoin fails:
020000000001011c1a025dd55caf8c7a9ff1c0c6669dc0aae4d300ac871b1385f8a5d9b549360f0100000000fdffffff021027000000000000160014056cfc404fbbd317b908a2e8cc82c981d469b101d6b8f50500000000160014a907de27419d9a559a8a2302892b8a848f43096a02473044022011299f19a9938b350737c07b597b60a9dcc4fe488939cc902229f13d648ac4ea02206efb2c255a28d01ea6036128d810381dd3a79d0db0532f0623a16a2c7dcfa0680121024a1526347017998300b80f3e12d4174b420683b9f343e4655c0818d0d9fa101eaf010000
2026-03-30T01:26:05.365261Z DEBUG payjoin::core::receive::common: min_fee_rate: FeeRate(500)
2026-03-30T01:26:05.379765Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:26:05.381063Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:26:05.526780Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
Response successful. Watch mempool for successful Payjoin. TXID: 2f6c6a7bdb3bb03e8efbf95e4fd6a714ca3ffd64bc60770957dc199c4f7e59a4
2026-03-30T01:26:05.860914Z DEBUG payjoin_cli::app::v2: Polling for payment confirmation
Payjoin transaction detected in the mempool!



RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/sender \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 40021 \
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
send --fee-rate 2 "bitcoin:bcrt1qq4k0csz0h0f30wgg5t5veqkfs82xnvgp2l9kyv?amount=0.0001&pjos=0&pj=HTTPS://PAYJO.IN/CY9XCF3AKHAQU%23EX1DV3VK6G-OH1QYPFLM8XL59R0XV4VGPLS7FRDSSM4TUXL07TXCWC4S0GLVLNK2SE4NQ-RK1QTZRL0THNEWHDS57DFQNFUUQ0P7UQAT8NDD04VCEJRAZYES64GQ9X"
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.59s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/sender' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 40021 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' send --fee-rate 2 'bitcoin:bcrt1qq4k0csz0h0f30wgg5t5veqkfs82xnvgp2l9kyv?amount=0.0001&pjos=0&pj=HTTPS://PAYJO.IN/CY9XCF3AKHAQU%23EX1DV3VK6G-OH1QYPFLM8XL59R0XV4VGPLS7FRDSSM4TUXL07TXCWC4S0GLVLNK2SE4NQ-RK1QTZRL0THNEWHDS57DFQNFUUQ0P7UQAT8NDD04VCEJRAZYES64GQ9X'`
2026-03-30T01:26:03.262185Z DEBUG payjoin_cli::app::wallet: Fee rate sat/vb: 2
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:26:03.311785Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded, using for relay selection with fixed directory
2026-03-30T01:26:03.379752Z DEBUG reqwest::connect: starting new connection: https://payjo.in/
2026-03-30T01:26:03.379795Z DEBUG reqwest::connect: proxy(https://ohttp.cakewallet.com/) intercepts 'https://payjo.in/'
2026-03-30T01:26:03.381105Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:26:03.585214Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
2026-03-30T01:26:04.587478Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", payjo.in)
2026-03-30T01:26:04.601965Z DEBUG payjoin::core::send::v2: ohttp_relay_url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("ohttp.cakewallet.com")), port: None, path: "/https://payjo.in/", query: None, fragment: None }
2026-03-30T01:26:04.602408Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:26:04.605576Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:26:04.799906Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Posted original proposal...
2026-03-30T01:26:05.329298Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:26:05.338081Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:26:05.534046Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Proposal received. Processing...
Payjoin sent. TXID: 2f6c6a7bdb3bb03e8efbf95e4fd6a714ca3ffd64bc60770957dc199c4f7e59a4



RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/receiver \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 99999999 \
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
receive 10000
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.58s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/receiver' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 99999999 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' receive 10000`
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:27:52.406271Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded successfully, using AS-aware directory selection
2026-03-30T01:27:52.933903Z DEBUG payjoin_cli::app::v2::ohttp: Selected directory: https://mailroom.luisschwab.net/
2026-03-30T01:27:53.310289Z DEBUG reqwest::connect: starting new connection: https://mailroom.luisschwab.net/
2026-03-30T01:27:53.310330Z DEBUG reqwest::connect: proxy(https://ohttp.cakewallet.com/) intercepts 'https://mailroom.luisschwab.net/'
2026-03-30T01:27:53.311746Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:27:53.509797Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
2026-03-30T01:27:55.152072Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", mailroom.luisschwab.net)
Receive session established
Request Payjoin by sharing this Payjoin Uri:
bitcoin:bcrt1q3gj6hg9n24fz89hnyusw53zdcfknhwpv0pyyvj?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/ZRW2AH5ALA5S6%23EX1RV3UK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1QDYP9KNFVFND7ZD8MUST2G40T409LP4UN26HXF28V5LSSHYQU9696
Polling receive request...
2026-03-30T01:27:55.175843Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:27:55.186154Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:27:55.381445Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Got a request from the sender. Responding with a Payjoin proposal.
Fallback transaction received. Consider broadcasting this to get paid if the Payjoin fails:
02000000000101a0ee517d29a401512c0139b9688f234171e988c599d9d82247d5a348b4c2eef90000000000fdffffff02d6b8f50500000000160014d66952d915651389cd01b50eaa775d03771bec8610270000000000001600148a25aba0b355522396f32720ea444dc26d3bb82c02473044022029a0cedde9bb1b154e41532a29a99646e2aac8e21fe3fde8e8ef5ce13f716bd6022052294e1db0788239bf22aee4135380e59660a37273a6e7eb53b43c8afd5ed5d401210306ea3f02ef98417dca3ac6f86113edea40be304fb28786d7b072416e234c0a00af010000
2026-03-30T01:28:23.441857Z DEBUG payjoin::core::receive::common: min_fee_rate: FeeRate(500)
2026-03-30T01:28:23.455784Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:28:23.460894Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:28:23.656653Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Response successful. Watch mempool for successful Payjoin. TXID: c7f25c29ca5ebef9d8ca8ca99de150c1579971f7ae7cbdda795c1c93331bc577
2026-03-30T01:28:24.306162Z DEBUG payjoin_cli::app::v2: Polling for payment confirmation
Payjoin transaction detected in the mempool!



RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/sender \
--asmap kartograf/out/1774697080/final_result.txt \
--user-asn 402106 \
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
send --fee-rate 2 "bitcoin:bcrt1q3gj6hg9n24fz89hnyusw53zdcfknhwpv0pyyvj?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/ZRW2AH5ALA5S6%23EX1RV3UK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1QDYP9KNFVFND7ZD8MUST2G40T409LP4UN26HXF28V5LSSHYQU9696"
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.60s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/sender' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 402106 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' send --fee-rate 2 'bitcoin:bcrt1q3gj6hg9n24fz89hnyusw53zdcfknhwpv0pyyvj?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/ZRW2AH5ALA5S6%23EX1RV3UK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1QDYP9KNFVFND7ZD8MUST2G40T409LP4UN26HXF28V5LSSHYQU9696'`
2026-03-30T01:28:17.546556Z DEBUG payjoin_cli::app::wallet: Fee rate sat/vb: 2
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:28:17.646744Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded, using for relay selection with fixed directory
2026-03-30T01:28:17.726658Z DEBUG reqwest::connect: starting new connection: https://mailroom.luisschwab.net/
2026-03-30T01:28:17.726696Z DEBUG reqwest::connect: proxy(https://pj.bobspacebkk.com/) intercepts 'https://mailroom.luisschwab.net/'
2026-03-30T01:28:17.728387Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:28:18.150013Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
2026-03-30T01:28:21.119842Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", mailroom.luisschwab.net)
2026-03-30T01:28:21.133477Z DEBUG payjoin::core::send::v2: ohttp_relay_url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("pj.bobspacebkk.com")), port: None, path: "/https://mailroom.luisschwab.net/", query: None, fragment: None }
2026-03-30T01:28:21.134132Z DEBUG reqwest::connect: starting new connection: https://pj.bobspacebkk.com/
2026-03-30T01:28:21.140471Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:28:21.459409Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
Posted original proposal...
2026-03-30T01:28:23.780399Z DEBUG reqwest::connect: starting new connection: https://pj.bobspacebkk.com/
2026-03-30T01:28:23.782425Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:28:24.106649Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
Proposal received. Processing...
Payjoin sent. TXID: c7f25c29ca5ebef9d8ca8ca99de150c1579971f7ae7cbdda795c1c93331bc577



RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/receiver \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 99999999 \
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com,https://mailroom.luisschwab.net/" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
receive 10000
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.60s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/receiver' --asmap kartograf/out/1774697080/final_result.txt --user-asn 99999999 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com,https://mailroom.luisschwab.net/' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' receive 10000`
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:34:19.015425Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded successfully, using AS-aware directory selection
2026-03-30T01:34:19.348746Z DEBUG payjoin_cli::app::v2::ohttp: Selected directory: https://mailroom.luisschwab.net/
2026-03-30T01:34:19.523629Z DEBUG reqwest::connect: starting new connection: https://mailroom.luisschwab.net/
2026-03-30T01:34:19.523676Z DEBUG reqwest::connect: proxy(https://pj.bobspacebkk.com/) intercepts 'https://mailroom.luisschwab.net/'
2026-03-30T01:34:19.525953Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:34:19.837165Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
2026-03-30T01:34:22.800917Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", mailroom.luisschwab.net)
Receive session established
Request Payjoin by sharing this Payjoin Uri:
bitcoin:bcrt1q9d7c77wthrglfkjqa82hye82vfy9yg7xyrn6hv?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/K5HTTVA0RTWES%23EX1NCJVK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1QVR8C7ARCNZSUKSNEPMMR0JPSQV95VQYGRZS6RUNEU906VHUEQ95X
Polling receive request...
2026-03-30T01:34:22.918154Z DEBUG reqwest::connect: starting new connection: https://pj.bobspacebkk.com/
2026-03-30T01:34:22.960128Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:34:23.278557Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
Polling receive request...
2026-03-30T01:34:55.630087Z DEBUG reqwest::connect: starting new connection: https://pj.bobspacebkk.com/
2026-03-30T01:34:55.638415Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:34:55.957933Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
Got a request from the sender. Responding with a Payjoin proposal.
Fallback transaction received. Consider broadcasting this to get paid if the Payjoin fails:
02000000000101602815ca2e9371ad9fcfa35e12d543c420af1a760aa15a83428bbee20ecd1b420100000000fdffffff02c03ef50500000000160014604b141d9b86a920b88c833ba475bb6d83b6550010270000000000001600142b7d8f79cbb8d1f4da40e9d57264ea62485223c60247304402204ca3e068a6a5c21b6e6a93fbf0eaf2fbaee7f13a2afd541cd1674a07a7952f07022022f9d6ad867fcb5d845753b60497673fd62f033fa73b6514accd9ad0621aa1b201210265878c95a4f5c7cdb084f15550628633859170e46e182f20d3edff9751e43b92ba010000
2026-03-30T01:35:24.670980Z DEBUG payjoin::core::receive::common: min_fee_rate: FeeRate(500)
2026-03-30T01:35:24.683104Z DEBUG reqwest::connect: starting new connection: https://pj.bobspacebkk.com/
2026-03-30T01:35:24.685185Z DEBUG hyper_util::client::legacy::connect::http: connecting to 157.245.59.46:443
2026-03-30T01:35:25.009081Z DEBUG hyper_util::client::legacy::connect::http: connected to 157.245.59.46:443
Response successful. Watch mempool for successful Payjoin. TXID: c7ac4e298701d99d8de44692a94db7c86629d3e7e99beac1fd85c3e557d41da5
2026-03-30T01:35:26.102237Z DEBUG payjoin_cli::app::v2: Polling for payment confirmation
Payjoin transaction detected in the mempool!



RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \                                                                                      
--rpcpassword password \                                                               
--rpchost http://127.0.0.1:18443/wallet/sender \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 63949 \                                                                                         
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com" \        
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
send --fee-rate 2 "bitcoin:bcrt1q9d7c77wthrglfkjqa82hye82vfy9yg7xyrn6hv?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/K5HTTVA0RTWES%23EX1NCJVK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1QVR8C7ARCNZSUKSNEPMMR0JPSQV95VQYGRZS6RUNEU906VHUEQ95X"
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.54s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/sender' --asmap kartograf/out/1774697080/final_result.txt --user-asn 63949 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' send --fee-rate 2 'bitcoin:bcrt1q9d7c77wthrglfkjqa82hye82vfy9yg7xyrn6hv?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/K5HTTVA0RTWES%23EX1NCJVK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1QVR8C7ARCNZSUKSNEPMMR0JPSQV95VQYGRZS6RUNEU906VHUEQ95X'`
2026-03-30T01:35:21.474892Z DEBUG payjoin_cli::app::wallet: Fee rate sat/vb: 2
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:35:21.521247Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded, using for relay selection with fixed directory
2026-03-30T01:35:21.689787Z DEBUG reqwest::connect: starting new connection: https://mailroom.luisschwab.net/
2026-03-30T01:35:21.689827Z DEBUG reqwest::connect: proxy(https://ohttp.achow101.com/) intercepts 'https://mailroom.luisschwab.net/'
2026-03-30T01:35:21.691568Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:35:21.845616Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
2026-03-30T01:35:23.394845Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", mailroom.luisschwab.net)
2026-03-30T01:35:23.411615Z DEBUG payjoin::core::send::v2: ohttp_relay_url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("ohttp.achow101.com")), port: None, path: "/https://mailroom.luisschwab.net/", query: None, fragment: None }
2026-03-30T01:35:23.412183Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:35:23.418829Z DEBUG hyper_util::client::legacy::connect::http: connecting to 208.68.4.72:443
2026-03-30T01:35:23.534995Z DEBUG hyper_util::client::legacy::connect::http: connected to 208.68.4.72:443
Posted original proposal...
2026-03-30T01:35:24.558030Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:35:24.563484Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:35:24.707373Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
Proposal received. Processing...
Payjoin sent. TXID: c7ac4e298701d99d8de44692a94db7c86629d3e7e99beac1fd85c3e557d41da5



RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/receiver \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 174 \     
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com,https://mailroom.luisschwab.net/" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
receive 10000
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.59s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/receiver' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 174 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com,https://mailroom.luisschwab.net/' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' receive 10000`
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:36:50.915203Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded successfully, using AS-aware directory selection
2026-03-30T01:36:50.974405Z DEBUG payjoin_cli::app::v2::ohttp: Selected directory: https://mailroom.luisschwab.net/
2026-03-30T01:36:51.031139Z DEBUG reqwest::connect: starting new connection: https://mailroom.luisschwab.net/
2026-03-30T01:36:51.031173Z DEBUG reqwest::connect: proxy(https://ohttp.cakewallet.com/) intercepts 'https://mailroom.luisschwab.net/'
2026-03-30T01:36:51.032403Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:36:51.132792Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
2026-03-30T01:36:52.442336Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", mailroom.luisschwab.net)
Receive session established
Request Payjoin by sharing this Payjoin Uri:
bitcoin:bcrt1qzfuljkm6gpy8cgyw76tdvmye680u9h640djqlc?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/07CNS083636U5%23EX1XSJUK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1Q27NFR4C3D8NRR2E6C64J2MYLHGCXWYJL323VVPDT6QY94QJW7S2U
Polling receive request...
2026-03-30T01:36:52.458305Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:36:52.460246Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:36:52.553595Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Polling receive request...
2026-03-30T01:37:23.413761Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:37:23.419840Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:37:23.513877Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Polling receive request...
2026-03-30T01:37:53.996893Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:37:54.003292Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:37:54.201746Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Got a request from the sender. Responding with a Payjoin proposal.
Fallback transaction received. Consider broadcasting this to get paid if the Payjoin fails:
02000000000101a4597e4f9c19dc57097760bc64fd3fca14a7d64f5ef9fb8e3eb03bdb7b6a6c2f0100000000fdffffff022490f505000000001600145192339eb0271737ac1c44b4495ae496f1cc391e10270000000000001600141279f95b7a40487c208ef696d66c99d1dfc2df550247304402203eaf4be2f7064230f353c48f19bce017187373e02409156ee2cfcadf1429c98702200b730c44e13eeee7083e2e61fe15f70fa5968b159c515e583729888e1c0cc9cf0121024376793670421ab8058ac9976ffcbd36bff3ebb3c109a7c8ccef99ed72b05b92ba010000
2026-03-30T01:38:05.499905Z DEBUG payjoin::core::receive::common: min_fee_rate: FeeRate(500)
2026-03-30T01:38:05.511419Z DEBUG reqwest::connect: starting new connection: https://ohttp.cakewallet.com/
2026-03-30T01:38:05.513744Z DEBUG hyper_util::client::legacy::connect::http: connecting to 45.79.253.179:443
2026-03-30T01:38:05.608215Z DEBUG hyper_util::client::legacy::connect::http: connected to 45.79.253.179:443
Response successful. Watch mempool for successful Payjoin. TXID: ea01952385a2f837fd6e1398e85eb4eea875ed02ad69bdc091215880132c197b
2026-03-30T01:38:06.075684Z DEBUG payjoin_cli::app::v2: Polling for payment confirmation
Payjoin transaction detected in the mempool!



RUST_LOG=debug cargo run -p payjoin-cli -- \
--rpcuser user \
--rpcpassword password \
--rpchost http://127.0.0.1:18443/wallet/sender \
--asmap /kartograf/out/1774697080/final_result.txt \
--user-asn 13335 \
--ohttp-relays "https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com,https://mailroom.luisschwab.net/" \
--pj-directories "https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/" \
send --fee-rate 2 "bitcoin:bcrt1qzfuljkm6gpy8cgyw76tdvmye680u9h640djqlc?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/07CNS083636U5%23EX1XSJUK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1Q27NFR4C3D8NRR2E6C64J2MYLHGCXWYJL323VVPDT6QY94QJW7S2U"
  Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.61s
   Running `target/debug/payjoin-cli --rpcuser user --rpcpassword password --rpchost 'http://127.0.0.1:18443/wallet/sender' --asmap /kartograf/out/1774697080/final_result.txt --user-asn 13335 --ohttp-relays 'https://ohttp.achow101.com,https://pj.bobspacebkk.com,https://ohttp.cakewallet.com,https://mailroom.luisschwab.net/' --pj-directories 'https://payjo.in,https://pj.bobspacebkk.com/,https://mailroom.luisschwab.net/,https://payjoin.achow101.com/' send --fee-rate 2 'bitcoin:bcrt1qzfuljkm6gpy8cgyw76tdvmye680u9h640djqlc?amount=0.0001&pjos=0&pj=HTTPS://MAILROOM.LUISSCHWAB.NET/07CNS083636U5%23EX1XSJUK6G-OH1QYP7Y4ZCU37F4QEQAJMDZZMH76HD93E9EUYWZJCKUE698W66DY49SYG-RK1Q27NFR4C3D8NRR2E6C64J2MYLHGCXWYJL323VVPDT6QY94QJW7S2U'`
2026-03-30T01:38:02.566647Z DEBUG payjoin_cli::app::wallet: Fee rate sat/vb: 2
Bootstrapping private network transport over Oblivious HTTP
2026-03-30T01:38:02.610475Z DEBUG payjoin_cli::app::v2::ohttp: ASmap loaded, using for relay selection with fixed directory
2026-03-30T01:38:02.696377Z DEBUG reqwest::connect: starting new connection: https://mailroom.luisschwab.net/
2026-03-30T01:38:02.696423Z DEBUG reqwest::connect: proxy(https://ohttp.achow101.com/) intercepts 'https://mailroom.luisschwab.net/'
2026-03-30T01:38:02.698124Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:38:02.860293Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
2026-03-30T01:38:04.275544Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("https", mailroom.luisschwab.net)
2026-03-30T01:38:04.290434Z DEBUG payjoin::core::send::v2: ohttp_relay_url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("ohttp.achow101.com")), port: None, path: "/https://mailroom.luisschwab.net/", query: None, fragment: None }
2026-03-30T01:38:04.290861Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:38:04.293515Z DEBUG hyper_util::client::legacy::connect::http: connecting to 208.68.4.72:443
2026-03-30T01:38:04.408678Z DEBUG hyper_util::client::legacy::connect::http: connected to 208.68.4.72:443
Posted original proposal...
2026-03-30T01:38:05.431838Z DEBUG reqwest::connect: starting new connection: https://ohttp.achow101.com/
2026-03-30T01:38:05.437838Z DEBUG hyper_util::client::legacy::connect::http: connecting to [2602:f480:ac:c010::72]:443
2026-03-30T01:38:05.583662Z DEBUG hyper_util::client::legacy::connect::http: connected to [2602:f480:ac:c010::72]:443
Proposal received. Processing...
Payjoin sent. TXID: ea01952385a2f837fd6e1398e85eb4eea875ed02ad69bdc091215880132c197b

@coveralls
Copy link
Copy Markdown
Collaborator

Pull Request Test Coverage Report for Build 23728712726

Details

  • 442 of 588 (75.17%) changed or added relevant lines in 6 files are covered.
  • 1 unchanged line in 1 file lost coverage.
  • Overall coverage decreased (-0.4%) to 83.724%

Changes Missing Coverage Covered Lines Changed/Added Lines %
payjoin-cli/src/app/config.rs 27 28 96.43%
payjoin-cli/src/app/v2/mod.rs 45 56 80.36%
payjoin-cli/src/app/v2/asmap.rs 225 254 88.58%
payjoin-cli/src/app/v2/ohttp.rs 137 242 56.61%
Files with Coverage Reduction New Missed Lines %
payjoin-cli/src/app/v2/mod.rs 1 56.19%
Totals Coverage Status
Change from base Build 23607944477: -0.4%
Covered Lines: 11070
Relevant Lines: 13222

💛 - Coveralls

Copy link
Copy Markdown
Contributor

@Mshehu5 Mshehu5 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for taking this on!

Just took a quick look at the approach as this is still in draft will take better look later

Even though this is in draft just incase this is something you will keep working on please make sure to add commits messages as decribed in https://github.com/payjoin/rust-payjoin/blob/master/.github/CONTRIBUTING.md#commits

this will help reviewers and also incase when this gets merged to keep track of changes easier

Comment on lines +348 to +359
/// Override the generated receiver keypair with a specific keypair.
///
/// Added for AS-aware relay selection: the receiver pubkey must
/// be known before the session is created to use as a deterministic seed
/// shared with the sender.
///
/// This is the minimal change to unblock the PoC. Exposing keypair
/// on the public API may not be the right long-term design
pub fn with_receiver_keypair(self, keypair: HpkeKeyPair) -> Self {
Self(SessionContext { receiver_key: keypair, ..self.0 })
}

Copy link
Copy Markdown
Contributor

@Mshehu5 Mshehu5 Mar 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Though minimal I agree this is not the right long term design cause it might be a footgun by exposing/overiding the receiver key to downstream and also this may have privacy concerns.
I think thats why in the API, ReceiverBuilder (line 311) owns key generation internally by calling HpkeKeyPair::gen_keypair() (line 321)

Also this might cause issues for other protocol values that use it e.g:
proposal_mailbox_id , pj_uri , Incoming v2 payloads are decrypted with the receiver secret key,
Outgoing replies are encrypted with the same receiver keypair at create_post_request.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, why would the receiver key leak in this case? i do agree that the "make invalid state unrepresentable" maxim applies in this case, so i agree with the feedback but i could not follow the rationale

Comment on lines 870 to +874
async fn unwrap_relay_or_else_fetch(
&self,
directory: Option<impl payjoin::IntoUrl>,
receiver_pubkey: Option<&[u8; 33]>,
role: RelayRole,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one thing to note is relay choice is still app global in this PR so the new per-session AS aware selection can be overridden by other sessions because unwrap_relay_or_else_fetch in payjoin-cli keeps one shared relaymanager for all sessions. Once one session sets selected_relay later sessions will probably skip the receiver_pubkey/role-based ordering this may defeat the purpose of this PR

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the selection logic implemented here should work for per session relay selection as well, and part of the original idea was for the receiver and sender to use the same shared secret to derive opposing orders so the role would still be important, so while the interface might change, the purpose of this PR would not be obviated, it implements stronger protection against a passive adversary than just random selection that still makes sense even if only for retrying logic.

if two relays from the same compromised AS are chosen by both sender and receiver then their network metadata will be linkable, and their combined activity will be temporally linkable to potential payjoin transactions. if the network metadata is linkable to PII that is in turn related to clustering information, this could cause a complete breakdown of the payjoin privacy model.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry I may not have been clear in my earlier comment. I am not saying the AS-aware role ordering is unnecessary. I agree that still makes sense as a privacy improvement.

My concern is narrower and specific to the current payjoin-cli wiring. The chosen relay is kept in RelayManager.selected_relay and App holds a single shared RelayManager for the whole process. In unwrap_relay_or_else_fetch() we first check get_selected_relay() and return it immediately if it is already set. So once one session sets selected_relay later sessions may just reuse that relay and never re-run the per-session AS-aware role-based ordering. The issue I meant to point out is the scope of that cached relay state in this PR’s current implementation which I think would need to be addressed rather than the value of the selection logic itself.

@bc1cindy
Copy link
Copy Markdown
Contributor Author

thanks for the review @Mshehu5

Once one session sets selected_relay later sessions will probably skip the receiver_pubkey/role-based ordering this may defeat the purpose of this PR

imo, the test analysis still valid, because this would only manifests after the first relay is selected.

since I worked on this PoC just to follow my curiosity, its not my actual focus and I didn't know it was in your scope, if needed you can feel totally free to take it on and keep going, ok?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants