Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
306 commits
Select commit Hold shift + click to select a range
97a50d7
mcp-09: persist verified relay shreds and prune cache
aeyakovenko Feb 8, 2026
fa57a26
mcp-16: add stateful proposer reconstruction tracker
aeyakovenko Feb 8, 2026
9c69a9f
mcp: accept legacy tx bytes and apply fee components
aeyakovenko Feb 8, 2026
e5bfc4a
mcp-02: add domain-separated proposer/relay schedules
aeyakovenko Feb 8, 2026
93a5050
turbine: derive MCP roles from slot schedules
aeyakovenko Feb 8, 2026
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
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.

60 changes: 60 additions & 0 deletions audit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# MCP Audit — Post-Fix Verification (Master)

Date: 2026-02-12
Branch: `master`
Scope: Re-validated latest `audit.md` concerns against code, implemented minimal-diff fixes on `master`, and re-ran targeted + e2e tests.

## Executive Summary

- Prior high and medium findings from the latest audit pass are now closed in code.
- MCP integration remains end-to-end passing in 5-node local cluster.
- Two non-blocking items remain tracked:
- hash-only equivocation conflict marker (`McpConflictMarker`)
- O(n) nonce-less outstanding-request match path for MCP repair responses

## Concern Status

| ID | Concern | Status | Evidence |
|---|---|---|---|
| H1 | Vote-gate signature/equivocation checks dead due to pre-filtering | FIXED | `core/src/mcp_replay.rs:181` builds `VoteGateInput` from raw aggregate entries; relay/proposer signatures verified at `core/src/mcp_replay.rs:189` and `core/src/mcp_replay.rs:200`. |
| H2 | Replay bridge parsed bincode before MCP, losing MCP fee components | FIXED | MCP parse now first at `ledger/src/blockstore_processor.rs:1778`, bincode fallback second at `ledger/src/blockstore_processor.rs:1789`. |
| M1 | Dispatch `any()` short-circuit skipped remaining proposer indices | FIXED | `turbine/src/broadcast_stage/standard_broadcast_run.rs:872` iterates all proposer indices without early return; targeted-proposer path no longer aborts batch at `turbine/src/broadcast_stage/standard_broadcast_run.rs:861`. |
| M2 | Silent reconstruction tx drops | FIXED | Drops now counted with typed cause counters at `core/src/mcp_replay.rs:524`, `core/src/mcp_replay.rs:529`; aggregate drop counter at `core/src/mcp_replay.rs:519`. |
| M3 | Missing nonce fee edge coverage | DISMISSED (already covered) | Existing tests in `runtime/src/bank/tests.rs:1491` and `runtime/src/bank/tests.rs:1535`. |
| M4 | Weak equivocation evidence (hash-only marker) | OPEN (non-blocking v1 tradeoff) | `ledger/src/blockstore.rs:233` intentionally stores deterministic hashes only in `McpConflictMarker`. |
| N1 | MCP repair only requested first missing shred per proposer per scan | FIXED | `core/src/repair/repair_service.rs:706` continues scanning and enqueues multiple missing shreds up to budget. |
| N2 | `tx_count` capacity allocation from untrusted data could OOM | FIXED | Bound check added before allocation at `ledger/src/blockstore_processor.rs:1711`; reject impossible tx_count. |
| N3 | Typed reconstruction metadata error variant discarded | FIXED | Per-variant counters added at `core/src/mcp_replay.rs:524` and `core/src/mcp_replay.rs:529`. |
| N4 | No MCP feature gate on repair serve-side `McpWindowIndex` | FIXED | Serve-side gate added at `core/src/repair/serve_repair.rs:689`; pre-feature requests dropped and counted at `core/src/repair/serve_repair.rs:710`. |
| N6 | No counter for per-proposer duplicate signature drops during reconstruction | FIXED | Counter added at `core/src/mcp_replay.rs:540`. |
| N7 | MCP consensus retention slot constant duplicated in two files | FIXED | Unified via `ledger/src/mcp.rs` (`CONSENSUS_BLOCK_RETENTION_SLOTS`) and consumed in `core/src/mcp_replay.rs:318` and `core/src/window_service.rs:325`. |

## New/Updated Tests

- `core/src/repair/serve_repair.rs`:
- `test_handle_repair_mcp_window_request_requires_feature_activation`
- `ledger/src/blockstore_processor.rs`:
- `test_decode_mcp_execution_output_wire_transactions_rejects_unbounded_tx_count`
- `core/src/repair/repair_service.rs` tests updated to validate multi-shred enqueue behavior.

