Skip to content

Make mac release binaries runnable without nix - #2795

Open
vrom911 wants to merge 1 commit into
masterfrom
vrom911/mac-release-partial-fanout
Open

Make mac release binaries runnable without nix#2795
vrom911 wants to merge 1 commit into
masterfrom
vrom911/mac-release-partial-fanout

Conversation

@vrom911

@vrom911 vrom911 commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

The pre-built mac binaries hard-linked their libraries from /nix/store, so they only launched on a machine that had nix installed. On a plain mac dyld could not find those paths and the binaries would not start at all.

This fixes the packaging step. The libiconv rewrite now matches the versioned name so hydra-node points at the macOS system copy, and the libraries that macOS does not ship (libsodium-vrf, secp256k1, gmp, ncursesw) get bundled next to the binaries with dylibbundler and referenced via @executable_path. Verified on a fresh nix build .#release that both binaries have no /nix/store paths left, stay validly signed and launch fine.

Fixes #2461


  • CHANGELOG updated or not needed
  • Documentation updated or not needed
  • Haddocks updated or not needed
  • No new TODOs introduced or explained herafter

@vrom911 vrom911 self-assigned this Jul 28, 2026
@vrom911
vrom911 requested a review from a team July 28, 2026 16:23
@github-actions

Copy link
Copy Markdown

Transaction cost differences

No cost or size differences found

@github-actions

Copy link
Copy Markdown

End-to-end benchmark differences

Comparing this PR (new) against master (old). Numbers come from cloud VMs, so changes under 5% are shown as and are likely run-to-run noise rather than a real regression or improvement. 🟢 = improvement, 🔴 = regression; uncolored rows are neutral measures reported for context.

Sustained load (3 nodes, 3x5000 txs)

Metric master PR Δ
End-to-end TPS (tx/s) 485.15 458.53 🔴 -26.62 (-5.5%)
Sustained TPS (tx/s) 970.19 900.90 🔴 -69.29 (-7.1%)
Backlog drain time (s) 26.80 32.00 🔴 +5.20 (+19.4%)
Snapshots per second (/s) 0.55 0.52 -0.03 (-5.5%)
Avg txs per snapshot 882.40 882.40 ≈ +0.00 (+0.0%)
Avg. Confirmation Time (s) 25.435 26.483 ≈ +1.048 (+4.1%)
P50 confirmation (s) 26.808 27.954 ≈ +1.145 (+4.3%)
P95 confirmation (s) 30.349 32.073 🔴 +1.724 (+5.7%)
P99 confirmation (s) 30.460 32.291 🔴 +1.831 (+6.0%)
Tx validation time p50 (s) 10.973 11.006 ≈ +0.033 (+0.3%)
Peak node RSS (MB) 420.40 408.40 ≈ -12.00 (-2.9%)
Invalid txs 0.00 0.00 ≈ +0.00 (n/a%)

Plateau 1000 UTxO (1 node, 4000 txs)

Metric master PR Δ
End-to-end TPS (tx/s) 234.57 229.53 ≈ -5.04 (-2.1%)
Backlog drain time (s) 16.90 17.30 ≈ +0.40 (+2.4%)
Snapshots per second (/s) 0.41 0.40 ≈ -0.01 (-2.4%)
Avg txs per snapshot 571.40 571.40 ≈ +0.00 (+0.0%)
Avg. Confirmation Time (s) 10.930 11.210 ≈ +0.280 (+2.6%)
P50 confirmation (s) 12.219 11.455 🟢 -0.764 (-6.3%)
P95 confirmation (s) 16.952 17.334 ≈ +0.382 (+2.3%)
P99 confirmation (s) 16.953 17.335 ≈ +0.382 (+2.3%)
Tx validation time p50 (s) 4.548 5.654 🔴 +1.107 (+24.3%)
Peak node RSS (MB) 361.70 386.20 +24.50 (+6.8%)
Invalid txs 0.00 0.00 ≈ +0.00 (n/a%)

Round-trip latency (3 nodes, closed-loop, 3x250 txs)

