CSDN资料地址:(152条消息) 1.hyperledger-fabric 资料整理_youth_ymh的博客-CSDN博客 X- \4 j8 R1 g2 ?
https://blog.csdn.net/baidu_ymh/article/details/131537319?spm=1001.2014.3001.5501
2 O, P0 h z: l L( q- x知乎:https://zhuanlan.zhihu.com/p/6414584191 ~* f' _( U2 Y x
章节目录
/ L; ]7 S3 Y; s9 W+ q# L4 L) {1.hyperledger-fabric 介绍和资料整理 https://www.toutiao.com/article/7251935732179354150/
* G7 a: f r( A9 u5 X2.服务环境准备 https://www.toutiao.com/article/7251937147132035623/
5 P3 ~3 u3 B) s& {- v3.安装fabric 二进制源码程序 https://www.toutiao.com/article/7251938220630753795/4 h- q0 Y1 K) {2 A4 D. P/ D
4.生成fabric身份信息文件(证书)https://www.toutiao.com/article/7251940174950105633/& j$ n' ^; H/ t, B, i
5.生成系统通道初始区块文件 https://www.toutiao.com/article/7251940560347349542/. I; b5 ]0 y# b S% j- Z' e7 ^
6.启动配置网络节点 docker-compose启动文件 https://www.toutiao.com/article/7252140512931889676/' k9 w6 ^3 Y' K* i
7.将组织加入通道 https://www.toutiao.com/article/7252141528884265505/
* i' g2 h. Z: u4 l8.安装合约链码 https://www.toutiao.com/article/7252142449584521766/7 @5 o& n/ Q, }% _, C
configtx.yaml 详解 https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=72521437172289869180 B/ d: ~' y2 y* g% G. N
crypto-config.yaml配置详解 https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=7252143970669855235. X( W% x6 P% ] e3 x5 R" P: ~
. |8 P# m+ v4 u! H0 S0 ]) n' G; A$ A, A3 z
1.创建合约代码. }# d! C4 G7 } E( c
; y- n2 N+ G0 @- \* M语言:java5 K& T, M# [3 o3 V1 K# f% T& ^
/ M5 t. o1 D U; v J E参考官网示例: https://mvnrepository.com/artifact/org.hyperledger.fabric-chaincode-java/fabric-chaincode-shim1 e, d& E7 C0 e+ [; l7 z! |/ r5 r
5 `* r1 m3 ?3 V( z9 `7 U项目目录
3 Y3 w7 N4 G. |7 u! H( V7 M, p2 J& z8 ?" }
+ v1 S! i0 W. y, i% U0 {
1 J! K i' o9 _7 U8 F/ g
3.maven 打包
3 N% i* t: u9 w; g0 C
) E! m8 n& l& [! w" N, F2 |3 `
1 A2 i4 U8 q% J. i, X; N' l# O/ C% f8 n1 r J) X
打包后target/下会生成chaincode.jar 包。
, [9 D6 }! \, `
$ H! _4 c; ~" _& E. ?4 e; w0 [- q
+ F" y1 H: [2 \6 w0 S% e) a% }4.移动包到服务器
3 O2 m* P ?; z6 j c( v, |# p/ G$ ]' j! z
将合约代码里target\chaincode.jar和 META-INF 两个文件上传到服务器目录 /home/hyperledgerFabric/qkl_01/chaincode/fabric-java 下,没有目录请创建。 f" q# `0 C3 C
6 S6 k v6 `: u$ ]2 t6 @
) l% a2 U, O' r% Y5 f" \
5.设置环境变量
( ~" \4 L! A" @* Z
7 Q Y- [4 J1 a$ o# Fexport PATH=/home/hyperledgerFabric/qkl_01/bin:$PATHexport FABRIC_CFG_PATH=/home/hyperledgerFabric/qkl_01/config/6.通过 lifecycle 命令打包成链码包
5 d. Z3 E( q- X5 ^, ]: q) s T5 Z" Y; p: B
lifecycle命令参数$ i+ E/ n# T p# O9 {5 x
4 F, R; x/ B& y" m5 z
package : 打包后的链码包文件) k5 L0 C) H9 B8 h! c" z- K
- _) O6 q5 d1 y( `# `% N: s--path : 需要打包的合约代码文件目录( F4 s7 [- V* D
8 l {& R# x3 R
--lang : 链码语言 java版本
5 s7 o [# @) p1 w
0 X! m4 g$ u4 s/ L5 f( d0 e0 r5 h--label : 链码包名称id
2 [% O* ?' s. z3 w8 ~6 j tpeer lifecycle chaincode package fabcar.tar.gz --path /home/hyperledgerFabric/qkl_01/chaincode/fabric-java --lang java --label fabric-java7.安装链码. \9 g* p9 V- G0 O' K# b( y0 v1 q+ ^
/ c% `$ A! u: T+ _1 _1 S4 }* i进入链码包目录:+ R$ e" q2 l- t4 N: f5 L
cd /home/hyperledgerFabric/qkl_01/chaincode$ t; A* K$ w+ E7 v7 V% ?- z' l j
) K7 |( x1 A3 x( P# _6 ], G- p
7.1 Org1MSP 安装链码" q4 p4 @1 C" a
" V0 ]4 `0 n$ g% {1 C
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 查看链码
+ x: l! w0 D5 }- @* X; X! \0 l e" i$ Q/ @. n4 B4 _# {
#查询Org1MSP链码 Package ID- u/ B+ v, }) u0 _
peer lifecycle chaincode queryinstalled
* S4 J$ G) L% ]1 U+ ]7 f$ r3 v9 h5 p1 a! Y) |# l! V6 B8 G) w
+ ^! f* S; E* D% F% d
+ n4 [( V2 h, [( B
9 k" Z* Z& Y( u p$ \6 U+ ~1 x" f: n( _ |& @2 z! ]
7 u# X9 ]# _9 g& N8 ]0 E0 B7.1.2 批准链码
: q9 v5 {5 i' J! X4 D( z: D' y# W8 f
#写入环境变量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 安装链码. e1 ~) U1 q7 k/ X) q' a
4 Y6 ~8 H! k9 aexport 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 查看链码
& n; m: c$ a- k
8 x2 x4 ]- A4 ~& u#查询Org2MSP链码 Package IDpeer lifecycle chaincode queryinstalled4 L% r; h7 `7 t
; J8 ?! k& u& h" x8 ~. g! j4 o$ s, g: Z/ O) t1 A( N* T4 B
. x& P$ C( r% d) E/ R2 i- x
, B; ^8 ]' ^) V L) Q5 H* ?6 N. r( L5 V6 G4 ~! B2 t) W
7.2.2 批准链码 w' t0 C5 J+ @% a4 d3 b+ J7 U+ s
/ i* J2 S6 Y2 U# B; E! C' v
#写入环境变量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检查链码
4 r* k$ D! @% ?) n9 O5 t' C" c$ G: ]1 o; 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将链码提交到通道
" j6 m8 u/ B: p. o, r6 z# F
8 ]3 O u% X" V9 H命令参数6 o1 Z# T1 b0 x9 C2 t
( @+ B+ }* S* `8 ? ?
--name : 链码名称
* f* ]+ u" b" b# u: R/ @( D0 v3 K( |' r0 V9 G8 D o8 |- D! ^
--version : 链码版本
* c0 s$ q3 K% ^2 Z2 u0 k4 u* D7 ]/ d6 z8 {% _% i! H* X
--sequence : 升级序列号,从1开始,每次升级迭代累加1.9 r' ^9 k* c; ~ G# B
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 确认链码定义已提交给通道% f$ Y' D! K2 S& I3 _; w
7 H$ B$ s J' _1 j7 a0 B& Y$ G# Vpeer 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' l- o( P+ t1 V# w- y* a2 C5 u+ Y
( N2 I% n% d& J. Q# n! f, o$ Y
" E: O& U4 j) y- T6 @% N
$ b0 s/ M! w2 l. X" M7 {+ {4 C0 N9 C+ T7 f: u
2 }6 S' |( c0 {# c, }) K4 b( n8 b6 t, [) X4 ?0 P( e
4 Z3 ^3 g) U0 {7 ]
) J9 y0 Z* A, {5 I, e链码安装完毕* H* Q! j7 H U3 `" m: g& w" x, q
0 o! m5 i% f9 r' f) r( V5 s5 P/ y5 Y2 r9 u
8.链码测试
# a3 O: h! S: r; j9 D/ O# B. ?- K% A' Y- {4 J
参数( H# B1 a q0 r# `% m2 {
, l, [$ v" s/ X, T2 M
-C : 通道id5 `* o! P# e5 ?5 {, o
& M) w9 M8 _) l. o
-n :链码名称
+ J! R4 B# p! K" |' W" M* j9 {, V, L1 R& D7 B. S* Z( Q
-c : 合约参数(function - 合约方法名;Args- 参数,数组格式)
# F; ]. _* D: T5 p# F8.1 测试上链 o) }& z" i1 l
9 a/ W$ {; R' ?7 fpeer 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" ]}'
2 S- a0 n6 \) H- M1 ]/ i& a执行上链后提示:200 则成功1 V( y+ I! i) G T7 u/ l0 O$ }# p
& c3 X& {& B3 T' D1 X
) s/ @9 E/ S% N" H' Z& z$ B8 p" W8 o: o8 H' H! n! l# P
3 r/ m- w0 k- b! M9 `% x4 H& Y
/ L" _2 H# n- s8 D0 L8 k, b/ y) P& p' ~# b
* a4 G$ C# C, q$ l6 f6 K
9 y2 a! q0 R5 `' W: C8.2 查看上链数据$ X2 \) k7 ?# c0 F
s) \/ a- h% z8 N- L% s+ F
peer chaincode query -C ymhchannel -n fabric-java -c '{"Args":["queryUniversal" , "唯一key"]}'" L2 g# H/ m5 F" a$ M9 L1 S4 t# b
查询成功后,后台打印输出上链数据,数据格式为json。截图示例:2 f+ }" H7 a2 p4 W$ A$ g
% W# M2 h& }4 H/ d# X( T L
0 L. i! H! W( w" s' I
$ ?" w2 |& z. {1 N, C
: L& Q" B- }, z- t* |" m: L a5 o% M9 \
" d8 E8 D/ ], V9 O$ g6 N2 U
% L1 H' S3 I. C: d' G
" }8 k% C0 J) C) V7 s3 _9 通过CouchDb 数据库查看上链数据
7 S4 B q7 a' a- o
5 A1 J4 d" i1 D( y
0 ^/ q" v R; V/ r/ C8 L6 ]2 [
6 O3 P3 U) @ Y" V访问地址: http://ip:5984/_utils/
$ W& x' \) o7 h9 O9 [' J& w$ g2 |- m2 p, }0 D/ M
用户密码:admin adminpw
9 M1 w9 h4 P7 Q. g [3 Q
6 h7 v4 U* ^' L& P: n请查看《6.启动配置网络节点 docker-compose启动文件》章节的5和6 小节目录配置,如下截图:
% I" W/ g# h( o8 y
( O, P- E5 H8 ? q
; R9 R1 j" r* d* |9 Y. |4 ^4 |% O
5 B6 `5 w% D: M% Q6 t: ?: Y( b4 J; H$ R( w& o' ^
; ~1 @' T3 ^( y2 l# i# \5 G9 ], F
) j* G. E/ p: s3 [" s' r! P
# K( m+ K. w4 t, r# o$ x, T; K( y4 X. {4 @6 S/ D
) ]: H& o/ [" Y5 C1 G" e
( {* h& n" w6 B5 R' ]3 c: i i. u: l
- X5 M6 R& T2 p k& m
# Q# a/ r, b" W0 k' n+ ]8 x5 h6 G- t; Z2 T, O
' ?& O" N @# V- ?6 W
U* _5 v/ M# a( U" R
9 w2 W$ u9 ^1 {; Y# |
3 W) W0 r: M* y |