CSDN资料地址:(152条消息) 1.hyperledger-fabric 资料整理_youth_ymh的博客-CSDN博客
) S% m- o& @0 [+ Chttps://blog.csdn.net/baidu_ymh/article/details/131537319?spm=1001.2014.3001.5501
" [& h5 |9 J) V: I知乎:https://zhuanlan.zhihu.com/p/641458419
+ o+ z, B1 ~% X# ^章节目录/ i. c4 P/ X2 h% F
1.hyperledger-fabric 介绍和资料整理 https://www.toutiao.com/article/7251935732179354150/
; Z" W3 A) u3 v6 J% z. X2.服务环境准备 https://www.toutiao.com/article/7251937147132035623// W1 j7 K' z: `8 x; b( [/ z% Z
3.安装fabric 二进制源码程序 https://www.toutiao.com/article/7251938220630753795/
p( ~! j+ a7 l5 c% h4.生成fabric身份信息文件(证书)https://www.toutiao.com/article/7251940174950105633/7 H1 y; _% E8 `0 H# v$ i# M
5.生成系统通道初始区块文件 https://www.toutiao.com/article/7251940560347349542// d$ B! O) G6 ^% c* K, B
6.启动配置网络节点 docker-compose启动文件 https://www.toutiao.com/article/7252140512931889676/7 K# l: v' S" U* v6 H) S" t+ n) b
7.将组织加入通道 https://www.toutiao.com/article/7252141528884265505/
9 _# I% w4 C+ S0 O8 N9 ?# X, D) A8.安装合约链码 https://www.toutiao.com/article/7252142449584521766/8 z, _+ G; j% ]) [+ n+ H
configtx.yaml 详解 https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=72521437172289869183 y6 i5 |; n$ z. U
crypto-config.yaml配置详解 https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=7252143970669855235
+ W- P6 U2 c- F5 h3 B5 G
7 r. C7 s, _7 X5 u2 m' j4 v e7 E4 e# S+ W; ~4 k7 I
1.创建合约代码
; A' h+ Y+ O! K2 }) @3 q4 @% K6 ? o$ B6 X8 g
语言:java
3 s( p% W0 E+ f# E
+ e! n8 A) s1 D2 O$ [* b! W参考官网示例: https://mvnrepository.com/artifact/org.hyperledger.fabric-chaincode-java/fabric-chaincode-shim
5 ~8 W) m" n. u+ b4 S
2 G$ T# o& _9 i) ~( H, f) k" s- o1 f项目目录6 i7 j) l6 g2 E+ ^
! C4 T! f' X3 \% T. g
) u# P! M& I6 S" p8 @4 K) ^* R
# n* N0 [( x* j: m8 \3.maven 打包" }% l5 `* B. J- H- Y
4 H* u; _: l5 m
- ]2 P* m# `. z W; ~3 f% u
" K/ L2 S% B3 M d8 k
打包后target/下会生成chaincode.jar 包。2 g1 Z( ?# I7 T. D" R
' ?8 _3 ]* R2 F0 q6 O @
4 ~. k4 Q+ x& L9 D! P% c5 e) s4.移动包到服务器
, l# I1 L% S$ X# i" f W* F4 F
$ z: c( h6 O# @$ ^) ]将合约代码里target\chaincode.jar和 META-INF 两个文件上传到服务器目录 /home/hyperledgerFabric/qkl_01/chaincode/fabric-java 下,没有目录请创建。
7 [( _- d" `) b! g9 d5 m2 A+ Y+ M3 L: z- c8 @9 D
- [8 E/ |; M2 q8 U+ Q
5.设置环境变量
/ M# Q' V. a6 P" F1 Q) h1 v1 Q) x5 C; y3 M) ^
export PATH=/home/hyperledgerFabric/qkl_01/bin:$PATHexport FABRIC_CFG_PATH=/home/hyperledgerFabric/qkl_01/config/6.通过 lifecycle 命令打包成链码包( V% n" \1 U' \6 I: x/ z$ L
' E$ b" n! k9 `+ W( D
lifecycle命令参数
" x4 x% `) n8 }6 a3 \
: d, j: d9 Y! b6 v5 Q. l0 }; u, Rpackage : 打包后的链码包文件
$ m0 E, @3 t5 }. g- F+ [& b: o' Z9 l* }3 \% ?
--path : 需要打包的合约代码文件目录
. g: J! x$ P" r5 s$ d6 O4 G0 S9 X; L$ G5 L+ L8 J( Y. k! K
--lang : 链码语言 java版本! W m' ^0 v' Q5 [' y9 u3 C1 p+ E
) l* Q# e+ E8 W1 H1 E3 E# D& c8 |--label : 链码包名称id
9 E+ w! W, Q; G- C+ N# d% _; |! hpeer lifecycle chaincode package fabcar.tar.gz --path /home/hyperledgerFabric/qkl_01/chaincode/fabric-java --lang java --label fabric-java7.安装链码; _" X( F% o5 W8 [ d. _' h! H
; r5 [; T u3 Z$ d0 N2 N7 ~ Z进入链码包目录:* `: ^0 }6 C. M0 V
cd /home/hyperledgerFabric/qkl_01/chaincode" p \" i* h/ d( I8 L& C4 Y! }
- r7 k# R( t: G0 c9 x0 z/ T
7.1 Org1MSP 安装链码
! r, W& g+ y" w) V0 V2 X
9 n2 H5 ^$ R& K- j( W) L& m. iexport 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 查看链码: T! p8 }/ S0 }2 D0 I
. Z: N' C5 I$ J8 w* Y
#查询Org1MSP链码 Package ID
+ S( a3 d5 w3 X Bpeer lifecycle chaincode queryinstalled
% F4 d4 } a. ?8 f7 a" I6 y
! a# [: P9 \/ c0 O
6 C0 S- X! g8 V h$ Q) c f C' v3 w3 W+ b. H
7 V9 b; {) h2 p6 a1 K
% H- z% `. N6 |. t, Z% i
- J3 E; f$ Q; Z. B6 L
7.1.2 批准链码; c. M0 e2 n. i
% a' }5 t( Q8 B% ^" D#写入环境变量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 安装链码
0 i `. J9 [. e; p h, J4 n+ N3 r% r4 j* G1 @% V
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 查看链码
1 K# r$ v, \) {) V- o+ I6 X
* s* a( A0 c6 W) k#查询Org2MSP链码 Package IDpeer lifecycle chaincode queryinstalled
# B; z5 J9 g) @9 R, j3 M1 K% V& Y4 K6 g8 F$ Z& t% K3 Z' q5 e
) f$ ~- ^1 K8 g8 k$ v$ q) d/ R5 W9 Y2 J7 ]
/ e3 ?# O$ {! q9 N
+ t! o% ]& U# e7.2.2 批准链码# y Y9 W: L" U! }. m3 Z
7 Q7 ~) `+ e' e#写入环境变量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检查链码0 q) z. R% T. z/ L4 ^
' t' [# p$ g s$ \% O4 b& l
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将链码提交到通道5 q& W. ]. x. N. G/ w }9 V! M
1 U5 n( C) h7 |% d- t6 E命令参数
" v0 z: Y! ]) y6 ^6 E- S2 H3 D7 i: W; b- I
--name : 链码名称
. E" k; `$ U# `5 H; C1 r! _( j5 K( r' T0 m
% ]0 S1 M8 ?7 C7 B6 T+ t+ c$ l--version : 链码版本
; ?1 ]) v8 o" @- G6 d" p. S- c
2 A4 O% s: n# z- S3 c, c--sequence : 升级序列号,从1开始,每次升级迭代累加1.
! _$ f- a4 |% `& u! v0 u& bpeer 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 确认链码定义已提交给通道
9 X9 p8 x# h- ?; {
- \# o8 [' \# k8 o! P& r) M' Hpeer 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
2 u1 @- d* j) \- P7 \( d
- y1 z9 b" F) a$ ^3 F) o2 J5 Z6 e4 h% t7 p* r- v; w2 V
9 q# k% U! L: a7 I( b T& q
5 `" c' K' _# F% L7 l$ Z! }
: l! r) T! o2 h: `- M$ J5 o/ S8 M. w; N" F% b0 l
3 _) ~, B# w5 J8 L2 H# M9 r: S
8 L2 o# r+ T4 `1 A; a! |链码安装完毕
: u7 l2 Z# r m" R; Z$ |3 L$ o$ R
2 H; f/ c* [$ V- d/ M1 s
8.链码测试" I: e- |( Z+ ^1 x. a5 g5 R
v$ t9 I0 i1 d0 h( e6 W3 Y8 O
参数
! C K, H* i3 v1 d* S+ z; T4 u
; z% n4 C& g+ }( C! p% B8 N, O-C : 通道id
4 z9 X3 f8 F# C2 S# B2 r% L+ _2 J1 ]7 i9 s
-n :链码名称
4 `" |+ m' y) J+ X
$ I& b; e" M) Q0 z" z8 n-c : 合约参数(function - 合约方法名;Args- 参数,数组格式) g+ A9 ?2 d" M
8.1 测试上链& n0 N5 G, C) H, \
( o- s+ C6 M+ d% `+ Q, ]: `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" ]}'
, Q8 o8 a9 A! D' Q- h0 X" s' O& }执行上链后提示:200 则成功
, \* M6 M7 a- `% _* c8 k# D
0 l0 M5 C9 e4 G; w/ e
4 A" u3 V: `! r6 W6 q+ \
1 B$ Y; |) i, c- L2 v
& u) Y# }3 m: o M7 d0 e" m3 ?) O: v2 c. z X( {- p) E) W
, i0 @6 [0 P: C- d% v! R, g
# l& n; r4 _4 X* }3 G Y1 y/ Q, g% q8 T5 @
8.2 查看上链数据# \7 d/ w8 _8 o
; Q. k2 {# e8 s7 `0 @2 X
peer chaincode query -C ymhchannel -n fabric-java -c '{"Args":["queryUniversal" , "唯一key"]}'. t* {2 c& s- ~0 p4 s$ ^
查询成功后,后台打印输出上链数据,数据格式为json。截图示例:- c5 w9 U% j& s
% Q8 a+ G% [, t/ F
" j2 `7 U7 Z N/ O# P/ J( J$ ~# V: u3 U0 k
( y3 Y8 ` [9 a2 m* d) w7 x: V3 I5 u8 R
% J. z7 c: T, T5 r# O) G: z* E/ t9 t
/ a* h7 ~0 |9 U
/ p2 o! W8 p: I, t0 U( g" `
9 通过CouchDb 数据库查看上链数据+ o7 n# f2 T6 b7 P# A
1 x! I. |5 O& P4 F/ b6 f0 i
/ \1 x$ J! C: W3 R- Y
* \% n6 T! O5 S4 V8 j访问地址: http://ip:5984/_utils/
6 Y U( R3 i* ?2 m! {
, l6 H, J9 Q- \ F; R用户密码:admin adminpw7 h& ^/ ?' a& r2 o. O5 [0 K
$ t) E0 i3 I9 S6 e请查看《6.启动配置网络节点 docker-compose启动文件》章节的5和6 小节目录配置,如下截图:
* s6 ~( Y N0 P4 ?6 H+ t+ A% j1 v: ^
" `8 t. y( e' A1 [, T3 C3 P* @( p' |) ~6 c0 [" ^$ x2 o
7 F- g; f* O; S9 c
2 V8 h8 ~0 N: ]" r- B+ I i7 \% e4 B* s7 ~$ `' l
' N) @! Q4 S- M: F/ R; c$ j5 z
' T E" M: S* {! s
# R. R! m$ V/ f6 n) q: d4 M2 m* ?* Y! v1 d' ~" }3 L
0 O1 p( x* Q- p" ?
* `! a: ]4 T& i4 v0 x- Q! Z3 w# I- o9 T4 K5 E0 _* ~7 @" P Z" i# V# i
- n; {& P; R0 |- k# }/ ^! d+ w7 o! @& T l
3 B% b1 l( C$ a+ T
; Q3 A5 \1 C2 y- t. l$ q8 {4 F! v8 _
|