cosmos-sdk/docs/rest/API_draft.md

5.6 KiB

API

In order to allow for quick client development, with the security of the light-client and ease of use the cli (embedding go-wire and go-crypto), we will provide a REST API, which can run on localhost as part of basecli, securely managing your keys, signing transactions, and validating queries. It will be exposed for a locally deployed application to make use of (eg. electron app, web server...)

By default we will serve on http://localhost:2024. CORS will be disabled by default. Potentially we can add a flag to enable it for one domain.

MVP

The MVP will allow us to move around money. This involves the following functions:

Construct an unsigned tx

POST /build/send

Input:

{
    "to": {"app": "role", "addr": "62616E6B32" },
    "from": {"app": "sigs", "addr": "BDADF167E6CF2CDF2D621E590FF1FED2787A40E0" },
    "amount": { "denom": "mycoin", "amount": 900000 },
    "sequence": 1,
    "multi": true,
}

Output (a json encoding of basecoin.Tx):

basecli tx send --to=role:62616E6B32 --from=sigs:91C959ADE03D8973E8F2FBA9FD2EED327DCE2B0A --amount=900000mycoin --sequence=1 --multi --prepare=- --no-sign

{
  "type": "sigs/multi",
  "data": {
    "tx": {
      "type": "chain/tx",
      "data": {
        "chain_id": "lakeshore",
        "expires_at": 0,
        "tx": {
          "type": "nonce",
          "data": {
            "sequence": 1,
            "signers": [
              {
                "chain": "",
                "app": "sigs",
                "addr": "91C959ADE03D8973E8F2FBA9FD2EED327DCE2B0A"
              }
            ],
            "tx": {
              "type": "coin/send",
              "data": {
                "inputs": [
                  {
                    "address": {
                      "chain": "",
                      "app": "role",
                      "addr": "62616E6B32"
                    },
                    "coins": [
                      {
                        "denom": "mycoin",
                        "amount": 900000
                      }
                    ]
                  }
                ],
                "outputs": [
                  {
                    "address": {
                      "chain": "",
                      "app": "sigs",
                      "addr": "BDADF167E6CF2CDF2D621E590FF1FED2787A40E0"
                    },
                    "coins": [
                      {
                        "denom": "mycoin",
                        "amount": 900000
                      }
                    ]
                  }
                ]
              }
            }
          }
        }
      }
    },
    "signatures": null
  }
}

Sign a Tx

Once you construct a proper json-encoded basecoin.Tx, you can sign it once, or (if you constructed it with multi=true), multiple times.

POST /sign

Input:

{
    "name": "matt",
    "password": "1234567890",
    "tx": {
        "type": "sigs/multi",
        "data": {
            "tx": // see output of /build/send,
            "signatures": nil,
        }
    }
}

Output:

basecli tx send --to=role:62616E6B32 --from=sigs:91C959ADE03D8973E8F2FBA9FD2EED327DCE2B0A --amount=900000mycoin --sequence=1 --multi --no-sign --prepare=unsigned.json

echo 1234567890 | basecli tx --in=unsigned.json --prepare=- --name=matt

{
    "type": "sigs/multi",
    "data": {
        "tx": // see output of /build/send,
        "signatures": [
            {
                "Sig": {
                    "type": "ed25519",
                    "data": "436188FAC4668DDF6729022454AFBA5DA0B44E516C4EC7013C6B00BD877F255CDE0355F3FBFE9CCF88C9F519C192D498BF087AFE0D531351813432A100857803"
                },
                "Pubkey": {
                    "type": "ed25519",
                    "data": "B01508EB073C0823E2CE6ABF4538BA02EAEC39B02113290BBFCEC7E1B07F575A"
                }
            }
        ]
    }
}

Send Tx to the Blockchain

This will encode the transaction as binary and post it to the tendermint node, waiting until it is committed to the blockchain. (TODO: make this async? return when recevied, notify when committed?)

POST /tx

Input:

Signed tx as json, directly copy output of /sign

Output:

echo 1234567890 | basecli tx send --to=role:62616E6B32 --from=sigs:91C959ADE03D8973E8F2FBA9FD2EED327DCE2B0A --amount=900000mycoin --sequence=1 --multi --name=matt --prepare=signed.json

basecli tx --in=signed.json --no-sign

{
  "check_tx": {
    "code": 0,
    "data": "",
    "log": ""
  },
  "deliver_tx": {
    "code": 0,
    "data": "",
    "log": ""
  },
  "hash": "4D0EB7853E71AB6E3021990CF733F70F4CC2E001",
  "height": 1494
}

Query account balance

GET /query/account/sigs:BDADF167E6CF2CDF2D621E590FF1FED2787A40E0

{
  "height": 1170,
  "data": {
    "coins": [
      {
        "denom": "mycoin",
        "amount": 12345
      }
    ]
  }
}

Other stuff for MVP

You must run basecli init int he cli to set things up.

When you run basecli serve, it will start the local rest api server, with the above endpoints.

Also, support keys endpoints from go-crypto as they currently are and mount them under /keys.

Future Stuff

proxy mounted as well under /tendermint

/tendermint/status /tendermint/block

info about self...

/

{
    "app": "basecli",
    "version": "0.7.1",  // of client, server????
    "modules": {
        "chain": "0.1.0",
        "fees": "0.2.1",
        "coin": "0.3.2",
        "stake": "0.1.2"
    },
    "nodes": [
        "localhost:46657",
        "mercury.interchain.io:443"
    ]
}

/seeds

{
    "last_height": 4555,
    "update_problems": "too much change"
}

info on last seed