## Validation Runs

All commands succeeded.

- `cargo test -p solana-core test_identify_mcp_repairs_enqueues_missing_shreds -- --nocapture`
- `cargo test -p solana-core test_identify_mcp_repairs_skips_slot_with_final_execution_output -- --nocapture`
- `cargo test -p solana-core test_handle_repair_mcp_window_request_requires_feature_activation -- --nocapture`
- `cargo test -p solana-ledger test_decode_mcp_execution_output_wire_transactions_roundtrip -- --nocapture`
- `cargo test -p solana-ledger test_decode_mcp_execution_output_wire_transactions_rejects_unbounded_tx_count -- --nocapture`
- `cargo test -p solana-core mcp_replay -- --nocapture`
- `cargo test -p solana-core mcp_vote_gate -- --nocapture`
- `cargo test -p solana-turbine test_maybe_dispatch_mcp_shreds_removes_complete_slot_payload_state -- --nocapture`
- `cargo check -p solana-core -p solana-ledger -p solana-turbine`
- `cargo test -p solana-local-cluster test_local_cluster_mcp_produces_blockstore_artifacts -- --nocapture`
- PASS, 5-node run, finished in 59.49s.

## Current Verdict

- Critical blockers: **0 open**.
- Medium blockers: **0 open**.
- Remaining tracked non-blocking items: **2** (`McpConflictMarker` hash-only evidence, O(n) nonce-less outstanding request scan).
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
156 changes: 151 additions & 5 deletions core/src/banking_stage/consumer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,79 @@ use {
},
crossbeam_channel::unbounded,
itertools::Itertools,
solana_clock::MAX_PROCESSING_AGE,
solana_fee::FeeFeatures,
solana_account::ReadableAccount,
solana_clock::{Slot, MAX_PROCESSING_AGE},
solana_fee::{FeeFeatures, MCP_NUM_PROPOSERS},
solana_fee_structure::FeeBudgetLimits,
solana_measure::measure_us,
solana_nonce_account::{get_system_account_kind, SystemAccountKind},
solana_poh::{
poh_recorder::PohRecorderError,
transaction_recorder::{
RecordTransactionsSummary, RecordTransactionsTimings, TransactionRecorder,
},
},
solana_pubkey::Pubkey,
solana_runtime::{
bank::{Bank, LoadAndExecuteTransactionsOutput},
transaction_batch::TransactionBatch,
},
solana_runtime_transaction::transaction_with_meta::TransactionWithMeta,
solana_runtime_transaction::{
transaction_meta::StaticMeta, transaction_with_meta::TransactionWithMeta,
},
solana_svm::{
account_loader::validate_fee_payer,
account_loader::{validate_fee_payer, validate_fee_payer_for_mcp},
transaction_error_metrics::TransactionErrorMetrics,
transaction_processing_result::TransactionProcessingResultExtensions,
transaction_processor::{ExecutionRecordingConfig, TransactionProcessingConfig},
},
solana_transaction_error::TransactionError,
std::{num::Saturating, sync::Arc},
std::{collections::HashMap, num::Saturating, sync::Arc},
};

/// Consumer will create chunks of transactions from buffer with up to this size.
pub const TARGET_NUM_TRANSACTIONS_PER_BATCH: usize = 64;

#[derive(Default)]
pub struct McpFeePayerTracker {
current_slot: Option<Slot>,
reserved_lamports_by_payer: HashMap<Pubkey, u64>,
}

impl McpFeePayerTracker {
pub fn try_reserve(
&mut self,
slot: Slot,
payer: Pubkey,
payer_lamports: u64,
nonce_min_balance: u64,
additional_fee: u64,
) -> Result<(), TransactionError> {
if self.current_slot != Some(slot) {
self.current_slot = Some(slot);
self.reserved_lamports_by_payer.clear();
}

let available = payer_lamports
.checked_sub(nonce_min_balance)
.ok_or(TransactionError::InsufficientFundsForFee)?;
let currently_reserved = self
.reserved_lamports_by_payer
.get(&payer)
.copied()
.unwrap_or_default();
let next_reserved = currently_reserved
.checked_add(additional_fee)
.ok_or(TransactionError::InsufficientFundsForFee)?;
if next_reserved > available {
return Err(TransactionError::InsufficientFundsForFee);
}

self.reserved_lamports_by_payer.insert(payer, next_reserved);
Ok(())
}
}

