Professional Documents
Culture Documents
Blockchain Guide
Blockchain Guide
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
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
coffee~
1.1.1 - coffee
moneycashcurrency
10
100 0.1 100
Double-Spent
11
1.0
e-
CashHashCash](HashcashB-money
PoW
12
paypal
13
14
2014 Blockchain
Distributed Ledger
15
Blockchain
wikipedia
16
1.2.3.1 -
17
PoW
PoW
PoS
Hyperledger
Transaction
Block
Chain
18
1.2.3.2 -
nonce
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
26
openssl
heart bleeding
hash
NoSql
27
levelDBRocksDB \/
BlockDB
28
1.2.6.1 -
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
RSCoin
RSCoin
RSCoin 2PC
201610 IBM
60-80%
35
Abra
Bitwage
BitPOS
Circle
Ripple
BitShare 10
DAH
Symbiont
Overstock.com T0(The
trade is the settlement)
SETLcoin
36
IDG
37
Factom
BitShare
Everledger
Mycelia
Monegraph
Mediachain metadata
38
Airbnb P2P
P2P
AirbnbHomeAway OneFineStay
30-90
ConsenSys LO3
OpenBazaar
39
OpenBazaar
40
41
Transaction
Address
PM2.5 DNS
Edge
IBM
IBM
Skuchain
42
DNS
DNS
DNS
43
BitMessage
GemHealth
Storj
Tierion
Twister
44
45
46
(Consistency Agreement)
47
Termination
Consensus
Validity
Strong Consistency
Eventually Consistency
48
49
Proposal
PaxosRaft
PBFT PoW
PBFT PoW
FLP
50
51
FLP
FLP
FLP
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
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
N F
Byzantine Fault Tolerant (BFT)
1
1 0 0
0 1
59
F1
Leslie Lamport
4 1
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
MD5 Hash
89242549883a2ef85dc81b90fb606046 hello blockchain
hash fingerprintdigest
hash
hash hash
hash
hash
hash
hash
64
Hash
Hash scrypt
CPU hash
Hash
Hash
Hash
65
DES3DES
AESIDEA
RSAElGamal
symmetric cryptography
common-key cryptography(asymmetric cryptography
public-key cryptography)
DES3DESAESIDEA
66
67
RSA
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
unlinkability
RSA )
n m
n m
69
,
,
70
CA ITU ISO
X.509
CA
CA
CA
CA CA
CA
PKI
71
PKI
PKI
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
key
key
74
A B B A
75
76
trade-off
77
blockchain.info
1.6.1.1 -
2009 1 3 50
The Times 03/Jan/2009 Chancellor on brink of
second bailout for banks
2010 7 17
2011 2011 2
78
2012 9 27 12.46
2012 11 28
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
UTXO
blockchain.info
0beca08914de596217f098d744e3fb8da68aa5e00dd8f63a3364b451f3f4a70f
Script
Forth
scriptPubKeyscriptSig
82
P2PKHPay-To-Public-Key-Hash
0x00
P2SHPay-To-Script-Hash
0x05
P2PKH
pubKey hash
pubKey hash pubKeyHash
scriptSig scriptPubKey
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
2010
cover
86
Hash
1/3
1/2
PoWProof of Work
PoW PoS
87
GPU ASIC
Forth UTXO
88
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
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
Hyperledger
1.7.1.2 - Hyperledger
98
Incubation
99
BlockchainChaincode
Membership
Auditability
Block
Blockchain
hash
Certificate AuthorityCA Member Service Identity
Service
Chaincode
golangnodejs
Committer1.0 peer orderer
Confidentiality
Endorser1.0 peer
100
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;
1.0 transaction
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"
}
]
}
hash
numBuckets maxGroupingAtEachLevel hashFunction
numBuckets bucket
104
hashFunction
maxGroupingAtEachLevel hash
chaincodeID
chaincodeID
Chaincode VP
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 {
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
CORE_PEER_DISCOVERY_ROOTNODE DISC_HELLO
idblock
block
DISC_GET_PEERS DISC_GET_PEERS
DISC_PEERS
Transaction
DeployInvokeQuery
Synchronization
block consensus
Consensus
110
CONSENSUS consensus
111
chaincode
chaincode Hyperledger fabric
VP
Docker gRPC VP
chaincode
golang chaincode shim Init,
Invoke Query
chaincode
fmt Println .
errors errors
github.com/hyperledger/fabric/core/chaincode/shim chaincode
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
Docker
Docker
docker-compose
python-pip
docker-compose 1.7.0
115
1.0 v0.6
noopspbft
noops
noops consensus 1
PBFT
116
PBFT hyperledger 4
Compose
hyperledger/0.6/pbft
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
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
118
7057tCAA
7058tlsCAP
7059tlsCAA
119
chaincode
chaincode
example02 chaincode a b
chaincode
VP pbft pbft_vp0_1
chaincode example02
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
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
122
hyperledger fabric
hyperledger PBFT
jim
vp0
REST
POST HOST:7050/registrar
Request
123
{
"enrollId": "jim",
"enrollSecret": "6avZQLwcUe9b"
}
Response
{
"OK": "User jim is already logged in."
}
chaincode
chaincode -u
vp0
chaincode ID
# CC_ID=ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5d
c31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
124
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
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
API
SDK
Python SDK
Nodejs SDK
130
Fabric 1.0
1.0
Hyperledger Fabric 1.0
Docker
Docker Linux Redhat/Centos/Ubuntu 1.12
Docker
Docker
docker-compose
python-pip
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
hyperledger/1.0
peers.yml : peer
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
install instantiate
response:< 200 "OK" "100" >
133
Fabric 1.0
$ 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
134
Fabric 1.0
135
Fabric 1.0
chaincode
chaincode a b 10
>
136
Fabric 1.0
a b
a 90
b 210
137
git
golang 1.6+ $GOPATH
Docker 1.12+ MacOS Docker for Mac
$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/
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
FAB-XXX
$ git commit -a -s
commit
git review
$ git review
gerrit.hyperledger.org/r/ patchset
reviewer review
maintainer merge
140
1.7.7.1 -
141
142
chaincode_example01.go
hello_world key
func main() {
err := shim.Start(new(SimpleChaincode))
if err != nil {
fmt.Printf("Error starting Simple chaincode: %s", err)
}
}
rest api
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
}
invoke json
{
"jsonrpc": "2.0",
"method": "invoke",
"params": {
"type": 1,
"chaincodeID": {
"name": "4251b5512bad70bcd0947809b163bbc8398924b29d4a37554f2dc2b033617c19c
c0611365eb4322cf309b9a5a78a5dba8a5a09baa110ed2d8aeee186c6e94431"
},
"ctorMsg": {
"function": "init",
"args": [
"swb"
]
},
"secureContext": "jim"
},
"id": 2
}
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"
)
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
153
//0 1
154
//0: 1 2:
function
init
invoke
query
updateDiploma invoke
enrollStudent invoke
createSchool init
createStudent init
getStudentByAddress query
getRecordById Id 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
1.
guid+1guid+2+"1"
//0
//0 1
(
+ID
)
158
function
init
invoke
query
createUser invoke
buyByAddress invoke
getTransactionById id 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
Linux Hyperledger
Hyperledger Brian Behlendorf
2016 12 1 TWG-China TSC
162
rocketchat
meetuphackfest
IBM Hyperledger
163
Hyperledger Linux
164
Ethereum -
Ethereum -
Smart Contract
ethereum.org
165
Ethereum
Platform for Smart Contract
GolangC++Python
DAPP
2014
2016 3Q Metropolis
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
solc
geth ethereum
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,
,
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
greeterCompiled.Token.code
greeterCompiled.Token.info.abiDefinition ABI
ABIjavascript
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
greeter.kill.sendTransaction({from:eth.accounts[0]})
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
CPU(GHz) (GB)
Ubuntu 14.04.1 3.16.0-71-generic 4x2.0 8
10s
throughputlatency
consensus
tps
query
noops
1 1 2000 195.50
1 4 2000 187.09
pbft:classic
1 4 2000 193.05
pbft:batch
189
Hyperledger Fabric v0.6
1 4 2 2000 193.99
1 4 4 2000 192.49
1 4 8 2000 192.68
pbft:sieve
1 4 2000 192.86
invoke
noops
pbft:classic
pbft:batch
1 4 4 2000 227.53
1 4 8 2000 237.81
pbft:sieve
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==
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
ProtoBuf
protoc
protobuf
C++
message
service RPC
1~15
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
ProtoBuf Marshal/Unmarshal
XML 3~10 1~2
gRPC
protoc grpc ProtoBuf IDL .proto
HelloServiceServer
202
ProtoBuf gRPC
gRPC
//
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
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)
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/
Bluemix BaaS
SV BaaS
206