Download as pdf or txt
Download as pdf or txt
You are on page 1of 206

1.

1
1.2
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
1.2.6
1.2.7
1.3
1.3.1
1.3.2
1.3.3
1.3.4
1.3.5
1.3.6
1.3.7
1.4
1.4.1
1.4.2
FLP 1.4.3
CAP 1.4.4
ACID 1.4.5
Paxos Raft 1.4.6
1.4.7
1.4.8
1.4.9
1.5
Hash 1.5.1
1.5.2

2
1.5.3
1.5.4
PKI 1.5.5
Merkle 1.5.6
1.5.7
1.5.8
1.5.9
1.6
1.6.1
1.6.2
1.6.3
1.6.4
1.6.5
1.6.6
1.6.7
1.6.8
Hyperledger - 1.7
1.7.1
1.7.2
1.7.3
1.7.4
Fabric v0.6 1.7.5
1.7.5.1
chaincode 1.7.5.2
1.7.5.3
Python 1.7.5.4
Fabric 1.0 1.7.6
1.7.7
1.7.8
1.7.8.1
1.7.8.2
1.7.8.3
1.7.8.4
1.7.8.5

3
1.7.9
1.7.10
Ethereum - 1.8
1.8.1
1.8.2
1.8.3
1.8.4
1.8.5
1.8.6
1.9
Bluemix BaaS 1.9.1
BaaS 1.9.2
1.9.3
1.10
1.10.1
Hyperledger Fabric v0.6 1.10.2
1.10.3
1.11
1.11.1
1.11.2
1.11.3
ProtoBuf gRPC 1.11.4
1.11.5

0.8.0

Fintech

Decentralized Ledger TechnologyDLT

GitBook GitHub

pdf
epub

QQ I335626996
QQ II523889325
QQ III414919574
QQ IV364824846

0.8.0: 2017-03-07



Hyperledger
0.7.0: 2016-09-10



0.6.0: 2016-08-05



0.5.0: 2016-07-10
Hyperledger




0.4.0: 2016-06-02

0.3.0: 2016-05-12

0.2.0: 2016-04-07
Hyperledger
0.1.0: 2016-01-17

Github github.com/yeasy/blockchain_guide

GitHub fork docker_user/blockchain_guide clone

$ git clone git@github.com:docker_user/blockchain_guide.git


$ cd blockchain_guide
$ git config user.name "yourname"
$ git config user.email "your email"

$ #do some change on the content


$ git commit -am "Fix issue #1: change helo to hello"
$ git push

GitHub pull request

$ git remote add upstream https://github.com/yeasy/blockchain_guide


$ git fetch upstream
$ git checkout master
$ git rebase upstream/master
$ git push -f origin master

coffee~

1.1.1 - coffee

moneycashcurrency

10





















100 0.1 100








Double-Spent

11

1.0

e-
CashHashCash](HashcashB-money

1983 David Chaum ecash 1989 Digicash ecash


anonymous cryptographic electronic money, or electronic cash
system David Chaum ecash

1997 Adam Back Hashcash DoS Hashcash


Proof of WorkPoW

1998 Wei Dai B-money PoW B-money

PoW

12

paypal

13

2008 10 31 Satoshi Nakamoto


metzdowd 2009
2009 1 3 18:15:05 2010
bitcoin

2009 7*24 8 1.5

14

2014 Blockchain
Distributed Ledger

15

Blockchain

wikipedia

A blockchain originally, block chain is a distributed database that maintains a


continuously-growing list of data records hardened against tampering and revision. It
consists of data structure blockswhich hold exclusively data in initial blockchain
implementations, and both data and programs in some of the more recent
implementationswith each block holding batches of individual transactions and the
results of any blockchain executables. Each block contains a timestamp and
information linking it to a previous block.

16

1.2.3.1 -

Double Entry Bookkeeping


1494 Summa de arithmetica, geometrica, proportioni et proportionalit

17



PoW



PoW

PoS



Hyperledger

Transaction
Block

Chain

18

1.2.3.2 -

nonce
hash

Proof of WorkPoW hash

hash 10
12.5

19

Git

PublicConsortiumPrivate

20

21

1/3

22

1.2.4.1 -

Visa
Nasdaq
Goldman Sachs
citibank
Wells Fargo





DTCC
SWIFT

23

IBM

Intel
Cisco

24

hash
()
RSA

SONY PS3

Paxos

Proof of Work

PoSDPoS Casper

PoW PBFT

25


side chainshadow chain
1-2

VISA 2000 tps 56,000 tps


85,000 tps 80,000 tps

26

openssl
heart bleeding

2016 6 17 DAO 6000

hash

NoSql

27

levelDBRocksDB \/

BlockDB

28

1.2.6.1 -

1969 - ARPANetAdvanced Research Projects Agency Network


Advanced Research Project Agency NCP

1973 - TCP/IPVinton.CerfBob Karn TCP
NCP
1982 - InternetTCP/IP
1989 - WWW telnetftpemail -Tim
Berners-Lee WWW

1999 - salesforce salesforce

2006 - aws ec2AWS EC2
AWS
2013 - cognitive IBM Watson

29

7-8

2009 1

7 7 2~3 2~3

1.2.6.2 -

30

31

Hyperledger Ethereum

32






airbnb


DAO

33

200

34

2016 1 20

CAD

CAD

CAD Jasper

- Canada experiments with digital dollar on blockchain2016-06-16

RSCoin

RSCoin

RSCoin 2PC

201610 IBM

60-80%

35

Abra
Bitwage
BitPOS
Circle
Ripple

Oliver Wyman SWIFT()


50~100 , 400~450
(390 ) 200~250

2015 10 Nasdaq Nasdaq Linq

BitShare 10
DAH
Symbiont
Overstock.com T0(The
trade is the settlement)
SETLcoin

36

facebook

IDG

37

Factom

MIT Juliana Nazar


Philipp Schmidt

BitShare
Everledger

Mycelia
Monegraph
Mediachain metadata

38

Airbnb P2P


P2P

AirbnbHomeAway OneFineStay
30-90

ConsenSys LO3

OpenBazaar

39

OpenBazaar

40

DAODecentralized Autonomous OrganizationDAO


1.6

41

Transaction
Address

PM2.5 DNS

Edge

IBM
IBM

2015 IBM ADEPT

Skuchain

42

DNS
DNS

DNS

43

BitMessage
GemHealth
Storj
Tierion
Twister

44

45

46

(Consistency Agreement)

47

Termination
Consensus
Validity

Strong Consistency

Eventually Consistency

Sequential ConsistencyLeslie Lamport 1978



A B A, B B, A


Linearizability ConsistencyMaurice P. Herlihy Jeannette M. Wing
1990


48

49

Proposal

PaxosRaft

PBFT PoW
PBFT PoW

FLP

50

51
FLP

FLP
FLP

Fischer, Lynch Patterson 1985


Dijkstra

FLP

0 1
A 0B 1C
C A B

FLP

CAP

52
CAP

CAP
CAP Eric Brewer 2000 ACM Lynch

ConsistencyAvailablity
Partition

Consistency

Availablity
Partition

CAP

CouchDBCassandra

MongoDB
Redis

PaxosRaft

53
CAP

ZooKeeper

54
ACID

ACID
AtomicityConsistencyIsolationDurability

ACID

Atomicity
Consistency
Isolation
Durability

BASEBasic AvailiabilitySoft stateEventually Consistency

55
Paxos Raft

Paxos Raft
Paxos faultcorrupt
Consensus Leslie
Lamport Paxon

Paxos
1990 Leslie Lamport Paxos
Paxos Chubby
ZooKeeper Leslie Lamport 2013

Paxon

Paxos

proposer
acceptor
learner

safetey liveness

safety
value proposers proposal
chosenaccept

liveness
learners chosen

proposer acceptor
proposer
proposer

Paxos

56
Paxos Raft

57
Paxos Raft

Paxos preparecommit

<id, value>

Raft
Raft Paxos

Raft Paxos

leadercandiate follower

Leader candidate
leader
logleader log follower

log

58

FLP

Byzantine Generals Problem Leslie Lamport 1982

N F
Byzantine Fault Tolerant (BFT)

1
1 0 0
0 1

59

F1

Leslie Lamport

4 1

Byzantine Fault Tolerant

Castro Liskov 1999 Practical Byzantine Fault TolerantPBFT


BFT

PBFT Pre-PreparePrepare Commit

PoWProof of Work

PoX

60

9 9


90% 1.2
99% 3.6
99.9% 8.6

99.99% 51.6
99.999% 5
99.9999% 31
99.99999% 3 N/A
99.999999% 0.3 N/A
99.9999999% 30 N/A

AWS

IT
Linux

61

trade-off

62

hash
PKI Merkle

63
Hash

Hash

Hash
Hash
Hash

hello blockchain world, this is yeasy@github MD5 hash


89242549883a2ef85dc81b90fb606046

$ echo "hello blockchain world, this is yeasy@github"|md5


89242549883a2ef85dc81b90fb606046

MD5 Hash
89242549883a2ef85dc81b90fb606046 hello blockchain

world, this is yeasy@githubHash

hash fingerprintdigest

MD5 hash SHA-1

hash

hash hash
hash
hash
hash

hash

Hash MD5SHA-1 SHA-2

MD4RFC 1320 MIT Ronald L. Rivest 1990 MD Message Digest


128 MD4

64
Hash

MD5RFC 1321 Rivest 1991 MD4 512


128 MD5 MD4 MD5

SHA Secure Hash Algorithm Hash NISTNational Institute of


Standards and Technology 1993 SHA-1 1995
160 hash SHA-1 MD4
SHA-1

NIST SHA-224SHA-256SHA-384 SHA-512


SHA-2 SHA-1 SHA-3

MD5 SHA1 SHA2-256

Hash CPU Hash

Hash scrypt
CPU hash

Hash

Hash

Hash

65

DES3DES
AESIDEA

RSAElGamal


symmetric cryptography
common-key cryptography(asymmetric cryptography
public-key cryptography)

DES3DESAESIDEA

66

DESData Encryption Standard1977


FIPS FIPS-46-3 64 64 56
+ 8
3DES DES --> --> DES

AESAdvanced Encryption StandardNIST DES
1997~2000 NIST 15 Rijndael
Joan Daemon Vincent Rijmen AES FIPS-
197AES 128192256 AES

Cipher Block ChainCBC


CounterCTR

RSAElGamalElliptic Curve CrytosystemsECC

RSA1978 Ron RivestAdi ShamirLeonard Adleman


2002

Diffie-Hellman

ElGamal Taher ElGamal
PGP
Elliptic curve cryptographyECC

67

1985 Neal Koblitz


Victor Miller ECC

RSA

HTTPS HTTPS Transport Layer


Security/Secure Socket LayerTLS/SSLTLS SSL
TLS 1.0 SSL 3.1

R1

R2

CA
CA CA

R3
R1R2 R3 R1R2 R3 AES

68

integrity
non-repudiation

A B B A
A
BB A
A

HMAC
Hash-based Message Authentication Code Hash
Hash HMAC
HMAC HMAC

HMAC(K, H, Message)

K H Hash
Message K H Message
HMAC

HMAC AB A BB
HMAC AA B

HMAC
Non-repudiation

1983 David Chaum

unlinkability
RSA )

