Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
311 commits
Select commit Hold shift + click to select a range
e2cff1f
mcp-02: add domain-separated proposer/relay schedules
aeyakovenko Feb 8, 2026
aafd471
core: verify MCP shred roles against slot schedules
aeyakovenko Feb 8, 2026
f2ba73c
mcp: harden legacy/latest transaction parsing
aeyakovenko Feb 8, 2026
570d8e1
mcp-01: add MCP v1 feature gate and protocol constants
aeyakovenko Feb 8, 2026
6e7e6d5
banking-stage: enforce MCP fee payer tracker in scheduler
aeyakovenko Feb 8, 2026
a4b0325
mcp-06: add MCP erasure encode/reconstruct helper
aeyakovenko Feb 8, 2026
4a9d025
mcp-01: add MCP v1 feature gate and protocol constants
aeyakovenko Feb 8, 2026
d186a76
turbine: RS-encode MCP proposer dispatch and harden state
aeyakovenko Feb 8, 2026
a93a0ab
mcp-01: add MCP v1 feature gate and protocol constants
aeyakovenko Feb 8, 2026
0b2790c
core: harden MCP relay verification and fallback handling
aeyakovenko Feb 8, 2026
1879ea1
mcp-01: add MCP v1 feature gate and protocol constants
aeyakovenko Feb 8, 2026
6e623c6
core: validate relay attestation entry bounds and encoding
aeyakovenko Feb 8, 2026
085a08b
mcp-01: add MCP v1 feature gate and protocol constants
aeyakovenko Feb 8, 2026
8a5bd1b
ledger: preserve aggregate signature validity under filtering
aeyakovenko Feb 8, 2026
2ba7c98
ledger: domain-separate consensus block signatures
aeyakovenko Feb 8, 2026
e3cc3cc
mcp-01: add MCP v1 feature gate and protocol constants
aeyakovenko Feb 8, 2026
3ead825
core: harden MCP vote gate fallback and thresholds
aeyakovenko Feb 8, 2026
4056f16
mcp-01: add MCP v1 feature gate and protocol constants
aeyakovenko Feb 8, 2026
e98b284
ledger: preserve reconstruction shards on failure
aeyakovenko Feb 8, 2026
3883b3a
mcp-01: add MCP v1 feature gate and protocol constants
aeyakovenko Feb 8, 2026
1ada6b4
runtime: gate MCP fee components behind feature flag
aeyakovenko Feb 8, 2026
32fb71b
ledger: centralize MCP schedule and erasure constants
aeyakovenko Feb 8, 2026
5056f82
ledger: centralize MCP schedule and erasure constants
aeyakovenko Feb 8, 2026
0461276
ledger: keep relay attestations when filtering invalid proposer entries
aeyakovenko Feb 8, 2026
ea4ae62
turbine: build MCP proposer payload from entry transactions
aeyakovenko Feb 8, 2026
efebb7c
core: avoid MCP relay cache poisoning from invalid shreds
aeyakovenko Feb 8, 2026
22ebb7a
core: bound relay attestation frames and classify send failures
aeyakovenko Feb 8, 2026
3920b1b
ledger: align consensus block signing bytes and size bounds
aeyakovenko Feb 8, 2026
bb1a406
core: require MCP vote-gate input before voting MCP slots
aeyakovenko Feb 8, 2026
2a0d7f4
ledger: poison MCP reconstruction state after commitment mismatch
aeyakovenko Feb 8, 2026
f8e3917
fee: scale MCP fee components and tighten parser mask validation
aeyakovenko Feb 8, 2026
72d7f35
cost-model: satisfy StaticMeta MCP fee components hook
aeyakovenko Feb 8, 2026
dcef250
cleanup
aeyakovenko Feb 8, 2026
44d4112
ledger: harden MCP shred classifier
aeyakovenko Feb 8, 2026
9172209
ledger: align MCP schedule seed derivation
aeyakovenko Feb 8, 2026
d770c86
ledger: add MCP shred wire format module
aeyakovenko Feb 8, 2026
40943b8
ledger: harden MCP shred classifier
aeyakovenko Feb 8, 2026
4e26dc0
core: reuse canonical MCP shred codec in relay
aeyakovenko Feb 8, 2026
d345022
mcp-10: add RelayAttestation v1 wire codec and signature checks
aeyakovenko Feb 8, 2026
3c7478a
core: delegate relay attestation codec to ledger
aeyakovenko Feb 8, 2026
5642654
core: make MCP vote gate input non-consuming
aeyakovenko Feb 8, 2026
6e85dce
ledger: isolate MCP blockstore writes behind dedicated lock
aeyakovenko Feb 8, 2026
33bcc31
core: persist MCP fee payer tracking across receive loops
aeyakovenko Feb 8, 2026
29cd685
svm: validate fee payer in skip-fee mode
aeyakovenko Feb 8, 2026
e6996c0
ledger: cap aggregate attestation wire size
aeyakovenko Feb 8, 2026
7a270f9
ledger: bound consensus block wire size
aeyakovenko Feb 8, 2026
b66fef2
ledger: add MCP shred wire format module
aeyakovenko Feb 8, 2026
57aba39
ledger: harden MCP shred classifier
aeyakovenko Feb 8, 2026
54721fa
turbine: encode proposer shreds via canonical MCP shred type
aeyakovenko Feb 8, 2026
4207b84
ledger: guard threshold helper against zero denominator
aeyakovenko Feb 8, 2026
8875d18
ledger: cache Reed-Solomon instance for MCP erasure
aeyakovenko Feb 8, 2026
79cd1b1
plan: tighten MCP bounds and replay invariants
aeyakovenko Feb 8, 2026
c682d65
ledger: cap relay attestation entries to MCP proposer limit
aeyakovenko Feb 8, 2026
8bb1fa1
core: avoid dropping relay attestations on full send queue
aeyakovenko Feb 8, 2026
fc74731
core: persist MCP fee tracker across scheduler pre-graph checks
aeyakovenko Feb 8, 2026
2c40302
svm: preserve fee details in skip-fee replay mode
aeyakovenko Feb 8, 2026
f71141f
runtime-tx: require MCP fee fields for canonical latest format
aeyakovenko Feb 8, 2026
d6275f1
remove claude instructions file
aeyakovenko Feb 8, 2026
988b369
core+turbine: partition MCP shreds before legacy sigverify
aeyakovenko Feb 8, 2026
d109faa
ledger: prove MCP classifier rejects legacy merkle shreds
aeyakovenko Feb 8, 2026
ee10e93
ledger: cap aggregate wire bytes by QUIC control bound
aeyakovenko Feb 8, 2026
6ecf66a
ledger: cap consensus block wire by QUIC control bound
aeyakovenko Feb 8, 2026
b44268e
core: use non-fixed-root account view for MCP fee precheck
aeyakovenko Feb 8, 2026
adfd107
ledger: sort MCP ordering by cached fee keys
aeyakovenko Feb 8, 2026
a0a8457
turbine: route MCP shreds through retransmit addressing
aeyakovenko Feb 8, 2026
0319554
plan: align MCP ingestion and transport invariants
aeyakovenko Feb 8, 2026
19d3c82
ledger: harden MCP schedule domain and epoch cache updates
aeyakovenko Feb 8, 2026
87e1dd2
ledger: share MCP merkle helpers across erasure code
aeyakovenko Feb 8, 2026
d16489c
ledger: share MCP witness verification for shred format
aeyakovenko Feb 8, 2026
f013d2a
ledger: share MCP merkle logic in reconstruction
aeyakovenko Feb 8, 2026
140eab7
transaction-view: add MCP payload framing parser
aeyakovenko Feb 8, 2026
94582c4
ledger: share MCP witness verification for shred format
aeyakovenko Feb 8, 2026
f3b8b55
ledger: share MCP witness verification for shred format
aeyakovenko Feb 8, 2026
2da0d2c
runtime+ledger: wire MCP two-pass fee execution in replay
aeyakovenko Feb 8, 2026
c8185f3
plan: align payload parser and two-pass replay wiring
aeyakovenko Feb 8, 2026
81a9e7e
runtime: scale MCP phase-A replay fees by proposer count
aeyakovenko Feb 9, 2026
8f876a0
core: fail closed when MCP vote gate input is missing
aeyakovenko Feb 9, 2026
36100c3
ledger: gate MCP schedule cache on feature activation
aeyakovenko Feb 9, 2026
f4a96b8
core: bound relay indices and avoid blocking MCP attestation send
aeyakovenko Feb 9, 2026
1a7825f
ledger: keep MCP shred classifier layout-only
aeyakovenko Feb 9, 2026
85d6246
ledger: keep MCP shred classifier layout-only
aeyakovenko Feb 9, 2026
894daa7
ledger: keep MCP shred classifier layout-only
aeyakovenko Feb 9, 2026
9ac9ef0
ledger: avoid destructive shard take during MCP recovery
aeyakovenko Feb 9, 2026
81ec179
ledger: avoid destructive shard take during MCP recovery
aeyakovenko Feb 9, 2026
4d1a366
ledger: add MCP witness generation helper and bounds checks
aeyakovenko Feb 9, 2026
c755eee
ledger: add MCP witness generation helper and bounds checks
aeyakovenko Feb 9, 2026
18cce40
ledger: add MCP witness generation helper and bounds checks
aeyakovenko Feb 9, 2026
6da851d
ledger: add MCP witness generation helper and bounds checks
aeyakovenko Feb 9, 2026
07bd299
ledger: add MCP witness generation helper and bounds checks
aeyakovenko Feb 9, 2026
0484666
ledger: handle MCP merkle leaf-index errors in reconstruction
aeyakovenko Feb 9, 2026
f8463f0
ledger: enforce relay/proposer index bounds in MCP attestations
aeyakovenko Feb 9, 2026
6f36a5e
ledger: harden aggregate attestation index and cursor bounds
aeyakovenko Feb 9, 2026
bed07dd
ledger: replace consensus block codec magic numbers
aeyakovenko Feb 9, 2026
9722e2f
core: restore fixed-root fee checks and avoid lock unwrap panic
aeyakovenko Feb 9, 2026
dc97b7e
runtime-transaction: prefilter MCP parsing and derive legacy ordering…
aeyakovenko Feb 9, 2026
a35d1af
core: reject MCP relay shreds with out-of-range shred index
aeyakovenko Feb 9, 2026
1147e9e
ledger: cover MCP ordering duplicate and empty input cases
aeyakovenko Feb 9, 2026
afcfe95
ledger: add MCP constant helper edge-case coverage
aeyakovenko Feb 9, 2026
c7b12bb
ledger: reject empty relay attestations
aeyakovenko Feb 9, 2026
d1dd6ae
ledger: add aggregate attestation empty and duplicate-index tests
aeyakovenko Feb 9, 2026
fcb5682
plan: codify relay attestation non-empty invariant
aeyakovenko Feb 9, 2026
98ffa19
turbine: frame MCP proposer payloads with tx count and lengths
aeyakovenko Feb 9, 2026
69475bf
turbine: include proposer index in MCP retransmit dedup key
aeyakovenko Feb 9, 2026
2d00608
mcp: consolidate proposer and erasure merkle derivation
aeyakovenko Feb 9, 2026
13456fe
ledger: decode reconstructed MCP payloads with dual-format parser
aeyakovenko Feb 9, 2026
b20b4f3
ledger: avoid panic on oversized MCP schedule domain seed
aeyakovenko Feb 9, 2026
c5d56a8
ledger: propagate merkle errors in MCP erasure commitment root
aeyakovenko Feb 9, 2026
a08ee42
ledger: add MCP shred boundary and combined verify coverage
aeyakovenko Feb 9, 2026
feeb1be
ledger: add missing MCP relay attestation edge-case tests
aeyakovenko Feb 9, 2026
7ba78a6
ledger: cover invalid relay signatures in aggregate filtering
aeyakovenko Feb 9, 2026
f0edec0
ledger: document consensus meta bound and cover sign failure path
aeyakovenko Feb 9, 2026
4ebeb04
core: preserve non-MCP replay assert and avoid blocking vote gate prune
aeyakovenko Feb 9, 2026
0293a20
runtime-transaction: default missing MCP fee fields instead of saniti…
aeyakovenko Feb 9, 2026
4cda508
runtime: cover scaled MCP fee insufficiency in phase-A fee pass
aeyakovenko Feb 9, 2026
85e2f1d
turbine: count dropped MCP proposer dispatch sends
aeyakovenko Feb 9, 2026
dac3c24
plan: clarify latest MCP fee-field fallback rules
aeyakovenko Feb 9, 2026
2d80f38
runtime: avoid double nonce rent floor in MCP phase-A fee pass
aeyakovenko Feb 9, 2026
6b4dcb9
core: reject MCP vote gate decisions with no included proposers
aeyakovenko Feb 9, 2026
31283ec
ledger: split MCP blockstore write locks by column family
aeyakovenko Feb 9, 2026
61a540a
clarify mcp schedule wrap semantics and cover short epochs
aeyakovenko Feb 9, 2026
81dc6c5
ledger: tighten aggregate attestation filtering and leader bounds
aeyakovenko Feb 9, 2026
8ff5c88
fee/core: enforce MCP proposer constant consistency
aeyakovenko Feb 9, 2026
523f668
turbine: cover MCP dispatch state drain on slot completion
aeyakovenko Feb 9, 2026
17cd9e0
core: avoid cloning MCP vote gate inputs on hot path
aeyakovenko Feb 9, 2026
50efc3c
ledger: bound MCP blockstore payload sizes
aeyakovenko Feb 9, 2026
1078a98
ledger: centralize MCP relay attestation constants
aeyakovenko Feb 9, 2026
466784e
ledger: centralize MCP erasure constants
aeyakovenko Feb 9, 2026
1b741c5
ledger: centralize MCP shred constants
aeyakovenko Feb 9, 2026
972cc62
ledger: validate consensus block leader index bounds
aeyakovenko Feb 9, 2026
5591fae
plan: align relay threshold and empty-slot semantics with fixes
aeyakovenko Feb 9, 2026
4e1d71c
runtime/fee: share MCP proposer multiplier constant
aeyakovenko Feb 9, 2026
bf25da5
mcp-07: retry dispatch sends on temporary channel backpressure
aeyakovenko Feb 9, 2026
64ee0fc
mcp-16: guard threshold math against zero denominator
aeyakovenko Feb 9, 2026
b1474c5
mcp-11: retry relay attestation dispatch on transient backpressure
aeyakovenko Feb 9, 2026
f66a45d
mcp-12: document leader-agnostic relay signing domain
aeyakovenko Feb 9, 2026
25d68b6
plan: clarify leader-agnostic relay signing domain
aeyakovenko Feb 9, 2026
b133221
mcp-08: reuse fee crate proposer multiplier in svm validation
aeyakovenko Feb 9, 2026
ee7bf4c
mcp-12: share QUIC control payload cap via mcp constants
aeyakovenko Feb 9, 2026
e89cf21
mcp-13: share QUIC control payload cap via mcp constants
aeyakovenko Feb 9, 2026
c762a91
mcp-02: document schedule constant sync invariant
aeyakovenko Feb 9, 2026
780dda1
plan: track unresolved vote-gate and bankless integration blockers
aeyakovenko Feb 9, 2026
fb64c3c
Limit MCP fee checks to dedicated MCP paths
aeyakovenko Feb 9, 2026
345f4df
Accept standard Solana entries in MCP payload parser
aeyakovenko Feb 9, 2026
b9fc344
Wire production path to record_bankless when no bank
aeyakovenko Feb 9, 2026
d5a0636
Persist MCP included proposers from vote gate decisions
aeyakovenko Feb 9, 2026
9e6c492
Reject zero denominator in MCP threshold helper
aeyakovenko Feb 9, 2026
55cc7d5
Drop empty relays after aggregate equivocation filtering
aeyakovenko Feb 9, 2026
cbe475e
Add relay-index boundary coverage for attestation codec
aeyakovenko Feb 9, 2026
35fa600
Document block_id authority for MCP consensus block
aeyakovenko Feb 9, 2026
f3c0de2
Optimize MCP compat parser with legacy fast-path
aeyakovenko Feb 9, 2026
b4514d9
Add MCP epoch-boundary schedule coverage
aeyakovenko Feb 9, 2026
7f63aad
Accept standard Solana entries in MCP payload parser
aeyakovenko Feb 9, 2026
7c2d5fe
Optimize MCP compat parser with legacy fast-path
aeyakovenko Feb 9, 2026
9ca6745
core: wire MCP relay-attestation dispatch into window service
aeyakovenko Feb 9, 2026
6a696ec
turbine: avoid full decode when partitioning MCP shreds
aeyakovenko Feb 9, 2026
79a046e
turbine: assert full MCP relay fanout in dispatch test
aeyakovenko Feb 9, 2026
f0e6132
Merge issue-12 relay verification into MCP integration branch
aeyakovenko Feb 9, 2026
34a486b
core: emit relay attestations from verified MCP shred flow
aeyakovenko Feb 9, 2026
60ad33c
Merge issue-18 reconstruction primitives into integration branch
aeyakovenko Feb 9, 2026
0a23dc7
Merge issue-14 aggregate attestation into integration branch
aeyakovenko Feb 9, 2026
2ff2efe
Merge issue-1 deterministic ordering into integration branch
aeyakovenko Feb 9, 2026
e28161f
Merge issue-2 MCP blockstore into integration branch
aeyakovenko Feb 9, 2026
608b0ad
Merge issue-3 MCP encode/commit into integration branch
aeyakovenko Feb 9, 2026
e310b4d
Merge issue-4 MCP protocol constants into integration branch
aeyakovenko Feb 9, 2026
912be65
Merge issue-5 MCP schedules into integration branch
aeyakovenko Feb 9, 2026
f4113b8
Merge issue-6 MCP fee-payer checks into integration branch
aeyakovenko Feb 9, 2026
a1983c3
Merge issue-7 MCP shred format into integration branch
aeyakovenko Feb 9, 2026
09112e6
Merge issue-8 MCP two-pass fees into integration branch
aeyakovenko Feb 9, 2026
367fdb3
Merge issue-9 relay attestation codec into integration branch
aeyakovenko Feb 9, 2026
19e5a4d
Merge issue-10 bankless proposer path into integration branch
aeyakovenko Feb 9, 2026
fc4881b
Fix integration compile after strict relay attestation checks
aeyakovenko Feb 9, 2026
e7a6306
Merge issue-11 proposer distribution into integration branch
aeyakovenko Feb 9, 2026
49503f5
Merge issue-15 consensus block codec into integration branch
aeyakovenko Feb 9, 2026
a4c174b
Merge issue-16 vote gate into integration branch
aeyakovenko Feb 9, 2026
3234b5c
ledger: add MCP execution output column family
aeyakovenko Feb 8, 2026
87f960e
mcp-15: emit empty execution output for finalized missing slots
aeyakovenko Feb 8, 2026
9ddd81f
votor: atomically record empty MCP execution output
aeyakovenko Feb 8, 2026
1e4ceac
ledger: make MCP execution output writes idempotent
aeyakovenko Feb 8, 2026
97347d4
ledger: use dedicated lock for MCP execution output writes
aeyakovenko Feb 9, 2026
ee59dee
ledger: verify MCP execution output purge behavior
aeyakovenko Feb 9, 2026
7148184
votor: do not mark mismatched finalized slots as empty MCP output
aeyakovenko Feb 9, 2026
793d204
Fix MCP execution output purge chain with all MCP CFs
aeyakovenko Feb 9, 2026
ff4cd18
Merge issue-19 MCP transaction format into integration branch
aeyakovenko Feb 9, 2026
b5947db
mcp: restore bankless gating and recorder guardrails
aeyakovenko Feb 9, 2026
515a85c
core: wire MCP control-path vote gate inputs
aeyakovenko Feb 9, 2026
d42b552
core: trigger MCP reconstruction from vote-gate outputs
aeyakovenko Feb 9, 2026
50c764e
core: keep MCP-native txs in reconstruction ordering
aeyakovenko Feb 9, 2026
f8fa1cf
core: finalize MCP consensus blocks from relay attestations
aeyakovenko Feb 9, 2026
d9c6ae9
core: add MCP consensus finalization window-service tests
aeyakovenko Feb 9, 2026
c1ca4ee
core: use MCP proposer schedule for forwarding targets
aeyakovenko Feb 9, 2026
5e79eb6
plan: mark MCP release blockers as resolved
aeyakovenko Feb 9, 2026
21957f6
core: gate MCP relay dispatch by slot-effective activation
aeyakovenko Feb 9, 2026
c170c73
core: extend MCP constant consistency assertions
aeyakovenko Feb 9, 2026
ceb0f82
core: add replay test for consensus-to-votegate wiring
aeyakovenko Feb 9, 2026
2200560
core: test MCP consensus control-frame broadcast
aeyakovenko Feb 9, 2026
8688328
core: test MCP proposer-based forwarding address selection
aeyakovenko Feb 9, 2026
43ad0d9
core: make MCP relay dispatch tests sandbox-safe
aeyakovenko Feb 9, 2026
7eae2e7
turbine: harden MCP dispatch test setup and expectations
aeyakovenko Feb 9, 2026
0307316
plan: align pass 5/6 with current MCP integration path
aeyakovenko Feb 9, 2026
3f142c0
core: harden MCP control-frame routing and constant checks
aeyakovenko Feb 9, 2026
250c42c
mcp: harden vote-gate persistence and two-pass fee gating
aeyakovenko Feb 9, 2026
1bffb2b
plan: clarify MCP two-pass fee scoping and nonce debit semantics
aeyakovenko Feb 9, 2026
9d2884a
local-cluster: add MCP blockstore artifact integration test
aeyakovenko Feb 9, 2026
8181b23
mcp: harden issue-20 integration test and reduce hot-path overhead
aeyakovenko Feb 9, 2026
e47686b
plan: restore master plan.md on integration-backed issue-20 branch
aeyakovenko Feb 9, 2026
3d05fe4
mcp: remove schedule-constant duplication and add bounded send backoff
aeyakovenko Feb 9, 2026
97125f2
local-cluster: scan all validator ledgers for MCP artifact detection
aeyakovenko Feb 9, 2026
0682047
turbine: tighten MCP dispatch cache refresh and function surface
aeyakovenko Feb 10, 2026
3ed2be1
core: make MCP vote-gate prune writes explicit and observable
aeyakovenko Feb 10, 2026
39500eb
local-cluster: skip MCP integration test when UDP bind is unavailable
aeyakovenko Feb 10, 2026
7c1e9a6
mcp: harden dispatch cache/root handling and issue-20 diagnostics
aeyakovenko Feb 10, 2026
19b8ab6
mcp: handle empty outputs and stabilize issue-20 test
aeyakovenko Feb 10, 2026
cd945fb
mcp: align proposer-count constant types across fee paths
aeyakovenko Feb 10, 2026
318d47d
mcp: harden replay ingestion and reconstruction paths
aeyakovenko Feb 10, 2026
2668830
mcp: persist bank hashes and retry pending consensus finalization
aeyakovenko Feb 10, 2026
f624b04
mcp: harden integration paths and strict local-cluster validation
aeyakovenko Feb 10, 2026
6d9be2c
mcp: harden replay bridge and local-cluster integration checks
aeyakovenko Feb 11, 2026
ecc7d67
plan: sync MCP audit follow-ups and integration invariants
aeyakovenko Feb 11, 2026
fff3e42
mcp: harden issue-20 5-node integration and align replay safety
aeyakovenko Feb 11, 2026
fcb13dc
plan: encode MCP cutover and blocker decisions
aeyakovenko Feb 11, 2026
4666348
mcp: align plan policy details and refresh audit blockers
aeyakovenko Feb 11, 2026
d021ca2
plan: integrate 81bc269-compatible deltas and refresh audit
aeyakovenko Feb 11, 2026
9d394e1
plan: sync to authoritative internal commit 81bc269
aeyakovenko Feb 11, 2026
8a39669
mcp: resolve audit gaps and align plan with implementation
aeyakovenko Feb 11, 2026
254e8a0
mcp: tighten replay prep and block_id sidecar wiring
aeyakovenko Feb 11, 2026
2711778
mcp: enforce consensus-observed strict replay and re-audit plan align…
aeyakovenko Feb 11, 2026
7079e17
mcp: close audit gaps and re-audit integrated PR behavior
aeyakovenko Feb 11, 2026
503cade
mcp: make relay attestation enqueue non-blocking
aeyakovenko Feb 11, 2026
6258708
mcp: close remaining audit gaps and sync plan
aeyakovenko Feb 11, 2026
a019ec5
mcp: close remaining audit blockers for replay and proposer admission
aeyakovenko Feb 11, 2026
0dfd668
Close remaining MCP audit gaps and sync plan/audit
aeyakovenko Feb 11, 2026
b074eeb
Stabilize MCP audit items and fix relay range test expectations
aeyakovenko Feb 11, 2026
b819a89
Merge issue-20 MCP integration into master
aeyakovenko Feb 11, 2026
edba27f
audit: mark master as integrated MCP audit baseline
aeyakovenko Feb 11, 2026
80bec69
mcp: harden local-cluster integration checks and sync audit
aeyakovenko Feb 11, 2026
f8a6de5
mcp: confirm audit concerns and harden relay attestation check
aeyakovenko Feb 11, 2026
988ca10
mcp: close confirmed audit test gaps and refresh audit
aeyakovenko Feb 12, 2026
65568a2
mcp: close repair indexing and strict block-id audit blockers
aeyakovenko Feb 12, 2026
a45c302
mcp: fix audit regressions in replay deferral and block component decode
aeyakovenko Feb 12, 2026
c95a559
mcp: expand audit coverage for repair and block component paths
aeyakovenko Feb 12, 2026
f2a87a1
Wire MCP admission/dispatch/replay gaps and sync plan+audit
aeyakovenko Feb 12, 2026
db320af
mcp: preserve relay attestation signatures in ingest
aeyakovenko Feb 12, 2026
2f6e8a1
mcp: close audit gaps and align plan with implementation
aeyakovenko Feb 12, 2026
c0fbf8c
mcp: close latest audit gaps in replay and dispatch
aeyakovenko Feb 12, 2026
e12d490
mcp: address latest audit findings on repair and replay
aeyakovenko Feb 12, 2026
631f9a5
mcp test: verify included proposer execution by signature
aeyakovenko Feb 13, 2026
c98afd8
votor: harden epoch/leader/vote handling and refresh audit
aeyakovenko Feb 13, 2026
29d42ba
mcp: close medium audit findings in votor and payload parsing
aeyakovenko Feb 13, 2026
965da32
mcp: demote dead reconstruction state helper to test-only
aeyakovenko Feb 13, 2026
8717bdf
audit: refresh current open low/non-blocking items
aeyakovenko Feb 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

