An interactive explainer
The Anatomy of SATP
Two blockchains do not agree on anything. They do not share validators, blocks, clocks or a notion of finality. Yet people routinely want to move an asset from one to the other and end up with exactly one copy of it, never two and never zero.
The Secure Asset Transfer Protocol (SATP) solves that by moving the problem off the ledgers and into a conversation.[9] Each network is represented by a gateway: a piece of software that is the sole authorised agent for that network. Applications talk to their own gateway, gateways talk to each other, and the strict order of that dialogue is what makes the transfer safe.[4]
This page opens that conversation up, one message at a time, as it is actually implemented in Hyperledger Cacti's SATP Hermes plugin.[2][12] We follow a single transfer end to end:
- a client application asks for a transfer
- its gateway takes the client role
- the two gateways negotiate and agree on terms
- the asset is locked on the source ledger
- value is committed on the destination ledger
- the transfer is finalised and the source copy is gone
By the end you should be able to say, without hand-waving, what each message carries, who signs it, who checks it, and what would happen if a party stopped answering half way through.
One thing to fix before we start: the protocol modelled on this page is version 3 of the SATP draft, which is the version the current Hyperledger Cacti SATP Hermes implementation follows.[9][2] Where Cacti adds something the draft does not define — Stage 0, for instance — the page says so at that point.
Prior knowledge assumed: you know roughly what a blockchain and a smart contract are. No knowledge of SATP, Cacti or gateway architectures is assumed.
Chapter 1
Why moving an asset between two chains is hard
What goes wrong without a protocol, and what a pair of gateways changes.
Inside one ledger, moving value is easy: a single consensus decides the order of events, so a transfer either happened or it did not. Across two ledgers there is no shared decider. Each chain will happily accept a write without knowing anything about the other, which is exactly how the same value ends up existing twice, or vanishing entirely.[1][8]
The temptation is to trust a bridge: a piece of software that watches one chain and writes to the other. That works until it does not. Most large interoperability failures were not consensus failures; they were failures of the component in the middle, which had authority over assets and no protocol constraining what it could claim.[7]
SATP takes a narrower position. It does not try to make two chains agree. It defines a conversation between two gateways, each of which is the only authorised agent for its own network, and it fixes the order of that conversation so that no intermediate state is dangerous. Value is locked before anything is created. Value is created before the original is destroyed. Each party signs what it saw, and each signed message commits to the previous one, so nobody can later claim a different agreement was made.[9][5]
If a gateway crashes mid-transfer, the session is not lost: the protocol's recorded state is what recovery works from, which is the subject of a separate draft.[11] And whether you need any of this in the first place is itself a design question worth asking before adopting an interoperability solution.[4][3]
Hyperledger Cacti implements SATP as the cactus-plugin-satp-hermes
package. Everything below is read from one file in that package,
core/satp-protocol-map.ts, which declares the entire protocol as an
ordered list of steps. That list is the ground truth for this page: the table
table and the animation in Chapter 3 are the same 36 steps, in the same order.
The hash-chain diagram needs JavaScript. In short: every SATP message carries the hash of the previous one, so the whole conversation is a chain.
Chapter 2
How two gateways agree on the terms of a transfer
The four messages that turn a request into a commitment, read field by field.
Stage 1 is the negotiation that everything else rests on. Four messages: a proposal, a receipt, a commence request and an acknowledgement. After them, both gateways hold signed evidence of exactly the same terms, and only then may an asset be locked.
Pick a message and open its fields. Every field carries a plain-language note saying what it is and why it exists; the highlighted rows are the hash and signature fields that chain the messages together. Switch to the raw view to see the same object as it appears on the wire, in the shape the Cacti v02 proto defines.
The message explorer needs JavaScript. The message shapes are defined in
proto/cacti/satp/v02/service/stage_1.proto in the Cacti repository.
Chapter 3
The shape of the whole conversation
Four parties, two ledgers, and a fixed order that value must move in.
The picture starts before SATP does. Alice, a human operator, asks her application to move the asset; the application then activates a transfer in its own gateway. Those two hand-offs are the dashed arrows on the left of the diagram: they are ordinary API calls, not protocol messages, and everything after them is SATP.
Four parties then matter: Alice's application, the gateway that speaks for Alice's network, the gateway that speaks for Bob's network, and Bob's application. The two gateways take roles, not identities: whichever gateway starts the transfer is the client, the other is the server. The same software can be either.
Scroll the steps below and watch three things: which lane the message is on, which gateway is checking rather than sending, and what the two ledger bands at the bottom say. Stage 0 covers discovery and session setup and is being specified in the IETF draft draft-avrilionis-satp-setup-stage; stages 1 to 3 are the standardised protocol.[9]
The invariant to watch for is in the last stage: the asset is minted on the destination while it is still locked at the source, and only then is the source copy burned and the destination copy assigned to Bob. At no point does the value exist twice as spendable, and at no point does it exist nowhere.
The animated flow needs JavaScript. The step table below lists the same steps in the same order.
Every step, in declaration order
The same 36 steps as a reference table. Hover a step name or a wire message to read what it does.
The step table needs JavaScript. Without it, read
core/satp-protocol-map.ts in the Cacti repository directly.
Chapter 4
API1: how an application talks to its own gateway
The business-logic API between a client application and the gateway that acts for its network.
Everything in the previous chapters happens between two gateways. Before any of it starts, an application has to ask its own gateway for a transfer, and then follow that transfer to completion. That local interface is API1.
Scaffold — this chapter is planned. It will walk through the transfer request, the session identifier handed back, the status calls the application polls, and the final receipt, with the same lane-diagram treatment used for the gateway conversation.
Chapter 5
The adapter layer: how a gateway reaches a ledger
Bridges, leaves and wrapper contracts — the part of Cacti that turns a protocol step into a real transaction.
A gateway never writes to a ledger directly. Each supported network has an adapter: a bridge object in the plugin, a connector to the network, and a wrapper smart contract that owns the lock, mint, burn and assign operations.
Scaffold — this chapter is planned. It will use a worked example from the Cacti demos to show the same protocol step landing on Besu and on Fabric through two different adapters.
Chapter 6
Tying it all together: the CBDC demo, end to end
One worked example that runs the whole stack — two CBDC applications, two gateways, two ledgers, one asset transfer.
Every earlier chapter looks at one layer in isolation: the messages, the stages, the API the application calls, the adapter that reaches the ledger. This chapter walks the Hyperledger Cacti CBDC demo, where those layers run together: a central-bank digital currency issued on one network is moved to a second network while the applications on both sides keep their own view of the user's balance.
The narrative follows one transfer from the operator's click in the sender application, through gateway activation, the four Stage 1 messages, the lock and burn on the origin ledger, the mint and assign on the destination ledger, and finally the gateway telling the receiving application that the value has landed.
Scaffold — this chapter is planned. Todos:
- Diagram the full stack: two CBDC apps, two gateways, Besu and Fabric, with the API1 and adapter boundaries marked.
- Trace one transfer end to end, reusing the Stage 0–3 step ids from Chapter 3 so the same vocabulary carries over.
- Show the balance view on both sides before and after, to make conservation of value visible.
- Point at the concrete Cacti demo packages and the commands used to run them.
- Explain what an operator sees when a transfer is recovered or rolled back mid-flight.
References
Further reading
The protocol drafts and the research this explainer draws on. Source code: github.com/hyperledger-cacti.
- Belchior, R.; Vasconcelos, A.; Guerreiro, S.; Correia, M. A Survey on Blockchain Interoperability: Past, Present, and Future Trends. ACM Computing Surveys 54(8):168, 2021. 10.1145/3471140
- Belchior, R.; Vasconcelos, A.; Correia, M.; Hargreaves, T. HERMES: Fault-tolerant middleware for blockchain interoperability. Future Generation Computer Systems 129:236–251, 2022. 10.1016/j.future.2021.11.016
- Augusto, A.; Belchior, R.; Correia, M.; Vasconcelos, A.; Zhang, L.; Hargreaves, T. Do You Need a Distributed Ledger Technology Interoperability Solution? Proc. IEEE Int. Conf. on Blockchain and Cryptocurrency (ICBC), 2023. 10.1109/ICBC56567.2023.10174990
- Belchior, R.; Riley, L.; Hardjono, T.; Vasconcelos, A.; Correia, M. Do You Need a Distributed Ledger Technology Interoperability Solution? Distributed Ledger Technologies: Research and Practice (DLT) 2(1):1–37, 2023. 10.1145/3564532
- Belchior, R.; Riley, L.; Hargreaves, T.; Vasconcelos, A.; Correia, M. Hephaestus: Modeling, Analysis, and Performance Evaluation of Cross-Chain Transactions. IEEE Transactions on Reliability 72(3):1147–1163, 2023. 10.1109/TR.2023.3234917
- Augusto, A.; Belchior, R.; Correia, M.; Vasconcelos, A.; Zhang, L. BUNGEE: A Middleware to Detect and Exploit Cross-Chain Views. ACM Distributed Ledger Technologies: Research and Practice (DLT), 2024. 10.1145/3643566
- Augusto, A.; Belchior, R.; Correia, M.; Vasconcelos, A.; Hargreaves, T. SoK: Security and Privacy of Blockchain Interoperability. Proc. IEEE Symp. on Security and Privacy (S&P), 2024. 10.1109/SP54263.2024.00072
- Belchior, R.; Correia, M.; Hargreaves, T. A Brief History of Blockchain Interoperability. Communications of the ACM 67(4):66–76, 2024. 10.1145/3643760
-
Hargreaves, T.; Ramakrishna, V.; Belchior, R.
Secure Asset Transfer Protocol (SATP) between Gateways.
IETF Internet Draft
draft-ietf-satp-core, 2022. datatracker.ietf.org/doc/draft-ietf-satp-core -
Ramakrishna, V.; Hardjono, T.; Liu, C.
Secure Asset Transfer (SAT) Use Cases.
IETF Internet Draft
draft-ietf-satp-usecases, 2026 (work in progress). datatracker.ietf.org/doc/draft-ietf-satp-usecases -
Belchior, R.; Hargreaves, T.; Correia, M.
Crash Recovery Mechanism for Blockchain Gateways.
IETF Internet Draft
draft-belchior-blockchain-gateway-recovery, 2021. datatracker.ietf.org/doc/draft-belchior-blockchain-gateway-recovery - Hyperledger Cactus Contributors. Hyperledger Cactus Whitepaper. Hyperledger Foundation, 2019. github.com/hyperledger-cacti/cacti — whitepaper.md
- Belchior, R. SATP Hermes in Hyperledger Cacti — project explanation (video). Hyperledger, talk recording. youtube.com/watch?v=pN1m0vgV7bY
- Hyperledger Cacti Contributors. Hyperledger Cacti workshop (video). Hyperledger, workshop recording. youtube.com/watch?v=Bcqd475U0WA