Metric master PR Δ
End-to-end TPS (tx/s) 100.13 103.97 ≈ +3.84 (+3.8%)
Sustained TPS (tx/s) 100.94 104.43 ≈ +3.49 (+3.5%)
Backlog drain time (s) 0.00 0.00 ≈ +0.00 (n/a%)
Snapshots per second (/s) 67.55 70.15 ≈ +2.60 (+3.8%)
Avg txs per snapshot 1.50 1.50 ≈ +0.00 (+0.0%)
Avg. Confirmation Time (s) 0.030 0.029 ≈ -0.001 (-4.0%)
P50 confirmation (s) 0.029 0.028 ≈ -0.001 (-3.5%)
P95 confirmation (s) 0.039 0.037 ≈ -0.001 (-3.6%)
P99 confirmation (s) 0.045 0.042 🟢 -0.002 (-5.2%)
Tx validation time p50 (s) 0.008 0.007 ≈ -0.000 (-3.8%)
Peak node RSS (MB) 149.40 149.60 ≈ +0.20 (+0.1%)
Invalid txs 0.00 0.00 ≈ +0.00 (n/a%)

@github-actions

Copy link
Copy Markdown

Transaction costs

Sizes and execution budgets for Hydra protocol transactions. Note that unlisted parameters are currently using arbitrary values and results are not fully deterministic and comparable to previous runs.

Metadata
Generated at 2026-07-28 16:25:14.996243693 UTC
Max. memory units 14000000
Max. CPU units 10000000000
Max. tx size (kB) 16384

Script summary

Name Hash Size (Bytes)
νHead f2dd4ade71e19c2310a86215aa78aea06463aca2d8b818af8dc1b8a4 12805
μHead 4abb8dedbcd6a6f03f4fe227300e2713d73b7680d47baa898b60d27a* 4971
νDeposit c78e8c9205721eb3ef4410f3db9c6169fa6db497c24641d29c20529c 1615
νCRS 09db7ee6cf7a4b358dd5c8a2f19d2c048336ffc5a01ef35a47ca7072 2736
  • The minting policy hash is only usable for comparison. As the script is parameterized, the actual script is unique per head.

Init transaction costs

Parties Tx size % max Mem % max CPU Min fee ₳
1 5475 9.34 3.07 0.49
2 5572 9.82 3.22 0.50
3 5668 10.53 3.45 0.51
5 5860 11.13 3.63 0.52
10 6345 13.76 4.47 0.57
50 10180 35.52 11.31 0.97
100 14983 62.25 19.65 1.45
114 16327 69.34 21.86 1.59

Cost of Increment Transaction

Parties Tx size % max Mem % max CPU Min fee ₳
1 2321 21.24 7.55 0.48
2 2453 21.57 8.31 0.49
3 2584 22.62 9.31 0.51
5 2844 24.59 11.27 0.56
10 3501 29.43 16.14 0.66
50 8741 71.50 55.96 1.52
75 12018 97.46 80.76 2.05

Cost of Decrement Transaction

Parties Tx size % max Mem % max CPU Min fee ₳
1 642 18.46 6.68 0.38
2 772 19.42 7.65 0.40
3 905 20.41 8.63 0.42
5 1167 22.26 10.55 0.46
10 1822 27.19 15.45 0.56
50 7068 67.78 54.80 1.40
75 10338 93.87 79.60 1.94

Close transaction costs

Parties Tx size % max Mem % max CPU Min fee ₳
1 669 17.78 11.67 0.41
2 801 18.76 12.65 0.43
3 931 19.69 13.61 0.45
10 1853 26.46 20.44 0.59
50 7090 67.73 60.08 1.44
75 10365 93.22 84.77 1.97

Contest transaction costs

Parties Tx size % max Mem % max CPU Min fee ₳
1 701 21.50 14.91 0.46
2 832 22.64 15.93 0.48
3 963 23.77 16.96 0.51
5 1225 26.10 19.03 0.55
10 1885 31.70 24.14 0.66
50 7122 80.15 65.90 1.59
66 9218 98.80 82.40 1.95

