[PYTHON] Erleben Sie Blockchain mit BigchainDB

Zuerst habe ich die Artikel hier gelesen und aufgeholt. https://www.slideshare.net/cookle/5-58379474 http://qiita.com/hshimo/items/1881fba8957c2a6e17ca http://qiita.com/akitoh/items/bebf1bf3d71d3e4b96b0

Daher fand ich die Blockchain sehr nützlich.

Ich weiß es nur grob, aber ich möchte es trotzdem verschieben. Wenn Sie einen Fehler machen, beeilen Sie sich bitte. Versuchen Sie es mit einer Bibliothek namens bigchaindb, an der ich mich schon lange interessiert habe. Es heißt, es ist eine skalierbare Blockchain-Datenbank. Es ist kein reines p2p, sondern eine Bibliothek, die eine verteilte Datenbank und eine Blockchain kombiniert.

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

BigchainDB-Anwendungsfall

Verfolgung von Immobilienvermögen entlang der Lizenzierungskette

BigchainDB reduziert den Lizenzwettbewerb für Kanäle, die Schöpfer und Zuschauer verbinden, und bietet eine perfekte Investition in digitale Artefakte. Ein typischer Musikdienst hat 38 Millionen Songs. BigchainDB kann diese Informationen sofort speichern sowie Lizenzinformationen für jeden Song und Informationen zur Abonnentennutzung. Stellen Sie sich als weiteres Beispiel einen mittelgroßen Fotomarkt vor, auf dem 100.000 Transaktionen pro Tag ausgeführt werden. Die Anwendung auf Bitcoin kostet 10.000 US-Dollar pro Tag und stellt eine Verbindung zum Bitcoin-Netzwerk her.

Quittung und Zertifikat.

BigchainDB reduziert rechtliche Reibungsverluste durch unwiderlegbare Beweise für elektronisches Verhalten. BigchainDB kann Support-Informationen wie Quittungen und Zertifikate (COA) auch direkt speichern, anstatt sie mit Dokumenten zu verknüpfen oder Hashes zu speichern.

Abkürzung ~

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

Unterschied zur traditionellen Blockkette

Es wird keine Verbindung zum vorherigen Block per Hash hergestellt. Eine Abstimmungsliste wird im Block aufbewahrt. Der signierende Knoten stimmt ab. Es ist gültig, wenn Sie die Mehrheit der Stimmen für den Block erhalten. Und zum Zeitpunkt der Abstimmung tritt eine Kette auf.

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

Terminologie

BigchainDB Node Ein BigchainDB-Knoten ist eine Gruppe von Computern, auf denen ein MongoDB-Server, ein BigchainDB-Server, ausgeführt wird. Jeder Knoten wird von einer Person oder Organisation gesteuert. BigchainDB Cluster Eine Reihe von BigchainDB-Knoten kann zu einem BigchainDB-Cluster verbunden werden. Auf jedem Knoten im Cluster wird dieselbe Software ausgeführt. Der Cluster enthält einen logischen MongoDB-Datenspeicher. BigchainDB Consortium Die Personen und Organisationen, die die Knoten im Cluster ausführen, gehören zum BigchainDB-Konsortium (einer anderen Organisation). Das Konsortium benötigt eine Governance-Struktur, um Entscheidungen treffen zu können. Wenn ein Unternehmen einen Cluster betreibt, ist dieses Unternehmen das einzige "Konsortium". Ein Cluster ist eine Sammlung verbundener Knoten. Ein Konsortium ist eine Organisation mit einem Cluster, und jeder Knoten im Cluster hat einen anderen Operator. Was ist ein Operator ... Auf jeden Fall wird es als Bild mit einem Cluster unter dem Konsortium und einem Knoten unter dem Cluster interpretiert.

Dokumentstruktur

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

Auf einer höheren Ebene können Sie die BigchainDB-Client-Server-HTTP-API oder einen Wrapper für diese API (z. B. den BigchainDB-Python-Treiber) verwenden, um mit einem BigchainDB-Cluster (einer Reihe von Knoten) zu kommunizieren. Der BigchainDB-Python-Treiber unterstützt das Vorbereiten, Ausführen und Senden von Transaktionen an BigchainDB-Knoten. Transaktion nach ID abrufen. Ruft den Status der Transaktion anhand der ID ab.

Serverseite: Serverdokumente, Server-Schnellstart, http-API-Dokumente Client-Seite: Python-Treiberdokumente Andere: comannd line tran ... tool

Umgebung

ubuntu14 or mac python3 conda DB wählt RethinkDB oder MongoDB. Wird RethinkDB noch unterstützt?

BigchainDB Server Einstellungen

Dies ist eine serverseitige Einstellung.

Installieren Sie in der Python-Umgebung

Es funktioniert nur, wenn es python3 ist, also habe ich mit conda zu python3 gewechselt.

Klicken Sie hier für 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

Setzen Sie Mongo 3.4 oder höher

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