n m

n m

69

Rivest,shamir Tauman 2001

,
,

70

Certification AuthorityCA CA verisign

CA ITU ISO
X.509

CA
CA

CA

CA CA
CA

PKI

71
PKI

PKI

PKIPublic Key Infrastructure

PKI

PKI PKI
PKI
RSA PKCSPublic Key Cryptography
Standards X.509

PKI

CACertification Authority RA

RARegistration Authority
CA
LDAP X.500

CA

RA CA
CA

CA
CA CA

72
Merkle

Merkle

1.5.6.1 - Merkle


D1 N1N4 Root
Root --> N4 --> N1 D1
D0D3 D0
N0N1N4RootD0 D0

73

Homomorphic Encryption

E D

Ron RivestLeonard Adleman Michael L. Dertouzos 1978


2009 Craig Gentry

Paillier Benaloh RSA


ElGamal

key
key

74

zero knowledge validation

A B B A

75

76

trade-off

77

blockchain.info

1.6.1.1 -

2008 10 31 BitcoinA Peer-to-Peer


Electronic Cash System/

2009 1 3 50
The Times 03/Jan/2009 Chancellor on brink of
second bailout for banks

2010 5 21 Laszlo Hanyecz 1 BTC


25 1: 0.0025
700

2010 7 17

2011 2011 2

78

2012 9 27 12.46

2012 11 28

2013 3 1/3 ASIC

2013 4 10 BTC 266

2013 6 27
102.24

2013 10 ATM

2013 11 29 1242
1241.98

2014 2 Mt.Gox 85

2014 3 ATM

2014 6 AB-129

2015 6

2015 10

2016 1

2016 7 9

600 100

42 75 GB
BitstampBTC-eBitfinex IDG

blockchain.info

700
Ripple

79

80

Unspent Transaction
OutputsUTXO

UTXO

UTXO




A A B A
T0
B

B C B
T1 T0
C
X X Y X
...
Y

hashHASH160 SHA256
RIPEMD160 160 20

81

Base58Check
4

hash

SHA256 RIPEMD160 hash 160


hash

ID





UTXO

blockchain.info
0beca08914de596217f098d744e3fb8da68aa5e00dd8f63a3364b451f3f4a70f

Script

Forth

scriptPubKeyscriptSig

82

P2PKHPay-To-Public-Key-Hash
0x00
P2SHPay-To-Script-Hash
0x05

P2PKH

scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

OP_DUP OP_HASH160 hash OP_EQUALVERIFY


OP_CHECKSIG
pubKey

scriptSig: <sig> <pubKey>

pubKey hash
pubKey hash pubKeyHash

scriptSig scriptPubKey

<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

80

4
SHA256 hash 32
Merkle 32
4

83

4
Nonce4 PoW

1~9

4 2140
2100

64

84

PoW

85

10 1 MB 10
12.5

50 21 4
2100

hash 10
X hash
2016
10
4

hash h/s

Anton Tonev Davy Jose





2010

cover

86

CPU2009 GPU2010 FPGA2011


ASIC 2013 Hash

Hash

1/3
1/2

PoWProof of Work

PoSProof of Stake DPoS


vs

PoW PoS

87

GPU ASIC

Forth UTXO

88

Proof of WorkPoW 1998 B-


money

Proof of PoW PoS

PoW
Proof of Worknonce hash
hashcash

Fork

hash
nonce

51%

PoW

89

90

1.6.5.1 - Pow

PoS
Proof of Stake2013 Peercoin

PoS PoW

PoS

PoS DPOS

91

7
6 1

-- 2015
2 The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments

RSMCRecoverable Sequence Maturity Contract


HTLCHashed Timelock Contract

RSMC
Recoverable Sequence Maturity Contract

HTLC
Hashed Timelock Contract

92

HTLC

RSMC HTLC

93

2013 12 ,2014 4

Blockstream Liquid

94

95
Hyperledger -

Hyperledger -
Uneasy lies the head that wears a crown.

Hyperledger Linux

hyperledger fabric

96

2015 12 Linux 30
IBMAccentureIntelJ.P.MorganR3DAHDTCCFUJITSUHITACHISWIFT
Cisco Hyperledger

hyperledger.org

1.7.1.1 - Hyperledger

120
Hyperledger 30
2016.05.19Onchain2016.06.22Belink

97

2016.06.22BitSE2016.06.222016.07.272016.08.30
2016.09.082016.10.24

1.0 2.0
Hyperledger 3.0

IBM Open Blockchain Digital Asset


R3 Intel

Hyperledger Technical Steering CommitteeTSC


IBM CTO Chris Ferris Digital Asset Holdings
CEO Blythe Masters 2016 5 Apache Brian
Behlendorf 2016 12

Hyperledger

Gerrit Github gerrit

1.7.1.2 - Hyperledger

98

Fabric FabricFabric CAFabric SDK Node.JsPython Java


fabric-apifabric-sdk-nodefabric-sdk-py
pbft consensus IBM DAH
SawToothLake arcadecoredev-toolsvalidatormktplace Intel
Proof of Elapsed
TimePoET
Iroha C++ Web Mobile
Soramitsu

Blockchain Explorer Web



Cello"Blockchain as a Service" Cello

Incubation

Hyperledger Hyperledger Fabric

99

BlockchainChaincode
Membership

Auditability
Block
Blockchain
hash
Certificate AuthorityCA Member Service Identity
Service
Chaincode
golangnodejs
Committer1.0 peer orderer

Confidentiality

Endorser1.0 peer

100

Enrollment Certificate AuthorityECA CA


CA
Ledgerworld
state
MSPMember Service Provider

Non-validating Peer
REST
Orderer1.0

Permissioned Ledger

Privacy

Transaction chaincode
Transactor
Transaction Certificate AuthorityTCA CA
CA
Validating Peer

World Statechaincode

DeployInvokeQueryTerminate
uuid
chaincodeID
hash Deploy Invoke
ConfidentialityLevel
metadata
nonce

101

cert
signature
metadata
timestamp

Protobuf

message Transaction {
enum Type {
UNDEFINED = 0;
// deploy a chaincode to the network and call `Init` function
CHAINCODE_DEPLOY = 1;
// call a chaincode `Invoke` function as a transaction
CHAINCODE_INVOKE = 2;
// call a chaincode `query` function
CHAINCODE_QUERY = 3;
// terminate a chaincode; not implemented yet
CHAINCODE_TERMINATE = 4;
}
Type type = 1;
//store ChaincodeID as bytes so its encrypted value can be stored
bytes chaincodeID = 2;
bytes payload = 3;
bytes metadata = 4;
string uuid = 5;
google.protobuf.Timestamp timestamp = 6;

ConfidentialityLevel confidentialityLevel = 7;
string confidentialityProtocolVersion = 8;
bytes nonce = 9;

bytes toValidators = 10;


bytes cert = 11;
bytes signature = 12;
}

1.0 transaction

[ledger] [channel], proposal:[chaincode, ] endorsement:[proposal hash, simulation result,


signature]

endorsements: proposal hash, simulation result, signature


function-spec: function name, arguments
proposal: [channel,] chaincode,

102

version
timestamp
hash
hash
hash

hash hash peer

Protobuf

message Block {
uint32 version = 1;
google.protobuf.Timestamp timestamp = 2;
repeated Transaction transactions = 3;
bytes stateHash = 4;
bytes previousBlockHash = 5;
bytes consensusMetadata = 6;
NonHashData nonHashData = 7;
}