FanOut transaction costs

Involves spending head output and burning head tokens. Uses ada-only UTXO for better comparability.

Parties UTxO UTxO (bytes) Tx size % max Mem % max CPU Min fee ₳
10 0 0 5644 23.29 42.87 0.90
10 1 57 5679 25.63 45.39 0.93
10 5 285 5814 35.88 55.71 1.10
10 10 568 5982 49.89 68.99 1.31
10 20 1139 6323 82.42 96.97 1.79
10 20 1140 6324 82.42 96.97 1.79

PartialFanOut transaction costs

Largest chunk of ada-only outputs that can be distributed in one partial fanout step, computed dynamically. The last row is the maximum total UTxO count where at least one output can still be distributed.

Distributed UTxO (bytes) Tx size % max Mem % max CPU Min fee ₳
11 570 987 34.91 66.33 0.95
25 1309 1424 68.24 99.40 1.48
30 1310 1429 68.24 99.40 1.48
40 1310 1429 68.24 99.40 1.48
50 1306 1425 68.24 99.40 1.48
100 1309 1424 68.24 99.40 1.48
150 1307 1426 68.24 99.40 1.48
200 1310 1429 68.24 99.40 1.48
200 1310 1429 68.24 99.40 1.48

PartialFanOut transaction costs (with native tokens)

Largest chunk of native-token outputs that can be distributed in one partial fanout step, computed dynamically. The last row is the maximum total UTxO count where at least one output can still be distributed.

Distributed UTxO (bytes) Tx size % max Mem % max CPU Min fee ₳
11 980 1455 42.00 68.83 1.05
25 2205 2452 76.59 99.17 1.59
30 2352 2610 76.59 99.22 1.60
40 2016 2258 76.56 99.11 1.58
50 2079 2325 76.59 99.12 1.59
100 2478 2739 76.59 99.22 1.60
150 2373 2633 76.59 99.22 1.60
200 2121 2369 76.56 99.12 1.59
200 2121 2369 76.59 99.12 1.59

FinalPartialFanOut transaction costs (with native tokens)

Terminal partial fanout step (FanoutProgress → Final) with outputs carrying a native token. Burns all head tokens and proves accumulator exhaustion via BLS proof.

Distributed UTxO (bytes) Tx size % max Mem % max CPU Min fee ₳
1 98 5518 22.10 44.30 0.89
5 525 5860 35.70 55.83 1.10
10 1120 6351 53.90 70.65 1.37
10 1090 6320 53.90 70.63 1.37

End-to-end benchmark results

This page is intended to collect the latest end-to-end benchmark results produced by Hydra's continuous integration (CI) system from the latest master code.

Please note that these results are approximate as they are currently produced from limited cloud VMs and not controlled hardware. Rather than focusing on the absolute results, the emphasis should be on relative results, such as how the timings for a scenario evolve as the code changes.

Generated at 2026-07-28 16:28:07.329996629 UTC

Baseline Scenario

Number of nodes 1
Number of txs 300
Avg. Confirmation Time (ms) 181.8
P99 189.3ms
P95 188.6ms
P50 179.7ms
Tx validation time p50 (ms) 108.5
End-to-end TPS 1558.05 tx/s
Backlog drain time (s) 0.2
Snapshots observed 3
Snapshots per second 15.58 /s
Avg txs per snapshot 100.0
Peak node RSS (MB) 144.9
Number of Invalid txs 0
Fanout outputs 2

Three local nodes

Number of nodes 3
Number of txs 900
Avg. Confirmation Time (ms) 827.0
P99 883.9ms
P95 883.4ms
P50 846.8ms
Tx validation time p50 (ms) 433.6
End-to-end TPS 1012.09 tx/s
Backlog drain time (s) 0.9
Snapshots observed 3
Snapshots per second 3.37 /s
Avg txs per snapshot 300.0
Peak node RSS (MB) 148.5
Number of Invalid txs 0
Fanout outputs 4

