The Java ecosystem has a mature way of doing things. Pick your framework. Use Maven or Gradle. Write tests with JUnit. Run everything locally with Docker. These patterns have been stable for years exactly because they work.
But most blockchain ecosystems were not built with Java developers in mind. Instead, Rust, JavaScript, and Go dominate. Cardano – my blockchain of choice – historically leaned on Haskell.
Table of Contents
- Blockchain: What Java Developers Need to Know
- Why Cardano?
- What Is BloxBean?
- Building Transactions with Cardano Client Lib
- Your Local Blockchain in Seconds: Yaci DevKit
- Under the Hood: Yaci Mini-Protocols
- Indexing Blockchain Data: Yaci Store
- Quick Start: Your First ada Transfer
- The Broader Java Ecosystem on Cardano
- Java in Production on Cardano
- LINKs
At the end of the day, if you wanted to build on blockchain as a Java developer, you were largely on your own.
BloxBean was built to fix this.
No matter if you prefer Spring Boot, any other Java framework, or actually default to Maven, Gradle, and writing clean Java services, you already have everything you need to start building on Cardano.
Blockchain: What Java Developers Need to Know
If you have spent your career building web applications, REST APIs, and microservices, blockchain might feel like a concept that belongs to a different world. It does not. At its core, a blockchain is a distributed, append-only log where entries are cryptographically linked and verified by a network of participants rather than a central authority. Think of it as a shared system of record where no single entity controls the data, and every write is permanently auditable.
For Java developers, the relevant mental model is straightforward: instead of writing to a PostgreSQL database controlled by your organization, you submit transactions to a decentralized network that validates, orders, and permanently records them. The data becomes immutable: once written, it cannot be altered or deleted.
This property makes blockchain particularly valuable for use cases where trust, transparency, and auditability matter. Top applications include financial records, supply chain provenance, identity verification, and governance.
Key Concepts
The key concepts that differ from traditional development are few but important:
- Transactions are not database operations. They are cryptographically signed instructions that transfer value or record data on the network.
- Wallets are not accounts. They are key pairs. A private key signs transactions, and a public key derives an address. You do not register anything; you generate it.
- UTXOs (Unspent Transaction Outputs) track value differently than traditional account balances. Rather than keeping a single number in a table, some blockchains manage individual “chunks” of value like cash in a physical wallet. When you “send a transaction”, you consume an entire UTXO and receive any leftover amount back as change, similar to buying a $3 coffee with a $10 bill.
- Transaction finality is the point at which a transaction becomes irreversible on the network, unlike a database commit that an admin could roll back.
BloxBean lets you learn these concepts and see them in action using familiar Java tools instead of learning a new language while also trying to understand blockchain.
Why Cardano?
Among the many blockchain networks available, Cardano stands out for several reasons that matter to developers.
Cardano offers deterministic transaction fees based on transaction size and script execution cost, not network congestion. This means that, unlike most other blockchains, you can predict the fee before submitting a transaction.
Cardano uses the EUTXO (Extended UTXO) model, which builds on the basic UTXO concept by allowing each output to carry additional data and logic. This lets applications design for parallel processing off-chain, even though transactions are still processed sequentially on-chain. Unlike simple UTXOs, which only track value, EUTXOs can store smart contract data, enabling more complex interactions while preserving predictability and security.
The platform is MiCA compliant and CCRI-certified for energy efficiency. These are the kind of engineering guarantees that enterprise teams look for when evaluating infrastructure.
The ecosystem is steered by multiple independent organizations, including the Cardano Foundation, Input Output, EMURGO, and Intersect, with a strong enterprise focus spanning through finance, supply chain, digital identity, real-world asset tokenization, and much more.
That enterprise ambition requires enterprise-grade developer tooling. And unlike many blockchain ecosystems that lock developers into a language, Cardano is designed to be language-agnostic — the Cardano community builds tools in Haskell, Python, JavaScript, Rust, and more. For Java developers, the gateway into this ecosystem is BloxBean.
What Is BloxBean?
BloxBean is a GitHub organization hosting a collection of open-source Java tools and libraries, each solving a specific piece of the Cardano development puzzle. Rather than one monolithic SDK, it’s a set of focused projects that work well independently and even better together; all available as standard Maven or Gradle dependencies.
The projects are community-driven, actively maintained by the Cardano Foundation and the community, and built with one clear philosophy: Java developers should not have to abandon their existing skills to work with blockchain technology.
If you know how to add a dependency to your pom.xml, write a @Test method, or call a REST endpoint, you already have what it takes.
However, even though BloxBean removes the tooling barrier, blockchain development does introduce new concepts. The UTXO transaction model, transaction finality, and on-chain versus off-chain logic are ideas that don’t have direct equivalents in traditional web development. The difference is that with BloxBean, you learn these concepts while building with tools you already know, not while simultaneously fighting an unfamiliar language, build system, and test framework. The learning curve becomes one thing at a time instead of everything at once.
Key Tools / Libraries
These are some of the key tools or libraries:
| Tool | What It Does |
|---|---|
| Cardano Client Lib | Build and submit transactions, create wallets, mint native tokens. |
| Yaci DevKit | Spin up a local blockchain for development with your own explorer. |
| Yaci | Connect directly to Cardano nodes via mini-protocols and receive blockchain data in callbacks. |
| Yaci Store | Index and query blockchain data via REST APIs; provides Spring Boot starters so you can build your own custom indexer in any Spring project and listen to blockchain events using Spring’s @EventListener — just like any other Spring event. |
Building Transactions with Cardano Client Lib
Cardano Client Lib is the core Java SDK for building on Cardano. If you’ve ever used a fluent builder API in Java, you’ll feel right at home. It covers wallet creation, transaction building and signing, native token minting, smart contract interaction, and NFT metadata standards, all available as a standard Maven dependency.
Getting Started: Adding Dependencies
Adding Cardano Client Lib to your project is no different from adding any other Java library:
<dependency>
<groupId>com.bloxbean.cardano</groupId>
<artifactId>cardano-client-lib</artifactId>
<version>0.7.1</version>
</dependency>
No special plugins, no custom build steps, no native binaries to install. It is a standard Maven (or Gradle) dependency that works with Java 11 and above.
Creating Accounts and Building Transactions
Creating a wallet takes two lines — instantiate an Account with the target network (mainnet or testnet) and call baseAddress(). The class handles HD wallet derivation, mnemonic generation, and key management behind the scenes. You get a fully functional blockchain account without needing to understand elliptic curve cryptography or derivation paths, though those details are accessible if you want them.
Account account = new Account(Networks.testnet());
String baseAddress = account.baseAddress();
Where the library truly shines is the QuickTx API, which lets you specify the intent of a transaction declaratively. You describe what you want to happen: pay this address, attach this metadata, mint these tokens, and QuickTx handles the input selection, fee calculation, and transaction balancing to make sure the declared intent is fulfilled and the transaction is valid. All the complexity is wrapped behind a clean, easy-to-use Java API.
QuickTxBuilder quickTxBuilder = new QuickTxBuilder(backendService);
Tx tx = new Tx()
.payToAddress(receiverAddress, Amount.ada(1.5))
.payToAddress(anotherAddress, Amount.ada(3.0))
.from(senderAddress);
Result<String> result = quickTxBuilder
.compose(tx)
.withSigner(SignerProviders.signerFrom(senderAccount))
.completeAndWait();
Read that as a Java developer: Even without blockchain knowledge, the intent is clear. You are composing a transaction that pays ada – the native currency on Cardano, where the smallest unit is called a Lovelace – to specific addresses, detailing who sends it, signing it, and waiting for confirmation. The pattern is the same as building an HTTP request with WebClient or constructing a query with a JPA Criteria builder. The Result object wraps the outcome with success/failure status, so your error handling works the same way it does in any Java application.
Modular Architecture and Backend Providers
The library is organized into over 20 focused modules: core, crypto, address, plutus, Cardano Improvement Proposal (CIP) implementations, and more. You only pull in what you need, keeping your application lean.
It also supports multiple backend providers: Blockfrost (managed API), Koios (community-driven API), and Ogmios/Kupo (self-hosted). You choose your backend the same way you might choose between different database drivers: swap the provider, keep the same application code.
If you want to get hands-on straight away, the official docs have a simple ada transfer tutorial to get you started, and also a multi-sig transfer tutorial once you’re ready to go further.
Your Local Blockchain in Seconds: Yaci DevKit
One of the real pain points with blockchain development is testing. Cardano has public test networks, and you can even submit real transactions to them, but public testnets aren’t ideal for fast iteration. Block times are fixed, the network is shared with everyone else, and the immutable nature of blockchain means you can’t just roll back a bad test. Waiting anywhere from seconds to minutes for a testnet confirmation on every small change is not how anyone wants to develop.
As Java developers we’re used to running everything locally. Docker made that easy: spin up your database, your message broker, your cache, all in one command. Yaci DevKit does the same thing for Cardano. You get a fully private Cardano network running on your machine in seconds, and you can create or reset it with a single command. You can even dial the block time down to milliseconds for ultra-fast iteration.
yaci-cli> create-node -o --start
That’s it. A private Cardano blockchain, made for you, and running locally.
The kit also comes with Yaci Viewer, a browser-based block explorer at localhost:5173. Think of it as your own personal blockchain explorer for your own devnet. You can see every block, every transaction, every UTXO in real time, the same way you’d browse Etherscan or Cardanoscan on mainnet, except this is your chain, with your test data.
And it ships with a built-in indexer that exposes all the REST API endpoints that Cardano Client Lib needs to build and submit transactions. So your local development setup is fully self-contained. No external API keys, no Blockfrost account, no public network dependency. Just point your BackendService at localhost:8080 and start coding.
Commands
The CLI mirrors tools you already know. Fund test addresses like seeding a test database, query UTXOs like inspecting rows in a table, reset the chain like truncating your test DB:
devnet:default> topup addr_test1... 50000 # fund a test address
devnet:default> utxos addr_test1... # check UTXOs
devnet:default> tip # current chain tip
devnet:default> reset # wipe and start fresh
Distributions
Yaci DevKit comes in three flavours depending on your setup: a Docker Compose based distribution for local development, an NPM package for CI/CD pipelines, and a standalone ZIP. Whichever you choose, you go from zero to a running blockchain in a single command.
For full documentation and setup guides, visit devkit.yaci.xyz.
Under the Hood: Yaci Mini-Protocols
Most developers won’t need to touch Yaci directly. But it’s worth knowing it exists and what it does.
Cardano nodes communicate with each other using a set of low-level protocols called mini-protocols. These handle everything: synchronizing chain data, fetching blocks, submitting transactions, watching the mempool. Yaci is a pure Java implementation of those protocols. It’s what sits underneath Yaci Store and Yaci DevKit and handles all the actual node communication.
If you’re building something custom, like a chain indexer, a real-time monitoring tool, or your own block explorer, Yaci gives you direct access to the raw blockchain data stream without any of the network complexity. You don’t write socket code, you don’t handle protocol framing, you don’t deal with connection management. You create a regular Java object, attach listeners, and start receiving data.
Listening to new blocks as they arrive is a few lines of code. Replaying historical blocks from a specific point is the same API. Watching the mempool for unconfirmed transactions in real time is just another listener. Everything that would normally require deep knowledge of Cardano’s network layer is hidden behind a clean Java abstraction.
If you’ve worked with message consumers or event listeners in Java, the programming model will feel immediately familiar. The getting started guide covers the Fetcher API, Reactive API, and Local Client Provider with simple examples for each.
Indexing Blockchain Data: Yaci Store
Yaci Store is a chain indexer built on top of Yaci. It reads block data from the Cardano blockchain using those same mini-protocols and stores it in a standard relational database: Postgres, H2, or MySQL. From there, it exposes a REST API layer that tools like Cardano Client Lib use to query data, build transactions, and submit them to the network.
Out of the box, Yaci Store works as a standalone product. You download it, configure it like any other Spring Boot application through application.properties or application.yml, point it at a Cardano node, and it starts indexing. The Cardano node connection is just a few lines of configuration:
store:
cardano:
host: backbone.cardano.iog.io
port: 3001
protocol-magic: 764824073
The storage layer is built with DDD in mind. Each module in Yaci Store is called a store, and each one represents a specific domain of blockchain data: UTXO data, block data, transaction data, governance data, and so on. By default Yaci Store keeps full historical data, but pruning configurations are available if your application only needs recent state. If you don’t need a particular type of data at all, you just disable that module:
store:
blocks:
enabled: true
transaction:
enabled: true
utxo:
enabled: true
metadata:
enabled: false
script:
enabled: false
Yaci Store exposes the Blockfrost-compatible API endpoints that transaction-building SDKs like Cardano Client Lib need, so you can develop locally without a Blockfrost account and switch to Blockfrost in production without changing your code. Develop against your locally running instance and point your app at Blockfrost’s hosted service in production without changing a line of application code.
That’s the product. But here’s where it gets interesting for application developers:
Spring boot Starters
Each store module is also published as a separate library with its own Spring Boot starter. So instead of running Yaci Store as a standalone product, many developers pull in only the starters they need and build a narrow, application-scoped indexer directly inside their own Spring Boot app. Your application just becomes a standard Spring Boot app that listens to blockchain events using plain @EventListener annotations:
@Component
public class MyBlockchainListener {
@EventListener
public void onTransaction(TransactionEvent event) {
event.getTransactions().forEach(tx -> {
System.out.println("New tx: " + tx.getTxHash());
// your custom logic here
});
}
@EventListener
public void onBlock(BlockEvent event) {
System.out.println("Block #" + event.getMetadata().getBlock()
+ " with " + event.getMetadata().getNoOfTxs() + " transactions");
}
}
No blockchain-specific framework to learn; just Spring events. For more on this approach, see the usage guide.
One more thing worth knowing: Yaci Store ships with a plugin framework backed by GraalVM’s polyglot support. If you have team members who don’t write Java, they can write plugins in JavaScript, Python, or MVEL to create filters and event listeners to process blockchain data. It’s a practical feature for teams with mixed language backgrounds. There’s a hands-on tutorial on tracking address UTXOs with the plugin framework if you want to see it in action.
Quick Start: Your First ada Transfer
Here’s how the pieces fit together for your first ada transfer. This is the actual flow, not a simplified demo:
- Add cardano-client-lib to your pom.xml
- Install the Docker-based Yaci DevKit following the instructions at devkit.yaci.xyz, then start it:
devkit start
- Create a new local devnet with 1-second block times:
yaci-cli> create-node -o --start
- Create sender and receiver accounts with new Account(Networks.testnet())
- Fund the sender via DevKit CLI: topup <senderAddress> 1000
- Build and submit:
BackendService backendService =
new BFBackendService("http://localhost:8080/api/v1/", "");
QuickTxBuilder quickTxBuilder = new QuickTxBuilder(backendService);
Tx tx = new Tx()
.payToAddress(receiver.baseAddress(), Amount.ada(5))
.from(sender.baseAddress());
Result<String> result = quickTxBuilder
.compose(tx)
.withSigner(SignerProviders.signerFrom(sender))
.completeAndWait();
- Open localhost:5173 to see your transaction confirmed in the block explorer
That’s it: From zero to a confirmed on-chain transaction in under 20 lines of Java and one Docker command. No waiting for testnet, no external API keys needed, and all in your preferred language.
The Broader Java Ecosystem on Cardano
BloxBean provides the core development stack, but it is worth noting that the Java ecosystem on Cardano extends beyond it. The community and the Cardano Foundation maintain additional libraries, including the Koios Java Client for REST-based node interaction, the Ogmios Java Client for WebSocket communication via Ouroboros mini-protocols, and the Cardano Foundation Java Rewards Calculation library for computing staking rewards among others. These complement BloxBean’s stack and signal a broader, ecosystem-wide commitment to making Java a first-class citizen on Cardano.
Java in Production on Cardano
The BloxBean toolchain is already powering production-grade, Java-written applications on the Cardano blockchain. Here are some notable examples:
Reeve — Financial Data Integrity
Reeve is a platform developed by the Cardano Foundation that connects Enterprise Resource Planning (ERP) systems with the Cardano blockchain to create immutable, auditable financial records. Built entirely in Java using Spring Boot with a Spring Modulith architecture, Reeve allows organizations to record accounting transactions on-chain, creating a tamper-proof trail of financial activities.
The platform is designed with modular Java components — a reporting core, blockchain publisher and reader services, and ERP adapters — all operating independently within a Spring dependency injection context. Use cases include NGOs seeking to bolster donor transparency, publicly listed corporations managing ESG disclosures, and governmental bodies modernizing procurement audits. Reeve is open source under the Apache 2.0 license.
OriginateNavio — Supply Chain Verification
OriginateNavio is a blockchain-based solution that helps enterprises prove product origin and quality. It digitizes supply chain and certification data at the source using unique QR codes, uploads it for secure tracking with unique identifiers, and permanently records verified information on the Cardano blockchain. The result is instant, trustworthy verification of product provenance — from raw materials to finished goods.
USDM by Moneta — Fiat-Backed Stablecoin
USDM is a Cardano fiat-backed stablecoin issued by Moneta Digital LLC (FinCEN-registered MSB). Each USDM token is backed 1:1 by USD reserves, making it a foundational building block for decentralized finance (DeFi) on Cardano. USDM enables instant on-chain payments, serves as a base asset for DeFi protocols, and provides a stable store of value within the Cardano ecosystem. Parts of its infrastructure leverage the Cardano Client Lib to simplify interactions with the Cardano blockchain.
These are production platforms developed by established organizations and regulated financial entities to solve everyday problems in supply chain, finance, and identity. Several are built in Java, using Spring Boot, Maven, and the same architectural patterns you use in your day job.
If you are a Java developer who has been curious about blockchain, BloxBean gives you the most practical place to get started. Your existing knowledge becomes your blockchain foundation — the very building blocks you use from day one.
LINKs
- BloxBean: https://www.bloxbean.com
- Cardano Client Lib: GitHub
- Yaci DevKit: GitHub | Documentation
- Yaci: GitHub
- Yaci Store: GitHub
- Koios Java Client: GitHub
- Ogmios Java Client: GitHub
- CF Java Rewards Calculation: GitHub
- Reeve: Cardano Foundation | GitHub
- OriginateNavio: Cardano Foundation
- USDM by Moneta: https://moneta.global
- Cardano Developer’s portal: https://developers.cardano.org/