263 changes: 263 additions & 0 deletions audit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
# MCP Adversarial Audit — Votor Hardening + Integration Test Expansion (Master)

Date: 2026-02-13
Branch: `master` (commit `965da326b7`)
Perspective: Principal engineer + security researcher, assuming adversarial/lazy developer.
Scope: **Verify claimed V1, NEW-1, and NEW-2 fixes are genuine (not lazy relocations), confirm prior MCP fixes intact, run integration test.**

---

## Executive Summary

Two new commits: (1) `631f9a5606` expands the integration test to verify that every included proposer's payload contains at least one executed transaction (significant test strengthening), (2) `c98afd85e6` hardens votor consensus by replacing 3 panics with soft error handling and adding a 3-level leader lookup fallback.

All prior MCP fixes (H1, H2, M1, M2, N1-N4, N6, N7) remain **intact** — no core MCP files modified. Both follow-up fixes verified **genuine**: (a) parent-ready leader-lookup failure handling now has counters, bounded consecutive-failure exit after 32 misses, and watermark advancement moved after successful lookup, (b) `McpPayload::from_bytes` now bounds `tx_count` before allocation with `remaining / sizeof::<u32>()` pattern matching `blockstore_processor.rs`. Integration test **PASS** (108.64s).

### Verdicts