Scenario benchmark results

This page collects results from the scenario matrix: every combination of cluster size, UTxO shape, and incremental-ops mode is exercised by CI from the latest master code and reported below.

Numbers are approximate. They come from cloud VMs rather than controlled hardware, so the useful signal is the relative change between cells and between commits, not the absolute throughput.

Generated at 2026-07-28 16:41:29.300087285 UTC

Summary across cells

TPS columns are rates (transactions per second); Wall clock (s) is the measured elapsed time from the first tx submission to the last confirmation. Times are rounded to one decimal.

Scenario Txs Wall clock (s) End-to-end TPS (tx/s) Sustained TPS (tx/s) Avg conf (ms) P95 conf (ms)
Nodes=1, Constant, fire and forget 30 0.0 1144.51 n/a 25.5 25.9
Nodes=1, Constant, wait for tx valid 30 0.2 188.62 189.31 5.2 6.2
Nodes=1, Growing, fire and forget 30 0.0 1004.55 n/a 29.0 29.6
Nodes=1, Growing, wait for tx valid 30 0.2 143.34 143.26 6.9 8.7
Nodes=1, Mixed, fire and forget 30 0.0 1023.81 n/a 28.6 29.0
Nodes=1, Mixed, wait for tx valid 30 0.2 160.22 156.74 6.2 7.8
Nodes=2, Constant, fire and forget 60 0.1 730.25 n/a 81.3 82.0
Nodes=2, Constant, wait for tx valid 60 0.5 116.94 116.33 16.9 22.9
Nodes=2, Growing, fire and forget 60 0.1 787.37 n/a 74.5 76.0
Nodes=2, Growing, wait for tx valid 60 0.7 84.08 83.40 23.5 29.6
Nodes=2, Mixed, fire and forget 60 0.1 1027.10 n/a 55.9 57.7
Nodes=2, Mixed, wait for tx valid 60 0.7 88.41 84.01 22.4 30.3
Nodes=3, Constant, fire and forget 90 0.1 780.33 n/a 111.1 112.2
Nodes=3, Constant, wait for tx valid 90 0.9 100.72 99.51 29.5 38.3
Nodes=3, Growing, fire and forget 90 0.2 517.60 n/a 170.3 172.8
Nodes=3, Growing, wait for tx valid 90 1.4 64.14 63.27 45.4 68.2
Nodes=3, Mixed, fire and forget 90 0.2 550.78 n/a 160.8 163.2
Nodes=3, Mixed, wait for tx valid 90 1.2 77.80 73.96 38.0 53.1

Nodes=1, Constant, fire and forget

Number of nodes 1
Number of txs 30
Avg. Confirmation Time (ms) 25.5
P99 26.0ms
P95 25.9ms
P50 25.7ms
Tx validation time p50 (ms) 12.9
End-to-end TPS 1144.51 tx/s
Backlog drain time (s) 0.0
Snapshots observed 2
Snapshots per second 76.30 /s
Avg txs per snapshot 15.0
Peak node RSS (MB) 144.1
Number of Invalid txs 0
Fanout outputs 2

Nodes=1, Constant, wait for tx valid

Number of nodes 1
Number of txs 30
Avg. Confirmation Time (ms) 5.2
P99 6.4ms
P95 6.2ms
P50 5.1ms
Tx validation time p50 (ms) 1.8
End-to-end TPS 188.62 tx/s
Sustained TPS 189.31 tx/s
Backlog drain time (s) 0.0
Snapshots observed 30
Snapshots per second 188.62 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 145.1
Number of Invalid txs 0
Fanout outputs 2

Nodes=1, Growing, fire and forget

Number of nodes 1
Number of txs 30
Avg. Confirmation Time (ms) 29.0
P99 29.6ms
P95 29.6ms
P50 29.3ms
Tx validation time p50 (ms) 10.8
End-to-end TPS 1004.55 tx/s
Backlog drain time (s) 0.0
Snapshots observed 2
Snapshots per second 66.97 /s
Avg txs per snapshot 15.0
Peak node RSS (MB) 144.6
Number of Invalid txs 0
Fanout outputs 31