103

{
"nonHashData": {
"localLedgerCommitTimestamp": {
"nanos": 975295157,
"seconds": 1466057539
},
"transactionResults": [
{
"uuid": "7be1529ee16969baf9f3156247a0ee8e7eee99a6a0a816776acff65e6e1de
f71249f4cb1cad5e0f0b60b25dd2a6975efb282741c0e1ecc53fa8c10a9aaa31137"
}
]
},
"previousBlockHash": "RrndKwuojRMjOz/rdD7rJD/NUupiuBuCtQwnZG7Vdi/XXcTd2MDyAMsF
AZ1ntZL2/IIcSUeatIZAKS6ss7fEvg==",
"stateHash": "TiIwROg48Z4xXFFIPEunNpavMxnvmZKg+yFxKK3VBY0zqiK3L0QQ5ILIV85iy7U+
EiVhwEbkBb1Kb7w1ddqU5g==",
"transactions": [
{
"chaincodeID": "CkdnaXRodWIuY29tL2h5cGVybGVkZ2VyL2ZhYnJpYy9leGFtcGxlcy9jaG
FpbmNvZGUvZ28vY2hhaW5jb2RlX2V4YW1wbGUwMhKAATdiZTE1MjllZTE2OTY5YmFmOWYzMTU2MjQ3YTBlZThl
N2VlZTk5YTZhMGE4MTY3NzZhY2ZmNjVlNmUxZGVmNzEyNDlmNGNiMWNhZDVlMGYwYjYwYjI1ZGQyYTY5NzVlZm
IyODI3NDFjMGUxZWNjNTNmYThjMTBhOWFhYTMxMTM3",
"payload": "Cu0BCAESzAEKR2dpdGh1Yi5jb20vaHlwZXJsZWRnZXIvZmFicmljL2V4YW1wbG
VzL2NoYWluY29kZS9nby9jaGFpbmNvZGVfZXhhbXBsZTAyEoABN2JlMTUyOWVlMTY5NjliYWY5ZjMxNTYyNDdh
MGVlOGU3ZWVlOTlhNmEwYTgxNjc3NmFjZmY2NWU2ZTFkZWY3MTI0OWY0Y2IxY2FkNWUwZjBiNjBiMjVkZDJhNj
k3NWVmYjI4Mjc0MWMwZTFlY2M1M2ZhOGMxMGE5YWFhMzExMzcaGgoEaW5pdBIBYRIFMTAwMDASAWISBTIwMDAw"
,
"timestamp": {
"nanos": 298275779,
"seconds": 1466057529
},
"type": 1,
"uuid": "7be1529ee16969baf9f3156247a0ee8e7eee99a6a0a816776acff65e6e1def712
49f4cb1cad5e0f0b60b25dd2a6975efb282741c0e1ecc53fa8c10a9aaa31137"
}
]
}

[chaincodeID, ckey]: value

hash
numBuckets maxGroupingAtEachLevel hashFunction

numBuckets bucket

104

hashFunction

maxGroupingAtEachLevel hash

chaincodeID

chaincodeID

Chaincode VP

type Chaincode interface { Init(stub *ChaincodeStub, function string, args []string) (


[]byte, error) Invoke(stub *ChaincodeStub, function string, args []string) ([]byte, er
ror) Query(stub *ChaincodeStub, function string, args []string) ([]byte, error)}

DeployInvokeQuery

VP protobuf shim
ChaincodeID REGISTER VP VP
gRPC Init
VP TRANSACTION shim shim
Invoke
VP QUERY shim shim
Query

Docker

buildstartstop VM

105

type VM interface {
build(ctxt context.Context, id string, args []string, env []string, attachstdin bool
, attachstdout bool, reader io.Reader) error
start(ctxt context.Context, id string, args []string, env []string, attachstdin bool
, attachstdout bool) error
stop(ctxt context.Context, id string, timeout uint, dontkill bool, dontremove bool)
error
}

VP gRPC Invoke
Query

gRPC
VP gRPC

message ChaincodeMessage {

enum Type { UNDEFINED = 0; REGISTER = 1; REGISTERED = 2; INIT = 3; READY = 4; TRANSAC


TION = 5; COMPLETED = 6; ERROR = 7; GET_STATE = 8; PUT_STATE = 9; DEL_STATE = 10; INVO
KE_CHAINCODE = 11; INVOKE_QUERY = 12; RESPONSE = 13; QUERY = 14; QUERY_COMPLETED = 15;
QUERY_ERROR = 16; RANGE_QUERY_STATE = 17; }

Type type = 1; google.protobuf.Timestamp timestamp = 2; bytes payload = 3; string uui


d = 4;}

REGISTER VP VP
REGISTERED INIT Init

VP TRANSACTION Invoke
RESPONSE

VP QUERY Query
RESPONSE

PKI

EnrollmentTransaction TLS

ECert
TCert
TLSCert

106

VP

Fabric 1.0

1.7.2.1 -

SDK Fabric
endorser endorser orderer

Endorser peer ACL

Committer peer
endorser
committer
Orderer

CA PKI

107

1.7.2.2 -

108

message Message {
enum Type {
UNDEFINED = 0;

DISC_HELLO = 1;
DISC_DISCONNECT = 2;
DISC_GET_PEERS = 3;
DISC_PEERS = 4;
DISC_NEWMSG = 5;

CHAIN_STATUS = 6;
CHAIN_TRANSACTION = 7;
CHAIN_GET_TRANSACTIONS = 8;
CHAIN_QUERY = 9;

SYNC_GET_BLOCKS = 11;
SYNC_BLOCKS = 12;
SYNC_BLOCK_ADDED = 13;

SYNC_STATE_GET_SNAPSHOT = 14;
SYNC_STATE_SNAPSHOT = 15;
SYNC_STATE_GET_DELTAS = 16;
SYNC_STATE_DELTAS = 17;

RESPONSE = 20;
CONSENSUS = 21;
}
Type type = 1;
bytes payload = 2;
google.protobuf.Timestamp timestamp = 3;
}

DiscoveryTransactionSynchronization
Consensus

payload

Discovery
DISC_HELLODISC_GET_PEERSDISC_PEERS

DISC_HELLO

109

message HelloMessage { PeerEndpoint peerEndpoint = 1; uint64 blockNumber = 2;}message


PeerEndpoint { PeerID ID = 1; string address = 2; enum Type { UNDEFINED = 0; VALIDATOR
= 1; NON_VALIDATOR = 2; } Type type = 3; bytes pkiID = 4;}

message PeerID { string name = 1;}

CORE_PEER_DISCOVERY_ROOTNODE DISC_HELLO
idblock

block

DISC_GET_PEERS DISC_GET_PEERS
DISC_PEERS

Transaction
DeployInvokeQuery

message Transaction { enum Type { UNDEFINED = 0; CHAINCODE_DEPLOY = 1; CHAINCODE_INVOK


E = 2; CHAINCODE_QUERY = 3; CHAINCODE_TERMINATE = 4; } Type type = 1; string uuid = 5;
bytes chaincodeID = 2; bytes payloadHash = 3;

ConfidentialityLevel confidentialityLevel = 7; bytes nonce = 8; bytes cert = 9; bytes


signature = 10;

bytes metadata = 4; google.protobuf.Timestamp timestamp = 6;}

message TransactionPayload { bytes payload = 1;}

enum ConfidentialityLevel { PUBLIC = 0; CONFIDENTIAL = 1;}

Synchronization
block consensus

SYNC_GET_BLOCKS SYNC_BLOCKS block


SYNC_STATE_GET_SNAPSHOT SYNC_STATE_SNAPSHOT

SYNC_STATE_GET_DELTAS SYNC_STATE_DELTAS
block

Consensus

110

consensus CHAIN_TRANSACTION CONENSUS


VP

CONSENSUS consensus

111

chaincode
chaincode Hyperledger fabric
VP
Docker gRPC VP

Hyperledger chaincode GolangJavaScriptJava

chaincode
golang chaincode shim Init,
Invoke Query

chaincode

fmt Println .

errors errors

github.com/hyperledger/fabric/core/chaincode/shim chaincode

shim stub.PutState stub.GetState


shim gRPC VP

PUT_STATE
GET_STATE
DEL_STATE
RANGE_QUERY_STATE
INVOKE_CHAINCODE
QUERY_CHAINCODE

Init()
chaincode init

Invoke()

112

chaincode invoke

chaincode go

Query()
chaincode Quer()

Main()
main chaincode

chaincode

chaincode
chaincode cli rest api rest api

113
Fabric v0.6

Fabric v0.6
Fabric v0.6 1.0

v0.6 PoC

114

Fabric v0.6
Hyperledger Fabric Docker-Compose

doc

Docker

Docker
Docker Linux Redhat/Centos/Ubuntu

$ curl -fsSL https://get.docker.com/ | sh

Ubuntu 14.04 Docker /etc/default/docker

DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --api-c


ors-header='*'"

Docker

$ sudo service docker restart

Ubuntu 16.04 systemd Docker


/etc/systemd/system/docker.service.d/override.conf

Docker

$ sudo systemctl daemon-reload


$ sudo systemctl restart docker.service

docker-compose
python-pip

$ sudo aptitude install python-pip

docker-compose 1.7.0

