CSDN资料地址:(152条消息) 1.hyperledger-fabric 资料整理_youth_ymh的博客-CSDN博客; U, a8 Y$ y2 H5 O6 N. r' _2 ]
https://blog.csdn.net/baidu_ymh/article/details/131537319?spm=1001.2014.3001.5501
# f2 g6 }. O) H" T( Y知乎:https://zhuanlan.zhihu.com/p/641458419
$ s# {: E. [6 Z6 f" d9 V0 Y章节目录8 a* d$ F6 x$ [0 m6 f! P
1.hyperledger-fabric 介绍和资料整理 https://www.toutiao.com/article/7251935732179354150/
1 _3 U% a2 J |' P2.服务环境准备 https://www.toutiao.com/article/7251937147132035623/# F- ^. U- K. v: k P# [% [1 ?
3.安装fabric 二进制源码程序 https://www.toutiao.com/article/7251938220630753795/
4 G+ r# j) Y5 C# x" i" W7 |4.生成fabric身份信息文件(证书)https://www.toutiao.com/article/7251940174950105633/
& C P H' M3 r. S: s( L: D5.生成系统通道初始区块文件 https://www.toutiao.com/article/7251940560347349542/' K n2 D6 N3 p. T: T4 T
6.启动配置网络节点 docker-compose启动文件 https://www.toutiao.com/article/7252140512931889676/8 _ M8 a5 j& p4 m9 ~8 s: U2 |
7.将组织加入通道 https://www.toutiao.com/article/7252141528884265505/
, H! T. y% V8 d# B' z! p) E8.安装合约链码 https://www.toutiao.com/article/7252142449584521766/* K& S8 ^& `) A+ ]/ E- \
configtx.yaml 详解 https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=72521437172289869184 k9 U/ J( t/ ^% `9 _
crypto-config.yaml配置详解 https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=72521439706698552350 d0 S' S; Y& t# Q" u7 ~* X/ Q# `! G
# e- B- h- V/ ~" { M* E; U# B2 p2 a; {" \3 K; K- v# x5 x
1.创建合约代码
# g5 r0 i8 a- q! [( C& |4 h3 l7 V& T! p5 [( \0 ^+ @
语言:java' q$ e1 }1 {: T9 ~( m: Z# Z
; U$ S( v+ g7 P: w) P9 @. @
参考官网示例: https://mvnrepository.com/artifact/org.hyperledger.fabric-chaincode-java/fabric-chaincode-shim# w% B. j& G: o1 w/ W7 y- _- h
" |+ C) j& C$ s2 I* B) G Y
项目目录
# Y7 y' W2 P! g* s& m: z6 J! I4 F: e: e1 J
4 B1 u( h8 d! U( u+ L0 D; a
; o+ z0 }1 B* t7 m7 a" ^* u! z6 ?
3.maven 打包+ g3 g6 o; B' d4 J. X0 G1 P9 l5 I
: {- v: V" j4 [0 n' Y X @
$ s. ]* V3 |5 C+ S: @, d6 y; n# V
打包后target/下会生成chaincode.jar 包。( o9 R' E! O& ?' R% ~4 x: X- N* G
( r$ o8 ~/ x0 L0 C8 A! @' Z; n
; k8 R- Y& q7 Y5 m a7 b4.移动包到服务器- k {+ J8 E6 w0 b1 u' N2 q& ~. c
8 V% m) T; u. g% D将合约代码里target\chaincode.jar和 META-INF 两个文件上传到服务器目录 /home/hyperledgerFabric/qkl_01/chaincode/fabric-java 下,没有目录请创建。
. _, @" t+ t1 k$ @7 |# k; W2 _7 V$ q$ p
: X0 `/ M8 @. ] r% S0 o5.设置环境变量
& v6 |/ U. [3 R, P
+ E r: t3 U- @1 aexport PATH=/home/hyperledgerFabric/qkl_01/bin:$PATHexport FABRIC_CFG_PATH=/home/hyperledgerFabric/qkl_01/config/6.通过 lifecycle 命令打包成链码包
; \; p3 t& k" y% n6 l( Q, c. ?- D G6 p
lifecycle命令参数2 @$ F W3 f+ Z" A) i
7 Y3 a. U) K3 v/ Q+ r+ Spackage : 打包后的链码包文件
$ W& x$ i/ \% d) V! q7 w
! |' k+ e s$ G* N" N; R: I1 t--path : 需要打包的合约代码文件目录
# e7 |0 O8 I: p6 o. d- n' ~* W6 ?( ~9 L7 l6 t
--lang : 链码语言 java版本
# n& W [6 |) @& i" x' q, @0 {2 c# J4 V4 ~& f1 b+ B. m
--label : 链码包名称id
, {5 v/ ?: ]. s' \+ `. x9 Rpeer lifecycle chaincode package fabcar.tar.gz --path /home/hyperledgerFabric/qkl_01/chaincode/fabric-java --lang java --label fabric-java7.安装链码
! k+ j! e. Z3 [6 _/ C& p6 x
" Y3 N5 l- ~' g b进入链码包目录:
" f3 E* |$ Y# H$ j2 i, rcd /home/hyperledgerFabric/qkl_01/chaincode
) G6 v9 C5 k5 L9 M |5 P& R) O, V+ G7 N
7.1 Org1MSP 安装链码' r0 F1 }' F6 n2 ^) ]) ^' F
0 {" s7 w% N6 K$ N6 texport 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 查看链码! x1 d& R. p6 N. M, ? c& b
$ k1 E& ] G/ x1 ?" `
#查询Org1MSP链码 Package ID/ M% c' S. m, L) Y& x
peer lifecycle chaincode queryinstalled
5 A$ U1 L' X: x v& M. l3 G3 J/ S3 J2 ]* x4 ~& T
1 U; h% o' d' {1 P6 R; _* r7 h0 ]6 T- W/ m @" s' e- L
k: Q9 `) d! N r3 s) J$ L$ K4 Y% P
( q7 h6 h+ d7 F0 D5 M7 V
) m6 i2 y: u: Y0 X+ \3 F! W* j7.1.2 批准链码
9 f2 \: G. g. f
0 r& i& E% _5 B% x! {+ t g8 ]#写入环境变量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 安装链码7 M. Z1 _5 X) \' o" U, A4 c
; x: ]: v: w, x, y9 {8 D2 x% ^2 ~
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 查看链码; s1 ^& A1 s5 w
4 U: K( w$ |) ?5 a9 k$ O#查询Org2MSP链码 Package IDpeer lifecycle chaincode queryinstalled
3 E& Q `% H1 h9 U2 r7 ^; d2 ]# r
' {' [! d" w, b" f* h8 ]0 F0 q$ ]* x# G& v" U
; z$ `- ?1 F4 M% Q2 s( T5 z3 n' Y4 ?& T( W$ ^
# H/ g% F4 S, U- C# R+ q0 S7.2.2 批准链码
9 E5 U4 C1 B( T" E' r. T8 ^$ Q3 W+ s5 e% V; y% D
#写入环境变量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检查链码8 `! k7 D5 Z: |( e3 g5 X
/ q( @5 u% K/ @7 a, T
peer 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将链码提交到通道! O. O- V5 N! S% t# k' d
! u1 _; q& A+ p) n7 \, ?6 |4 l! z0 W命令参数/ k% N0 |* h% w' [ y
5 Z- |1 _ y2 i z--name : 链码名称5 @/ [* J4 O. K0 t' N
: H$ Q' N9 P7 S( O3 X--version : 链码版本+ X1 m' H' ^3 l" n7 I; l
) z) ?+ N" \5 k6 g6 X0 U) ?7 M5 k# @--sequence : 升级序列号,从1开始,每次升级迭代累加1.9 e& j$ H! L0 d2 ]- s, s$ s
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 确认链码定义已提交给通道1 y0 i. ~4 N7 E# q$ p/ R
. R3 q9 u& U: n
peer 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.pem4 U- ^: D0 }) g& o4 q2 ^4 o( A6 [) x
% D% B$ u8 }$ B0 W+ J& q6 E
, K4 I K6 ^2 Y9 R! J5 Z. ~
4 ^# P E" g5 ]" U
" u' y' o; n' ?& H+ v& t/ [
m* b3 v& m7 h0 _' i' B! M
; ~2 E. `5 H2 C* c& E
) z! q& e) O; e0 q4 |- ~' u2 k
4 c) r/ p* s% c0 [; p链码安装完毕
+ a* K: }1 L' c7 @ y
7 W: a. J* y- Z7 j Z* S8 {% _/ e3 }- N. g: A S
8.链码测试8 ?+ G: H+ u3 E! d
; e/ ?" n2 p: _' x: ?
参数. [ x% C; N! O
" V8 H9 W3 I9 M4 M+ w3 @+ y8 G& F-C : 通道id
( Q* x3 _; x$ V1 K# a. h( Z) t- s5 u! l8 T
-n :链码名称
- U6 [0 u; E' P& U$ j8 ~: Z3 j% Z3 b7 J- ~5 x L
-c : 合约参数(function - 合约方法名;Args- 参数,数组格式). i4 \' M6 S$ _1 l. H) ~
8.1 测试上链
, }& @+ q* f& F% x
. L, ?. ~. }" M) ~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" ]}'3 n7 R( a f% T; \8 e* J
执行上链后提示:200 则成功
3 C9 E" F0 N: F. \* S! p; d6 T* X% L2 W2 d
$ M3 k, ^( k8 v# y: k+ h( W& J* W7 e/ q! O0 p1 Q
& r3 O/ D# L0 ^; A% Y% W1 ~
7 F" ^% T8 n8 P. {2 W2 i3 a$ b# k& t
. D7 Y) l3 P$ W! E
! ~( b; j: }+ t2 X9 _3 Q
$ O4 F( }: g" b* A K8.2 查看上链数据* t/ u% ^2 I! f. w) E' t6 l
! E! J2 h$ A5 i1 I% C9 n- gpeer chaincode query -C ymhchannel -n fabric-java -c '{"Args":["queryUniversal" , "唯一key"]}'
( t( a; U& I( ?: x6 ~3 j5 [6 [查询成功后,后台打印输出上链数据,数据格式为json。截图示例:
6 q' i4 T/ V9 ]4 c; N$ q9 \- u0 P4 E( R* i2 x
7 J- @: p: K( j: y& D" V8 J3 H u; |
# l; M" c9 \+ D! l# \
4 \# u0 Y. c2 m/ f
: s0 ^* M/ i( f4 s: K5 B
4 l+ `8 q) y* h7 S* J* _) g9 ^) y$ J- l" X, k" C5 D
9 通过CouchDb 数据库查看上链数据9 l/ t$ [1 v2 {+ t* V3 L
. T6 g6 t# B6 u9 y& N3 x- c4 M, i: H8 l- L" k/ n
' N& w* O$ t- \访问地址: http://ip:5984/_utils/
6 _* a( v* A, |0 N* p3 \2 w* Q& G! S7 b/ s4 F1 B
用户密码:admin adminpw
t; F7 N8 Z, T- R: ], n$ f% B9 f8 B# P
请查看《6.启动配置网络节点 docker-compose启动文件》章节的5和6 小节目录配置,如下截图:" l* F5 F; r- u: Y; `, l
" P( f: ~0 B6 F4 x7 ?/ J5 ?& W2 T8 I3 Q- G3 f; `) R0 i9 E2 F
2 N9 W$ n1 U5 e1 r1 o# v/ r7 f2 d- L& @ z! X2 M" c" r
. r, x7 A- a2 R* @9 P0 X/ m
5 k2 R/ U% o+ N2 t/ F5 z- v+ V( [9 H9 M3 `8 b ]
- G" m* b$ O3 H% h$ b9 S# x
9 O; m L1 p( d1 p S( H
6 u+ ^( |/ V+ [2 j; r) A! B6 n
. }. I) y! Q6 l: B1 p6 f$ `+ M$ k1 b& x! F6 L! U. h; E
# [- a2 R' B% w' b+ [/ Z0 ^$ ?. n" ~( W4 v# T. Q7 P
) y% d2 v8 D! w3 j5 B
! c0 r! Q2 [# m4 K, o5 m' M
3 S4 N; C( r& \9 r1 d |