| Area | Status |
|------|--------|
| Local-cluster e2e test | **PASS** (108.64s) — expanded with proposer execution verification |
| Prior MCP fixes (H1, H2, M1, M2, N1-N4, N6, N7) | **ALL INTACT** — no core MCP files modified |
| Votor `consensus_metrics.rs` hardening | **CORRECT** — stale epoch counter, well tested |
| Votor `consensus_pool_service.rs` leader fallback | **FIXED** — failure counters + bounded consecutive-failure exit |
| Votor `voting_utils.rs` panic removal | **CORRECT** — graceful `NoRankFound` return |
| Votor `parent_ready_tracker.rs` min→max | **CORRECT** — builds on newest certified chain tip |
| Integration test expansion | **CORRECT** — strong end-to-end proposer execution verification |
| Plan conformance | **STRONG** — votor changes outside plan scope |
| New findings | **0 HIGH, 0 MEDIUM, 0 LOW** (net new this pass) |

---

## 1. New Commit Analysis

### Commit `631f9a5606`: Integration Test — Proposer Execution Verification

This commit adds substantial end-to-end verification to `test_local_cluster_mcp_produces_blockstore_artifacts`:

**New helper closures:**
- `first_signature_bytes_from_wire_transaction` — extracts raw `[u8; 64]` from MCP or legacy tx formats. MCP-first order matches production code. **CORRECT.**
- `maybe_refresh_transfer_stream` — rate-limits transfer submissions to 2/sec (was ~16/sec). Initial burst of 32 txns provides sufficient base pool. **CORRECT.**
- `included_commitments_for_consensus_block` — derives included proposer commitments from consensus block's aggregate attestation. Uses `filtered_valid_entries` (builds on existing code) + manual equivocation exclusion (`commitments.len() != 1`). Thresholds match production (≥120 attestations, ≥80 inclusions). **CORRECT.**
- `proposer_payload_transactions_for_commitment` — reconstructs proposer payload from blockstore shreds. Faithful copy of production logic in `mcp_replay.rs:455-557` (same shard initialization, iteration, filtering, verification, reconstruction). **CORRECT.**
- `assign_one_executed_tx_for_proposer` — matches proposer payload transactions to execution output by signature with reference counting. **CORRECT.**