115

$ sudo pip install docker-compose>=1.7.0

1.0 v0.6

$ docker pull yeasy/hyperledger-fabric:0.6-dp \


&& docker pull yeasy/hyperledger-fabric-peer:0.6-dp \
&& docker pull yeasy/hyperledger-fabric-base:0.6-dp \
&& docker pull yeasy/blockchain-explorer:latest \
&& docker tag yeasy/hyperledger-fabric-peer:0.6-dp hyperledger/fabric-peer \
&& docker tag yeasy/hyperledger-fabric-base:0.6-dp hyperledger/fabric-baseimage \
&& docker tag yeasy/hyperledger-fabric:0.6-dp hyperledger/fabric-membersrvc

$ docker pull hyperledger/fabric-peer:x86_64-0.6.1-preview \


&& docker pull hyperledger/fabric-membersrvc:x86_64-0.6.1-preview \
&& docker pull yeasy/blockchain-explorer:latest \
&& docker tag hyperledger/fabric-peer:x86_64-0.6.1-preview hyperledger/fabric-peer \
&& docker tag hyperledger/fabric-peer:x86_64-0.6.1-preview hyperledger/fabric-baseim
age \
&& docker tag hyperledger/fabric-membersrvc:x86_64-0.6.1-preview hyperledger/fabric-
membersrvc

noopspbft

noops
noops consensus 1

$ docker run --name=vp0 \


--restart=unless-stopped \
-it \
-p 7050:7050 \
-p 7051:7051 \
-v /var/run/docker.sock:/var/run/docker.sock \
-e CORE_PEER_ID=vp0 \
-e CORE_PEER_ADDRESSAUTODETECT=true \
-e CORE_NOOPS_BLOCK_WAIT=10 \
hyperledger/fabric-peer:latest peer node start

PBFT

116

PBFT hyperledger 4

Compose

$ git clone https://github.com/yeasy/docker-compose-files

hyperledger/0.6/pbft

4-peers.yml : 4 PBFT peer

4-peers-with-membersrvc.yml : 4 PBFT peer + 1 CA CA


4-peers-with-explorer.yml : 4 PBFT peer + 1 Blockchain-explorer

Web
4-peers-with-membersrvc-explorer.yml : 4 PBFT peer + 1 CA + 1

Blockchain-explorer CA

4 PBFT

$ docker-compose -f 4-peers.yml up

Peer
Swarm

peer

4 PBFT 4
Docker

4 vp0 ~ vp3

vp0
vp0

117

$ docker run --name=vp0 \


--net="host" \
--restart=unless-stopped \
-it --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-e CORE_PEER_ID=vp0 \
-e CORE_PBFT_GENERAL_N=4 \
-e CORE_LOGGING_LEVEL=debug \
-e CORE_PEER_ADDRESSAUTODETECT=true \
-e CORE_PEER_NETWORKID=dev \
-e CORE_PEER_VALIDATOR_CONSENSUS_PLUGIN=pbft \
-e CORE_PBFT_GENERAL_MODE=batch \
-e CORE_PBFT_GENERAL_TIMEOUT_REQUEST=10s \
hyperledger/fabric-peer:latest peer node start

vp1 ~ vp3
vp1 vp0 10.0.0.1

$ NAME=vp1
$ ROOT_NODE=10.0.0.1
$ docker run --name=${NAME} \
--net="host" \
--restart=unless-stopped \
-it --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-e CORE_PEER_ID=${NAME} \
-e CORE_PBFT_GENERAL_N=4 \
-e CORE_LOGGING_LEVEL=debug \
-e CORE_PEER_ADDRESSAUTODETECT=true \
-e CORE_PEER_NETWORKID=dev \
-e CORE_PEER_VALIDATOR_CONSENSUS_PLUGIN=pbft \
-e CORE_PBFT_GENERAL_MODE=batch \
-e CORE_PBFT_GENERAL_TIMEOUT_REQUEST=10s \
-e CORE_PEER_DISCOVERY_ROOTNODE=${ROOT_NODE}:7051 \
hyperledger/fabric-peer:latest peer node start

Hyperledger

7050: REST NVP 0.6 5000


7051peer gRPC 0.6 30303
7052peer CLI 0.6 30304
7053peer 0.6 31315
7054eCAP
7055eCAA
7056tCAP

118

7057tCAA
7058tlsCAP
7059tlsCAA

119
chaincode

chaincode
example02 chaincode a b

chaincode
VP pbft pbft_vp0_1

$ docker exec -it pbft_vp0_1 bash

chaincode example02

$ peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chainco


de_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'
03:08:44.740 [chaincodeCmd] chaincodeDeploy -> INFO 001 Deploy result: type:GOLANG cha
incodeID:<path:"github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example0
2" name:"ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5
dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539" > ctorMsg:<args:"init" args:"a" a
rgs:"100" args:"b" args:"200" >
Deploy chaincode: ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb
9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
03:08:44.740 [main] main -> INFO 002 Exiting.....

chaincode id
ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e65

4dbd5a1d86cbb30c48e3ab1812590cd0f78539 id

CC_ID

$ CC_ID="ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5
dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539"

chaincode

120
chaincode

CONTAINER ID IMAGE
COMMAND
CREATED STATUS PORTS
NAMES
e86c26bad76f dev-vp1-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05
eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539 "/opt/gopath/
bin/ee5b" 2 minutes ago Up 2 minutes
dev-vp1-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070
549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
597ebaf929a0 dev-vp2-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05
eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539 "/opt/gopath/
bin/ee5b" 2 minutes ago Up 2 minutes
dev-vp2-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070
549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
8748a3b47312 dev-vp3-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05
eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539 "/opt/gopath/
bin/ee5b" 2 minutes ago Up 2 minutes
dev-vp3-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070
549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
cf6e762f6a2e dev-vp0-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05
eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539 "/opt/gopath/
bin/ee5b" 2 minutes ago Up 2 minutes
dev-vp0-ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070
549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539

chaincode
a 100

$ peer chaincode query -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}'


03:22:31.420 [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Successfully queried tr
ansaction: chaincodeSpec:<type:GOLANG chaincodeID:<name:"ee5b24a1f17c356dd5f6e37307922
e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab181
2590cd0f78539" > ctorMsg:<args:"query" args:"a" > >
Query Result: 100
03:22:31.420 [main] main -> INFO 002 Exiting.....

chaincode
a b 10

$ peer chaincode invoke -n ${CC_ID} -c '{"Function": "invoke", "Args": ["a", "b", "10"
]}'
03:22:57.345 [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Successfully invoked tr
ansaction: chaincodeSpec:<type:GOLANG chaincodeID:<name:"ee5b24a1f17c356dd5f6e37307922
e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab181
2590cd0f78539" > ctorMsg:<args:"invoke" args:"a" args:"b" args:"10" > > (fc298ffb-c763
-4ed0-9da2-072de2ab20b1)
03:22:57.345 [main] main -> INFO 002 Exiting.....

121
chaincode

a 90

