CSDN资料地址:(152条消息) 1.hyperledger-fabric 资料整理_youth_ymh的博客-CSDN博客
; Q! e1 y) m3 d+ \& Qhttps://blog.csdn.net/baidu_ymh/article/details/131537319?spm=1001.2014.3001.5501
' v2 \$ B5 F* d% |- p知乎:https://zhuanlan.zhihu.com/p/6414584191 X0 d! b& r+ u; N2 j0 ?" M# R6 M
章节目录2 f4 h- F# |2 w# } w' A
1.hyperledger-fabric 介绍和资料整理 https://www.toutiao.com/article/7251935732179354150/ _% W: i( ~+ K2 E* `/ B& v
2.服务环境准备 https://www.toutiao.com/article/7251937147132035623/! k" j7 b/ `! R
3.安装fabric 二进制源码程序 https://www.toutiao.com/article/7251938220630753795/
$ M P8 }! L9 ^1 o6 j7 u4.生成fabric身份信息文件(证书)https://www.toutiao.com/article/7251940174950105633/- o( v3 s4 ]* k0 D# K; {
5.生成系统通道初始区块文件 https://www.toutiao.com/article/7251940560347349542/
- G, C0 G/ ?4 w6.启动配置网络节点 docker-compose启动文件 https://www.toutiao.com/article/7252140512931889676/. _! l8 k5 V) s2 _& |
7.将组织加入通道 https://www.toutiao.com/article/7252141528884265505/6 F4 }) f) B% |5 d8 d5 y- j
8.安装合约链码 https://www.toutiao.com/article/7252142449584521766/
$ o% m& H& V+ q: aconfigtx.yaml 详解 https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=7252143717228986918
3 D8 N7 x. V2 c" y1 W! y x6 E. Bcrypto-config.yaml配置详解 https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=7252143970669855235
/ l; Y/ l2 B8 \) `; e. K3 Y& J+ z% F3 u7 C4 s9 f
& \9 M$ C. ?; m& e
1.创建合约代码
' P4 |% I: v! j0 }3 ^. c" d
- A4 D# A: V& ^2 j- V7 v& ]8 O语言:java& F6 e) v/ R( p0 D4 f
2 L" y' M+ [- Y. s) \/ W参考官网示例: https://mvnrepository.com/artifact/org.hyperledger.fabric-chaincode-java/fabric-chaincode-shim7 I" r! c7 g3 e3 |5 z# v
0 n) R4 L. s* J w/ w1 D5 a9 O- I
项目目录
) a" `& J3 u" y+ _5 D( l5 D
; |! r) u$ n* i2 t9 d: W* b I9 U: J7 f- e% s4 h
' S# z4 H4 y* ?- H! n. [
3.maven 打包- U5 |! h, A k
/ P& ]8 Z4 r5 m* K/ C
. \2 r6 i0 D" |
5 p9 ?8 g$ s7 G0 `: E打包后target/下会生成chaincode.jar 包。. H6 O0 t0 V5 Q0 v7 T7 Q! ]
8 j1 R4 L' X) U+ J
, ~; i" ~3 k) O& W, |
4.移动包到服务器2 o! k1 u" f' T
- T2 [, W* v- l
将合约代码里target\chaincode.jar和 META-INF 两个文件上传到服务器目录 /home/hyperledgerFabric/qkl_01/chaincode/fabric-java 下,没有目录请创建。6 W+ I5 k/ |6 u
& \. ?) a3 L6 K9 H$ A/ i1 _
2 Y% Q1 y- x) }8 x
5.设置环境变量
: m8 E: i7 _! M* O1 z" Y7 Z. ]8 i1 A" z$ X4 q; ^$ d6 P6 D" e
export PATH=/home/hyperledgerFabric/qkl_01/bin:$PATHexport FABRIC_CFG_PATH=/home/hyperledgerFabric/qkl_01/config/6.通过 lifecycle 命令打包成链码包: D W. ^/ f; r" }: n
+ U k/ r! c) S) g6 T9 C8 dlifecycle命令参数
! |& a w9 H$ r) p
: p& T4 y" X- e' x4 Mpackage : 打包后的链码包文件
0 S5 x/ f- t9 P8 U0 m3 x4 p8 ~1 T4 q Y8 t& C" ?' P: q
--path : 需要打包的合约代码文件目录1 I) w) C) V3 _" \9 ]
6 v5 B) |: Z/ d
--lang : 链码语言 java版本1 A% h' s1 R a4 w L, W
4 A" C b, B5 x9 C% h6 r* U--label : 链码包名称id' i* s8 j: k& o u( d
peer lifecycle chaincode package fabcar.tar.gz --path /home/hyperledgerFabric/qkl_01/chaincode/fabric-java --lang java --label fabric-java7.安装链码
: J# G$ ?7 ?6 m6 Z0 j S
$ B- V) I: i( I进入链码包目录:
: D% a+ Q1 `% G) d! d# _. c; t _cd /home/hyperledgerFabric/qkl_01/chaincode
* x# Y0 ^# N( f m% _. l" D- A$ g! u0 j$ c4 }$ b D
7.1 Org1MSP 安装链码( R/ O/ g$ s; j1 a
# Y3 ?7 O& H; r6 K4 Z3 C) j! `
export CORE_PEER_TLS_ENABLED=trueexport CORE_PEER_LOCALMSPID="Org1MSP"export CORE_PEER_TLS_ROOTCERT_FILE=/home/hyperledgerFabric/qkl_01/crypto-config/peerOrganizations/org1.ymh.com/peers/peer0.org1.ymh.com/tls/ca.crtexport CORE_PEER_MSPCONFIGPATH=/home/hyperledgerFabric/qkl_01/crypto-config/peerOrganizations/org1.ymh.com/users/[email protected]/mspexport CORE_PEER_ADDRESS=peer0.org1.ymh.com:2051#安装链码包---构建mavanpeer lifecycle chaincode install fabcar.tar.gz7.1.1 查看链码
; U, C8 ^* E( l) |: m- K0 g
5 v. L0 p4 B/ L+ D5 ?#查询Org1MSP链码 Package ID" k* n7 Q: h; t/ K2 ^. I0 S
peer lifecycle chaincode queryinstalled: f) g: {) @3 D5 }1 A7 J
3 S2 K6 x$ J6 q0 I
4 A3 M, n0 p* r* q! ]( Q
1 |$ Y$ ~" A( G# e$ D$ c
4 u ]4 t1 S- v; Y: H9 z) f* h( X/ N
; Q% _% B6 h; z$ n. a/ J7 \( z8 S, O+ W- k3 U
7.1.2 批准链码/ ]! Q; w. c P; J+ g9 |! V
+ L0 ^( _- H6 r- c, k
#写入环境变量export CC_PACKAGE_ID=fabric-java:60d361c56b9bd73b69ecfc7caa434c56db41d99126d176835b74e79939fbbca4#Org1MSP批准链码peer lifecycle chaincode approveformyorg -o orderer0.ymh.com:2050 --ordererTLSHostnameOverride orderer0.ymh.com --channelID ymhchannel --name fabric-java --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile /home/hyperledgerFabric/qkl_01/crypto-config/ordererOrganizations/shineyue.com/orderers/orderer0.ymh.com/msp/tlscacerts/tlsca.ymh.com-cert.pem7.2 Org2MSP 安装链码
/ ]- d6 M% M/ s. k8 e8 _3 c+ U7 S" y8 B
export CORE_PEER_TLS_ENABLED=trueexport CORE_PEER_LOCALMSPID="Org2MSP"export CORE_PEER_TLS_ROOTCERT_FILE=/home/hyperledgerFabric/qkl_01/crypto-config/peerOrganizations/org2.ymh.com/peers/peer0.org2.ymh.com/tls/ca.crtexport CORE_PEER_MSPCONFIGPATH=/home/hyperledgerFabric/qkl_01/crypto-config/peerOrganizations/org2.ymh.com/users/[email protected]/mspexport CORE_PEER_ADDRESS=peer0.org2.ymh.com:3051#安装链码包---构建mavanpeer lifecycle chaincode install fabcar.tar.gz7.2.1 查看链码8 ~6 a [% [: l0 T S }" Y. D& Q
1 x8 R9 `4 t2 b9 f% v#查询Org2MSP链码 Package IDpeer lifecycle chaincode queryinstalled0 n; G6 [$ U. `1 }- l! s$ B( n7 y8 W4 E' _
) _& y& Z# A% f4 K) R2 i5 O/ w
! L1 B4 I/ ]3 u3 q. ]' B' C
( ?: R* r- l1 U, c) _, K5 x" G5 S2 D$ h, b& [! n a! u0 c; L
4 b6 L1 Q# l( V: l6 J5 _% y8 x9 D
7.2.2 批准链码
; Z! I& k" t# a8 }$ n0 o& i7 _$ }# h. m: u) a
#写入环境变量export CC_PACKAGE_ID=fabric-java:60d361c56b9bd73b69ecfc7caa434c56db41d99126d176835b74e79939fbbca4#Org2MSP批准链码peer lifecycle chaincode approveformyorg -o orderer0.ymh.com:2050 --ordererTLSHostnameOverride orderer0.ymh.com --channelID ymhchannel --name fabric-java --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile /home/hyperledgerFabric/qkl_01/crypto-config/ordererOrganizations/shineyue.com/orderers/orderer0.ymh.com/msp/tlscacerts/tlsca.ymh.com-cert.pem7.3检查链码& F. L9 { `3 b5 ]1 e* c
! R$ e4 O- N9 t* J) mpeer lifecycle chaincode checkcommitreadiness --channelID ymhchannel --name fabric-java --version 1.0 --sequence 1 --tls --cafile /home/hyperledgerFabric/qkl_01/crypto-config/ordererOrganizations/shineyue.com/orderers/orderer0.ymh.com/msp/tlscacerts/tlsca.ymh.com-cert.pem --output json7.4将链码提交到通道$ a- u7 a. a+ \' H* E
, u: ^8 V6 R8 ]' Z命令参数
% c' A+ }4 H1 X, `" s6 t
; e; q/ f2 g3 |" P: Y! K1 @ H--name : 链码名称
( U- C( z5 x: E: Z p/ s8 s; m/ C+ \1 E0 K0 D2 _. x) P
--version : 链码版本
( L0 r3 U' F* k# G8 ?1 H0 l& u9 w" [5 J2 l9 [2 |: D6 B
--sequence : 升级序列号,从1开始,每次升级迭代累加1.# d' }" u5 L& U# e
peer lifecycle chaincode commit -o orderer0.ymh.com:2050 --ordererTLSHostnameOverride orderer0.ymh.com --channelID ymhchannel --name fabric-java --version 1.0 --sequence 1 --tls --cafile /home/hyperledgerFabric/qkl_01/crypto-config/ordererOrganizations/shineyue.com/orderers/orderer0.ymh.com/msp/tlscacerts/tlsca.ymh.com-cert.pem --peerAddresses peer0.org1.ymh.com:2051 --tlsRootCertFiles /home/hyperledgerFabric/qkl_01/crypto-config/peerOrganizations/org1.ymh.com/peers/peer0.org1.ymh.com/tls/ca.crt --peerAddresses peer0.org2.ymh.com:3051 --tlsRootCertFiles /home/hyperledgerFabric/qkl_01/crypto-config/peerOrganizations/org2.ymh.com/peers/peer0.org2.ymh.com/tls/ca.crt7.5 确认链码定义已提交给通道3 B: r/ J- M+ f* ]4 A. N2 ?
; Q0 M! U C: B' Zpeer lifecycle chaincode querycommitted --channelID ymhchannel --name fabric-java --cafile /home/hyperledgerFabric/qkl_01/crypto-config/ordererOrganizations/shineyue.com/orderers/orderer0.ymh.com/msp/tlscacerts/tlsca.ymh.com-cert.pem& @4 t$ z; w" K: e: [
, p% j4 }& Z' g& ]5 p
' d! r6 r7 y( f2 E$ L3 i' v* U
$ {8 ~! s. ~+ S6 u9 b9 m! M
, ?$ ~. w U) N" F6 ]7 ~
7 ?' h `9 n+ j6 ]! w
1 n9 i2 Q7 e! V# ?' i, ~1 A7 Q
* o4 H$ K5 j7 C4 ^! n c& ^0 D, H
( @+ x% O& E9 y( H, q0 x4 u) s' t, _* i链码安装完毕
: D& ]* f- k( w% g) m
$ {8 N" Q, V5 M& ~ v, A
4 h- S1 O3 L0 [" c: |( {8.链码测试$ K; @" N& `$ l- {5 a1 p8 Y
* d6 t8 L6 `# P: X; X# k
参数
/ ]7 t, y: M& C# d. ?& v4 U5 L* |/ ^2 @$ d" ]+ o. f: e
-C : 通道id+ D6 ?2 c3 a2 b. S& n9 N# j
1 w- Z4 {* T8 P( n6 ^
-n :链码名称
$ f% A$ F, @, x9 N
% L$ Y$ y' n& o/ o# b-c : 合约参数(function - 合约方法名;Args- 参数,数组格式)) ~" n3 o/ k& T% o. J+ \9 n
8.1 测试上链, `2 A$ t- D0 _/ M
+ h7 T# V& M; R, Z
peer chaincode invoke -o orderer0.ymh.com:2050 --ordererTLSHostnameOverride orderer0.ymh.com --tls --cafile /home/hyperledgerFabric/qkl_01/crypto-config/ordererOrganizations/shineyue.com/orderers/orderer0.ymh.com/msp/tlscacerts/tlsca.ymh.com-cert.pem -C ymhchannel -n fabric-java --peerAddresses peer0.org1.ymh.com:2051 --tlsRootCertFiles /home/hyperledgerFabric/qkl_01/crypto-config/peerOrganizations/org1.ymh.com/peers/peer0.org1.ymh.com/tls/ca.crt --peerAddresses peer0.org2.ymh.com:3051 --tlsRootCertFiles /home/hyperledgerFabric/qkl_01/crypto-config/peerOrganizations/org2.ymh.com/peers/peer0.org2.ymh.com/tls/ca.crt -c '{"function":"ymhUpchain","Args":["唯一key" ,"参数2", "参数3" , "参数3" ]}'' O) H9 \0 ?' V3 i
执行上链后提示:200 则成功( _1 h/ B/ d$ {+ c! f
& {# p: b+ {; w. `
- _- ?/ q6 d& E; K& c: H: m1 \: L2 V& X; Q" b5 U1 O$ m2 v
6 x+ z8 U: F0 Y% k# @8 N4 K
! F2 V9 \8 g; j" o( e' b2 v
- e8 B* e% w9 ]' F- D( i
/ h: f9 J/ |# f" [
7 _' b" `0 K" V4 R, `8.2 查看上链数据
) g; S% a8 q3 O2 X7 t3 Z
J( o- m2 ^0 v: ~- l5 _peer chaincode query -C ymhchannel -n fabric-java -c '{"Args":["queryUniversal" , "唯一key"]}'
, z, ?4 x, M% G' c4 C查询成功后,后台打印输出上链数据,数据格式为json。截图示例: I) V' P. _8 {$ V$ _1 r8 V" \
& I- d: v4 @5 i5 B7 e+ }# G) P" k: k( N9 e1 V$ J9 q, | R6 ^
- L* h, {' b) v9 ^4 Q
3 S, ~5 S& u7 n( P8 Z2 {
$ a/ K& Y8 d R0 L- r. o
) l% m4 Y' K# D" H+ d% ?
7 s& P. z5 m7 q4 k' i
5 \+ @7 K+ o" c. e9 h9 e- I
9 通过CouchDb 数据库查看上链数据* B4 }* T y, m
6 W! G, n) V( D% P# A) T( z5 L) m, T4 f) k
. u( I K) P+ m# `. i
访问地址: http://ip:5984/_utils/+ H6 g, ^# }" H! K
/ Y5 Y1 e% }9 e1 t* o1 g
用户密码:admin adminpw
$ }/ I( r- {+ W+ W% l% q5 h0 o, f% t& }7 C) F
请查看《6.启动配置网络节点 docker-compose启动文件》章节的5和6 小节目录配置,如下截图:8 t0 q/ {$ v/ H
! ~" ? i( H" T
# {& L6 M; n2 \$ b2 {) o
" g8 U) T. t( c1 m
! M) Z1 g. `; H. v; C j( `/ F( [4 J0 n3 }$ f8 L. S# U: ?
+ S) ^0 W$ U) u' k3 l2 H P
9 T7 G. S. e3 W
?$ y( o3 C+ l. H! V
% i+ P% p5 F9 I* o5 R# d2 Z5 ~6 N) k1 X, V( b$ F6 `1 C
1 ~* V, w6 I" d6 ~$ B5 c( ^* d8 `. Q: u
& d, ]9 j$ J0 |& M2 l* G& O
, P$ `4 P0 ?: Z; N7 g! k! ^* K( r6 F& D: k+ t
2 ~0 w5 z9 J. H: n/ h5 |, s1 a
* l c4 r' P/ ~( j |