**New verification section (after existing test):**
1. Derives included proposer commitments from the already-observed consensus block
2. Waits for non-empty execution output at the consensus slot (120s timeout)
3. Builds executed signature map from execution output transactions
4. For each included proposer: reconstructs payload from shreds, asserts payload non-empty, asserts at least one payload transaction appears in execution output
5. Asserts all expected proposer pubkeys are covered

**Verdict: Strong test strengthening.** This closes a significant coverage gap — the test now verifies the full pipeline from consensus block attestations through shred reconstruction to transaction execution matching at the per-proposer level.

**Note on `filtered_valid_entries`:** Previously flagged as dead code (NEW-3). The integration test is now a caller, though not a production caller. The function itself remains test-only in terms of production paths. Reclassified from MEDIUM to **LOW** since it has an important test consumer.

### Commit `c98afd85e6`: Votor Consensus Hardening

Four changes to the votor (Alpenglow consensus) crate:

#### 1. `consensus_metrics.rs` — Stale epoch handling (CORRECT)

**Old:** `assert!(epoch >= self.current_epoch)` — panics on stale epoch notification.
**New:** Soft return with `stale_epoch_events` counter.

- Counter initialized to 0 in `new()` ✓
- Counter emitted in `end_of_epoch_reporting` datapoint ✓
- Uses `saturating_add` (no overflow) ✓
- Early return prevents epoch regression ✓
- Counter resets on epoch advance (via `Self::new()`) ✓
- Tests cover both stale and forward-advance paths ✓