```sh $ peer chaincode query -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}'


03:23:33.045 [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Successfully queried
transaction: chaincodeSpec: ctorMsg: > Query Result: 90 03:23:33.045 [main] main -> INFO
002 Exiting.....

122

hyperledger fabric

$ docker pull yeasy/hyperledger:latest


$ docker tag yeasy/hyperledger:latest hyperledger/fabric-baseimage:latest
$ docker pull yeasy/hyperledger-peer:latest
$ docker pull yeasy/hyperledger-membersrvc:latest

hyperledger PBFT

$ git clone https://github.com/yeasy/docker-compose-files


$ cd docker-compose-files/hyperledger/0.6/pbft
$ docker-compose -f 4-peers-with-membersrvc.yml up

jim

vp0

$ docker exec -it pbft_vp0_1 bash


# peer network login jim
06:57:13.603 [networkCmd] networkLogin -> INFO 001 CLI client login...
06:57:13.603 [networkCmd] networkLogin -> INFO 002 Local data store for client loginTo
ken: /var/hyperledger/production/client/
Enter password for user 'jim': 6avZQLwcUe9b
06:57:25.022 [networkCmd] networkLogin -> INFO 003 Logging in user 'jim' on CLI interf
ace...
06:57:25.576 [networkCmd] networkLogin -> INFO 004 Storing login token for user 'jim'.
06:57:25.576 [networkCmd] networkLogin -> INFO 005 Login successful for user 'jim'.
06:57:25.576 [main] main -> INFO 006 Exiting.....

REST

POST HOST:7050/registrar

Request

123

{
"enrollId": "jim",
"enrollSecret": "6avZQLwcUe9b"
}

Response

{
"OK": "User jim is already logged in."
}

chaincode
chaincode -u

vp0

# peer chaincode deploy -u jim -p github.com/hyperledger/fabric/examples/chaincode/go/


chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'
06:58:20.099 [chaincodeCmd] getChaincodeSpecification -> INFO 001 Local user 'jim' is
already logged in. Retrieving login token.
06:58:22.178 [chaincodeCmd] chaincodeDeploy -> INFO 002 Deploy result: type:GOLANG cha
incodeID:<path:"github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example0
2" name:"ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5
dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539" > ctorMsg:<args:"init" args:"a" a
rgs:"100" args:"b" args:"200" >
Deploy chaincode: ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb
9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
06:58:22.178 [main] main -> INFO 003 Exiting.....

chaincode ID

# CC_ID=ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5d
c31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539

124

# peer chaincode query -u jim -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}'


07:28:39.925 [chaincodeCmd] getChaincodeSpecification -> INFO 001 Local user 'jim' is
already logged in. Retrieving login token.
07:28:40.281 [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 002 Successfully queried tr
ansaction: chaincodeSpec:<type:GOLANG chaincodeID:<name:"ee5b24a1f17c356dd5f6e37307922
e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab181
2590cd0f78539" > ctorMsg:<args:"query" args:"a" > secureContext:"jim" >
Query Result: 100
07:28:40.281 [main] main -> INFO 003 Exiting.....

REST

POST HOST:7050/chaincode

Request

{
"jsonrpc": "2.0",
"method": "deploy",
"params": {
"type": 1,
"chaincodeID":{
"path":"github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example0
2"
},
"ctorMsg": {
"function":"init",
"args":["a", "1000", "b", "2000"]
},
"secureContext": "jim"
},
"id": 1
}

Response

{
"jsonrpc": "2.0",
"result": {
"status": "OK",
"message": "ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194
fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539"
},
"id": 1
}

chaincode

125

ab 10

# peer chaincode invoke -u jim -n ${CC_ID} -c '{"Function": "invoke", "Args": ["a", "b
", "10"]}'
07:29:25.245 [chaincodeCmd] getChaincodeSpecification -> INFO 001 Local user 'jim' is
already logged in. Retrieving login token.
07:29:25.585 [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 002 Successfully invoked tr
ansaction: chaincodeSpec:<type:GOLANG chaincodeID:<name:"ee5b24a1f17c356dd5f6e37307922
e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab181
2590cd0f78539" > ctorMsg:<args:"invoke" args:"a" args:"b" args:"10" > secureContext:"j
im" > (f8347e3b-7230-4561-9017-3946756a0bf4)
07:29:25.585 [main] main -> INFO 003 Exiting.....

REST

POST HOST:7050/chaincode

Request

{
"jsonrpc": "2.0",
"method": "invoke",
"params": {
"type": 1,
"chaincodeID":{
"name":"980d4bb7f69578592e5775a6da86d81a221887817d7164d3e9d4d4df1c981440abf9
a61417eaf8ad6f7fc79893da36de2cf4709131e9af39bca6ebc2e5a1cd9d"
},
"ctorMsg": {
"function":"invoke",
"args":["a", "b", "100"]
},
"secureContext": "jim"
},
"id": 3
}

Response

{
"jsonrpc": "2.0",
"result": {
"status": "OK",
"message": "66308740-a2c5-4a60-81f1-778dbed49cc3"
},
"id": 3
}

126

chaincode
a

# peer chaincode query -u jim -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}'


07:29:55.844 [chaincodeCmd] getChaincodeSpecification -> INFO 001 Local user 'jim' is
already logged in. Retrieving login token.
07:29:56.198 [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 002 Successfully queried tr
ansaction: chaincodeSpec:<type:GOLANG chaincodeID:<name:"ee5b24a1f17c356dd5f6e37307922
e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab181
2590cd0f78539" > ctorMsg:<args:"query" args:"a" > secureContext:"jim" >
Query Result: 90
07:29:56.198 [main] main -> INFO 003 Exiting.....

REST

POST HOST:7050/chaincode

Request

{
"jsonrpc": "2.0",
"method": "query",
"params": {
"type": 1,
"chaincodeID":{
"name":"980d4bb7f69578592e5775a6da86d81a221887817d7164d3e9d4d4df1c981440abf9
a61417eaf8ad6f7fc79893da36de2cf4709131e9af39bca6ebc2e5a1cd9d"
},
"ctorMsg": {
"function":"query",
"args":["a"]
},
"secureContext": "jim"
},
"id": 5
}

Response

{
"jsonrpc": "2.0",
"result": {
"status": "OK",
"message": "900"
},
"id": 5
}

127

URL

GET HOST:7050/chain/blocks/2

Response

128

{
"transactions": [
{
"type": 2,
"chaincodeID": "EoABMjhiYjJiMjMxNjE3MWE3MDZiYjI4MTBlYzM1ZDA5NWY0MzA4NzdiZj
Q0M2YxMDYxZWYwZjYwYmJlNzUzZWQ0NDA3MDBhNTMxMmMxNjM5MGQzYjMwMTk5ZmU5NDY1YzNiNzVkNTk0NDM1
OGNhYWUwMWNhODFlZjI4MTI4YTFiZmI=",
"payload": "Cp0BCAESgwESgAEyOGJiMmIyMzE2MTcxYTcwNmJiMjgxMGVjMzVkMDk1ZjQzMD
g3N2JmNDQzZjEwNjFlZjBmNjBiYmU3NTNlZDQ0MDcwMGE1MzEyYzE2MzkwZDNiMzAxOTlmZTk0NjVjM2I3NWQ1
OTQ0MzU4Y2FhZTAxY2E4MWVmMjgxMjhhMWJmYhoTCgZpbnZva2USAWESAWISAzEwMA==",
"uuid": "2b3b6cf3-9887-4dd5-8f2e-3634ec9c719a",
"timestamp": {
"seconds": 1466577447,
"nanos": 399637431
},
"nonce": "5AeA6S1odhPIDiGjFTFG8ttcihOoNNsh",
"cert": "MIICPzCCAeSgAwIBAgIRAMndnS+Me0G6gs4J9/fb8HcwCgYIKoZIzj0EAwMwMTELM
AkGA1UEBhMCVVMxFDASBgNVBAoTC0h5cGVybGVkZ2VyMQwwCgYDVQQDEwN0Y2EwHhcNMTYwNjIyMDYzMzE4Whc
NMTYwOTIwMDYzMzE4WjAxMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLSHlwZXJsZWRnZXIxDDAKBgNVBAMTA2ppb
TBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDLd2W8PxzgB4A85Re2x44BApbOGqP05tnkygbXSctLiqi5HVfw
RAACS6znVA9+toni59Yy+XAH3w2offdjFW3mjgdwwgdkwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwD
QYDVR0OBAYEBAECAwQwDwYDVR0jBAgwBoAEAQIDBDBNBgYqAwQFBgcBAf8EQAfASTE6bZ0P5mrEzTa5r1UyKFv
+dKezBiGU0V3l2iWzk9evlGMvaC2pwhEKfKDdKxs7YSMYe/7cLq/oF++GBVowSgYGKgMEBQYIBEBEO3TKXuORl
5Geuco8Gnn5TkoIl4+b96aPGDGvKbmDjMXR9vEBuUXTnsbDL53j7kC8/XQs1kZboC1ojLeUSN03MAoGCCqGSM4
9BAMDA0kAMEYCIQCZqyANMFcu1WiMe2So0pC7eRU95F0+qUXLAKZsPWv/YQIhALmNaglP7CoMOe2qxehucmffD
lu0BRLSYDHyV9xcxmkH",
"signature": "MEYCIQDob3NqdrfwlSGhi+zz+Ypl7S9QQ07RIFr8nV92e8KDNgIhANIljz4t
RS8vwQk01hTemNQFJX2zMI6DhSUFZivbbtoR"
}
],
"stateHash": "7YUoVvYnMLHbLf47uTixLtkjF6xM9DuvgSWC92MbOUzk09xhcRBBLZqe5FvJElgZemEL
BOcuIFnubL0LiGH0yw==",
"previousBlockHash": "On4BlpqCYNpugUKluqvOcbvkr3TAQxmlISLdd6qrONtIgmQ4iUDeWxAA9lUC
ceZfF8tke8A0Wy7m9tksNpKodw==",
"consensusMetadata": "CAI=",
"nonHashData": {
"localLedgerCommitTimestamp": {
"seconds": 1466577447,
"nanos": 653618964
},
"transactionResults": [
{
"uuid": "2b3b6cf3-9887-4dd5-8f2e-3634ec9c719a"
}
]
}
}

129
Python

Python
HTTP API hyperledger

hyperledger-py

$ pip install hyperledger --upgrade

$ git clone https://github.com/yeasy/hyperledger-py.git


$ cd hyperledger-py
$ pip install -r requirements.txt
$ python setup.py install

>>> from hyperledger.client import Client


>>> c = Client(base_url="http://127.0.0.1:7050")
>>> c.peer_list()
{u'peers': [{u'type': 1, u'ID': {u'name': u'vp1'}, u'address': u'172.17.0.2:30303'}, {u
'type': 1, u'ID': {u'name': u'vp2'}, u'address': u'172.17.0.3:30303'}]}

API

HyperLedger Fabric SDK

SDK

Python SDK
Nodejs SDK

130
Fabric 1.0

1.0
Hyperledger Fabric 1.0

Docker
Docker Linux Redhat/Centos/Ubuntu 1.12

$ curl -fsSL https://get.docker.com/ | sh

Ubuntu 14.04 Docker /etc/default/docker

DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --api-c


ors-header='*'"

Docker

$ sudo service docker restart

Ubuntu 16.04 systemd Docker


/etc/systemd/system/docker.service.d/override.conf

Docker

$ sudo systemctl daemon-reload


$ sudo systemctl restart docker.service

docker-compose
python-pip

$ sudo aptitude install python-pip

docker-compose 1.8.0

$ sudo pip install docker-compose>=1.8.0

131
Fabric 1.0

Docker
Docker DockerHub
golang:1.7

$ ARCH=x86_64
$ BASE_VERSION=1.0.0-preview
$ PROJECT_VERSION=1.0.0-preview
$ IMG_VERSION=0.8.4
$ docker pull yeasy/hyperledger-fabric-base:$IMG_VERSION \
&& docker pull yeasy/hyperledger-fabric-peer:$IMG_VERSION \
&& docker pull yeasy/hyperledger-fabric-orderer:$IMG_VERSION \
&& docker pull yeasy/hyperledger-fabric-ca:$IMG_VERSION \
&& docker pull yeasy/blockchain-explorer:latest \
&& docker tag yeasy/hyperledger-fabric-peer:$IMG_VERSION hyperledger/fabric-peer \
&& docker tag yeasy/hyperledger-fabric-orderer:$IMG_VERSION hyperledger/fabric-order
er \
&& docker tag yeasy/hyperledger-fabric-ca:$IMG_VERSION hyperledger/fabric-ca \
&& docker tag yeasy/hyperledger-fabric-base:$IMG_VERSION hyperledger/fabric-baseimag
e \
&& docker tag yeasy/hyperledger-fabric-base:$IMG_VERSION hyperledger/fabric-ccenv:$A
RCH-$BASE_VERSION \
&& docker tag yeasy/hyperledger-fabric-base:$IMG_VERSION hyperledger/fabric-baseos:$
ARCH-$BASE_VERSION

fabric 1.0
Compose

$ git clone https://github.com/yeasy/docker-compose-files

hyperledger/1.0

peers.yml : peer

docker-compose.yml : 1 1 peer 1 Orderer

1 CA

$ docker-compose up

132
Fabric 1.0

$ docker ps
CONTAINER ID IMAGE
C
OMMAND CREATED STATUS PORTS
NAMES
2367ccb6463d hyperledger/fabric-peer "peer node start" 15 minut
es ago Up 15 minutes 7050/tcp, 7052-7059/tcp, 0.0.0.0:7051->7051/tcp fabr
ic-peer0
02eaf86496ca hyperledger/fabric-orderer "orderer" 15 minut
es ago Up 15 minutes 0.0.0.0:7050->7050/tcp fabr
ic-orderer
71c2246e1165 hyperledger/fabric-ca "fabric-ca server sta" 15 minut
es ago Up 15 minutes 7054/tcp, 0.0.0.0:8888->8888/tcp fabr
ic-ca

chaincode
fabric chaincode

chaincode
peer0

$ docker exec -it fabric-peer0 bash

install instantiate
response:< 200 "OK" "100" >

peer testchainid channel channel


instantiate/invoke/query peer --help

root@peer0:/go/src/github.com/hyperledger/fabric# peer chaincode install -n test_cc -p


github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":[
"init","a","100","b","200"]}' -v v0
...
[container] WriteGopathSrc -> INFO 001 rootDirectory = /go/src
[container] WriteFolderToTarPackage -> INFO 002 rootDirectory = /go/src
Installed remotely response:<status:200 payload:"OK" >
[main] main -> INFO 003 Exiting.....

peer chaincode instantiate

133
Fabric 1.0

root@peer0:/go/src/github.com/hyperledger/fabric# peer chaincode instantiate -n test_c


c -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Arg
s":["init","a","100","b","200"]}' -v v0
...
[chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
[chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
[main] main -> INFO 003 Exiting.....

dev-peer0-test_cc-v0 chaincode Docker

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
edc9740c265c dev-peer0-test_cc-v0 "/opt/gopath/bin/t..." 34 minutes ag
o Up 34 minutes dev-peer0
-test_cc-1.0
2367ccb6463d hyperledger/fabric-peer "peer node start" 36 minutes a
go Up 36 minutes 7050/tcp, 7052-7059/tcp, 0.0.0.0:7051->7051/tcp fabric-p
eer0
02eaf86496ca hyperledger/fabric-orderer "orderer" 36 minutes a
go Up 36 minutes 0.0.0.0:7050->7050/tcp fabric-o
rderer
71c2246e1165 hyperledger/fabric-ca "fabric-ca server ..." 36 minutes a
go Up 36 minutes 7054/tcp, 0.0.0.0:8888->8888/tcp

chaincode
chaincode a

peer0 Query Result:


100

root@peer0:/go/src/github.com/hyperledger/fabric# peer chaincode query -n test_cc -c


'{"Args":["query","a"]}'
Query Result: 100
2017-02-20 07:12:10.020 UTC [main] main -> INFO 001 Exiting.....

< 200 "OK" "100" >

134
Fabric 1.0

root@peer0:/go/src/github.com/hyperledger/fabric# peer chaincode invoke -n test_cc -c


'{"Args":["query","a"]}'
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<s
tatus:200 message:"OK" payload:"100" > payload:"\n \n3\342Nbxl\340\332\367\220fT}]\371
\027Q\246A\332nI\242&#5i\230\220Bx\0224\n(\002\004lccc\001\007test_cc\004\001\001\001\
001\000\000\007test_cc\001\001a\004\001\001\001\001\000\000\032\010\010\310\001\032\00
3100" endorsement:<endorser:"\n\007DEFAULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAw
IBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk
NhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIE
luYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcx
MTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1Jh
bGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYI
KoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C
756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQ
UFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFB
dnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCC
qG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT
0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n" signature:"0D\002 IC\266\236\222E\370\
243\221\272\312k\007\336\306\265\034_\tT\321O@\247\241\267\334\315\311\231\264E\002 \0
10\375/\220\232h\322IP\350B\222@\200\201\204\20140BI\261\334\211\023\305F\345\001\260\
250." >
[main] main -> INFO 002 Exiting.....

b Query Result: 200

root@peer0:/go/src/github.com/hyperledger/fabric# peer chaincode query -n test_cc -c


'{"Args":["query","b"]}'
Query Result: 200
[main] main -> INFO 001 Exiting.....

135
Fabric 1.0

root@peer0:/go/src/github.com/hyperledger/fabric# peer chaincode invoke -n test_cc -c


'{"Args":["query","b"]}'
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<s
tatus:200 message:"OK" payload:"200" > payload:"\n \366\340\355\3350\202\326\213\367p\
222\364r\326\212\177\240\214\204\254\364\232\312\227\242(Z9\010a\342\241\0224\n(\002\0
04lccc\001\007test_cc\004\001\001\001\001\000\000\007test_cc\001\001b\004\001\001\001\
001\000\000\032\010\010\310\001\032\003200" endorsement:<endorser:"\n\007DEFAULT\022\2
32\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAw
Iw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28x
HzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBs
ZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMO
Tm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYz
EMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsO
vmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBa
AwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ
4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15
aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4
jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n"
signature:"0E\002!\000\335\t\234\347\367&\316-G~J\336u\tn\035\030U\314\021\227Z\241U\3
07+\\^>\230\216k\002 qk;\276\007\312'\376\022\267\342h\2620>\317\353\232\\\223\334U\37
2xu\2275\274\327\345fH" >
[main] main -> INFO 002 Exiting.....

chaincode
chaincode a b 10

peer0 response:< 200 "OK"

>

136
Fabric 1.0

root@peer0:/go/src/github.com/hyperledger/fabric# peer chaincode invoke -n test_cc -c


'{"Args":["invoke","a","b","10"]}'
...
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<s
tatus:200 message:"OK" > payload:"\n \004;#\354\320w;\256t\321\323\371\357i\313\024_\2
65!\372&=\203:7\3107k\326\303\001\264\022C\n<\002\004lccc\001\007test_cc\004\001\001\0
01\001\000\000\007test_cc\002\001a\004\001\003\001\001\001b\004\001\003\001\001\002\00
1a\000\00280\001b\000\003220\000\032\003\010\310\001" endorsement:<endorser:"\n\007DEF
AULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYI
KoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcm
FuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAx
MLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMB
UGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\n
IEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGM
kB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8B
Af8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYE
FOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQ
QeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKm
ilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END
-----\n" signature:"0E\002!\000\220\337}\224\324v\214\241\"\341{\243\3069s'\264\250\2
02o\247a'\r&\342\352\2312\255\317\276\002 \030\345\370\224\371i\317A\273m@\341\316\177
\02343\323\374\007\007\230\241\317\210\0163\235T \211\310" >
[main] main -> INFO 002 Exiting.....

a b

a 90

root@peer0:/go/src/github.com/hyperledger/fabric# peer chaincode query -n test_cc -c


'{"Args":["query","a"]}'
Query Result: 90
[main] main -> INFO 001 Exiting.....

b 210

root@peer0:/go/src/github.com/hyperledger/fabric# peer chaincode query -n test_cc -c


'{"Args":["query","b"]}'
Query Result: 210
[main] main -> INFO 001 Exiting.....

137

Linux Ubuntu 14.04+ MacOS

git
golang 1.6+ $GOPATH
Docker 1.12+ MacOS Docker for Mac

Linux foundation ID https://gerrit.hyperledger.org/ ssh pub


key

fabric Clone with commit-msg hook

$GOPATH/src/github.com/hyperledger/
LF_ID Linux foundation id

$ mkdir $GOPATH/src/github.com/hyperledger/
$ cd $GOPATH/src/github.com/hyperledger/
$ git clone ssh://LF_ID@gerrit.hyperledger.org:29418/fabric && scp -p -P 29418 LF_ID@g
errit.hyperledger.org:hooks/commit-msg fabric/.git/hooks/

ssh pubkey https clone

git clone http://LF_ID@gerrit.hyperledger.org/r/fabric && (cd fabric && curl -kLo `git
rev-parse --git-dir`/hooks/commit-msg http://LF_ID@gerrit.hyperledger.org/r/tools/hoo
ks/commit-msg; chmod +x `git rev-parse --git-dir`/hooks/commit-msg)

Makefile

go tools

$ make gotools

138

$ make linter

peer

$ make peer

Docker peer

make clean

Docker

$ make images

$ make checks

$ make unit-test

$ go test -v -run=TestGetFoo

BDD

139

Docker

$ make behave

Linux foundation ID jira.hyperledger.org


assignee FAB-XXX

FAB-XXX

$ git checkout -b FAB-XXX

$ git commit -a -s

commit

Simple words to describe main change

This fixes #FAB-XXX.

A more detailed description can be here, with several


paragraphs and sentences...

git review

$ git review

gerrit.hyperledger.org/r/ patchset
reviewer review
maintainer merge

$ git commit -a --amend

140

1.7.7.1 -

141

142

chaincode_example01.go

hello_world key

read key args[0] value

write key args[0] value

init key hello_world value

invoke init write

query read args[0] value

main shim start chaincode

func main() {
err := shim.Start(new(SimpleChaincode))
if err != nil {
fmt.Printf("Error starting Simple chaincode: %s", err)
}
}

rest api

init invoke query stub.PutState


stub.GetState ledger

REST API
jim pbft chaincode json

143

{
"jsonrpc": "2.0",
"method": "deploy",
"params": {
"type": 1,
"chaincodeID": {
"path": "https://github.com/ibm-blockchain/learn-chaincode/finished"
},
"ctorMsg": {
"function": "init",
"args": [
"hi there"
]
},
"secureContext": "jim"
},
"id": 1
}

path github ctorMsg init

invoke json

{
"jsonrpc": "2.0",
"method": "invoke",
"params": {
"type": 1,
"chaincodeID": {
"name": "4251b5512bad70bcd0947809b163bbc8398924b29d4a37554f2dc2b033617c19c
c0611365eb4322cf309b9a5a78a5dba8a5a09baa110ed2d8aeee186c6e94431"
},
"ctorMsg": {
"function": "init",
"args": [
"swb"
]
},
"secureContext": "jim"
},
"id": 2
}

name deploy message

query

144

chaincode_example02.go

AB
AB
AB

init AB

invoke AB

query AB

delete

import (
"errors"
"fmt"
"strconv"

"github.com/hyperledger/fabric/core/chaincode/shim"
)

strconv int string

invoke

X, err = strconv.Atoi(args[2])
Aval = Aval - X
Bval = Bval + X

args[2]<0 A B

145

146

init

invoke

query

createBank

createCompany

issueCoin

issueCoinToBank

issueCoinToCp

transfer

getCompanys 1010

getBanks 10 10

getTransactions 10 10

getCompanyById

getBankById

getTransactionBy

writeCenterBank

writeBank

writeCompany

writeTransaction

147

centerBank
Name
TotalNumber
RestNumber
IDID 0
bank
Name
TotalNumber
RestNumber
ID ID
company
Name
Number
ID ID
transaction
FromType //centerBank:0,Bank:1,Company:2
FromID ID
ToType //Bank:1,Company:2
ToID ID
Time
Number
ID ID

init

request :

args[0]
args[1]

response :

{"Name":"XXX","TotalNumber":"0","RestNumber":"0","ID":"XX"}

createBank

request :

148

args[0]

response :

{"Name":"XXX","TotalNumber":"0","RestNumber":"0","ID":"XX"}

createCompany

request :

args[0]

response :

{"Name":"XXX","Number":"0","ID":"XX"}

issueCoin

request :

args[0]

response :

{"FromType":"0","FromID":"0","ToType":"0","ToID":"0","Time":"XX","Number":"XX","ID":"X
X"}

issueCoinToBank

request :

args[0] ID
args[1]

response :

{"FromType":"0","FromID":"0","ToType":"1","ToID":"XX","Time":"XX","Number":"XX","ID":"
XX"}

issueCoinToCp

149

request :

args[0] ID
args[1] ID
args[2]

response :

{"FromType":"1","FromID":"XX","ToType":"2","ToID":"XX","Time":"XX","Number":"XX","ID":
"XX"}

transfer

request :

args[0] ID
args[1] ID
args[2]

response :

{"FromType":"2","FromID":"XX","ToType":"2","ToID":"XX","Time":"XX","Number":"XX","ID":
"XX"}

getBanks

response

[{"Name":"XXX","Number":"XX","ID":"XX"},{"Name":"XXX","Number":"XX","ID":"XX"},...]

getCompanys

response

[{"Name":"XXX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"},{"Name":"XXX","TotalNum
ber":"XX","RestNumber":"XX","ID":"XX"},...]

getTransactions

response

150

[{"FromType":"XX","FromID":"XX","ToType":"XX","ToID":"XX","Time":"XX","Number":"XX","I
D":"XX"},{"FromType":"XX","FromID":"XX","ToType":"XX","ToID":"XX","Time":"XX","Number":
"XX","ID":"XX"},...]

getCenterBank

response

[{"Name":"XX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"}]

getBankById

request

args[0] ID

response

[{"Name":"XX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"}]

getCompanyById

request

args[0] ID

response

[{"Name":"XXX","Number":"XX","ID":"XX"}]

getTransactionById

request

args[0] ID

response

151

{"FromType":"XX","FromID":"XX","ToType":"XX","ToID":"XX","Time":"XX","Number":"XX","ID"
:"XX"}

writeCenterBank

request

CenterBank

response

err nil

writeBank

request

Bank

response

err nil

writeCompany

request

Company

response

err nil

writeTransaction

request

Transaction

152

response

``` err nil