Nodes=1, Growing, wait for tx valid

Number of nodes 1
Number of txs 30
Avg. Confirmation Time (ms) 6.9
P99 9.2ms
P95 8.7ms
P50 6.7ms
Tx validation time p50 (ms) 1.9
End-to-end TPS 143.34 tx/s
Sustained TPS 143.26 tx/s
Backlog drain time (s) 0.0
Snapshots observed 30
Snapshots per second 143.34 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 145.9
Number of Invalid txs 0
Fanout outputs 31

Nodes=1, Mixed, fire and forget

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 1
Number of txs 30
Avg. Confirmation Time (ms) 28.6
P99 29.1ms
P95 29.0ms
P50 28.7ms
Tx validation time p50 (ms) 12.4
End-to-end TPS 1023.81 tx/s
Backlog drain time (s) 0.0
Snapshots observed 2
Snapshots per second 68.25 /s
Avg txs per snapshot 15.0
Peak node RSS (MB) 143.2
Number of Invalid txs 0
Fanout outputs 2

Nodes=1, Mixed, wait for tx valid

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 1
Number of txs 30
Avg. Confirmation Time (ms) 6.2
P99 8.1ms
P95 7.8ms
P50 6.1ms
Tx validation time p50 (ms) 1.8
End-to-end TPS 160.22 tx/s
Sustained TPS 156.74 tx/s
Backlog drain time (s) 0.0
Snapshots observed 30
Snapshots per second 160.22 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 144.4
Number of Invalid txs 0
Fanout outputs 2

Nodes=2, Constant, fire and forget

Number of nodes 2
Number of txs 60
Avg. Confirmation Time (ms) 81.3
P99 82.1ms
P95 82.0ms
P50 81.5ms
Tx validation time p50 (ms) 49.4
End-to-end TPS 730.25 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 24.34 /s
Avg txs per snapshot 30.0
Peak node RSS (MB) 144.4
Number of Invalid txs 0
Fanout outputs 3

Nodes=2, Constant, wait for tx valid

Number of nodes 2
Number of txs 60
Avg. Confirmation Time (ms) 16.9
P99 27.2ms
P95 22.9ms
P50 16.0ms
Tx validation time p50 (ms) 4.1
End-to-end TPS 116.94 tx/s
Sustained TPS 116.33 tx/s
Backlog drain time (s) 0.0
Snapshots observed 60
Snapshots per second 116.94 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 144.6
Number of Invalid txs 0
Fanout outputs 3

Nodes=2, Growing, fire and forget

Number of nodes 2
Number of txs 60
Avg. Confirmation Time (ms) 74.5
P99 76.0ms
P95 76.0ms
P50 75.0ms
Tx validation time p50 (ms) 25.8
End-to-end TPS 787.37 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 26.25 /s
Avg txs per snapshot 30.0
Peak node RSS (MB) 145.3
Number of Invalid txs 0
Fanout outputs 62

Nodes=2, Growing, wait for tx valid

Number of nodes 2
Number of txs 60
Avg. Confirmation Time (ms) 23.5
P99 34.4ms
P95 29.6ms
P50 23.5ms
Tx validation time p50 (ms) 7.8
End-to-end TPS 84.08 tx/s
Sustained TPS 83.40 tx/s
Backlog drain time (s) 0.0
Snapshots observed 60
Snapshots per second 84.08 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 147.1
Number of Invalid txs 0
Fanout outputs 62

Nodes=2, Mixed, fire and forget

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 2
Number of txs 60
Avg. Confirmation Time (ms) 55.9
P99 58.0ms
P95 57.7ms
P50 56.0ms
Tx validation time p50 (ms) 24.0
End-to-end TPS 1027.10 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 34.24 /s
Avg txs per snapshot 30.0
Peak node RSS (MB) 145.4
Number of Invalid txs 0
Fanout outputs 3

