mirror of
https://github.com/bigchaindb/js-bigchaindb-driver.git
synced 2024-10-31 23:45:22 +01:00
208 lines
5.5 KiB
ReStructuredText
Executable File
208 lines
5.5 KiB
ReStructuredText
Executable File
====================
|
||
Basic Usage Examples
|
||
====================
|
||
|
||
For the examples on this page, we assume you've :doc:`installed the bigchaindb_driver JavaScript package <quickstart>`,
|
||
and you have determined the BigchainDB Root URL (issue: move this to general docs)
|
||
of the node or cluster you want to connect to.
|
||
|
||
This example guides you through creating and transferring an asset.
|
||
We walk through the code explaining its use, some pieces are left out
|
||
because they have no real use (e.g. defenition of global variable)
|
||
*Full working code* can be found at the bottom of this document.
|
||
|
||
Getting Started
|
||
---------------
|
||
We begin by creating an object of BigchainDB driver:
|
||
|
||
.. code-block:: js
|
||
|
||
// ES6 Browser
|
||
import * as driver from 'js-bigchaindb-driver';
|
||
// ES<<6 Browser
|
||
let driver = require('js-bigchaindb-driver');
|
||
// ES<<6 CommonJS / node
|
||
let driver = require('js-bigchaindb-driver/dist/node');
|
||
|
||
Next, we define a constant containing the API path.
|
||
|
||
.. code-block:: js
|
||
|
||
// http(s)://<bigchaindb-API-url>/ (e.g. http://localhost:9984/api/v1/)
|
||
const API_PATH = 'http://localhost:9984/api/v1/';
|
||
|
||
Cryptographic Identities Generation
|
||
-----------------------------------
|
||
Alice and Bob are represented by public/private key pairs. The private key is
|
||
used to sign transactions, meanwhile the public key is used to verify that a
|
||
signed transaction was indeed signed by the one who claims to be the signee.
|
||
|
||
.. code-block:: js
|
||
|
||
const alice = new driver.Ed25519Keypair();
|
||
const bob = new driver.Ed25519Keypair();
|
||
|
||
Digital Asset Definition
|
||
------------------------
|
||
|
||
As an example, let’s consider the creation and transfer of a digital asset
|
||
that represents a bicycle:
|
||
|
||
.. code-block:: js
|
||
|
||
bicycle = {
|
||
'data': {
|
||
'bicycle': {
|
||
'serial_number': 'abcd1234',
|
||
'manufacturer': 'bkfab',
|
||
},
|
||
},
|
||
}
|
||
|
||
We'll suppose that the bike belongs to Alice, and that it eventually will be
|
||
transferred to Bob.
|
||
|
||
In general, you are free to define any JSON object you which to store for the
|
||
``'data'`` property
|
||
|
||
Metadata Definition (*optional*)
|
||
--------------------------------
|
||
|
||
You can `optionally` add metadata to a transaction. Any JSON object is accepted.
|
||
|
||
For example, the bicycle will be transferred on earth which is metadata:
|
||
|
||
.. code-block:: js
|
||
|
||
metadata = {'planet': 'earth'}
|
||
|
||
Asset Creation
|
||
--------------
|
||
|
||
We're now ready to create the digital asset. First, let's make a 'CREATE'
|
||
transaction:
|
||
|
||
.. code-block:: js
|
||
|
||
const txCreateAliceSimple = driver.Transaction.makeCreateTransaction(
|
||
bicycle,
|
||
metadata,
|
||
[ driver.Transaction.makeOutput(
|
||
driver.Transaction.makeEd25519Condition(alice.publicKey)
|
||
)],
|
||
alice.publicKey
|
||
);
|
||
|
||
The transaction now needs to be fulfilled by signing it with Alice’s
|
||
private key:
|
||
|
||
.. code-block:: js
|
||
|
||
const txCreateAliceSimpleSigned = driver.Transaction.signTransaction(txCreateAliceSimple, alice.privateKey);
|
||
|
||
And sent over to a BigchainDB node:
|
||
|
||
.. code-block:: js
|
||
|
||
driver.Connection.postTransaction(txCreateAliceSimpleSigned, API_PATH)
|
||
|
||
Notice the transaction ``id``:
|
||
|
||
.. code-block:: js
|
||
|
||
txid = txCreateAliceSimpleSigned.id
|
||
|
||
To check the status of the transaction:
|
||
|
||
.. code-block:: js
|
||
|
||
driver.Connection.getStatus(txCreateAliceSimpleSigned.id, API_PATH)
|
||
|
||
It is also possible to check the status every 0.5 seconds
|
||
with use of the transaction ``id``:
|
||
|
||
.. code-block:: js
|
||
|
||
return driver.Connection.pollStatusAndFetchTransaction(txCreateAliceSimpleSigned.id, API_PATH)
|
||
|
||
.. note:: It may take a small amount of time before a BigchainDB cluster
|
||
confirms a transaction as being valid.
|
||
|
||
Asset Transfer
|
||
--------------
|
||
|
||
Imagine some time goes by, during which Alice is happy with her bicycle, and
|
||
one day, she meets Bob, who is interested in acquiring her bicycle. The timing
|
||
is good for Alice as she had been wanting to get a new bicycle.
|
||
|
||
To transfer the bicycle (asset) to Bob, Alice must consume the transaction in
|
||
which the Bicycle asset was created.
|
||
|
||
Alice could retrieve the transaction:
|
||
|
||
.. code-block:: js
|
||
|
||
driver.Connection.getTransaction(txCreateAliceSimpleSigned.id)
|
||
|
||
First, let's prepare the transaction to be transferred.
|
||
|
||
.. code-block:: js
|
||
|
||
const txTransferBob = driver.Transaction.makeTransferTransaction(
|
||
txCreateAliceSimpleSigned,
|
||
{price: '100 euro'},
|
||
[ driver.Transaction.makeOutput(
|
||
driver.Transaction.makeEd25519Condition(bob.publicKey)
|
||
)],
|
||
0
|
||
);
|
||
|
||
The function ``makeTransferTransaction()`` needs following parameters:
|
||
|
||
- Unspent transaction: Previous transaction you have control over (i.e. can fulfill its Output Condition)
|
||
- Metadata for transaction (e.g. price of sold bike)
|
||
- Array of output objects to add to the transaction: Think of these as the recipients of the asset after the transaction. For `TRANSFER` transactions, this should usually just be a list of outputs wrapping Ed25519 conditions generated from the public keys of the recipients.
|
||
- Indices of the outputs in `unspent transaction` that this transaction fulfills.
|
||
|
||
Fulfill transaction by signing it with Alice's private key.
|
||
|
||
.. code-block:: js
|
||
|
||
txTransferBobSigned = driver.Transaction.signTransaction(txTransferBob, alice.privateKey);
|
||
|
||
And sent over to a BigchainDB node:
|
||
|
||
.. code-block:: js
|
||
|
||
return driver.Connection.postTransaction(txTransferBobSigned, API_PATH)
|
||
|
||
Bob is the new owner:
|
||
|
||
.. code-block:: js
|
||
|
||
|
||
|
||
Alice is the former owner:
|
||
|
||
.. code-block:: js
|
||
|
||
code
|
||
|
||
|
||
|
||
|
||
Recap: Asset Creation & Transfer
|
||
--------------------------------
|
||
|
||
.. code-block:: js
|
||
|
||
|
||
|
||
Other examples
|
||
--------------
|
||
|
||
|
||
|
||
|
||
TODO:
|
||
- Add lexer: https://stackoverflow.com/questions/4259105/which-sphinx-code-block-language-to-use-for-json |