pub struct ProcessTransactionBatchOutput {
// The number of transactions filtered out by the cost model
pub(crate) cost_model_throttled_transactions_count: u64,
Expand Down Expand Up @@ -312,6 +357,7 @@ impl Consumer {
recording_config: ExecutionRecordingConfig::new_single_setting(
transaction_status_sender_enabled
),
skip_fee_collection: false,
}
));
execute_and_commit_timings.load_execute_us = load_execute_us;
Expand Down Expand Up @@ -491,6 +537,85 @@ impl Consumer {
fee,
)
}

pub fn check_fee_payer_unlocked_mcp(
bank: &Bank,
transaction: &impl TransactionWithMeta,
fee_tracker: &mut McpFeePayerTracker,
error_counters: &mut TransactionErrorMetrics,
) -> Result<(), TransactionError> {
let fee_payer = transaction.fee_payer();
let fee_budget_limits = FeeBudgetLimits::from(
transaction
.compute_budget_instruction_details()
.sanitize_and_convert_to_compute_budget_limits(&bank.feature_set)?,
);
let base_fee = solana_fee::calculate_fee(
transaction,
bank.get_lamports_per_signature() == 0,
bank.fee_structure().lamports_per_signature,
fee_budget_limits.prioritization_fee,
FeeFeatures::from(bank.feature_set.as_ref()),
);
let mcp_fee_components = transaction.mcp_fee_components().unwrap_or_default();
let effective_fee = base_fee
.checked_add(mcp_fee_components.0)
.and_then(|fee| fee.checked_add(mcp_fee_components.1))
.ok_or(TransactionError::InsufficientFundsForFee)?;

let (mut fee_payer_account, _slot) = bank
.rc
.accounts
.accounts_db
.load_with_fixed_root(&bank.ancestors, fee_payer)
.ok_or(TransactionError::AccountNotFound)?;

let nonce_min_balance = match get_system_account_kind(&fee_payer_account)
.ok_or(TransactionError::InvalidAccountForFee)?
{
SystemAccountKind::System => 0,
SystemAccountKind::Nonce => bank
.rent_collector()
.rent
.minimum_balance(solana_nonce::state::State::size()),
};
let scaled_fee = effective_fee
.checked_mul(MCP_NUM_PROPOSERS as u64)
.ok_or(TransactionError::InsufficientFundsForFee)?;
fee_tracker.try_reserve(
bank.slot(),
*fee_payer,
fee_payer_account.lamports(),
nonce_min_balance,
scaled_fee,
)?;

validate_fee_payer_for_mcp(
fee_payer,
&mut fee_payer_account,
0,
error_counters,
&bank.rent_collector().rent,
effective_fee,
)
}

pub fn check_fee_payer_unlocked_admission(
bank: &Bank,
transaction: &(impl TransactionWithMeta + StaticMeta),
fee_tracker: &mut McpFeePayerTracker,
error_counters: &mut TransactionErrorMetrics,
) -> Result<(), TransactionError> {
let mcp_feature_active = bank
.feature_set
.activated_slot(&agave_feature_set::mcp_protocol_v1::id())
.is_some_and(|activated_slot| bank.slot() >= activated_slot);
if mcp_feature_active && transaction.mcp_fee_components().is_some() {
Self::check_fee_payer_unlocked_mcp(bank, transaction, fee_tracker, error_counters)
} else {
Self::check_fee_payer_unlocked(bank, transaction, error_counters)
}
}
}

#[cfg(test)]
Expand Down Expand Up @@ -568,6 +693,27 @@ mod tests {
consumer.process_and_record_transactions(&bank, &transactions)
}

#[test]
fn test_mcp_fee_payer_tracker_prevents_overcommit() {
let payer = Pubkey::new_unique();
let mut tracker = McpFeePayerTracker::default();

assert_eq!(tracker.try_reserve(10, payer, 1_000, 0, 600), Ok(()));
assert_eq!(
tracker.try_reserve(10, payer, 1_000, 0, 401),
Err(TransactionError::InsufficientFundsForFee)
);

// Slot change resets cumulative reservations.
assert_eq!(tracker.try_reserve(11, payer, 1_000, 0, 900), Ok(()));

// Nonce minimum balance is reserved.
assert_eq!(
tracker.try_reserve(11, payer, 1_000, 200, 801),
Err(TransactionError::InsufficientFundsForFee)
);
}

fn generate_new_address_lookup_table(
authority: Option<Pubkey>,
num_addresses: usize,
Expand Down
Loading