**Verdict: Clean implementation. No regression risk.** ConsensusMetrics is a telemetry thread, not a consensus-critical path.

#### 2. `parent_ready_tracker.rs` — `min()` to `max()` (CORRECT)

**Old:** `ss.parents_ready.iter().min()` — builds on oldest eligible parent.
**New:** `ss.parents_ready.iter().max()` — builds on newest certified chain tip.

`Block = (Slot, Hash)` with tuple `Ord` — `max()` selects highest slot. All parents in `parents_ready` are certified (notarized or notarize-fallback), so building on any is consensus-safe. The `max()` selection maximizes chain quality by extending the longest certified chain.

**Test updated:** `Parent(genesis)` → `Parent((10, _))` — correctly reflects selecting slot 10 (the highest parent-ready slot) instead of genesis.

**Verdict: Correct liveness optimization. Consensus safety maintained** because all candidates are already certified.

#### 3. `consensus_pool_service.rs` — Leader lookup fallback chain (FIXED)

**Old:** `slot_leader_at(*highest_parent_ready, Some(&root_bank))` — root bank only, fatal exit on failure.
**New:** `working_bank` → `root_bank` → `None` (cached schedule), warn + return on failure.

The 3-level fallback matches the MCP pattern in `mcp_replay.rs:58-62` (`load_proposer_schedule`). **Correct.**

