Skip to main content

Atto is crypto infrastructure built like backend software

· 7 min read
Felipe Rotilho
Software Engineer @ Atto


Engineers usually split into two camps on language choice.

One camp treats every problem as if it has a correct language. The other cares about what you can still understand when the system is under pressure.

I am closer to the second camp.

I would not write an embedded kernel in JavaScript, and I would not build a website in C++. Constraints matter. But a lot of real software lives in the middle: backend services, stateful systems, network protocols, APIs, queues, background workers, and data pipelines, etc.

A cryptocurrency node sounds exotic from the outside. From the inside, much of it is backend software with stricter consequences.

That is why Atto leans on a stack that looks more like practical backend infrastructure than fashionable crypto infrastructure: Kotlin, the JVM, Spring Boot, Micrometer, Kotlin Multiplatform, and MySQL.

The language debate is usually too narrow

"Right tool for the job" is good advice until it becomes a shortcut for naming whatever stack is fashionable in a niche.

Crypto has its expected wardrobe. Rust looks serious. Go looks practical. C++ looks battle-tested. Kotlin on the JVM still surprises people. Sometimes it makes them suspicious before they have read a line of code.

That suspicion is understandable, but it misses a basic part of tool choice: the engineers building the system.

A language never arrives alone. It comes with a runtime, libraries, profilers, database drivers, deployment habits, and the ability to reason about all of it when tired.

I know Kotlin well. I know the JVM well. That mattered.

Atto did not need a stack that looked popular in a crypto debate. It needed a stack that could help build a node, keep protocol rules readable, expose useful integration surfaces, and stay debuggable when something broke.

A crypto node is mostly backend software

Atto is instant, feeless digital cash.

The protocol goal is unusual, but the day-to-day implementation is not all exotic cryptography. A node accepts input from the network, validates signatures and account state, stores the result, talks to peers, runs background work, exposes APIs, streams events, survives restarts, catches up, and explains what it is doing while something is broken.

That is normal service software territory: lifecycle, configuration, health checks, metrics, persistence, APIs, and operations.

The difference is the cost of mistakes.

In a normal backend, a bad deploy can return 500s, drop jobs, or need a data repair. Painful, but usually contained. In a node, the wrong bug can reject valid money, accept invalid state, corrupt the local view of the ledger, or fail bootstrap only after hours of syncing.

That is how I think about Atto's stack. Cryptography is only one piece. A node is a long-running, stateful, networked service with strict correctness requirements.

Familiarity is an engineering advantage

Kotlin was not chosen because it is perfect.

It gave Atto a practical balance: safer defaults, tooling I know well, a mature runtime, and a concurrency model that fits node software without making the code feel alien.

Null-safety does not prove correctness, but it removes a class of ordinary mistakes. Data classes keep protocol primitives readable. Unsigned numbers fit fields such as amounts and height. Coroutines fit a node because a node is many small asynchronous jobs happening at once.

Could Atto have been written in Rust, Go, Java, C++, or something else? 100%.

But the useful question was not "can another language do this?" The useful question was "which stack gives this project the best chance of being finished, understood, profiled, operated, and improved?"

For me, that answer was Kotlin on the JVM.

Boring infrastructure is easier to operate

The Kotlin choice gets the attention. The quieter bet is the boring infrastructure around it.

Spring Boot, Micrometer, Prometheus, and MySQL are all familiar pieces of software. They give Atto ordinary ways to configure a node, expose health checks, inspect ledger state, back up data, replicate it, recover it, and connect it to other systems.

Want to see what a node is doing? Scrape Prometheus metrics and build a Grafana dashboard.

Want a transaction stream for projections, analytics, or downstream services? Enable the MySQL binlog and use Debezium to publish changes to Kafka.

A custom storage engine would sound more exciting. It would also give integrators one more strange thing to learn before they can build on top of the network.

Boring does not mean careless. Boring means the problems are visible.

When a node is slow, you want a profiler. When bootstrap is stuck, you want metrics. When ledger state looks off, you want queries. When a database grows, you want ordinary paths for monitoring, backup, restore, and replication.

Those are backend software practices applied to crypto infrastructure.

The hard parts are in the protocol

Kotlin did not make Atto easy.

The first performance decision in Atto was not the programming language. It was the shape of the ledger.

A classical blockchain is easier to reason about in one important sense: there is one chain.

Imagine a single append-only linked list of blocks that carries the global transaction order. Every transaction eventually has to fit into that one history. Once a node follows the chain, the order is explicit. There is one book to catch up with.

That model is clean. It is also the bottleneck. Everyone writes to the same shared ledger, so unrelated users still compete for the same global checkout lane.

Atto moves away from that by giving each account its own chain. Think of each account keeping its own transaction history. Alice's activity can update Alice's chain while Bob's activity updates Bob's chain. When Alice pays Bob, the transfer touches both histories: a send on Alice's side and a receive on Bob's side.

That removes the global checkout lane as the normal path. Alice and Bob do not need to wait for one global block just because other people are using the network at the same time.

But it also changes where the hard parts live.

The network still has to agree on the overall ledger. It still has to prevent conflicting spends. It still has to make many independent account histories add up to one coherent state.

That is why bootstrap has been the hardest technical problem so far. A single-chain node catches up with one book. An Atto node catches up with many small histories that reference each other. It has to find missing blocks, resolve dependencies, validate account state, process sends and receives consistently, and end up with the same ledger as the rest of the network.

No language choice removes that problem.

What Atto chose, and why

Atto's stack is not a claim that every cryptocurrency should be written in Kotlin.

The claim is smaller and more practical: tool choice should include operations, debugging, integrations, and the shape of the actual problem.

I keep coming back to leverage. Choose pieces that make Atto easier to run, inspect, integrate, and improve.

You can see it in the choices:

  • Account chains reduce unrelated contention.
  • Account snapshots let validation start from current account state.
  • Kotlin keeps protocol objects and asynchronous flows readable.
  • Spring Boot and the JVM handle lifecycle, configuration, observability, and shipping.
  • Prometheus, Micrometer, and MySQL make node behavior and ledger state inspectable.
  • Kotlin Multiplatform lets wallets, libraries, node software, integrations, and tools share core protocol code.

That stack does not make the protocol simple. It makes the surrounding work less mysterious.

Atto is practical digital cash: instant, feeless, fixed-supply money that can be integrated by developers, operated by node runners, and used in small payments where fees would ruin the point.

That needs protocol work. It needs networking work. It needs storage work. It needs wallet work. It also needs APIs, docs, monitoring, and boring infrastructure that can be understood when something goes wrong.

Kotlin, the JVM, Spring Boot, Prometheus, Kotlin Multiplatform, and MySQL fit that kind of work.

Atto is unusual where the protocol needs to be unusual. Around that, boring is a feature.