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