Follow-up fix validates the concern and closes it:
- leader lookup failures now increment explicit stats counters
- consecutive failures are tracked and bounded with a deterministic exit
- watermark advancement no longer happens before a successful leader lookup

This removes the prior silent-skip failure mode.

#### 4. `voting_utils.rs` — Epoch stakes panic removal (CORRECT)

**Old:** `bank.epoch_stakes_from_slot(vote.slot()).unwrap_or_else(|| panic!(...))` — fatal panic.
**New:** Returns `GenerateVoteTxResult::NoRankFound` (existing transient-error variant).

Additionally, `insert_vote_and_create_bls_message` now prefers `working_bank` (if it has epoch stakes for the vote slot) over `root_bank`. This mirrors the leader lookup fallback pattern.

**Test:** `test_panic_on_future_slot` renamed to `test_future_slot_returns_none`, now asserts `Ok(None)` instead of `#[should_panic]`. **Correct behavioral change.**

**Verdict:** Safe. Missing epoch stakes is genuinely transient (startup, epoch boundaries). `NoRankFound` is an existing handled path. Votes are generated per consensus event, so subsequent attempts succeed once the bank advances.

---

## 2. Prior MCP Fix Regression Check

All 8 core MCP files verified unmodified since `e12d4904f9`:

| File | Modified? | Fix Status |
|------|-----------|------------|
| `core/src/mcp_replay.rs` | **No** | N3, N6 fixes intact |
| `core/src/mcp_vote_gate.rs` | **No** | H1 fix intact (real sig verification) |
| `core/src/repair/repair_service.rs` | **No** | N1 fix intact (multi-shred scan) |
| `core/src/repair/serve_repair.rs` | **No** | N4 fix intact (feature gate) |
| `core/src/window_service.rs` | **No** | N7 fix intact (unified constant) |
| `ledger/src/blockstore_processor.rs` | **No** | H2, N2 fixes intact |
| `ledger/src/mcp.rs` | **No** | Constants intact |
| `turbine/src/broadcast_stage/standard_broadcast_run.rs` | **No** | M1 fix intact |

