[PYTHON] Découvrez la blockchain avec BigchainDB

Au début, j'ai lu les articles par ici et rattrapé. https://www.slideshare.net/cookle/5-58379474 http://qiita.com/hshimo/items/1881fba8957c2a6e17ca http://qiita.com/akitoh/items/bebf1bf3d71d3e4b96b0

J'ai donc trouvé la blockchain très utile.

Je ne le sais qu'en gros, mais je veux quand même le déplacer. Si vous faites une erreur, veuillez vous précipiter. Essayez d'utiliser une bibliothèque appelée bigchaindb qui m'intéresse depuis longtemps. Il dit que c'est une base de données blockchain évolutive. Une bibliothèque qui combine une base de données distribuée et une blockchain plutôt qu'une pure sensation p2p.

--Officiel https://docs.bigchaindb.com/en/latest/index.html

Cas d'utilisation de BigchainDB

Suivi des actifs immobiliers tout au long de la chaîne de licence

BigchainDB réduit la concurrence des licences pour les chaînes qui connectent les créateurs et les téléspectateurs, et offre un investissement parfait dans les artefacts numériques. Un service de musique typique compte 38 millions de chansons. BigchainDB peut stocker ces informations en un clin d'œil, ainsi que des informations de licence pour chaque chanson et des informations sur l'utilisation des abonnés. Comme autre exemple, prenons un marché photo de taille moyenne qui exécute 100 000 transactions par jour. L'application de cela à Bitcoin coûte 10000 USD par jour et se connecte au réseau Bitcoin.

Reçu et certificat.

BigchainDB réduit les frictions juridiques en fournissant des preuves irréfutables du comportement électronique. BigchainDB peut également stocker directement les informations de support, telles que les reçus et les certificats (COA), plutôt que de créer des liens vers des documents ou de stocker des hachages.

Abréviation ~

https://www.thoughtworks.com/insights/blog/blockchain-practice-tamper-proof-read-receipts

Différence avec la chaîne de blocs traditionnelle

Il ne se connecte pas au bloc précédent par hachage. Une liste de vote est conservée à l'intérieur du bloc. Le nœud de signature vote. Il sera valable si vous obtenez une majorité des voix en faveur du blocage. Et une chaîne se produit au moment du vote.

スクリーンショット 2017-08-30 21.12.20.png

Terminologie

BigchainDB Node Un nœud BigchainDB est un ensemble de machines exécutant un serveur MongoDB, un serveur BigchainDB. Chaque nœud est contrôlé par un individu ou une organisation. BigchainDB Cluster Un ensemble de nœuds BigchainDB peut être interconnecté pour former un cluster BigchainDB. Chaque nœud du cluster exécute le même logiciel. Le cluster contient une banque de données MongoDB logique. BigchainDB Consortium Les personnes et organisations qui exécutent les nœuds du cluster appartiennent au consortium BigchainDB (une autre organisation). Le consortium a besoin d'une structure de gouvernance pour prendre des décisions. Si une entreprise exploite un cluster, cette entreprise est le seul «consortium». Un cluster est un ensemble de nœuds connectés. Un consortium est une organisation qui possède un cluster et chaque nœud du cluster a un opérateur différent. Qu'est-ce qu'un opérateur ... Quoi qu'il en soit, il est interprété comme une image avec un cluster sous le consortium et un nœud sous le cluster.

Structure du document

スクリーンショット 2017-08-19 3.20.30.png

À un niveau supérieur, vous pouvez utiliser l'API HTTP BigchainDB Client-Serveur, ou un wrapper pour cette API (tel que le pilote Python BigchainDB), pour communiquer avec un cluster BigchainDB (un ensemble de nœuds). Le pilote Python BigchainDB prend en charge la préparation, l'exécution et l'envoi de transactions aux nœuds BigchainDB. Obtenez la transaction par identifiant. Obtenez le statut de la transaction par identifiant.

Côté serveur: documentation du serveur, démarrage rapide du serveur, documentation de l'API http Côté client: documentation du pilote python Autres: outil de tran ... ligne comannd

environnement

ubuntu14 or mac python3 conda DB choisit RethinkDB ou MongoDB, RethinkDB est-il toujours pris en charge?

Paramètres du serveur BigchainDB

Il s'agit d'un paramètre côté serveur.

Installer autour de l'environnement python

Cela ne fonctionne pas à moins que ce ne soit python3, donc je suis passé à python3 avec conda.

Cliquez ici pour conda http://qiita.com/miyamotok0105/items/5f26e4ae41f0e35ded16

