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

7a1b0b24e5251ee7f5407681cca7d142?s=47 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

7a1b0b24e5251ee7f5407681cca7d142?s=128

Ingo Rammer

December 13, 2018
Tweet

Transcript

  1. Hyperledger Fabric Open-Source Basis für Ihre Blockchain Ingo Rammer ingo.rammer@thinktecture.com

    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: ingo.rammer@thinktecture.com 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. Das Szenario für heute ...

  10. • "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
  11. Kernelemente eines Fabric Netzwerks

  12. Organisationen: Teilnehmer des Netzwerks Telco 1 Telco 2 Regulator

  13. Organisationen können Nodes betreiben Telco 1 Telco 2 Regulator

  14. Orgas verwalten Zertifikate für User & Nodes Telco 1 Telco

    2 Regulator MSP (Membership Service Provider): Zertifikaterstellung für User & Nodes
  15. Channel 1 Channel 2 Nodes können Channels beitreten peer1.telco1.com peer1.telco2.com

    peer1.regulator.com
  16. • 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
  17. • 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
  18. • 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
  19. Nodetypen Orderer Endorser Peer Peers können Endorsers für Chaincodes in

    Channels sein, müssen aber nicht Peer
  20. 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
  21. 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
  22. • 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
  23. • Organisationen • Peers & Orderer • Chaincode & State-DB

    (z.B. CouchDB) • Channels & Private Data Collections • Noch nicht: Endorsement & Policies Zwischenfazit: Kernkonzepte
  24. Smart Contracts in Fabric

  25. • 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
  26. • 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
  27. 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
  28. // 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") { ... }
  29. Fabric Client Development (Node & Java SDKs)

  30. 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});
  31. 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);
  32. Chaincode Lifecycle

  33. 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
  34. Chaincode Instantiation peer1.telco1.com peer1.regulator.com numbertransfer, v1 numbertransfer, v1 channel1 peer

    chaincode instantiate <…> numbertransfer:v1
  35. • 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
  36. • 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
  37. • 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
  38. Danke! Slides: https://thinktecture.com/presentations Kontakt: ingo.rammer@thinktecture.com Twitter: @ingorammer

  39. DETAILS

  40. Fabric Transaktionen im Detail

  41. • Proposal, Endorsement & Simulation • Ordering & Verteilung •

    Ledger Updates Drei Phasen
  42. 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
  43. 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
  44. 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
  45. • 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
  46. 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
  47. 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
  48. 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
  49. • Bausteine eines Fabric-Netzwerks • Transaktionsbehandlung in Fabric • Chaincode

    Grundlagen –Smart Contracts in Fabric • Client SDK Überblick • Transaktionsbehandlung im Detail Fazit – das haben Sie gesehen
  50. Danke! Slides: https://speakerdeck.com/ingorammer Kontakt: ingo.rammer@thinktecture.com Twitter: @ingorammer

  51. EXTRA CONTENT

  52. • 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. • 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
  58. • https://github.com/hyperledger/fabric-chaincode-node • New API: https://www.npmjs.com/package/fabric-contract- api • Currently doc

    bug: "startchaincode" vs "chaincodestart" in package.json Chaincode with Node.js
  59. • 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
  60. • 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