Nodes=2, Mixed, wait for tx valid

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 2
Number of txs 60
Avg. Confirmation Time (ms) 22.4
P99 32.4ms
P95 30.3ms
P50 22.7ms
Tx validation time p50 (ms) 6.3
End-to-end TPS 88.41 tx/s
Sustained TPS 84.01 tx/s
Backlog drain time (s) 0.0
Snapshots observed 60
Snapshots per second 88.41 /s
Avg txs per snapshot 1.0
Peak node RSS (MB) 146.2
Number of Invalid txs 0
Fanout outputs 3

Nodes=3, Constant, fire and forget

Number of nodes 3
Number of txs 90
Avg. Confirmation Time (ms) 111.1
P99 112.6ms
P95 112.2ms
P50 111.9ms
Tx validation time p50 (ms) 61.4
End-to-end TPS 780.33 tx/s
Backlog drain time (s) 0.1
Snapshots observed 2
Snapshots per second 17.34 /s
Avg txs per snapshot 45.0
Peak node RSS (MB) 145.4
Number of Invalid txs 0
Fanout outputs 4

Nodes=3, Constant, wait for tx valid

Number of nodes 3
Number of txs 90
Avg. Confirmation Time (ms) 29.5
P99 42.4ms
P95 38.3ms
P50 28.4ms
Tx validation time p50 (ms) 7.8
End-to-end TPS 100.72 tx/s
Sustained TPS 99.51 tx/s
Backlog drain time (s) 0.0
Snapshots observed 61
Snapshots per second 68.27 /s
Avg txs per snapshot 1.5
Peak node RSS (MB) 145.5
Number of Invalid txs 0
Fanout outputs 4

Nodes=3, Growing, fire and forget

Number of nodes 3
Number of txs 90
Avg. Confirmation Time (ms) 170.3
P99 172.9ms
P95 172.8ms
P50 171.5ms
Tx validation time p50 (ms) 47.2
End-to-end TPS 517.60 tx/s
Backlog drain time (s) 0.2
Snapshots observed 2
Snapshots per second 11.50 /s
Avg txs per snapshot 45.0
Peak node RSS (MB) 146.5
Number of Invalid txs 0
Fanout outputs 0

Nodes=3, Growing, wait for tx valid

Number of nodes 3
Number of txs 90
Avg. Confirmation Time (ms) 45.4
P99 71.5ms
P95 68.2ms
P50 43.5ms
Tx validation time p50 (ms) 12.0
End-to-end TPS 64.14 tx/s
Sustained TPS 63.27 tx/s
Backlog drain time (s) 0.0
Snapshots observed 62
Snapshots per second 44.19 /s
Avg txs per snapshot 1.5
Peak node RSS (MB) 147.8
Number of Invalid txs 0
Fanout outputs 0

Nodes=3, Mixed, fire and forget

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 3
Number of txs 90
Avg. Confirmation Time (ms) 160.8
P99 163.3ms
P95 163.2ms
P50 160.8ms
Tx validation time p50 (ms) 48.3
End-to-end TPS 550.78 tx/s
Backlog drain time (s) 0.2
Snapshots observed 2
Snapshots per second 12.24 /s
Avg txs per snapshot 45.0
Peak node RSS (MB) 144.5
Number of Invalid txs 0
Fanout outputs 4

Nodes=3, Mixed, wait for tx valid

Each client first grows its UTxO set (1-in to 2-out) for half of its tx budget, then contracts it back (2-in to 1-out) for the remainder.

Number of nodes 3
Number of txs 90
Avg. Confirmation Time (ms) 38.0
P99 56.2ms
P95 53.1ms
P50 36.9ms
Tx validation time p50 (ms) 9.9
End-to-end TPS 77.80 tx/s
Sustained TPS 73.96 tx/s
Backlog drain time (s) 0.0
Snapshots observed 62
Snapshots per second 53.59 /s
Avg txs per snapshot 1.5
Peak node RSS (MB) 146.6
Number of Invalid txs 0
Fanout outputs 4

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.

Check that the pre-built mac binary can partial fanout

1 participant