Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 122 additions & 0 deletions doc/atomicswaps.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# HOWTO: Atomic Swaps

__Or, trading apples for bananas.__


## The Problem

_Andy has some apples. Barb has some bananas. Andy agrees to give Barb two apples in exchange for one banana. In order to make sure both parties hold up their end of the deal they need to create a single transaction that sends assets both directions._

## The Inputs

We'll need to find 3 UTXOs to use as inputs. Andy's apples, Barb's bananas and some Raven to pay the network fee (Andy will pay).

Andy uses `listunspent` to find a suitable `txid` and `vout`:

```
{
"txid": "631cf1566165803f0b89fbfb169d8f0c89129ec3f8536a48e4c4f0f3c4081cff",
"vout": 0,
"address": "mh8mmbCPqnxCNqJq547NG99pauTHqvvYjA",
"scriptPubKey": "21027e1fde02d2cbfac3629aeaf669abd156d0c4dfbf52f6a5e4dd6664e81a621045ac",
"amount": 4.88281250,
"confirmations": 3088,
"spendable": true,
"solvable": true,
"safe": true
}
```

Then each party uses `listmyassets` with `verbose=true` to find asset UTXOs:

Andy:
`listmyassets APPLES true`:

```
{
"APPLES": {
"balance": 1000,
"outpoints": [
{
"txid": "744c61abe6d237939c3567bc44b912ff4c375984229908c964be44f36dec79e3",
"vout": 3,
"amount": 1000
}
]
}
}
```

Barb:
`listmyassets BANANAS true`:

```
{
"BANANAS": {
"balance": 1000,
"outpoints": [
{
"txid": "8468ef5193b1f5d6a7bd501f5f8ef5aec7c3d86fa87cec5a0b6f6d86fba78a4f",
"vout": 3,
"amount": 1000
}
]
}
}
```

Extracting the txids and vouts gives us our raw inputs:
`'[{"txid":"631cf1566165803f0b89fbfb169d8f0c89129ec3f8536a48e4c4f0f3c4081cff","vout":0}, \
{"txid":"744c61abe6d237939c3567bc44b912ff4c375984229908c964be44f36dec79e3","vout":3}, \
{"txid":"8468ef5193b1f5d6a7bd501f5f8ef5aec7c3d86fa87cec5a0b6f6d86fba78a4f","vout":3}]'`

## The Outputs

We'll be using 5 new Ravencoin addresses:

Andy's Raven change address:
`mvGfeg4uZA8XvjVDUywdgYE6TAyz77o5gB`

Andy's banana receive address:
`msXQpCK8UexfgtMbUGwnKjDfE6vqJ4JUPF`

Barb's banana change address:
`mjyoMtEtoxw9edgzpNnEVTH7jqSqiQ529N`

Barb's apple receive address:
`mzPe6rUPYcbDbqnxRc5mcvKkASCAS9JBzL`

Andy's apple change address:
`mzct8GQ5zdaCvbrnRDrR8T87ZuZxkRYNwL`

All asset transfers have to be balanced. Since we have 1000 APPLES coming in, we have to have 1000 going out. So Andy will send 2 to Barb's receive address and the rest (998) to his change address. The Raven will pay 0.0001 for the network fee as normal.

`'{"mvGfeg4uZA8XvjVDUywdgYE6TAyz77o5gB":4.8827125, \
"msXQpCK8UexfgtMbUGwnKjDfE6vqJ4JUPF":{"transfer":{"BANANAS":1}}, \
"mjyoMtEtoxw9edgzpNnEVTH7jqSqiQ529N":{"transfer":{"BANANAS":999}}, \
"mzPe6rUPYcbDbqnxRc5mcvKkASCAS9JBzL":{"transfer":{"APPLES":2}}, \
"mzct8GQ5zdaCvbrnRDrR8T87ZuZxkRYNwL":{"transfer":{"APPLES":998}}}'`

## Creating The Transaction

Andy can now use `createrawtransaction`, passing in the inputs and outputs and receiving the transaction hex:

```
createrawtransaction '[{"txid":"631cf1566165803f0b89fbfb169d8f0c89129ec3f8536a48e4c4f0f3c4081cff","vout":0},{"txid":"744c61abe6d237939c3567bc44b912ff4c375984229908c964be44f36dec79e3","vout":3},{"txid":"8468ef5193b1f5d6a7bd501f5f8ef5aec7c3d86fa87cec5a0b6f6d86fba78a4f","vout":3}]' '{"mvGfeg4uZA8XvjVDUywdgYE6TAyz77o5gB":4.8827125,"msXQpCK8UexfgtMbUGwnKjDfE6vqJ4JUPF":{"transfer":{"BANANAS":1}},"mjyoMtEtoxw9edgzpNnEVTH7jqSqiQ529N":{"transfer":{"BANANAS":999}},"mzPe6rUPYcbDbqnxRc5mcvKkASCAS9JBzL":{"transfer":{"APPLES":2}},"mzct8GQ5zdaCvbrnRDrR8T87ZuZxkRYNwL":{"transfer":{"APPLES":998}}}'
```

```
0200000003ff1c08c4f3f0c4e4486a53f8c39e12890c8f9d16fbfb890b3f80656156f11c630000000000ffffffffe379ec6df344be64c90899228459374cff12b944bc67359c9337d2e6ab614c740300000000ffffffff4f8aa7fb866d6f0b5aec7ca86fd8c3c7aef58e5f1f50bda7d6f5b19351ef68840300000000ffffffff05926d1a1d000000001976a914a1d62b4f8a6710ad43d56f656c27966513ae8fbf88ac00000000000000003076a91483b7a59ce25d8159fdc2ab70320512d2bc07a1c488acc01472766e740742414e414e415300e1f505000000007500000000000000003076a91430f446c2ac37dc072516603e44e86aea7af2bf6788acc01472766e740742414e414e415300078142170000007500000000000000002f76a914cf084a93cf87d3030b74a1939d9c8f02f6152c8c88acc01372766e74064150504c455300c2eb0b000000007500000000000000002f76a914d18967e005ff7208cc6a9c483b028c7c72ca2d6e88acc01372766e74064150504c455300268b3c170000007500000000
```

## Signing The Transaction

Ok, the structure of the transaction is set. Now each party needs to sign it in order to unlock the inputs. Here are the steps:

* Andy signs it using `signrawtransaction`. This will alter the hex, using his wallet to insert the signatures.
* Andy sends the signed hex to Barb.
* Barb uses `signrawtransaction` to sign the rest of the inputs. Again capture the hex output.

## Submit The Transaction

Almost there. Barb now passes the fully signed hex to `sendrawtransaction`! It will be communicated to the network and put into the next block.