Merge branch 'feature/186-http-api' into unstable
This commit is contained in:
commit
4245bb8a67
249
docs/rest/API_draft.md
Normal file
249
docs/rest/API_draft.md
Normal file
@ -0,0 +1,249 @@
|
||||
# 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
|
||||
Loading…
Reference in New Issue
Block a user