sudo apt-get update
sudo apt-get install g++ python3-dev libffi-dev build-essential libssl-dev
sudo apt-get install python3-pip
sudo pip3 install --upgrade pip setuptools
sudo pip3 install bigchaindb
bigchaindb -y configure mongodb

mettre mongo 3.4 ou supérieur

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

Cliquez ici pour mongo en premier lieu. C'est une base de données basée sur JSON, et vous pouvez la lancer sans penser au type. http://qiita.com/saba1024/items/f2ad56f2a3ba7aaf8521

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu precise/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
mongo --version
sudo mkdir -p /data/db
sudo chmod -R 700 /data/db

Réglage

Si vous exécutez sur un serveur, modifiez la partie ip ou domaine

sudo emacs ~/.bigchaindb

"server": {"bind": "localhost:9984", ... } to "server": {"bind": "0.0.0.0:9984", ... }

0.0.0.0 aux informations sur mon serveur

référence https://docs.bigchaindb.com/projects/server/en/latest/production-nodes/setup-run-node.html

Commencez

Démarrez MongoDB

sudo mongod --replSet=bigchain-rs

Cela a entraîné une erreur. Sinon, vous pouvez l'ignorer. Le mongo que j'ai installé avant est un obstacle. Résolu ci-dessous. http://kiita312.hatenablog.com/entry/2013/03/03/130935

Configurez une autre console avec bigchain-rs en cours d'exécution.

Démarrez le serveur BigchainDB

bigchaindb start

Un journal sort et se déplace. Cette. Ce gars va travailler.

****************************************************************************
*                                                                          *
*   Initialization complete. BigchainDB Server is ready and waiting.       *
*   You can send HTTP requests via the HTTP API documented in the          *
*   BigchainDB Server docs at:                                             *
*    https://bigchaindb.com/http-api                                       *
*                                                                          *
*   Listening to client connections on: localhost:9984                     *
*                                                                          *
****************************************************************************
 (MainProcess - pid: 15547)
======== Running on http://localhost:9985 ========
(Press CTRL+C to quit)
[2017-08-19 02:47:02] [INFO](gunicorn.error) Starting gunicorn 19.7.1 (webapi     - pid: 15680)
[2017-08-19 02:47:02] [INFO](gunicorn.error) Listening at: http://127.0.0.1:9984 (15680) (webapi     - pid: 15680)
[2017-08-19 02:47:02] [INFO](gunicorn.error) Using worker: sync (webapi     - pid: 15680)
[2017-08-19 02:47:02] [INFO](gunicorn.error) Booting worker with pid: 15685 (webapi     - pid: 15685)
[2017-08-19 02:47:02] [INFO](gunicorn.error) Booting worker with pid: 15686 (webapi     - pid: 15686)
[2017-08-19 02:47:02] [INFO](gunicorn.error) Booting worker with pid: 15687 (webapi     - pid: 15687)
[2017-08-19 02:47:02] [INFO](gunicorn.error) Booting worker with pid: 15688 (webapi     - pid: 15688)
[2017-08-19 02:47:03] [INFO](gunicorn.error) Booting worker with pid: 15689 (webapi     - pid: 15689)
[2017-08-19 02:47:07] [INFO](bigchaindb.backend.mongodb.connection) Closing initial connection to MongoDB (Process-16 - pid: 15659)


Accéder à la partie de localhost: 9984.

Si vous cliquez dessus avec un navigateur, quelque chose reviendra

{
  "api": {
    "v1": {
      "assets": "/api/v1/assets/", 
      "docs": "https://docs.bigchaindb.com/projects/server/en/v1.0.1/http-client-server-api.html", 
      "outputs": "/api/v1/outputs/", 
      "statuses": "/api/v1/statuses/", 
      "streams": "ws://localhost:9985/api/v1/streams/valid_transactions", 
      "transactions": "/api/v1/transactions/"
    }
  }, 
  "docs": "https://docs.bigchaindb.com/projects/server/en/v1.0.1/", 
  "keyring": [], 
  "public_key": "HPxXw3Kbkj8BVvgR49xa7jaUkHpmmqwL39pmk5qpbdjQ", 
  "software": "BigchainDB", 
  "version": "1.0.1"
}

BigchainDB Python Driver Frappé du côté client.

Installation

pip3 install bigchaindb_driver
or
pip install bigchaindb_driver

Création et transfert d'actifs Création et transfert d'actifs

Étant donné que les actifs ont une signification similaire à celle des actifs, les données sont-elles une image des actifs? J'ai sommeil. Le vélo appartient à Alice et assume le processus à transmettre à Bob. L'interprétation du processus est décrite dans le commentaire.

