Roadmap
Local transaction is not being diffused, despite peers asking?
### What revision are you using?
Cleanup + Enforce invariants in RewardAccount
We've inherited a lot of strange type decisions from Pallas, and didn't clean some of them up when we migrated to our own type system.
fix(amaru-protocols): preserve bytes of transactions flowing through the mempool.
fix(amaru-ledger): do not re-encode locally submitted transactions to compute their size
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit
fix: fix the parenting of spans after block validation
Skip-Changelog
test: containerized demo
This PR simplifies the `relay-1` demo:
log address_watch with ansi colors
disclaimer: I am not a designer, my color choices are terrible by definition
ensure emitted trace conform to emitted schema
Currently, the schema declared in `amaru-observability` only specifies which type of value we put into the macro at the call site, it doesn’t specify which type will appear in the JSON / CBOR / whatever. I think we should regulate both, which means removing the choice at the call site and defining the rendering within the schema definition instead. Then we are in a position to emit the actual JSON schema.
check block/header integrity when loading from disk
We use content-addressed types, so we need to make sure that we return the requested content.
align conformance fixtures on canonical snake_case
Closes #1192. Following KtorZ's guidance, this removes the proxy types and the HasProxy machinery from amaru-kernel, moves JSON parsing directly onto the types themselves, and switches all 242 test fixtures plus the schema, and Haskell harness to snake_case matching the format the rest of the codebase already uses everything is verified locally all conformance tests pass with the exact same counts as before, make all-ci-checks runs fully green, and the updated Haskell harness passes the full sweep, 240/240 scenarios validate correctly against the reference ledger. Per review feedback: the chan…
Fix Disjoint Inputs Check(s)
In pv11+, the reference inputs and the inputs do *not* need to be disjoint sets. That being said, script executions in PlutusV3 must have disjoint sets regardless of the protocol version.
Release workflow adjustments
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit
Fix the Min UTxO Value Calculation
Our min UTxO value calculation was incorrectly missing the constant of `160` that is added to the size of the UTxO. This was not caught anywhere since fixture 49 set `coins_per_utxo_byte` to 100 billion.
check quality of peers shared by peer_sharing
Markus found the following when looking at the peers shared by Amaru:
refine `Peer` / `PeerCandidate` types and implement SRV record support
Consensus protocol version 15 differs from our currently implemented v14 only in advertising the ability to use SRV records in peer discovery. Properly implementing this should first clean up the internal terminology so that we will arrive at the following state:
ensure correct display of dissemination metrics in TUI
Markus saw this when testing the first release: <img width="516" height="85" alt="Image" src="https://github.com/user-attachments/assets/d3a10a49-dca2-47b3-b3b5-4c537cd53b8c" /> The fetch times likely include fetch wait state, which should be shown separately. We also need to make sure that attribution to peers is adequate; in case of the “adopt” column this will need to be properly defined and documented as the easily accessible metric in this case only pertains to the local node (block adoption would be signaled in chainsync as well, but that happens only when the next header or rollback nee…
Add rust docs to TraceContext
As a way to solidify my understanding and softening the learning curve of future devs, the interplay between `tracing`, `opentelemetry` and serialization/deserialization (esp. with the `TraceBuffer`) should be spelt out.
Correct usage of NAME in tracing EDR
Names are only for tracing events, not for naming spans.
Persist findings of consensus behaviour in Cardano blueprints
As discussed in Porto last week, any gaps found in the Ouroboros network spec shall eventually be filled with information on https://github.com/cardano-scaling/cardano-blueprint. This ticket serves as a reminder to myself that I should start with the notes taken in Porto from very fruitful discussions with Marcin M.
Cleanup serde-json Proxy instances
### Abstract
Update packages metadata for v10.11.20260820
Updates packages metadata generated from the published release [`v10.11.20260820`](https://github.com/pragma-org/amaru/releases/tag/v10.11.20260820).
fix(amaru-bootstrap): resolve recently unregistered accounts from previous rocksdb snapshots.
The Mark snapshot from the Haskell's epoch state is no good, it does not contain accounts which did not receive rewards but that may receive some in the following epoch.
fix: amaru binary fails to create snapshot
Make sure amaru doesn't rely on build time constant. Improve error messages when directory can't be written to.
Decode transaction inputs to a set
After pv9, the Haskell node rejects duplicate entries, instead of silently dropping them. We have been *allowing* duplicate entries.
Don't fail when snapshots directory doesn't exist
If you run bootstrap without a pre-existing snapshots directory, it will fail. It shouldn't, since the process will download snapshots. This PR means we ignore a `NotFound` error, restoring the expected behavior.
VRF Key Uniqueness Validation - Take 2
feat: log the eviction reason for evicted mempool transactions
This PR adds log events when transactions are evicted to the mempool. Those events are useful to understand if a transaction was evicted because it was part of the last applied block or if it became invalid for another reason.
VRF Key Hash Validations
Close #910
chore: reduce traces noise around transaction validation: emit a single trace per phase-one, and phase-two.
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit
chore: detect local snapshots for bootstrap when they exists.
chore: leaner bootstrap
Various improvements to speedup bootstrap and reduce memory usage: * better tx usage when loading utxos * more efficient map decoding * stream node state snapshots
fix: normalize types around conn_id / peer + ensure various simple types are traced as strings
This commit also introduce better parsing for the tracing macros, so that %,@,? and full expressions can be used for span and event fields.
feat: make sure CI runs snapshots tests too
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit
fix amaru-node Telemetry tracing stack for structured logging
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit
Flat-decoding optimizations
## Abstract
chore: publish a few new recent epoch-stake-distribution snapshots for mainnet + fix Makefile.
<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
feat: focus on the info tab when the tui starts up
Skip-Changelog
Fix committee acknowledgment to NOT modify the final/resulting state
<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
fix(amaru-ledger): reduce peak allocation during stake distribution calculation
Elements are already *mostly* ordered and we can rotate vectors in place and reduce unnecessary allocations.
Sporadic unit test failure
### What revision are you using?
fix: decode bytes with indefinite length only in protocol version 12
This PR mostly fixes the decoding of bytes so that Conway data only accepts definite-length encoded bytes:
fix: switch to fork on the ledger only with a better tip
This fix is an addition to #1190. That previous PR was assuming that the `fetch_blocks` stage was sending only the tip of a given branch to the `validate_block` stage. This made it safe to call `switch_to_fork` at the ledger level since the ledger only expects a fork that has the same length or one more block than the current chain.
pure-stage contramap no longer leaks memory
The transformation function is no longer registered under its name, meaning that contramap can be used without worrying about memory leaks. This also is one more reason why resuming a simulation from a replay won’t work (since the mapped StageRef will not be rehydrated with the transformation function), but that was already broken earlier (for `.call`) and is not currently a design goal.
add pure-stage tracking of external effect time
This is a foundational step towards building the much more powerful amaru-sim we aspire to (EDR-011).
Implement DisallowedVoters logic
Closes #927
fold BlockHeight into Point and remove Tip
- **fold Tip into Point**, network layer and other external interfaces (like mithril) use NetworkPoint for the `slot.hash` format - **switch chain store to Point where beneficial** - **bump chain store to v6 and add migrations**
Fix CC members preparations
Two fixes; the first one was causing a sync issue on Mainnet epoch 602 due to the preparation step failing to correctly resolve the volatile hot delegation of a newly added member.
feat: support run-until-then-test with # of epochs
Drop make run-until and use `run-until-then-test` for CI so that snapshot tests are performed there too. `run-until-then-test` is also improved so that it can be launched with just a number of epoch to test. Starting epoch is then inferred from local dbs.
CommitteeUnknown + CommitteeHasPreviouslyResigned
Closes #920 and #921
Update Haskell Harness
Many tests were failing the Haskell evaluation because of drift. This PR fixes *almost* all the failing cases, except for `00044`, which is fixed in #1138.
Optimize reward payouts using RocksDB merge operators
### Abstract
Reduce stake distribution / rewards churn allocation
These little changes have noticeable effects on the transient allocations and pointless work that is done creating temporary structures; the reward calculation and stake distribution are significantly faster:
chore: unify BlockHeader and Header
The main motivation for this is not only the code cleanup that comes with it, but also an attempt at getting rid of the constant re-serialisation of headers for hash computation. This is not only inefficient but also potentially wrong should the header be constructed using a non 'canonical' cbor. The `recompute_hash` function was identified as one of the main culprit using DHat; and instead of patching over it I thought we might as well kill two birds on stone and unify these two types and take the opportunity to memoized the hash during decode; entirely avoiding the need for `recompute_h…
fix: cost models encoding + value size calculation
I found those 2 issues while synchronizing with `preprod`.
fix: lift restrictive assertion on the fork length when switching to a fork
Fixes https://github.com/pragma-org/amaru/issues/1162.
Ledger predicate: VRFKeyHashAlreadyRegistered
### Abstract
chore: add a clippy rule for using decode_bytes
This PR adds a lint to clippy in order to warn for the use of `d.bytes()` when decoding bytes that can potentially accept definite and indefinite length bytes.
fix(amaru-tui): reported blocks and transactions throughput
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit
fix(amaru-pure-stage): avoid unnecessary string allocation in pure-stage's try_cast and cast_ref
This commits does two things really:
restore and unify spans in traces/logs
fixes #1208
Tweak jemalloc configuration
This magic line is the result of multiple benchmarks evaluating different configurations for isolated mainnet runs over 10 epochs. This gives a good balance between allocation time and memory management overall:
refactor: move `any_` functions as `Arbitrary` proptest! instance
### Abstract
Implement InvalidGuardrailsScriptHash
Closes #931
Run phase two validations in ledger conformance tests
Closes #894
Fix Haskell Conformance Test Runner
During work on #1138, I discovered that the Haskell test runner doesn't actually work anymore, after recent changes to the fixture structure.
test: fix the serialization conformance tests gaps
This PR fixes the conformance gaps tracked by the `test_cbor_serialization` test.
Introduce GovActionsDoNotExist Logic
Closes #924.
feat: trace the tx-submission exchange with schema-validated events
This PR adds a few events to help us debug the behavior of the txsubmission protocol.
rebuild only when needed, demote noisy log
- ledger DB directories were triggering rebuilds of `amaru`, which I don’t think is useful -- please correct me if wrong - peer snapshot download metadata was triggering rebuilds of `amaru-node`, which was incorrect (moved that file to $out_dir) - printing span close for every single gov prop at INFO level seems inappropriate to me, the aggregate count is still there and I’ve seen INFO log when a gov prop is opened
Introduce UnelectedCommitteeVoters logic
Closes #922
remove compare-traces and warn about DEBUG logging in CI
fixes #1201
taking a stab at structured logging
There is already quite some structured logging that we can do, with the notable exception of emitting structured attributes (`AnyValue`) in OTLP spans--here the `opentelemetry` crate is not yet far enough.
push forwarded embedded Amaru
This is an experiment in advancing the embedding of Amaru as a library. Certainly not yet perfect, but the potential is demonstrated.
fix handling of already validated blocks in select_chain
This followed from a discussion on #1124, it was easier to create the code as a basis for discussion than to describe it in English in detail.
rewrite define_schemas parsing so that GoToDefinition works
I think syn parsing is more robust than rolling our own, and it has the advantage of keeping source spans so that GoToDefinition or FindUsages are now working.
Disentangle ledger store
### Abstract
fix: use local amaru with gliveview
<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
Fixture cleanup
This PR cleans up fixtures which had multiple failure cases. We avoid those, so that implementations that may run validations in a different order can still use our fixtures.
chore: fix nightly tools check
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit
add peer_mix configuration
fixes #1180
add peer sharing responder and wire it up
fixes #1169
add peer sharing protocol and initiator
fixes #1168
add collection of information needed for peer sharing
fixes #1167
amaru snapshot create fails with "Permission denied (os error 13)" when no --dist-dir and --snapshot-dir is given
### What revision are you using?
feat: add SPO Interviews and Milestone Onboarding
This PR contains the documents for **Milestone1 : Onboarding tasks and general knowledge about Cardano (July)** as part of the Amaru projetct : _Operations & Use Cases: Devops and SPO relationship_
Introduce InvalidPrevGovActionId logic and fixtures
Closes #932
fix: move alias resolution to runtime + avoid git dependencies in build.rs
We resolve the aliases at build time so that we can dump them for trace schema validation in the dump-traces-schema. However, this command is really just a dev util called in CI or locally, where we have the repository context available anyway. So instead of making the build.rs needlessly more complexe here, intoducing built-time
Fix the decoding FIXMEs
### Abstract
Test and report the code coverage for CBOR decoding tests
### Abstract
Check the conformance of cbor encoding with the Haskell node
### Abstract
Check the conformance of flat decoding
### Abstract
TUI: clarify when tui mode shall exit and how
Currently, `amaru node run` may open the TUI and immediately close it, leaving nothing on the console.
fix: cleanup metrics and observability setup and communication with the TUI
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit
tiny fix for “please migrate DB” message
Alternative solution to making `amaru dev migrate` part of the public CLI surface.
fix: successfully validate lists of BLS values if empty
On `preprod` a transaction contains the following script: ``` (con (list bls12_381_G1_element) [])) ```
Performance: define `CompactSet` & `CompactMap` for small b-tree structures
### Abstract
Move ledger to separate thread
All ledger operations are single-threaded and must be executed sequentially, while operations may be requested from separate entities (block validation, mempool, possible future cases like Leios integration). This matches the well-known Actor model, implemented using a dedicated thread that pulls requests from an mpsc channel and sends responses to oneshot channels that may be embedded in the work item messages as needed.
Automatic release process for crates
In preparation for a release of the `amaru` crate on crates.io we need to install the following mechanisms:
Correct behavior around invalid phase two transactions
Currently, Amaru runs all validation rules when a transaction has `is_valid: false`. This is a divergence from the Haskell implementation, where only the `UTXOW` state transition rule runs (which includes the `UTXO and UTXOS` rules). The `UTXOS` rule branches on `isValid`. The state update is also different, only the UTxO state changes are persisted (and here, it is the collateral spend and return only).
Bootstrap should fill db with blocks
### Abstract
Optimize startup time edge case
### Abstract
Cardano Node Diversity platform
### Abstract
Optimize the download of transactions in the txsubmission protocol across several peers
### Abstract
Support chained transactions in the mempool
### Abstract
Do not revalidate transactions that are already in the Mempool
### Abstract
Consider memory + cpu execution units when computing the available mempool capacity
### Abstract
Perform integrity/sanity check of the ledger & chain db
### Abstract
Properly compute the handshake negotiation result
### Abstract
Identify and close existing ledger coverage gaps
### Abstract
Monitor RocksDB metrics
### Abstract
Update the animations for the simulation
### Abstract
Add ledger checks to the simulation
### Abstract
Add the txsubmission protocol to the simulation
### Abstract
Complete implementation of `ExtraneousScriptWitnesses` ledger rule
### What revision are you using?
Epoch Transition Benchmark
### Abstract
Granular Ledger Benchmarks
### Abstract
Global Ledger Benchmarks
### Abstract
Enable the TraceBuffer in production
### Abstract
Use a separate column family for `BEST_CHAIN_PREFIX`
### Abstract
Add simulation tests for various network issues
### Abstract
implement initiatorOnlyMode=false on outgoing connections
### Abstract
Properly handle in/out/duplex peers
### Abstract
Promote downstream connections to initiator mode on incoming connections (warm -> hot peer transition)
### Abstract
fix amaru-sim test termination
### Abstract
Publish on brew
Add bench capacities
Add a new `bench` subcommands allowing to provide metrics about current hosts. Those should be relevant to `amaru` e.g.
Allow to browse static JSON
`amaru` can output JSON traces. Allow to open them and display details.
Allow to browse metrics
OpenTelemetry offers metrics primitives. Create a new screen allowing to see at a glimpse the most important ones exposed by amaru. It should leverage ratatui primitives to display metrics.
Visualise current network connections state
Showing the state of incoming/outgoing (or initiator/responder as mini protocols' terminology has it) would be useful to troubleshoot a node's state. In particular, we'll need to be able to trigger disconnections of "faulty" nodes so while we'll obviously trace that, visualising the links from/to a node would be nice.
Publish on crates.io
Will allow use of https://github.com/cargo-bins/cargo-binstall
Add static querying capacities
`amaru` should offer static querying capacities e.g. access db details
Allow to search DReps by ids
Add VIM keybindings for navigation
Make sure VIM like keybindings are added on top of regular keybindings for navigation between various panels.
Add a main screen showing off instances details
Could take inspiration from https://github.com/blinklabs-io/nview
Publish on crates
This is currently blocked by amaru not being published on crates
Introduce indexing
Searching entities by most key requires full scan. Introduce a local index mechanism to speed things up.
Allow to be used as a library
Make sure `amaru-doctor` can be used as a library in `amaru` directly.
Allow to browse resource deltas between two epochs
fix: pad contingency registry_script.hash to 28 bytes
One-character JSON fix in `journal/2026/metadata.json`.
Add CAG off-ramp address to journal metadata
The journal `metadata.json` currently lists only scope_owners and the five treasury script anchors. Designated off-ramp / vendor-coordination addresses (per CAG MSA §1.7) live only in off-chain email and in per-tx on-chain rationale references[].