bigchaindb/docs/source/getting-started.md
2016-02-10 15:21:29 +01:00

4.6 KiB

Getting Started

With BigchainDB and rethinkDB installed and running we can start creating and transferring digital assets.

Importing BigchainDB

First, lets open a python shell

$ python

Then we can import and instantiate BigchainDB

from bigchaindb import Bigchain
b = Bigchain()

When instantiating Bigchain witouth arguments it reads the configurations stored in $HOME/.bigchaindb

Creating digital assets

In BigchainDB only the federation nodes are allowed to create digital assets using the CREATE operation on the transaction. Digital assets are usually created and assigned to a user, which in BigchainDB is represented by a public key.

BigchainDB allows you to define your digital asset as a generic python dict that will be used has a payload of the transaction.

# create a test user
testuser1_priv, testuser1_pub = b.generate_keys()

# define a digital asset
digital_asset = {'msg': 'Hello BigchainDB!'}

# a create transaction uses the operation `CREATE` has no inputs
tx = b.create_transaction(b.me, testuser1_pub, None, 'CREATE', payload=digital_asset)

# all transactions need to be signed by the user creating the transaction
tx_signed = b.sign_transaction(tx, b.me_private)

# write the transaction to the bigchain
# the transaction will be store in a backlog where it will be validated,
# included in a block and written to the bigchain 
b.write_transaction(tx_signed)
Reading transactions from the bigchain

After a couple of seconds we can check if the transactions was included in the bigchain.

# retrieve a transaction from the bigchain
tx_retrieved = b.get_transaction(tx_signed['id'])

   'id': '6539dded9479c47b3c83385ae569ecaa90bcf387240d1ee2ea3ae0f7986aeddd',
   'transaction': {   'current_owner': 'pvGtcm5dvwWMzCqagki1N6CDKYs2J1cCwTNw8CqJic3Q',
                      'data': {   'hash': '872fa6e6f46246cd44afdb2ee9cfae0e72885fb0910e2bcf9a5a2a4eadb417b8',
                                   'payload': {'msg': 'Hello BigchainDB!'}},
                      'input': None,
                      'new_owner': 'ssQnnjketNYmbU3hwgFMEQsc4JVYAmZyWHnHCtFS8aeA',
                      'operation': 'CREATE',
                      'timestamp': '1455108421.753908'}}

The new owner of the digital asset is now ssQnnjketNYmbU3hwgFMEQsc4JVYAmZyWHnHCtFS8aeA which is the public key of testuser1

Transferring digital assets

Now that testuser1 has a digital asset assigned to him he can now transfered it to another user. Transfer transactions now require an input. The input will a transaction id of a digital asset that was assigned to testuser1 which in our case is 6539dded9479c47b3c83385ae569ecaa90bcf387240d1ee2ea3ae0f7986aeddd

# create a second testuser
testuser2_priv, testuser2_pub = b.generate_keys()

# create a transfer transaction
tx_transfer = b.create_transaction(testuser1_pub, testuser2_pub, tx_retrieved['id'], 'TRANSFER')

# sign the transaction
tx_transfer_signed = b.sign_transaction(tx_transfer, testuser1_priv)

# write the transaction
b.write_transaction(tx_transfer_signed)

# check if the transaction is already in the bigchain
tx_transfer_retrieved = b.get_transaction(tx_transfer_signed['id'])

{   'id': '1b78c313257540189f27da480152ed8c0b758569cdadd123d9810c057da408c3',
    'signature': '3045022056166de447001db8ef024cfa1eecdba4306f92688920ac24325729d5a5068d47022100fbd495077cb1040c48bd7dc050b2515b296ca215cb5ce3369f094928e31955f6',
    'transaction': {   'current_owner': 'ssQnnjketNYmbU3hwgFMEQsc4JVYAmZyWHnHCtFS8aeA',
                       'data': None,
                       'input': '6539dded9479c47b3c83385ae569ecaa90bcf387240d1ee2ea3ae0f7986aeddd',
                       'new_owner': 'zVzophT73m4Wvf3f8gFYokddkYe3b9PbaMzobiUK7fmP',
                       'operation': 'TRANSFER',
                       'timestamp': '1455109497.480323'}}
Double Spends

BigchainDB makes sure that a digital asset assigned to a user cannot be transfered multiple times.

If we try to create another transaction with the same input as before the transaction will be marked invalid and the validation will trow a double spend exception

# create another transfer transaction with the same input
tx_transfer2 = b.create_transaction(testuser1_pub, testuser2_pub, tx_retrieved['id'], 'TRANSFER')

# sign the transaction
tx_transfer_signed2 = b.sign_transaction(tx_transfer2, testuser1_priv)

# check if the transaction is valid
b.validate_transaction(tx_transfer_signed2)
Exception: input `6539dded9479c47b3c83385ae569ecaa90bcf387240d1ee2ea3ae0f7986aeddd` was already spent