python


# -*- coding: utf-8 -*-
from bigchaindb_driver import BigchainDB
from bigchaindb_driver.crypto import generate_keypair
from time import sleep
from sys import exit

#Génération de paires cryptographiques
alice, bob = generate_keypair(), generate_keypair()

bdb_root_url = 'http://0.0.0.0:9984'  #Réécrire vers l'URL racine de BigchainDB! !!

bdb = BigchainDB(bdb_root_url)

#Définition de l'actif
bicycle_asset = {
    'data': {
        'bicycle': {
            'serial_number': 'abcd1234',
            'manufacturer': 'bkfab'
        },
    },
}
#Des métadonnées facultatives peuvent être ajoutées à la transaction
bicycle_asset_metadata = {
    'planet': 'earth'
}

#Création d'actifs
#Au lieu d'enregistrements RDB, la bigchain stocke les données dans des unités de transaction.
#Préparation de la transaction.
prepared_creation_tx = bdb.transactions.prepare(
    operation='CREATE',
    signers=alice.public_key,
    asset=bicycle_asset,
    metadata=bicycle_asset_metadata
)

#La transaction doit être effectuée en signant avec la clé privée d'Alice.
fulfilled_creation_tx = bdb.transactions.fulfill(
    prepared_creation_tx,
    private_keys=alice.private_key
)

#Envoyer au nœud BigchainDB! !! !!
sent_creation_tx = bdb.transactions.send(fulfilled_creation_tx)

txid = fulfilled_creation_tx['id']

#Continuez à vérifier le statut de la transaction jusqu'à ce que la transaction soit valide
trials = 0
while trials < 60:
    try:
        if bdb.transactions.status(txid).get('status') == 'valid':
            print('Tx valid in:', trials, 'secs')
            break
    except bigchaindb_driver.exceptions.NotFoundError:
        trials += 1
        sleep(1)

if trials == 60:
    print('Tx is still being processed... Bye!')
    exit(0)

asset_id = txid

transfer_asset = {
    'id': asset_id
}

output_index = 0
output = fulfilled_creation_tx['outputs'][output_index]

transfer_input = {
    'fulfillment': output['condition']['details'],
    'fulfills': {
        'output_index': output_index,
        'transaction_id': fulfilled_creation_tx['id']
    },
    'owners_before': output['public_keys']
}

#Création d'actifs
prepared_transfer_tx = bdb.transactions.prepare(
    operation='TRANSFER',
    asset=transfer_asset,
    inputs=transfer_input,
    recipients=bob.public_key,
)

fulfilled_transfer_tx = bdb.transactions.fulfill(
    prepared_transfer_tx,
    private_keys=alice.private_key,
)

sent_transfer_tx = bdb.transactions.send(fulfilled_transfer_tx)

print("Is Bob the owner?",
    sent_transfer_tx['outputs'][0]['public_keys'][0] == bob.public_key)

print("Was Alice the previous owner?",
    fulfilled_transfer_tx['inputs'][0]['owners_before'][0] == alice.public_key)


le vélo est sous bob. L'ancien propriétaire est Alice. J'ai vu le résultat.

Tx valid in: 0 secs
Is Bob the owner? True
Was Alice the previous owner? True

Le plan est préparé, rempli et envoyé.

Library Reference

BigchainDB driver class

bigchaindb_driver.driver.TransactionsEndpoint

Exécute la transaction spécifiée.

Valeur de retour: la charge utile de la transaction exécutée est prête à être envoyée à BigchainDB Federation

Préparez-vous à la préparation de la charge utile de la transaction et exécutée. Vous pouvez sélectionner CREATE ou TRANSFER pendant l'opération.

Valeur de retour: dict de la transaction préparée

Soumettez une transaction à la fédération.

Valeur de retour: dict de la transaction envoyée au nœud de fédération

Il y en a d'autres, mais les détails sont ci-dessous https://docs.bigchaindb.com/projects/py-driver/en/latest/libref.html?highlight=prepare#driver

finalement

La prochaine fois que j'écrirai un article, je prévois de creuser un peu plus dans le transfert de transactions et autour des api.

ps

La version du nœud était également docker et la démo fonctionnait parfaitement. https://github.com/bigchaindb/bigchaindb-examples

Recommended Posts

Découvrez la blockchain avec BigchainDB
Détection de falsification de la blockchain avec Python
Implémentez la blockchain avec environ 60 lignes
Caméra à pixel unique à expérimenter avec Python