4.9 KiB
Swap Server API
Overview
The Swap Server provides a single JSON-RPC API with the method swap
. This API is used by clients to initiate the mixing process for their outputs, obscuring their coin history in a transaction with other users.
SWAP
Request
The swap
method accepts a single JSON object containing the following fields:
onion
: anOnion
data structure, which is the encrypted onion packet containing the key information necessary to transform the user's output.comsig
: a Commitment Signature that proves the client knows the secret key and value of the output's commitment.
Onion
data structure
The Onion
data structure consists of the following fields:
pubkey
: an ephemeral pubkey to as the onion originator's portion of the shared secret, represented as anx25519_dalek::PublicKey
.commit
: the Pedersen commitment before adjusting the excess and subtracting the fee, represented as a 33-bytesecp256k1
Pedersen commitment.data
: a vector of encrypted payloads, each representing a layer of the onion. When completely decrypted, these are serializedPayload
objects.
Each entry in the enc_payloads
vector corresponds to a server in the system, in order, with the first entry containing the payload for the swap server, and the last entry containing the payload for the final mix server.
Payload
data structure
A Payload
represents a single, decrypted/peeled layer of an Onion. It consists of the following fields:
next_ephemeral_pk
: anxPublicKey
representing the public key for the next layer.excess
: aSecretKey
representing the excess value.fee
: aFeeFields
value representing the transaction fee.rangeproof
: an optionalRangeProof
value.
Response
A successful call to the 'swap' API will result in an empty JSON-RPC response with no error.
In case of errors, the API will return a SwapError
type with one of the following variants:
InvalidPayloadLength
: The provided number of payloads is invalid.InvalidComSignature
: The Commitment Signature is invalid.InvalidRangeproof
: The provided rangeproof is invalid.MissingRangeproof
: A rangeproof is required but was not supplied.CoinNotFound
: The output does not exist, or it is already spent.AlreadySwapped
: The output is already in the swap list.PeelOnionFailure
: Failed to peel onion layer due to anOnionError
.FeeTooLow
: The provided fee is too low.StoreError
: An error occurred when saving swap to the data store.ClientError
: An error occurred during client communication.SwapTxNotFound
: The previous swap transaction was not found in data store.UnknownError
: An unknown error occurred.
Example
Here is an example of how to call the 'swap' API:
{
"jsonrpc": "2.0",
"method": "swap",
"params": {
"comsig": "09ca34db2ac772a9a0e954b4ae2180ba936d8f96219824fe7ec1f5439bef3a0afe7e18867db3d391f37260285feea38ff740b0b49196a4b0a7910c1a72ceca1c5a3e4a53d6e06ffb0536f0dad78812a72ef14e6ff83df8d0dd2aa71615fb00fbe2",
"onion": {
"commit": "0962da257e8c663d1a35128cf87363657ae6ec4a3c78fda4742a77e9c4f17e1a20",
"data": [
"fd06dd3e506b1c1e76fd6546beec1e88bb13e7e13be7c02a7e525cd22c43d5dc7a906c77e5c07b08d7a5eeb7e7983b87376b02a33f7582ffc1bf2adac498fefbc2dba840d76d4c8e945f",
"ecead273b9b707d101aae71c2c7cb8ce3e7c95347aa730015af206baaf37302df48e5e635ecc94ddf3eee12b314e276f23e29e7dde9f30f712b14ea227801719ecdd1a53999f854a7f4878b905c94905d5f1bfbb4ad9bcf01afeb55070ebcc665d29b0a85093b4d134a52adc76293ad9e963a9f7156dcfc95c1c600a31b919495bf6d3b7ec75eeffcc70aef15b98c43c41468f34b1a96c49b9e20328849a3b12c84d97893145a65d820c37dae51eba62121d681543d060d600167ede3a8c6e807a5765c5ebb2d568366c89bba2b08590a4615822ca64fb848e54267b18fc35fb0f9f6834f1524d7e0da89163e5385de65613e09fed6fec8d9cc60354baa86131b80aa1c8cd5be916a3d757cd8e8253c17158555539a2f8e4d9d1a4b996b218b1af3e7b28bdf9e0f3db2ea9f4d5e11d798d9b7698d037e69df3ca89c2165760963a4d80207917a70a4986d7df83b463547f4d704d28b1eec2e5a93aa70b5b7c73559120e23cd4cfbf76e4d2b21ef215d4c0210001c17318eba633a3c177c18ef88b6c1718e11c552cc77b297dab5c1020557915853434b8ca5698685b3a66bba73164e83d2440473ebb0591df593e0264b605dc3b35055a7de0d40c5c7cc7542dcbe5ade436098dd41e1ac395d2d0baf5c82fdd5932b2e182f8f11a67bccc90e6e63ec8928bd7f0306c6949122fadf12493a7de17f7bfad72501f4f792fca388b3614d6eb3165d948d7c9efe168b5273b132fa27ea6e8df63d70d8b099a9220903b02898b5cc925010ebfab78ccceb19a9f2f6d6e0392c4837977bf0e3e014913e154913c0204913514684f64d7166b3a7203cbab9dddd96ed7db35b4a17fec50abd752348cdf53181ddd6954bc1fb907ed86206dcf05c04efb432cb6ba6db25082b4ce0bf520e3c508163b44c82efaa44b2ec904ddd938a0b99044666941bc72be58e22122027c2fcbc4299e52bc29916eb51206c41e618bce1a5c0d859d116807217282d0883fdabe6f9250cda63082f71fbf921b65ab17cd9bfb0561c4cabe1369c7d6a85c51c0e4f43f51622e70ab4eb0e3fab5"
],
"pubkey": "500b161d3bbd9249161d9760ba038d9805be86c0e5273782303a67cda50edb5a"
}
},
"id": "1"
}