153

















//0 1


154





//0: 1 2:

function
init

invoke

query

updateDiploma invoke

enrollStudent invoke

createSchool init

createStudent init

getStudentByAddress query

getRecordById Id query

getRecords 10,10 query

getSchoolByAddress

getBackgroundById

writeRecord

writeSchool

writeStudent

createSchool

request:

args[0]
args[1]

response:

json

createStudent

155

request

args[0]

response

json

updateDiploma

request

args[0]
args[1]
args[2]
args[3] //0 1

response

json

enrollStudent

request:

args[0]
args[1]
args[2]

response

json

getStudentByAddress

request

args[0] address

response

json

156

getRecordById

request

args[0] ID

response

json

getRecords

response

1010

getSchoolByAddress

request

args[0] address

response

json

getBackgroundById

request

args[0] ID

response

json

157

LO3 Lawrence Orsini

1.

guid+1guid+2+"1"



//0


//0 1


(
+ID
)



158

function
init

invoke

query

createUser invoke

buyByAddress invoke

getTransactionById id query

getTransactions 1010 query

getHomes 1010 query

getHomeByAddress query

changeStatus invoke

writeUser

writeTransaction


createUser

request:

args[0]
args[1]

response:

json

buyByAddress

request:

args[0]
args[1]
args[2]
args[3]