Klicken Sie hier für Mongo. Es ist eine JSON-basierte Datenbank, und Sie können sie einwerfen, ohne über den Typ nachzudenken. 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

Aufbau

Wenn Sie auf einem Server ausgeführt werden, ändern Sie den IP- oder Domain-Teil

sudo emacs ~/.bigchaindb

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

0.0.0.0 zu Informationen auf meinem Server

Referenz https://docs.bigchaindb.com/projects/server/en/latest/production-nodes/setup-run-node.html

Anlaufen

Starten Sie MongoDB

sudo mongod --replSet=bigchain-rs

Dies führte zu einem Fehler. Wenn Sie dies nicht tun, können Sie es überspringen. Der Mongo, den ich vorher eingesetzt habe, ist im Weg. Unten gelöst. http://kiita312.hatenablog.com/entry/2013/03/03/130935

Richten Sie eine andere Konsole mit Bigchain-Rs ein.

Starten Sie BigchainDB Server

bigchaindb start

Ein Baumstamm kommt heraus und bewegt sich. Dies. Dieser Typ wird arbeiten.

****************************************************************************
*                                                                          *
*   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)


Greifen Sie auf den Teil von localhost zu: 9984.

Wenn Sie es mit einem Browser drücken, wird etwas zurückkommen

{
  "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 Hit von der Client-Seite.

Installation

pip3 install bigchaindb_driver
or
pip install bigchaindb_driver

Erstellung und Übertragung von Assets Erstellung und Übertragung von Assets

Sind Daten ein Bild von Vermögenswerten, da Vermögenswerte eine vermögensähnliche Bedeutung haben? Ich bin müde. Das Fahrrad gehört Alice und übernimmt den Prozess, der an Bob übergeben werden soll. Die Interpretation des Prozesses wird im Kommentar beschrieben.

python


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

#Erzeugung kryptografischer Paare
alice, bob = generate_keypair(), generate_keypair()

bdb_root_url = 'http://0.0.0.0:9984'  #Schreibe auf BigchainDB Root URL um! !!

bdb = BigchainDB(bdb_root_url)

#Asset-Definition
bicycle_asset = {
    'data': {
        'bicycle': {
            'serial_number': 'abcd1234',
            'manufacturer': 'bkfab'
        },
    },
}
#Optionale Metadaten können der Transaktion hinzugefügt werden
bicycle_asset_metadata = {
    'planet': 'earth'
}

#Asset-Erstellung
#Anstelle von RDB-Datensätzen speichert Bigchain Daten in Transaktionseinheiten.
#Vorbereitung für die Transaktion.
prepared_creation_tx = bdb.transactions.prepare(
    operation='CREATE',
    signers=alice.public_key,
    asset=bicycle_asset,
    metadata=bicycle_asset_metadata
)

#Die Transaktion muss durch Signieren mit Alices privatem Schlüssel durchgeführt werden.
fulfilled_creation_tx = bdb.transactions.fulfill(
    prepared_creation_tx,
    private_keys=alice.private_key
)

#An BigchainDB-Knoten senden! !! !!
sent_creation_tx = bdb.transactions.send(fulfilled_creation_tx)

txid = fulfilled_creation_tx['id']

#Überprüfen Sie den Status der Transaktion so lange, bis die Transaktion gültig ist
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']
}

#Asset-Erstellung
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)


Fahrrad ist unter Bob. Der Vorbesitzer ist Alice. Ich habe das Ergebnis gesehen.

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

Der Entwurf wird vorbereitet, erfüllt und gesendet.

Library Reference

BigchainDB driver class

bigchaindb_driver.driver.TransactionsEndpoint

Führt die angegebene Transaktion aus.

Rückgabewert: Erfülltes Transaktionsnutzlast-Diktat, das an die BigchainDB Federation gesendet werden kann

Bereiten Sie sich auf die Vorbereitung der Transaktionsnutzdaten vor und erfüllen Sie diese. Sie können im Betrieb CREATE oder TRANSFER auswählen.

Rückgabewert: Diktat der vorbereiteten Transaktion

Senden Sie eine Transaktion an den Verband.

Rückgabewert: Diktat der an den Verbundknoten gesendeten Transaktion

Es gibt andere, aber Details sind unten https://docs.bigchaindb.com/projects/py-driver/en/latest/libref.html?highlight=prepare#driver

Schließlich

Wenn ich das nächste Mal einen Artikel schreibe, habe ich vor, mich etwas eingehender mit der Übertragung von Transaktionen und der API zu befassen.

ps

Die Node-Version war auch Docker und die Demo funktionierte perfekt. https://github.com/bigchaindb/bigchaindb-examples

Recommended Posts

Erleben Sie Blockchain mit BigchainDB
Erkennung von Blockchain-Manipulationen mit Python
Implementieren Sie eine Blockchain mit ca. 60 Zeilen
Einzelpixel-Kamera zum Erleben mit Python