mwixnet/doc/swap_api.md

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: an Onion 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 an x25519_dalek::PublicKey.
  • commit: the Pedersen commitment before adjusting the excess and subtracting the fee, represented as a 33-byte secp256k1 Pedersen commitment.
  • data: a vector of encrypted payloads, each representing a layer of the onion. When completely decrypted, these are serialized Payload 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: an xPublicKey representing the public key for the next layer.
  • excess: a SecretKey representing the excess value.
  • fee: a FeeFields value representing the transaction fee.
  • rangeproof: an optional RangeProof 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 an OnionError.
  • 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"
}