response:

159

transactionjson
error

getTransactionById

request:

args[0]

response:

transaction

getTransactions

request:

none

response:

1010

getHomeByAddress

request

args[0] address

response

json

getHomes

response

1010

changeStatus

request:

160

args[0]
args[1]
args[2] 0 1

response:

json

161

1.7.9.1 - Hyperledger

Technical Steering Committee



Governing Board Hyperledger

Linux FoundationLinux Hyperledger Linux

Linux Hyperledger
Hyperledger Brian Behlendorf
2016 12 1 TWG-China TSC

162



rocketchat
meetuphackfest

IBM Hyperledger

163

Hyperledger Linux

R3 CEV Corda bletchley

164
Ethereum -

Ethereum -

Smart Contract

ethereum.org

165

Ethereum
Platform for Smart Contract
GolangC++Python

DAPP

2014

2015 7 1800 Frontier

2016 3 Homestead 1150000

2016 3Q Metropolis

2017 1Q Serenity PoS (Casper)

Solidity

uncle 15

gas

EVM

2014 6

166

ethereum

Go

curl -O https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.5.1.linux-amd64.tar.gz
mkdir -p ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc
echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
source ~/.bashrc

ethereum

sudo apt-get install software-properties-common


sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum

solc

sudo add-apt-repository ppa:ethereum/ethereum-qt


sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install cpp-ethereum

geth ethereum

geth account new

Solidity
browser-solidity Solidity

Solidity

167

Mist

EVM

ethereumjs-libjavascript
Ethereum(J)Java
ethereumHHaskell
go-ethereumgo
ParityRust
pyethapppython
ruby-ethereumRuby

IDE

EthStats.netEtherNodes.com

168

EVM
Account

Transaction
Gas

PoW PoS

DDoS
gas

169

Hello World!

smartContract_example01.sol

greeter
Hello World!Hello World!

:
solidityethereum,
,

kill selfdestruct ethereum ,kill,


greet greeter greeting


smartContract_example01.sol ssh session,
geth su - geth , cat smartContract_example01.sol | tr '\n' ' ' .
:

var greeterSource = 'contract mortal { address owner; function mortal() { owner = msg.
sender; } function kill() { if (msg.sender == owner) selfdestruct(owner); } } contract
greeter is mortal { string greeting; function greeter(string _greeting) public { gree
ting = _greeting; } function greet() constant returns (string) { return greeting; } }'

170

var greeterCompiled = web3.eth.compile.solidity(greeterSource)

greeterCompiled.Token.code

greeterCompiled.Token.info.abiDefinition ABI

var _greeting = "Hello World!"

ABIjavascript

var greeterContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition);

var greeter = greeterContract.new(_greeting,{from:web3.eth.accounts[0], data: greeterC


ompiled.greeter.code, gas: 300000}, function(e, contract){
if(!e) {
if(!contract.address) {
console.log("Contract transaction send: TransactionHash: " + contract.transact
ionHash + " waiting to be mined...");
} else {
console.log("Contract mined! Address: " + contract.address);
console.log(contract);
}
}
})

greeterContract.new
greeterContract.newfrom,
data, gasgasgas
gas
greeterContract.new

contract.newToken

171

15

miner.start(1)

...
I0714 22:00:19.694219 ethash.go:291] Generating DAG: 97%
I0714 22:00:22.987934 ethash.go:291] Generating DAG: 98%
I0714 22:00:26.543035 ethash.go:291] Generating DAG: 99%
I0714 22:00:29.912655 ethash.go:291] Generating DAG: 100%
I0714 22:00:29.915580 ethash.go:276] Done generating DAG for epoch 2, it took 5m34.983
289765s

()
DAG,,(,,
)

miner.stop()


,,:

//blockchain,
greeter.greet();

'Hello World!'

, "Hello World!" ,!

1. Address
2. ABIApplication Binary InterfaceABI

172

ABI:

greeterCompiled.greeter.info.abiDefinition;
greeter.address;

JavaScript
ABIAddress

var greeter = eth.contract(ABI).at(Address);

greeter.kill.sendTransaction({from:eth.accounts[0]})

THE GREETER YOUR DIGITAL PAL WHO'S FUN TO BE WITH

173

174

Blockchain as a
ServiceBaaSBaaS

175
Bluemix BaaS

Bluemix
Bluemix IBM Platform as a Service
Bluemix

Bluemix

176
BaaS

BaaS
Devops

github.com/yeasy/cello


1~2



177
BaaS

1.9.2.1 - start

Register

178
BaaS

Dashboard

1.9.2.2 - Dashboard

179
BaaS

map action
My Chaincode Instance

1.9.2.3 - deploy

180
BaaS

My Deployment

invoke

car_owner Cathy

181
BaaS

1.9.2.4 - invoke2

1.9.2.5 - blocks

query

182
BaaS

1.9.2.6 - query

car_owner

1.9.2.7 - query2

183
BaaS

1.9.2.8 - logs

184
BaaS

1.9.2.9 - operations

185

186

187

188
Hyperledger Fabric v0.6

Hyperledger Fabric v0.6

CPU(GHz) (GB)
Ubuntu 14.04.1 3.16.0-71-generic 4x2.0 8

10s

throughputlatency

consensus

tps

query
noops

clients VP Nodes iteration tps

1 1 2000 195.50
1 4 2000 187.09

pbft:classic

clients VP Nodes iteration tps

1 4 2000 193.05

pbft:batch

189
Hyperledger Fabric v0.6

clients VP Nodes batch size iteration tps

1 4 2 2000 193.99
1 4 4 2000 192.49
1 4 8 2000 192.68

pbft:sieve

clients VP Nodes iteration tps

1 4 2000 192.86

invoke
noops

clients VP Nodes iteration tps


1 1 2000 298.51
1 4 2000 205.76

pbft:classic

clients VP Nodes iteration tps


1 4 2000 141.34

pbft:batch

clients VP Nodes batch size iteration tps


1 4 2 2000 214.36

1 4 4 2000 227.53
1 4 8 2000 237.81

pbft:sieve

clients VP Nodes iteration tps


1 4 2000 253.49*

sieve
vp0_1 | 07:49:26.388 [consensus/obcpbft] main -> WARN 23348 Sieve replica 0 custody
expired, complaining:

190
Hyperledger Fabric v0.6

3kwyMkdCSL4rbajn65v+iYWyJ5aqagXvRR9QU8qezpAZXY4y6uy2MB31SGaAiaSyPMM77
TYADdBmAaZveM38zA==

tps 190 ~ 300

191

192

193

Blockchain
CACertificate Authority PKI
Chaincode
Decentralization
Distributed

Distributed Ledger

DLTDistributed Ledger Technology

DTCCDepository Trust and Clearing Corporation

FintechFinancial Technology
Hash
Lightning Network
Market Depth

Nonce
P2P
PKIPublic key infrastructure
Smart Contract
Sybil Attack

SWIFTSociety for Worldwide Interbank Financial Telecommunication

Turing-complete

Bitcoin
DAODecentralized Autonomous Organization

Mining hash
0

194


Miner
Mining MachineGPU
FPGA
Mining Pool

PoWProof of Work SHA256 hash

Hyperledger
Auditability
Block
Blockchain
hash
Chaincode golang
nodejs
Committer1.0 peer orderer

Confidentiality

Endorser1.0 peer

Ledgerworld
state
MSPMember Service Provider

Non-validating Peer
REST
Orderer1.0

Permissioned Ledger

Privacy

Transaction chaincode
Transactor
Validating Peer

World Statechaincode

195

196

cash
2009

10

10

197

1 MB

10
hash 100 MB/s

1 MB
0.2 ~ 1 KB

Hyperledger Fabric

v0.6
1.0 Fabric
2017 3 1.0 beta bug 1.0

198

IBM: HyperLedger

DTCC: HyperLedger
Circle 6000 D IDG
10
Consensus

R3 CEV 2015 9
40 CitiBOA
IBMR3 HyperLedger
[HyperLedger ]https://hyperledger.org 2015 12
Linux IBMAccentureIntelJ.P.MorganR3DAHDTCC
FUJITSUHITACHISWIFTCisco

Ethereum :
DAO Distributed Autonomous Organization()
1.6

199





2016


2014

BeLink
BitSeVechain

2016 2 3


ChinaLedger2016 4




2016 5 31

25

200
ProtoBuf gRPC

ProtoBuf gRPC
ProtoBuf IDL protoc C++
Apache Thrift .proto protoc
C++JavaPythonC#Golang
gRPC

gRPC Google RPC gRPC


gRPC ProtoBuf

.proto RPC protoc gRPC


.proto

ProtoBuf

protoc
protobuf

C++

message
service RPC
1~15

optionalrepeated service rpc


message message

syntax = "proto3";
package hello;

message HelloRequest {
string greeting = 1;
}

message HelloResponse {
string reply = 1;
repeated int32 number=4;
}

service HelloService {
rpc SayHello(HelloRequest) returns (HelloResponse){}
}

201
ProtoBuf gRPC

python --python_out=OUT_DIR

protoc plugin go

$ go get -u github.com/golang/protobuf/{protoc-gen-go,proto} // plugin go


protoc --go_out=./ hello.proto hello.pb.go protoc-


gen-go

ProtoBuf Marshal/Unmarshal
XML 3~10 1~2

gRPC


protoc grpc ProtoBuf IDL .proto

RPC gRPC gRPC Server gRPC


Stub
HTTP2 gRPC

ProtoBuf IDL service

proto grpc plugin

$ protoc --go_out=plugins=grpc:. hello.proto

HelloServiceServer

202
ProtoBuf gRPC

type HelloServiceServer interface {


SayHello(context.Context, *HelloRequest) (*HelloResponse, error)
}

func RegisterHelloServiceServer(s *grpc.Server, srv HelloServiceServer) {


s.RegisterService(&_HelloService_serviceDesc, srv)
}

gRPC

lis, err := net.Listen("tcp", port)


grpc.NewServer()
pb.RegisterHelloServiceServer()
s.Serve(lis)

type server struct{}

//
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, e
rror) {
return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

// gRPC
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterHelloServiceServer(s, &server{})
s.Serve(lis)
}

go HelloServiceClient
gRPC

203
ProtoBuf gRPC

type HelloServiceClient interface {


SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*Hel
loResponse, error)
}

type helloServiceClient struct {


cc *grpc.ClientConn
}

func NewHelloServiceClient(cc *grpc.ClientConn) HelloServiceClient {


return &helloServiceClient{cc}
}

func (c *helloServiceClient) SayHello(ctx context.Context, in *HelloRequest, opts ...g


rpc.CallOption) (*HelloResponse, error) {
out := new(HelloResponse)
err := grpc.Invoke(ctx, "/hello.HelloService/SayHello", in, out, c.cc, opts...)

if err != nil {
return nil, err
}
return out, nil
}

func main() {
// Set up a connection to the server.
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewHelloServiceClient(conn)

// Contact the server and print out its response.


name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}

204
ProtoBuf gRPC

205

/
The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments

blockchain.info
bitcoin.it wiki
https://www.ethereum.org
https://etherchain.org/
Hyperledger https://hyperledger.org;
Hyperledger Docker https://hub.docker.com/r/hyperledger/

Bitcoin and Cryptocurrency Technologies, Princeton University

Bluemix BaaS
SV BaaS

206

You might also like