js-bigchaindb-driver/README.md

167 lines
6.7 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
- [License](#license)
2017-02-10 17:57:14 +01:00
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`).
## License
```
Copyright 2017 BigchainDB GmbH
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```