---

## 3. Votor Remaining Crash Vectors

The hardening commit removed 3 panics but votor still has significant crash surface:

**Production-path panics:**
- `consensus_pool_service.rs:423` — `panic!("Must have a block production parent")` when `block_production_parent` returns `ParentNotReady`
- `consensus_pool.rs:90` — `panic!("Validator stake is zero for pubkey: {vote_key}")` during pool initialization
- `consensus_pool.rs:636` — `panic!("Should not happen while certificate pool is single threaded")`
- `voting_utils.rs:183,194,222,224` — Multiple `panic!()` for BLS keypair/authorization failures
- `vote_history.rs:106-208` — Multiple `assert!(slot >= self.root)` invariant checks

**Production-path unwraps:**
- `root_utils.rs:68,128,130,149,152` — RwLock poison + missing bank hash
- `event_handler.rs:103,611` — Channel send failure, missing block_id
- `staked_validators_cache.rs:73,86` — RwLock poison

These are not new findings from this commit but represent the remaining crash surface in votor.

---

## 4. Updated Finding Status

### Findings from this pass (net new):

| ID | Concern | Severity | Status |
|----|---------|----------|--------|
| V1 | `consensus_pool_service.rs` leader lookup silently skips block production on persistent failure | MEDIUM | **FIXED — VERIFIED GENUINE** — watermark moved after successful lookup (line 406), `consecutive_leader_lookup_failures` counter with `saturating_add`, bounded exit after 32 consecutive misses, stats emitted via `parent_ready_leader_lookup_failed` and `parent_ready_leader_lookup_exit` datapoints |

### Findings from prior passes (unchanged):

| ID | Concern | Severity | Status |
|----|---------|----------|--------|
| NEW-1 | `mcp_payload.rs` missing bounds check on `Vec::with_capacity` | MEDIUM | **FIXED — VERIFIED GENUINE** — `remaining / sizeof::<u32>()` check before allocation, new `TxCountExceedsMax` error variant, test sends `u32::MAX` and asserts rejection |
| NEW-2 | `McpReconstructionState` dead code (~90 lines pub API) | MEDIUM | **FIXED — VERIFIED GENUINE** — stateful helper and attempt enum gated to `#[cfg(test)]`, no longer part of production API surface |
| NEW-3 | `canonical_filtered` / `filtered_valid_entries` dead code | **LOW** (downgraded) | **OPEN** — `filtered_valid_entries` now has integration test caller |
| NEW-4–12 | Dead code items, unreachable arms, test gaps, fallback fragility | LOW | **OPEN** |
| M4 | Weak equivocation evidence (hash-only marker) | — | **OPEN** — non-blocking v1 tradeoff |
| N5 | O(n) nonce-less repair scan | — | **OPEN** — non-blocking performance concern |

