js-bigchaindb-driver/README.md

150 lines
6.1 KiB
Markdown
Raw Normal View History

2017-04-27 14:11:39 +02:00
# JavaScript Driver for BigchainDB
2017-02-10 17:57:14 +01:00
2017-04-27 14:11:39 +02:00
> Inspired by [`js-bigchaindb-quickstart`](https://github.com/sohkai/js-bigchaindb-quickstart) of @sohkhai [thanks]
2017-02-10 17:57:14 +01:00
2017-05-09 21:30:50 +02:00
> Supports BigchainDB Server v0.10 (Warning: use CORS enabled [branch](https://github.com/bigchaindb/bigchaindb/tree/kyber-master-feat-cors) untill [PR #1311](https://github.com/bigchaindb/bigchaindb/pull/1311) is resolved )
2017-02-10 17:57:14 +01:00
2017-04-27 14:11:39 +02:00
Some naive helpers to get you on your way to making some transactions, if you'd like to use
2017-02-10 17:57:14 +01:00
[BigchainDB](https://github.com/bigchaindb/bigchaindb) with JavaScript.
2017-04-27 14:11:39 +02:00
Aimed to support usage in browsers or node and ES∞+, so
2017-02-10 17:57:14 +01:00
you'll probably need a babel here and a bundler there (or use [one of the built versions](./dist)),
2017-04-27 14:11:39 +02:00
of which I expect you'll know quite well ([otherwise, go check out js-reactor](https://github.com/bigchaindb/js-reactor)).
2017-06-06 16:23:27 +02:00
[![Build Status](https://travis-ci.org/bigchaindb/js-bigchaindb-driver.svg?branch=master)](https://travis-ci.org/bigchaindb/js-bigchaindb-driver)
2017-04-27 14:11:39 +02:00
2017-05-11 10:22:48 +02:00
## Compatibility
2017-05-11 09:30:00 +02:00
| BigchainDB Server | BigchainDB Javascript Driver |
| ----------------- |------------------------------|
| `~=0.10.1` | `~=0.1.0` |
2017-04-27 14:11:39 +02:00
## Contents
- [Getting Started](#getting-started)
- [Usage](#usage)
- [Speed Optimizations](#speed-optimizations)
- [Warnings](#warnings)
2017-05-03 01:02:50 +02:00
- [API](API.md)
2017-02-10 17:57:14 +01:00
## Getting started
2017-04-27 14:11:39 +02:00
### Install from npm
2017-05-03 00:16:48 +02:00
```bash
# install from npm
2017-04-27 14:11:39 +02:00
npm install js-bigchaindb-driver
2017-05-03 00:18:15 +02:00
# Install from GitHub - ssh
2017-04-27 14:11:39 +02:00
npm install git+ssh://github.com/bigchaindb/js-bigchaindb-driver.git
2017-05-03 00:18:15 +02:00
# Install from GitHub - https
2017-04-27 14:11:39 +02:00
npm install git+https://github.com/bigchaindb/js-bigchaindb-driver.git
```
2017-05-03 00:16:48 +02:00
### Import / ES6
2017-04-27 14:11:39 +02:00
```javascript
2017-05-03 00:18:15 +02:00
// ES6 Browser
2017-04-27 14:11:39 +02:00
import * as driver from 'js-bigchaindb-driver';
2017-05-03 00:18:15 +02:00
// ES<<6 Browser
2017-04-27 14:11:39 +02:00
let driver = require('js-bigchaindb-driver');
2017-05-03 00:18:15 +02:00
// ES<<6 CommonJS / node
2017-04-27 14:11:39 +02:00
let driver = require('js-bigchaindb-driver/dist/node');
```
## Usage
```javascript
import * as driver from 'js-bigchaindb-driver';
// http(s)://<bigchaindb-API-url>/ (e.g. http://localhost:9984/api/v1/)
const API_PATH = 'http://localhost:9984/api/v1/';
2017-02-10 17:57:14 +01:00
2017-04-27 14:11:39 +02:00
// create a new user with a public-private keypair
const alice = new driver.Ed25519Keypair();
// Create a transation
const tx = driver.Transaction.makeCreateTransaction(
{ assetMessage: 'My very own asset...' },
{ metaDataMessage: 'wrapped in a transaction' },
[ driver.Transaction.makeOutput(
driver.Transaction.makeEd25519Condition(alice.publicKey))
],
alice.publicKey
);
// sign/fulfill the transaction
const txSigned = driver.Transaction.signTransaction(tx, alice.privateKey);
// send it off to BigchainDB
2017-05-11 18:51:30 +02:00
let conn = new driver.Connection(PATH, { 'Content-Type': 'application/json' });
2017-05-11 17:31:06 +02:00
conn.postTransaction(txSigned)
.then(() => conn.getStatus(txSigned.id))
.then((res) => console.log('Transaction status:', res.status));
2017-04-27 14:11:39 +02:00
```
You may also be interested in some [long-form tutorials with actual code](https://github.com/bigchaindb/kyber).
2017-02-10 17:57:14 +01:00
The expected flow for making transactions:
2017-04-27 14:11:39 +02:00
1. Go get yourself some keypairs! (or a whole bunch of them, nobody's
counting)
- `new driver.Ed25519Keypair()`
1. Construct a transaction payload that you can send of to BigchainDB:
- `driver.Transaction.makeCreateTransaction()` for creating a new asset or
- `driver.Transaction.makeTransferTransaction()` for transfering an existing asset
1. A transaction needs an output (\*):
- `driver.Transaction.makeOutput()` still requires a crypto-condition
- `driver.Transaction.makeEd25519Condition()` should do the trick for a simple public key output.
1. (**Optional**) You've got everything you need, except for an asset and metadata. Maybe define them (any
2017-02-10 17:57:14 +01:00
JSON-serializable object will do).
2017-04-27 14:11:39 +02:00
1. Ok, now you've got a transaction, but we need you to *sign* it cause, you
know... cryptography and `¯\_(ツ)_/¯`:
- `driver.Transaction.signTransaction()` allows you to sign with private keys.
1. Final step is to send the transaction off to BigchainDB:
- `driver.Connection.postTransaction()`
(\*) If you're not sure what any of this means (and you're as
2017-02-10 17:57:14 +01:00
confused as I think you are right now), you might wanna go check out [this](https://docs.bigchaindb.com/projects/server/en/latest/data-models/crypto-conditions.html)
and [this](https://docs.bigchaindb.com/projects/py-driver/en/latest/usage.html#asset-transfer)
2017-04-27 14:11:39 +02:00
and [this](https://tools.ietf.org/html/draft-thomas-crypto-conditions-01) first.
2017-02-10 17:57:14 +01:00
2017-04-27 14:11:39 +02:00
## Speed Optimizations
2017-02-10 17:57:14 +01:00
This implementation plays "safe" by using JS-native (or downgradable) libraries for its
2017-04-27 14:11:39 +02:00
crypto-related functions to keep compatibilities with the browser. If you do want some more speed, feel free to explore the following:
2017-02-10 17:57:14 +01:00
* [chloride](https://github.com/dominictarr/chloride), or its underlying [sodium](https://github.com/paixaop/node-sodium)
library
* [node-sha3](https://github.com/phusion/node-sha3) -- **MAKE SURE** to use [steakknife's fork](https://github.com/steakknife/node-sha3)
if [the FIPS 202 upgrade](https://github.com/phusion/node-sha3/pull/25) hasn't been merged
(otherwise, you'll run into all kinds of hashing problems)
2017-04-27 14:11:39 +02:00
## Warnings
2017-02-10 17:57:14 +01:00
> Crypto-conditions
Make sure you keep using a crypto-conditions implementation that implements the older v1 draft (e.g.
[`five-bells-condition@v3.3.1`](https://github.com/interledgerjs/five-bells-condition/releases/tag/v3.3.1)).
2017-04-27 14:11:39 +02:00
BigchainDB Server 0.10 does not implement the newer version of the spec and **WILL** fail if you to
2017-02-10 17:57:14 +01:00
use a newer implementation of crypto-conditions.
> SHA3
Make sure to use a SHA3 implementation that has been upgraded as per [FIPS 202](http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf).
Otherwise, the hashes you generate **WILL** be invalid in the eyes of the BigchainDB Server.
> Ed25519
2017-04-27 14:11:39 +02:00
If you do end up replacing `tweetnacl` with `chloride` (or any other `Ed25519` package), you might
2017-02-10 17:57:14 +01:00
want to double check that it gives you a correct public/private (or verifying/signing, if they use
that lingo) keypair.
2017-04-27 14:11:39 +02:00
An example BigchainDB Server-generated keypair (encoded in `base58`):
2017-02-10 17:57:14 +01:00
2017-04-27 14:11:39 +02:00
- Public: `DjPMHDD9JtgypDKY38mPz9f6owjAMAKhLuN1JfRAat8C`
- Private: `7Gf5YRch2hYTyeLxqNLgTY63D9K5QH2UQ7LYFeBGuKvo`
2017-02-10 17:57:14 +01:00
Your package should be able to take in the decoded version of the **private** key and return you the
2017-05-09 21:30:50 +02:00
same **public** key (once you encode that to `base58`).