Atomic Transfers are irreducible batch transactions that allow groups of transactions to be submitted at one time. If any of the transactions fail, then all the transactions will fail. That is, an Atomic Transfer guarantees the simultaneous execution of multiple transfers of all kinds of fungible tokens.
The implementation allows individual transactions to be created and then grouped into a file. Each transfer is signed separately by the originator of the transfer. This file is then submitted to the network, where the node verifies the transactions and submits them all at once. This eliminates the need for hashed time-locks for atomic swaps in other blockchains and also avoids the delays inherent with hashed timed-locks.
Atomic Transfers enables applications such as:
- Circular trades: Alice pays Bob if and only if Bob pays Clare if and only if Clare pays Alice
- Group payments: Either everyone pays or no one does.
- Decentralized exchanges: Atomic multi-party transfers enable trades without trusted intermediaries.
- Internal units of accounting: Several companies can settle their accounts with each other with a single transaction.
- Payments to multiple recipients
The primary steps to creating an Atomic Transfer are as follows:
Create unsigned transactions and save them to a file
Combine these transactions in to one file
Sign the grouped transactions with all the appropriate keys and submit them
See here for SDK Documentation: Atomic Transfer SDK Usage
Step 1: Create unsigned transactions and save them to a file
Before getting into the details of how Atomic Transfers work and if you have not done so already... we will create a default Wallet and add three accounts using the goal account and wallet new commands.
goal wallet new MyWallet -d betanetdata goal wallet -f MyWallet -d betanetdata goal account new -d betanetdata goal account new -d betanetdata goal account new -d betanetdata
We will also seed some assets into each account to account for transaction fees using the betanet dispenser. Run this command and you should see something similar to the accounts listed below…
goal account list -d betanetdata
[offline] Unnamed-1 HWYCB6YXZWPGXOJCXZQTK33BWLVBFQWVMDUWWKIHWNABAYLC3IKQ4SXRSQ 1000000 microAlgos [offline] Unnamed-2 VYAYCXHI2UUFKKXRSKTOYZQSEA7EPDAMHMXNOBKJC3B4TDB6Y6IBHSKCWA 1000000 microAlgos [offline] Unnamed-0 R4G4IWWH5LTK5VICEGTNUXUEMPKBCKTL5HFG77YXPN2B3EMXPDGIRPCVDI 1000000 microAlgos *Default
This process is the same as creating any transaction in Algorand, which can be done with any of the SDKs or using goal. The only difference is the transaction must saved to memory or a file to be combined with other transactions later. For example to do this in goal you can save the transaction to a file using the -o option with the goal clerk send command.
goal clerk send -f HWYCB6YXZWPGXOJCXZQTK33BWLVBFQWVMDUWWKIHWNABAYLC3IKQ4SXRSQ -t VYAYCXHI2UUFKKXRSKTOYZQSEA7EPDAMHMXNOBKJC3B4TDB6Y6IBHSKCWA -a 50000 -o 1.tx -d betanetdata -w yourwallet
Notice that we do not use the -s option which signs the transaction. Signing has to occur after grouping the transactions. You can create additional transactions by just creating new files.
goal clerk send -f VYAYCXHI2UUFKKXRSKTOYZQSEA7EPDAMHMXNOBKJC3B4TDB6Y6IBHSKCWA -t R4G4IWWH5LTK5VICEGTNUXUEMPKBCKTL5HFG77YXPN2B3EMXPDGIRPCVDI -a 100000 -o 2.tx -d betanetdata -w yourwallet
Step 2: Combine these transactions into a group
The next step is to combine all the transactions into one group. This can be done on a unix based system using the cat OS command, similar to the following.
cat 1.tx 2.tx > at1.tx goal clerk group -i at1.tx -o out.tx -d betanetdata -w yourwallet
Step 3: Sign the grouped transactions and submit them
The final step to creating an Atomic Transfer is to create and submit the grouped transaction file to the network.
The out.tx file contains the raw transactions that can now be then be signed using the
goal clerk sign command. If all the keys are on the same machine this can be done with the following command.
goal clerk sign -i out.tx -o signout.tx -d betanetdata -w yourwallet
If the keys are located on different machines you will need to use the
goal clerk split command to separate each transaction into its own file to be signed on that machine.
goal clerk split -i out.tx -o splitfiles -d betanetdata -w yourwallet
Wrote transaction 0 to splitfiles-0 Wrote transaction 1 to splitfiles-1
goal clerk sign -i splitfiles-0 -o splitfiles-0.sig -d betanetdata -w yourwallet goal clerk sign -i splitfiles-1 -o splitfiles-1.sig -d betanetdata -w yourwallet
Once individual files are signed you would use another cat command to combine all the signed transactions into one file to be submitted.
cat splitfiles-0.sig splitfiles-1.sig > group.sig
You can submit the combined signed and grouped transactions to the network using
goal clerk rawsend.
goal clerk rawsend -f group.sig -d betanetdata -w yourwallet
The node will verify that all transactions are valid and submit them. If any transaction is not valid, all of them will fail.