### All prior fixes:

| ID | Concern | Status |
|----|---------|--------|
| H1 | Vote gate dead code | **FIXED** — verified intact |
| H2 | Bincode-before-MCP parse | **FIXED** — verified intact |
| M1 | Dispatch `any()` short-circuit | **FIXED** — verified intact |
| M2 | Silent reconstruction drops | **FIXED** — verified intact |
| M3 | Missing nonce test | **DISMISSED** |
| N1 | Single-shred repair rate | **FIXED** — verified intact |
| N2 | tx_count OOM vector | **FIXED** — verified intact |
| N3 | Error variant discarded | **FIXED** — verified intact |
| N4 | No serve-side feature gate | **FIXED** — verified intact |
| N6 | Dedup counter missing | **FIXED** — verified intact |
| N7 | Duplicate retention constant | **FIXED** — verified intact |
| L2 | Lock poison panic | **FIXED** |
| L3 | Missing consistency tests | **FIXED** |

### Follow-up Fix Verification (this pass)

- `votor/src/consensus_pool_service.rs`:
- parent-ready leader lookup now uses the candidate slot without advancing the watermark first.
- failure path increments `parent_ready_leader_lookup_failed`.
- persistent failures trigger bounded exit after 32 consecutive misses and increment `parent_ready_leader_lookup_exit`.
- `votor/src/consensus_pool_service/stats.rs`:
- added datapoints for `parent_ready_leader_lookup_failed` and `parent_ready_leader_lookup_exit`.
- `transaction-view/src/mcp_payload.rs`:
- added `tx_count` upper-bound validation from remaining payload bytes before `Vec::with_capacity`.
- added unit test `test_from_bytes_rejects_unbounded_tx_count`.
- `ledger/src/mcp_reconstruction.rs`:
- `McpReconstructionState` and `McpReconstructionAttempt` are now `#[cfg(test)]`.
- removes dead production API while preserving existing reconstruction-state unit tests.

---

## 5. Plan Conformance

The MCP plan (`plan.md`, 728 lines, 7 passes) contains zero mentions of votor. These changes are **outside plan scope** — they are companion hardening of the Alpenglow consensus layer that MCP depends on.

MCP-specific plan conformance remains **STRONG** from the prior audit pass (all 7 passes, acceptance invariants, feature gate, thresholds — all verified conformant).

---

## 6. Dead Code Summary (Updated)

| File | Dead Items | Severity |
|------|-----------|----------|
| `mcp_shredder.rs` | Entire module (4 pub fns) | LOW |
| `mcp_reconstruction.rs` | `McpReconstructionState` + 5 methods | **FIXED** (test-only) |
| `mcp_aggregate_attestation.rs` | `canonical_filtered` | LOW (downgraded — `filtered_valid_entries` now used in integration test) |
| `mcp_erasure.rs` | `commitment_root` | LOW |
| `mcp_ordering.rs` | `order_batches_by_fee_desc` | LOW |
| `mcp_merkle.rs` | `witness_for_leaf` | LOW |
| `mcp_shred.rs` | `is_mcp_shred_packet`, `is_mcp_shred_packet_ref` | LOW |
| `mcp_relay_attestation.rs` | `verify_proposer_signatures` | LOW |

---

## 7. Test Coverage Gaps (Updated)

| Gap | Severity |
|-----|----------|
| No test exercising per-variant error counters in `mcp_replay.rs` | LOW |
| No test for dedup counter `mcp-reconstruction-transaction-duplicate-signature-drop` | LOW |
| No negative test for `build_vote_gate_input` with bad relay/proposer signatures | LOW |
| No test for ambiguous bytes (valid as both MCP and bincode) | LOW |
| No end-to-end banking-stage MCP admission test | LOW |

**Newly covered (no longer gaps):**
- Per-proposer execution output verification — now covered by expanded integration test
- Consensus block → included commitment derivation — now covered by integration test

---

## 8. Integration Test — PASS

```
cargo test -p solana-local-cluster test_local_cluster_mcp_produces_blockstore_artifacts -- --nocapture
```

**Result: PASS** (108.64s, exit code 0). 5-node cluster with MCP activation. Test now verifies: shred+attestation+execution artifacts, consensus block, transaction inclusion, cross-node equality, AND per-proposer payload reconstruction with execution output signature matching.

---

## Current Verdict

- Prior MCP fix regressions: **0** (all 8 core MCP files unmodified)
- New high findings: **0**
- New medium findings: **0**
- Votor hardening: **4 of 4 changes CORRECT**
- Integration test expansion: **CORRECT** — significant coverage improvement
- Architectural gaps: **2** (snapshot catch-up, consensus-block recovery) — unchanged
- Non-blocking tracked items: **2** (M4 hash-only evidence, N5 O(n) scan)
- Plan conformance: **STRONG** (votor changes outside plan scope)
- Feature gate: **PASS**
- Integration test: **PASS** (108.64s)
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,13 @@ impl ComputeBudgetInstructionDetails {
})
}

pub fn requested_compute_unit_price(&self) -> u64 {
self.requested_compute_unit_price
.map_or(0, |(_, requested_compute_unit_price)| {
requested_compute_unit_price
})
}

fn process_instruction(&mut self, index: u8, instruction: &SVMInstruction) -> Result<()> {
let invalid_instruction_data_error =
TransactionError::InstructionError(index, InstructionError::InvalidInstructionData);
Expand Down
Loading