Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hyperledger Fabric - Die Open-Source Basis für ...

Ingo Rammer
December 13, 2018

Hyperledger Fabric - Die Open-Source Basis für Ihre Blockchain

In dieser Session stellt Ihnen Ingo Rammer die von der Linux-Foundation betreute Open-Source-Blockchain-Basistechnologie Hyperledger Fabric vor. Sie lernen die Grundlagen von Fabric für den Betrieb von privaten bzw. berechtigungsgestützten Blockchains kennen und erfahren die dafür geeigneten Einsatzgebiete, Architekturentscheidungen sowie Sicherheitsaspekte.
Nach diesen Grundlagen sehen Sie, wie Sie mit dieser Plattform Smart Contracts beispielsweise in Node.js entwickeln und mit Ihren existierenden Anwendungen ansprechen können

Ingo Rammer

December 13, 2018
Tweet

More Decks by Ingo Rammer

Other Decks in Programming

Transcript

  1. Hyperledger Fabric Open-Source Basis für Ihre Blockchain Ingo Rammer [email protected]

    10. – 13.12.2018 Frankfurt am Main #ittage Hyperledger Fabric Ingo Rammer Die Open-Source Basis für Ihre Blockchain
  2. Ingo Rammer Gründer und Geschäftsführer der Thinktecture AG, einem technischen

    Beratungsunternehmen für Software-Architekten und –Entwickler Mein persönlicher Fokus: Blockchain Technologien für B2B-Verwendung, von den Tiefen der Technologie bis hin zu ISO TC 307, Enterprise Ethereum Alliance und Hyperledger Foundation Slides: https://thinktecture.com/presentations Kontakt: [email protected] Twitter: @ingorammer
  3. • Wozu das Ganze? Warum private Blockchains? • Was ist

    Hyperledger, was ist Fabric? • Bausteine eines Fabric-Netzwerks • Transaktionsbehandlung in Fabric • Chaincode Grundlagen – Smart Contracts in Fabric • Client SDK Grundlagen Agenda
  4. • Gegenseitiges Vertrauen im B2B-Bereich grundsätzlich vorhanden (und vom jeweiligen

    Rechtssystem gedeckt) • Digitalisierung von analogen Papierprozessen über Firmengrenzen • Single Source of Truth – bei Prozessdaten und –schritten • Im Papierprozess komplex und mit Konsolidierungsaufwand • Zentrale Lösungen teilweise nur unter regulatorischem Zwang etabliert • ... und was passiert eigentlich, wenn wir Ländergrenzen überschreiten? • "Ja warum nehmt ihr denn nicht einfach eine replizierte Datenbank?" Private Blockchains?
  5. • Klassische replizierte Datenbanken typischerweise entweder: • Single Writer, Multiple

    Readers • Oder komplexe Konsolidierungsregeln im Applikationscode (zB Couch DB) • Offene Fragen • Stabilität: Single Point of Failure des Single Writers • Vertrauen: Datenintegrität und Neutralität des Single Writers • Technologisch: Codeausführung, Versionierung, Berechtigungsmanagement • Datensparsamkeit: Oft zusätzliches Punkt-zu-Punkt Netzwerk notwendig • Governance: wer darf Daten austauschen? • Diese Fragen werden von Tools für private Blockchains adressiert Replizierte Datenbank?
  6. • Hyperledger selbst ist keine Technologie, sondern ein Projekt der

    Linux Foundation • https://hyperledger.org • Mehrere unterschiedliche Blockchain-Technologien • Fabric, Sawtooth, Iroha, Indy, … • Zusätzliche Tools • Cello, Explorer, Composer Was ist Hyperledger?
  7. • Eine Plattform um private, permissionierte Blockchain-Netzwerke aufzubauen • Fokus:

    B2B • Keine ICOs, öffentliche Cryptowährungen, … • Permissionierungs- und Governance-Konstrukte • Berechtigungen: Organisationen, federated Identity, … • Governance: Mehrheit, m-von-n, … • Private Daten: Channels, Private Data Collections • Das Backend für Blockchain-Angebote von IBM, SAP, Oracle, ... Was ist Fabric?
  8. • Organisationen • Peers & Orderer • Chaincode & State-DB

    (z.B. CouchDB) • Endorsement & Policies • Channels & Private Data Collections Kernkonzepte
  9. • "Dezentralisierte Portierung von Telefonnummern" • Mehrere Telekom-Unternehmen und ein

    Regulator (Bundesnetzagentur) sind Teilnehmer des Netzwerks • Smart Contract verarbeitet die aktuelle Inhaberschaft/Verantwortung für Telefonnummern (Mapping: Nummer-zu-Anbieter) Das Szenario für diese Session
  10. Orgas verwalten Zertifikate für User & Nodes Telco 1 Telco

    2 Regulator MSP (Membership Service Provider): Zertifikaterstellung für User & Nodes
  11. • Channels sind unabhängige Blockchains • Nur die Teilnehmer eines

    Channels sehen dessen Daten • Channels sind permissioniert • Transiente oder permanente Subsets: Private Data Collections • Smart Contracts werden pro Channel verwaltet Channels sind Blockchains
  12. • Chaincode sind die Smart Contracts in Fabric • Auf

    ein Subset der Peers deployed • Versioniert und permissioniert • Greifen auf State DB (zB Couch DB) der lokalen Node zu Chaincode
  13. • Endorsement, Ordering, Validation • Endorsement: ein Subset der Peers

    entscheidet, ob Transaktion gültig ist (basierend auf Chaincode) • Ordering: Erzeugen einer Sequenz von Transaktionen; Verpacken in Blöcke • Validation: Vor dem finalen Commit prüft jeder Peer, ob Endorsement und Concurrency korrekt sind Dreistufiger Konsens
  14. Client app S D K O1 O2 O3 O4 E1

    E2 E3 P2 P1 C1 C1 C2 C1 P E O C Endorser Orderer Peer (Committer) Chaincode
  15. P E O C Endorser Orderer Peer (Committer) Chaincode Client

    app O1 O2 O3 O4 E1 E2 E3 P2 P1 C1 C1 C2 C1 Tx 1) Client erzeugt Transaction Proposal und sendet es an Endorser 2) Endorser simulieren Transaktion und signieren Read-/Write-Set Tx 3) Client sendet TX mit Endorse- ments an Orderer 4) Orderer inkludieren TX in einem folgenden Block 5) Orderer senden Block an Peers S D K 6) Peers validieren Endorsement & Concurrency. Nehmen Block in ihre Chains & State DBs auf Other app S D K 7) Peers senden Events an Subscriber
  16. • Verantwortungsbereich der Orderer: • Erlangen von Konsens über Sequenz

    der Transaktionen • Erzeugen von Blöcken, die Transaktionen beinhalten • Verteilen der Blöcke an Peers • NICHT: prüfen, ob Transaktionen gültig/endorsed sind! • Aktuell zwei fertig implementierte, technische Konsens- Optionen: "Solo" und "Kafka" • CFT (etcd/raft) und BFT sind in Bearbeitung Orderer erzeugen Blöcke O1 O2 O3 O4
  17. • Organisationen • Peers & Orderer • Chaincode & State-DB

    (z.B. CouchDB) • Channels & Private Data Collections • Noch nicht: Endorsement & Policies Zwischenfazit: Kernkonzepte
  18. • Smart Contracts in Fabric: Chaincode • SDKs für unterschiedliche

    Programmiersprachen: Go, Node.js, Java; .NET in progress • SDKs kommunizieren via GRPC mit Fabric Peer • Interagieren (read/write) mit den eigentlichen Daten der Blockchain ("world state") • Chaincode läuft in separaten Docker Containern Fabric Chaincode Basiskonzepte
  19. • Prüfen von Berechtigungen (z.B.: auch Eigentum von digitalen Assets)

    • GetState • Ändern des World States in DB (z.B.: Eigentümerschaft von digitalen Assets übertragen) • PutState/DeleteState • Bereitstellen von Events an SDK Subscriber • SetEvent Programmieraufgaben bei Chaincode
  20. const {Contract} = require('fabric-contract-api'); class SimpleContract extends Contract { constructor()

    { super('com.example.simple'); } async myOperation(ctx, param1, param2) { // ... } } module.exports.contracts = [SimpleContract]; { chaincodeId: 'simplecontract', fcn: 'com.example.simple.myOperation', args: ['10', 'abc'], // ... } Schnittstelle zu Fabric, für Interaktionen mit Transaktionsdaten und State DB
  21. // reading values let someValue = await ctx.stub.getState('myKey'); // query

    multiple values let result = await ctx.stub.getQueryResult(...); // storing values let newValue = 1234; await ctx.stub.putState('myKey', Buffer.from(newValue.toString())); // setting an event await ctx.stub.setEvent('valuechanged', Buffer.from(newValue.toString())); // access the client's identity (transaction signer) if (ctx.clientIdentity.mspId == "Telco1") { ... }
  22. Initialisieren des Clients let FabricClient = require('fabric-client'); let client =

    new FabricClient(); await client.createUser(/* ... supply cryptographic information */); let channel = client.newChannel('demochannel'); let peer = client.newPeer('grpc://localhost:7061'); await channel.initialize({discover: true, target: peer});
  23. Aufrufen von Chaincode let txId = client.newTransactionID(); let proposalRequest =

    { txId: txId chaincodeId: 'simplecontract', fcn: 'com.thinktecture.simplecontract.myOperation', args: ['10', 'abc'], // everything is passed as string }; let result = await channel.sendTransactionProposal(proposalRequest); let request = { proposalResponses: result[0], proposal: result[1] }; let submissionResult = await channel.sendTransaction(request);
  24. Chaincode Deployment peer1.telco1.com peer1.regulator.com Chaincode Package oder Quellcode Install (durch

    Admin einer Organisation) peer chaincode install <…> peer chaincode install <…> numbertransfer, v1 numbertransfer, v1
  25. • Chaincode wird paketiert und explizit auf einzelnen Peers installiert

    • Nicht alle Peers benötigen jeden Chaincode • Chaincode kann auf einem Peer in mehreren Versionen existieren • Chaincode wird pro Channel instanziiert • Instanziierung == Verknüpfung einer spezifischen Chaincode Version mit einem Channel, mit gleichzeitiger Definition einer spezifischen Endorsement Policy • Chaincode kann pro Channel upgraded werden (=> mit einer neuen Version verknüpft, die auf den Peers installiert wurde) Chaincode / Smart Contracts
  26. • Nahezu jede Operation in Fabric ist permissioniert • Configurationsänderungen,

    Channel-Teilnahme, ... • Chaincode Endorsement Policies Berechtigungen und Policies AND ('Regulator1.Admin', OutOf(2, 'Telco1.Admin', 'Telco2.Admin', 'Telco3.Admin')) • Any, all, m-out-of, majority (für Config-Änderungen) • And, Or
  27. • Bausteine eines Fabric-Netzwerks • Transaktionsbehandlung in Fabric • Chaincode

    und Client SDK Grundlagen –Smart Contracts in Fabric • Policies und Endorsement • ... warum private Blockchain-Netzwerke mehr bieten können, als reine replizierte Datenbanken. Fazit – das haben Sie gesehen
  28. Proposal & Endorsement - Client's View { chaincodeId: 'numbertransfer', fcn:

    'confirmTransfer', args: ['49123123123', 'Telco2'] } peer1.telco1.com numbertransfer, v1 peer1.telco2.com numbertransfer, v1 peer1.telco3.com numbertransfer, v1 peer1.regulator.com numbertransfer, v1 2) Determine policy (Static or discovery) 3) Select endorsers (peer URLs) peer1.telco2.com numbertransfer, v1 peer1.telco3.com numbertransfer, v1 peer1.regulator.com numbertransfer, v1 4) Send proposal directly to endorsers 5) Endorsers simulate transactions 6) Collect endorsements and verify 1) Create and sign proposal
  29. peer1.telco2.com Simulation & Endorsement - Peer's View Key Value Version

    49123123123 Telco1 B1/Tx0 491111111111 Telco2 B23/Tx1 491111111112 Telco3 B4/Tx0 { chaincodeId: 'numbertransfer', fcn: 'confirmTransfer', args: ['49123123123', 'Telco2'] } Signed: Telco1 // still simplified pseudocode! function confirmTransfer(number, transferTarget) { if (ctx.clientIdentity.mspId == await getState(number)) { await putState (number, transferTarget); } else throw; } // still simplified pseudocode! function confirmTransfer(number, transferTarget) { if (ctx.clientIdentity.mspId == await getState(number)) { await putState (number, transferTarget); } else throw; } // still simplified pseudocode! function confirmTransfer(number, transferTarget) { if (ctx.clientIdentity.mspId == await getState(number)) { await putState (number, transferTarget); } else throw; } Update state Verification of rules
  30. peer1.telco2.com Simulation & Endorsement - Peer's View Key Value Version

    49123123123 Telco1 B9/Tx0 491111111111 Telco2 B23/Tx1 491111111112 Telco3 B4/Tx0 { chaincodeId: 'numbertransfer', fcn: 'confirmTransfer', args: ['49123123123', 'Telco2'] } Signed: Telco1 // still simplified pseudocode! function confirmTransfer(number, transferTarget) { if (ctx.clientIdentity.mspId == await getState(number)) { await putState (number, transferTarget); } else throw; } // still simplified pseudocode! function confirmTransfer(number, transferTarget) { if (ctx.clientIdentity.mspId == await getState(number)) { await putState (number, transferTarget); } else throw; } // still simplified pseudocode! function confirmTransfer(number, transferTarget) { if (ctx.clientIdentity.mspId == await getState(number)) { await putState (number, transferTarget); } else throw; } // still simplified pseudocode! function confirmTransfer(number, transferTarget) { if (ctx.clientIdentity.mspId == await getState(number)) { await putState (number, transferTarget); } else throw; } // still simplified pseudocode! function confirmTransfer(number, transferTarget) { if (ctx.clientIdentity.mspId == await getState(number)) { await putState (number, transferTarget); } else throw; } Endorsement Read Set Write Set Read Set Key: '49123123123': Version: {Block: 9, Transaction: 0} Write Set Key: '49123123123': New Value: 'Telco2' Signed: peer1.telco2.com
  31. • Transactions are processed on a client-selected subset of peers

    • Policy is defined during instantiation or upgrade of a chaincode • “Regulator AND two of Telco A, Telco B, or Telco B“ • Endorsers sign off on transactions after chaincode simulation (no ledger changes, only simulation!) Endorsement
  32. Transaction Request Collecting all endorsements on the client Proposal {

    chaincodeId: 'numbertransfer', fcn: 'confirmTransfer', args: ['49123123123', 'Telco2'] } Read Set Key: '49123123123': Version: {Block: 9, Transaction: 0} Write Set Key: '49123123123': New Value: 'Telco2' Signed: peer1.telco1.com, creator Signed: peer1.telco2.com, endorser Signed: peer1.telco3.com, endorser Signed: peer1.regulator.com, endorser
  33. Orderer Ordering, distribution and incorporation Transaction Message Proposal Read Set

    Write Set peer1.telco1.com peer1.telco2.com peer1.telco3.com peer1.regulator.com channel1 channel2 channel1 channel1 channel1 channel1 2) Orderers forms consensus and create a new block 3) New block is distributed to peers 4) Peers check that block comes from valid orderer 5) Peers add the block to their chains and process transactions 1) Client sends TX message to one orderer
  34. peer1.telco2.com Transaction handling at peers - Scenario: block #71 Key

    Value Version 49123123123 Telco1 B9/Tx0 491111111111 Telco2 B23/Tx1 491111111112 Telco3 B4/Tx0 Endorsement Read Set Key: '49123123123': Version: {Block: 9, Transaction: 0} Write Set Key: '49123123123': New Value: 'Telco2' 2) Verify endorsement, else flag as ENDORSEMENT_POLICY_FAILURE and stop 3) Compare the read-sets, else flag as MVCC_READ_CONFLICT and stop 4) Update state (and version!) and flag as VALID 1) Take each transaction from the block IMPORTANT: No chaincode execution at this stage! Key Value Version 49123123123 Telco2 B71/Tx0 491111111111 Telco2 B23/Tx1 491111111112 Telco3 B4/Tx0
  35. • Bausteine eines Fabric-Netzwerks • Transaktionsbehandlung in Fabric • Chaincode

    Grundlagen –Smart Contracts in Fabric • Client SDK Überblick • Transaktionsbehandlung im Detail Fazit – das haben Sie gesehen
  36. • Client uses SDK to create a proposal and send

    it to endorsers • Endorsers simulate chaincode execution; sign read-set and write-set • Client uses SDK to verify endorsement (optional) • Client sends transaction (proposal + endorsement) to orderer • Orderers create a block (for one channel) and broadcast to peers • Peer verifies endorsement and read-set against its copy of the ledger • If ok, the peer incorporates the write-set in its copy of the ledger • Erroneous transactions remain in the blockchain but will be flagged Complete Fabric Transaction Flow
  37. Endorsement Policies numbertransfer version: v1 endorsementpolicy: AND( 'Regulator.member', OutOf( 2,

    'Telco1.member', 'Telco2.member', 'Telco3.member' ) ) channel1 { chaincodeId: 'numbertransfer', fcn: 'confirmTransfer', args: ['49151123456'] } peer1.telco1.com numbertransfer, v1 peer1.telco2.com numbertransfer, v1 peer1.telco3.com numbertransfer, v1 peer1.regulator.com numbertransfer, v1
  38. numbertransfer version: v1 endorsementpolicy: AND( 'Regulator.member', OutOf( 2, 'Telco1.member', 'Telco2.member',

    'Telco3.member' ) ) channel1 { chaincodeId: 'numbertransfer', fcn: 'confirmTransfer', args: ['49151123456'] } peer1.telco1.com numbertransfer, v1 peer1.telco2.com numbertransfer, v1 peer1.telco3.com numbertransfer, v1 peer1.regulator.com numbertransfer, v1 Endorsement Policies
  39. Endorsement Policies numbertransfer version: v1 endorsementpolicy: AND( 'Regulator.member', OutOf( 2,

    'Telco1.member', 'Telco2.member', 'Telco3.member' ) ) channel1 { chaincodeId: 'numbertransfer', fcn: 'confirmTransfer', args: ['49151123456'] } peer1.telco1.com numbertransfer, v1 peer1.telco2.com numbertransfer, v1 peer1.telco3.com numbertransfer, v1 peer1.regulator.com numbertransfer, v1
  40. Endorsement Policies numbertransfer version: v1 endorsementpolicy: AND( 'Regulator.member', OutOf( 2,

    'Telco1.member', 'Telco2.member', 'Telco3.member' ) ) channel1 { chaincodeId: 'numbertransfer', fcn: 'confirmTransfer', args: ['49151123456'] } peer1.telco1.com numbertransfer, v1 peer1.telco2.com numbertransfer, v1 peer1.telco3.com numbertransfer, v1 peer1.regulator.com numbertransfer, v1
  41. • How is the chaincode executed? • Upon the first

    transaction (or instantiation for the initial node), a docker image (and container) is created and started • Can you stop/remove chaincode? • Only manually by stopping the container, removing the image and deleting the directory on the host (http://bit.ly/CC_for_ops_1_3) • Do I need to keep all versions around? • No: because of how endorsement works with Fabric • Does every node need access to the chaincode? • No: because of how endorsement works with Fabric Chaincode FAQs
  42. • Tip: use a single-peer endorsement policy • Start peer

    with --peer-chaincodedev=true • Start chaincode to connect to peer: Debugging Chaincode export CORE_CHAINCODE_ID_NAME=simplecontract:v0 # <contractname>:<version> node node_modules/fabric-shim/bin/chaincodestart --peer.address grpc://localhost:7052
  43. • Install – physical deployment to a peer • Instantiate

    – logical binding to a channel; specifies endorsement policies and private data collections • Invoke – send a TX to chaincode (Docker container started on demand!) • Query – retrieve read-only data • Upgrade – binding of a different chaincode to a channel (incl. new policies) Chaincode Lifecycle