Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

超级账本Fabric 2.0链码操作实战

青丝暮雪780
296 0 0
Hyperledger Fabric 2.0最近已经发布,其中最引人关注的一点是 链码操作。官方文档虽然对此提供了详细的说明,但本文将通过与 Hyperledger Fabric前一个版本中链码操作的对比,来帮助你更好的 理解新版本中链码操作的不同之处以及幕后的一些技术细节。
2 c) B. f4 ]8 F  R1、链码操作:Fabric 1.4 vs Fabric 2.0我们将首先快速介绍在HF 1.4和HF 2.0中的整个链码操作过程。( e2 e8 a  Q8 y* \" R1 H: S7 t, q
链码操作指的是在Hyperledger fabric网络通道上部署链码的操作,这样区块链 之外的应用可以调用或查询链码方法。在链码开发完成并测试后,首先需要 将Fabric链码安装到指定的peer节点。在这个阶段链码还不能使用,直到 链码被提交(Fabric 2.0中的术语)到通道中或在通道上实例化(Fabric 1.4中的 术语),这样链码就可以被授权用户访问了。  r  r( H0 f' U& U9 X5 i: _
下面是两个版本的Hyperledger Fabric中链码操作流程的对比图:$ t+ U& {6 g  r$ r0 C2 z
在Hyperledger Fabric 1.4中,链码操作过程包含以下步骤:打包、安装、实例化。 如果链码属于多个参与方,那么就需要打包这一环节。如果不存在多方属主的问题, 那么直接安装链码就可以(其中隐含了打包环节)。在Fabric链码安装时需要指定 要安装链码的目标节点。
$ R: Q: k$ C) o2 v1 Z: L在这个阶段,安装好的Fabric链码还不能使用,因为它还没有在通道上实例化。 当Fabric链码包被安装在指定的节点上之后,我们就可以执行链码实例化操作, 从而让链码在通道上可用。技术上来说,链码实例化实际上就是调用LSCC系统链码 的方法来初始化通道上的一个链码。  d# e% g( m) v( ?; M3 a7 G
Fabric链码实例化之后就可以使用了,可以接受通道上的调用或查询请求。
8 ^  z+ H" [. b. Z下面我们看在Hyperledger Fabric 2.0中的链码操作步骤有何区别。# H- H' S3 Y) z* v
宽泛地来讲,在Fabric 2.0中链码操作基本遵循同样的流程,但是在命令和某些 后台处理中做了一些调整。整体的流程可以分为四个步骤:打包、安装、机构审批、 链码提交。大致可以认为前两个环节对应于Fabric 1.4中的链码安装,后面两个 环节对应于Fabric 1.4中的链码实例化,但是实例化(instantiation)这个词不再 用了。: E" q$ v# A+ t9 |/ x/ G! v9 ^$ z
链码打包这一步是创建一个打包文件(tar格式),其中包含Fabric链码以及一些元数据。 虽然不同的机构可以分别进行打包处理,更常见是由一个机构打包然后分发给其他 机构以便确保所有的机构使用相同的链码。8 V' I* Y6 _7 l5 \
安装步骤是将打包的Fabric链码文件安装在指定的peer节点上。和之前的版本一样, 只有需要接受链码调用的节点才需要安装链码。在这个节点,Fabric链码还不可用, 因为还没有提交到通道中。链码安装的结果是得到一个包标识符,其格式为.。( ^$ |" X% k9 a0 h
机构审批是在Hyperledger Fabric 2.0中增加的步骤。在之前的版本中我们可以让 一个机构实例化链码。在Fabric 2.0中,需要机构显式地审批链码。需要多少机构 审批则是由生命周期背书策略来决定,默认情况下设置为需要大多数机构(超过半数)。 如果Fabric网络中包含两个机构,那么就需要这两个机构同时批准。在审批过程中 需要排序节点的参与,因为每次审批都会生成一个新的区块,这意味着所有的peer 节点都了解审批的状态。& R0 E& q( B7 {4 F- r6 W" G: s  O
当审批环节完成后,我们就需要指定要在哪个通道上部署链码。这需要提交一些信息, 例如背书策略、是否需要执行Init代码等等。在这里也有些与Fabric 1.4不同的地方: 在Fabric 1.4中,当链码实例化时会自动调用链码的Init方法,然而在Fabric 2.0中, 需要在提交链码后显式地调用Init方法。  o" B' _& _5 u
在批准机构达到指定数量后,链码就可以提交了。我们现在就进入了最后一个步骤: 链码提交。8 E+ A6 j- h3 ?' @, c/ |! E) F
链码提交可以由任何机构发起。该流程首先需要批准机构的背书,然后交易提交到 排序服务并生成新的区块,最后所有的对等节点在账本中提交该区块。
& x% b' x+ L) q现在链码就可以使用了。- @4 K2 f4 t" F& S9 b- h  _1 c' l
2、First Network和SACC链码简介出于完整性考虑,下面给出关于First Network和SACC链码的一些信息,这些内容 都来自fabric-samples仓库。
3 h# V( w* j4 N7 y+ H! @! Y3 V# y  GFirst Network是一个双机构设置,每个机构中包含两个peer节点。通道mychannel 创建后加入所有的4个peer节点。在byfn.sh中完整的实现了First Network的部署, 并包含一些可选的参数。在下面的演示中,我们不使用默认的链码(在Fabric 1.4 中式chaincode_example02,在Fabric 2.0中式abstore),而是使用SACC链码。8 @+ g: r! ?* G" b
SACC式Simple Asset ChainCode的缩写,表示简单资产链码。它在账本中模拟一个 键/值存储。当初次部署后,需要一个初始的键/值对。SACC链码定义了两个方法: Set()和Get(),分别用来设置或读取某个键的值。. G* F7 f, {, P) U
好了,现在我们可以开始演示Fabric 1.4和Fabric 2.0中链码操作的不同了。
' q% m9 V8 b# d# C# J9 y# {* w3、Fabric 1.4.4链码操作演示我们首先以无链码方式(使用-n选项)启动First Network,然后我们再加载 SACC链码以便聚焦链码的生命周期。7 r' d* U+ k; o6 L) U- V
下面是演示步骤:
) j7 S( F' S, W4 I" O, m( |. m2 F$ f无链码方式启动First Network在指定的peer节点上安装SACC链码在mychannel通道上实例化SACC链码并查询结果调用set()设置新值并从另一个peer节点查询结果STEP 1:首先启动First Network:0 ?% j$ L% R2 i8 W$ X% h
1+ i) [% Q! R8 y1 Z- z& R$ h
22 f4 z0 p* _! g2 G3 W4 F3 Z: V
cd fabric-samples/first-network9 r$ L% G- n( L1 q- I
./byfn.sh up -n2 _( [6 r' J) R  @, ^- J1 m
上面的命令会启动First Network、创建通道mychannel并将所有的peer节点加入该通道。 注意在Fabric 1.4.4中,First Network使用solo排序服务实现,只有一个排序节点。 另外,我们看到有4个对等节点在运行,以及一个CLI用于链码操作。, k) O' u- ?- b
现在我们可以开始链码部署操作。
  _( ]5 [8 t8 T9 ^( n4 |5 _STEP 2:在指定peer节点上安装链码. K- i; P; W0 L+ i$ u2 ?
这里我们跳过打包环节,直接在目标节点peer.org1和peer0.org2上安装链码, 因为在这个演示中我们只需要这两个节点进行链码调用和查询。; Y" y7 Z; w% r6 Z6 G! j. M0 [; A
1
+ S7 S! v# z! A# l, N+ O5 f5 _2' R0 u- T2 N8 E* A+ U; _
3: ]+ ^2 Y$ Q5 T0 r' u. L# M' i' [& I
4
! R: J0 B* {& P5 R* A- K5
# |) y% {  c0 O# m66 Q. D2 V* J9 }6 r3 b' L$ c7 U
74 w1 l7 [, u/ h+ {; x
8" L; h$ w) z& i1 t( u$ A
9
: Y: ^4 m) P4 M% X2 w$ @106 }) E5 |3 u1 M6 f
# peer0.org1
8 q9 b, U1 A( `% T* x4 U; \docker exec cli peer chaincode install -n mycc -v 1 \. E1 ~: c. h2 z" @- N5 K
  -p github.com/chaincode/sacc* s. Q3 m+ J$ [" o8 g; P
  
: n7 ~( {3 M: I# peer0.org2  + L; A) E1 a& }' O  `
docker exec \
0 A" W3 c! C6 U1 A  K: u3 L/ ^9 B  -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \& r% c$ m' @: D* }. ]
  -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 -e CORE_PEER_LOCALMSPID="Org2MSP" \
1 O" R# a: {3 Q6 y8 n  -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
& f3 C* n+ a& Q% L" _  cli peer chaincode install -n mycc -v 1 -p github.com/chaincode/sacc
+ x4 {" C) ?' `% h6 }
4 e$ o2 |/ j3 E! s
STEP 3:在通道mychannel上实例化链码并查询
5 j, _% b/ A0 F( u6 r注意在sacc链码中有Init()代码。当我们实例化链码时,我们需要 提供Init()所需的参数:. O' T0 [' k  E( J3 [
1
$ Z8 t( a4 E' v$ f2& r( ]2 t5 u  n. I
3+ b2 e+ ]8 V5 b4 {% u" [; M
4
9 V" [% |: @; \7 m3 ]: n$ O; B5 y
docker exec cli peer chaincode instantiate -o orderer.example.com:7050 --tls \
. y/ t& |4 G) u6 z4 ?  A  --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
( a; ^8 p  x# z+ M; {9 _+ |8 e  -C mychannel -n mycc -v 1 -c '{"Args":["name","kc"]}' \" u: ^. U6 `0 v: g) m5 N
  -P "AND ('Org1MSP.peer','Org2MSP.peer')"
9 j) ^" ~# |! x& ^  o6 l
# \- ^2 J# g( W, O, J
如果现在看看peer节点的日志,我们可以看到出了新区块#3。
- ?8 {! E* S( s) y4 K8 s在链码实例化之后,我们可以查询:
+ S4 b: Y2 ?# X% _
1# C/ o7 P$ U0 p$ ?& i
docker exec cli peer chaincode query -C mychannel -n mycc -c '{"Args":["get","name"]}'- e; \/ A0 q4 S; U+ L

9 u' Q: V0 K' A( mSTEP 4:调用set()设置新值并从另一个节点查询# V) y9 _1 v3 X8 S* L1 r  d$ Q
出于演示目的,我们在peer0.org1上调用set(),然后在peer0.org2上 调用get(),以此说明链码是否工作正常。% L3 ^1 \" K7 U
14 L# m0 H) i8 `; Q( l7 r$ m
2% U& Z. e% c9 w6 b# w+ y  e, G
35 C$ G  }2 H2 x
4
3 l5 l/ ?  j, e& y1 T! F52 x& C! L5 Z6 \0 N$ J( i1 R
6
' }  n8 K7 ~2 Q1 d+ e7
8 b  P# g$ V: r: J" u% d# {84 W+ `" x" O0 ]1 W+ F6 d
9) B& E4 x- Y$ @5 x' Y% ?% Q6 d
10) w5 W% M/ z! n
11
4 G, D6 t* |3 Z2 M- Z# @12
( X) [. h8 J9 q/ @13  p6 o6 s& X  r
143 `: ^, K% R- _/ G- Y3 E
# peer0.org19 c6 ]8 N0 K2 @& a4 O+ ^& B
docker exec cli peer chaincode invoke -o orderer.example.com:7050 --tls \
9 G* p, w7 g7 u( u  --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
' O4 Q2 C' y: G# I" ?' l7 c2 N* c% {  --peerAddresses peer0.org1.example.com:7051 \
9 ?, n1 O- R; }  --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \3 m; ]' b- e! l+ o) _
  --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \# j* y  F* ~9 H/ W8 G0 `
  -C mychannel -n mycc -c '{"Args":["set","name","Peter"]}'
  d3 T9 W& t; z. w1 Q" f  f" ]# u  
% ?1 ^) f0 S/ E" N: I' f3 R& r  # peer0.org2+ O3 D# P$ |  u# m4 T% G+ I0 z
docker exec -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \, z, p1 I5 L& x3 c  X% S
  -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \
9 s4 |$ g$ W- H$ ]# a  -e CORE_PEER_LOCALMSPID="Org2MSP" \
1 ?- M& M& k( Y1 m& H+ d' e  -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
4 k' B# z  X! F  a7 w: w0 O  cli peer chaincode query -C mychannel -n mycc -c '{"Args":["get","name"]}'
" C9 q3 r1 u3 ~5 y- G! }. y

  p% t) N5 e" o) h- L! \4、Fabric 2.0链码操作演示类似的,在Fairc 2.0.0中,我们也先以无链码方式启动First Network, 然后再启动SACC链码以便聚焦链码的生命周期。5 l+ ~: x% [2 h5 {; X8 c, a
下面是演示步骤:
6 Z2 z6 p0 g7 Q6 \无链码方式启动First Network打包SACC链码在指定peer节点上安装SACC链码包机构审批链码在mychannel通道上提交链码调用SACC链码的Init方法调用SACC链码的set方法并从另一个peer节点查询结果STEP 1:以无链码方式启动First Network:4 k' v& b% r3 o
1
% ~  N* r4 m" t! P" \2
5 W4 D1 O* W( n* v! Y
cd fabric-samples/first-network
6 n6 A# V+ G. V! {* f# W$ r./byfn.sh up -n( {  B- T; Y: W- }. t
现在First Network已经启动,通道mychannel已经创建并且所有peer节点 已经加入mychannel通道。注意在Fabric 2.0.0中,First Network使用Raft 作为排序服务,所有5个排序节点都在运行。在这个演示中,我们只使用 orderer.example.com,不过使用其他排序节点也是一样的。$ R4 E) f8 ?9 h; v
STEP 2:打包SACC链码( d' T& K9 r: a! m! K  n, X! e
首先我们处理依赖问题:+ S- A9 _3 e/ J5 ^/ B* r
1
- f4 \! i# V9 s& R1 m29 k3 @1 R  j* h5 n' j
3- J% z1 u4 l! D9 S8 i
cd fabric-sample/chaincode/sacc0 j% S0 o" p( w
GO111MODULE=on go mod vendor* b2 \$ M/ u' ?! i
cd fabric-sample/first-network7 V$ c7 d! p$ U% s% S
然后打包链码:
/ _6 R& w3 r9 ?5 t+ I4 b
1
: w7 R7 ]8 @* t& K2
# p) I( t( f! d# l8 G1 e" B, }3
8 Q- H. {# K0 s& P
docker exec cli peer lifecycle chaincode package sacc.tar.gz \& b7 h$ S; {/ t% p; ~: G
  --path github.com/hyperledger/fabric-samples/chaincode/sacc/ \
( p& r' N& w3 b9 d6 M# E$ {  --label sacc_1
" p4 v, @/ x+ r- {8 x6 M& n
在CLI容器内可以看到生成了新的文件sacc.tar.gz:
' K0 ]' o4 V) ?" L1 B* ?2 fSTEP 3:在指定peer节点上安装SACC链码包
* F* X0 R5 J* K# Q( H现在我们在peer0.org1和peer0.org2上安装SACC练马报,因为在这个 演示中我们只需要使用这两个节点进行链码调用和查询。
6 G- r' B& y  n% h* K8 k
1
) B8 p1 Y9 v" }. v2
% N  T8 ?. {3 g8 A' a3$ k/ Z0 d* e, T- G$ W
4) f% X% ~' J. c1 I
5! b' Q9 P! y+ p9 k3 t
6
% O/ J* I' r1 P6 s" ~8 }" ^7
1 T9 [  x1 c/ G+ E) X8
$ |( R; F6 i! ^5 t5 d0 b8 [. a, ]7 w: A9: x3 }6 D, n# C0 e) l& [
10; C& E9 t) I8 n
# peer0.org1/ m4 I  [8 V8 V8 y, @1 P
docker exec cli peer lifecycle chaincode install sacc.tar.gz3 L+ f. A# _$ q3 f
# peer0.org28 |, V$ `  x; {" R9 T9 b; C. T% K
docker exec \
0 U3 u  u7 {. J7 H# ]" g* F" [  H' `  -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \1 |8 q% r! A8 o- C$ a5 D% y
  -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \6 F/ u0 F9 u4 j  R
  -e CORE_PEER_LOCALMSPID="Org2MSP" \
( ?) s3 r7 W& I8 z" g% L) X9 k  -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
: I- m( ^- r" I* R+ I0 r  cli peer lifecycle chaincode install sacc.tar.gz
2 G% v6 J& h) |
. G: u$ @' \4 t! W
我们会收到链码包的标识符,在下面的链码审批阶段会用到。我们 收到的链码标识符为:sacc_1:bf57…6399。
6 B! U8 \0 ~- a: X+ w我们可以使用peer lifecycle chaincode queryinstalled命令随时 检查节点上的链码安装情况,如果我们需要找出链码包的标识ID,这个命令 会很有用。
. U! |% f1 l% M4 s, {
1! U0 m3 T! W8 u
2
7 n/ [8 B6 @; N! W0 S. R' x5 {# H5 H3
3 U9 i, Z. |% S; F4
  J( c6 h8 t: d5
- L% |" v& H; L# N4 `* E6& y8 g9 x% ?( t1 @% V( F0 l" ]
7# @% Y; S( I2 J$ R! _/ u! C
8% V( M* L) S/ J/ t" R+ G
9. }. e) }' O/ V' l) c/ G- L
10
& w+ B9 b* ?: j, l# k' h
# peer0.org1: }" o4 }$ ?' ^! A2 K$ G7 ~8 G8 X8 s- Z
docker exec cli peer lifecycle chaincode queryinstalled3 c5 u" w! A2 s( o2 w0 D  V
# peer0.org26 M& m" d& g* s2 E; m
docker exec \# g; E$ L; Y0 B0 f2 v
  -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \: c, G$ S, N' i# S5 \
  -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \
( G: K# |/ `" i1 V  -e CORE_PEER_LOCALMSPID="Org2MSP" \4 [; \+ A7 I- W5 c9 {" U3 p
  -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
7 G# f% P+ Z( v+ Q  X  cli peer lifecycle chaincode queryinstalled
  ^7 s) {1 U& a* k$ f' D& h
STEP 4:审批链码5 k6 Z& j8 P# u2 |- J( I% f% L' S3 I  `
根据默认策略,需要超过半数的机构审批链码后才能向通道提交链码, 具体可参考configtx.yaml中的Application/Policies/LifecycleEndorsement部分。 目前的设置中包含两个机构,因此需要两个机构同时批准链码。( U# Y2 ]( ]" P5 E/ I/ L/ S( F. c, W
首先是Org1批准链码:
5 d% p* d6 K/ ?- X1 Q( i) q. ^
10 H* a8 D, |. o: ^, H7 g
2
; r: A# I6 M0 H3
; u  P# d1 w, |4
* I' g) e8 D8 J9 {; e7 d5
2 M6 y+ S1 q; `: @3 @9 h% C
docker exec cli peer lifecycle chaincode approveformyorg \. y: E  K3 T. ~/ g% S
  --tls \& g4 a  {2 t! m& ?& l( v; k
  --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
7 T/ Q7 ?3 X) ^8 J+ [  --channelID mychannel --name mycc --version 1 \
' X3 V( t0 W8 s$ t# N  --init-required --sequence 1 --waitForEvent --package-id ${PACKAGE_ID}* W% e6 u) m; g2 Q9 l

4 g/ \. x1 H" f; ]. \+ d7 W/ e# A* Q如果我们现在看下peer节点的日志,可以看到出了新块#3。2 w% F  g' P7 V1 P; l9 W5 {
类似的,我们让Org2批准链码:2 i. l0 q/ J/ d. v3 |+ z* k: ]
1" `/ ^3 w+ \: |: L0 K
24 a" _1 d7 x4 j; L
3
  m" d3 R5 ]7 {4
' @$ n% A2 i. Z) l8 z8 W5+ l$ q2 P3 ?9 X" \
6
! b0 a- E" r) M" {" C3 A7 c1 r7
! E7 _3 X. u( U/ S( S8% l/ K# f- k, J5 G7 R4 D
9
2 f) @4 V( X- [- R( \" X104 h/ m5 S% ~. h# C% ^
docker exec \
; R( w8 _# M/ v2 d: ?7 W  -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \3 Z6 d5 p9 w- h3 d% h
  -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \
) ]# E# b& u8 g. q6 B  -e CORE_PEER_LOCALMSPID="Org2MSP" \
" o, y/ l2 Q9 K9 u% R% ]5 o  -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
! K5 |& A- d+ Y# H' s  cli peer lifecycle chaincode approveformyorg \& i1 s6 P3 Z* T$ j  o
  --tls \- r/ V& b) F9 t, }
  --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \6 h/ c, G% c1 G
  --channelID mychannel --name mycc --version 1 --init-required \" v( ^8 X% \1 A3 U
  --sequence 1 --waitForEvent --package-id ${PACKAGE_ID}
- h: e& |( Y5 b/ S: v
( ]5 N9 u4 P. C  F7 u6 k
不出意外,可以看到出了新块block#4:; {8 M' W- O2 _1 g4 E$ D5 C
注意我们在approval命令中指定了init相关的参数,以便向SACC链码的 Init方法传入所需的参数。
, x2 a5 P+ V- z7 w可以随时使用如下命令查看链码的提交状态:. ~4 T, |4 H8 o* ]3 }4 X; `
1( ^! u& j8 Q: ~# C: }. E
2( Z# h1 K: t1 B, S
docker exec cli peer lifecycle chaincode checkcommitreadiness \
& y% f5 |* B* a2 ^  --channelID mychannel --name mycc --version 1 --sequence 1 --output json
4 Q- N1 R- M( {0 S5 N- w! s

: Z/ D8 Z. J, u) B) @两个机构都已经批准了链码,现在可以提交了。5 b) Z! E7 a! x: I8 [% K4 C
STEP 5:向通道mychannel提交链码
( J% b+ i9 R3 E链码提交可以在一个peer节点上完成:5 Z  e! m2 C( ~/ c) F. @
1
, A! e0 c' u, F: h: n: A2  q/ R% t7 S& b+ Z; |+ Z% Z
3
+ W/ r- C- g, v0 D. n; F4
- S( s" A" b- e; R6 z58 g) y+ L; D% C4 J4 g% y
6& B1 C1 M/ [5 j" S. U# W6 H% b- U( b
7
7 c$ A/ f" b6 \1 ]; n' ~8, A* Q8 x+ O- Z, H# y) v
docker exec cli peer lifecycle chaincode commit -o orderer.example.com:7050 \
/ T, a% _0 I! H: Y5 q1 m  --tls \. P( d( h& X* h9 _) M8 ]
  --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
) v! Z) ~) @4 a8 f) O7 }  --peerAddresses peer0.org1.example.com:7051 \
  m: Z% ^" d' e( r# S- K  --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \5 l" c" w( `9 n# V. o- @# k
  --peerAddresses peer0.org2.example.com:9051 \
+ w. {$ J& {4 M3 I3 h7 `5 W  --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \  e; x4 W' l0 z; _
  --channelID mychannel --name mycc --version 1 --sequence 1 --init-required
/ V, _) _4 w9 q! ?3 @8 {: |

0 v) b5 k5 @# w& ]$ _+ e可以看到出了新块#5:
( Q* M4 z2 u. z. s: j3 ~注意我们在commit命令中已经包含了init所需的参数。/ y( c6 b% N; \& k
同样,我们可以使用querycommited命令来查看链码的提交状态:( q, j  }8 V7 }3 l& t
1/ b0 ?9 a$ W3 l& D9 q1 x
docker exec cli peer lifecycle chaincode querycommitted --channelID mychannel --name mycc
2 G! U0 C5 _5 g3 _* n1 ]
5 l' k, o# y3 Z- y
在链码提交到通道之后,链码的生命周期就完成了,链码已经可以访问。 现在我们回到链码的调用和查询,这和之前的版本是一致的。
( ]  x( _* J' [9 t5 ^  l- FSTEP 6:调用链码的Init方法' ^' ^4 }, l0 r8 T$ u8 l: W6 [  r8 F7 ?
SACC链码的Init方法需要首先调用。
/ f  U/ \" n4 f$ ~5 f/ b
19 f1 B3 A% E, G7 g
2
2 U+ k! `& h) A' ]' u4 C3
+ U6 U  M. {* }) b4
  ^' m' `8 \, D5 n6 k+ Z4 D- `5
% x" b/ n/ n5 r+ t% v69 S9 m; j3 O  w/ D  w
7
- \; n5 V& X/ g, }: ?8
7 u) d' d+ {% k; Q" Y" r
docker exec cli peer chaincode invoke -o orderer.example.com:7050 \" o7 c/ C2 c6 X+ g
  --tls \; L, n0 V( i7 X; X: U; E# X
  --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \  n5 }- _6 @7 G. R( v0 V
  --peerAddresses peer0.org1.example.com:7051 \
7 B% {9 R- g6 c; n* z( {" k  --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
) d- y$ u; c; P8 n' ]  --peerAddresses peer0.org2.example.com:9051 \  i# V- B" L! p* v! t. V
  --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
5 E+ H8 B( d0 V2 l1 H1 I  -C mychannel -n mycc --isInit -c '{"Args":["name","kc"]}'
: |" \% d" x- X7 R1 N
3 O$ Q$ p/ |5 d* @2 K
现在可以查询 链码:2 O, Q$ C( R8 s- B4 m
1
. C* h2 L% {7 l7 m! H
docker exec cli peer chaincode query -C mychannel -n mycc -c '{"Args":["get","name"]}'
1 x' W2 a! L! |5 }! w

1 [# s( q3 F) s0 K9 u& v5 GSTEP 7:调用链码的set()方法并从另一个peer节点查询: a% g# e+ W- x- P
和之前一样,我们在peer0.org1上调用链码的set()方法,在peer0.org2上 进行查询:4 U) v3 |5 b' ?& Q1 F- e
1$ K: A2 e  p3 O
2
( P3 _5 P/ J" U) ]3
. Q2 v1 E2 @- z% I! g41 n5 J3 K0 c! y! w4 X0 d& B+ n* P
55 `( t! E8 a0 M
6, P# _5 P6 E. p# c6 B
74 v; q2 }! Q/ |! E$ b. D
8
8 T! T- r" A" E6 q: e8 }& M' t1 b+ m* K9
: g( [6 {- }" u" a6 [$ A/ m& J10
& z' s7 b2 w( O! @0 i( x( j11# g; A; E' P  x- ?+ e
12' H9 }7 y  P  K: y  H7 s
13
3 x( J7 d+ f0 }/ H14
! X5 g" J( c9 f15: j& j- W5 M$ H# L
16! R! z6 z. e( @: c" v! f
17
8 P& B, m7 {  v4 V18& q$ z2 Q/ s2 e
# peer0.org1
7 e* y( H8 [0 \; E7 @" M# {9 ^: ^docker exec cli peer chaincode invoke \# V* {) v6 C) L* j: U
  -o orderer.example.com:7050 \+ W9 u7 ~$ b6 `& [0 ]' q# K
  --tls \$ D2 @4 W7 s! C
  --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
5 J7 x; S  v* Z7 Y$ b+ I  --peerAddresses peer0.org1.example.com:7051 \: F1 b, M" c/ x) |" R
  --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \$ [, o7 P+ x4 l# L
  --peerAddresses peer0.org2.example.com:9051 \' E8 d- ]) d+ Y- C
  --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
& `- Q& Q7 ^5 F) G' E1 r$ A  -C mychannel -n mycc -c '{"Args":["set","name","Peter"]}'
6 \! h0 J) Z) o' G( I! y2 k  
; g- ]7 A. X) g. a  # peer0.org2& Z5 V, K' m% W0 r( L( \+ r
docker exec \
7 C' x8 e; L0 E4 L" I  -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \
/ H6 b# O$ E" |/ B0 p2 \  -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \
4 h# v/ B: L- z- g7 ?  -e CORE_PEER_LOCALMSPID="Org2MSP" \
) Q0 F! X$ X* t4 T9 U- O  -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \' r( Z. t: z4 @8 Q
  cli peer chaincode query -C mychannel -n mycc -c '{"Args":["get","name"]}'
) @9 g5 e% k  r$ x9 z. n

+ |. I+ _, E$ V! G* W一切正常。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

青丝暮雪780 初中生
  • 粉丝

    0

  • 关注

    2

  • 主题

    11