Những người dùng cuối tương tác với ledger thông qua việc invoke các chaincode thay vì tương tác trực tiếp. Lifecycle của chaincode ở trong Fabric:
- Các tổ chức muốn validate các transaction và truy vấn ledger cần phải cài đặt chaincode lên các peer của tổ chức đó.
- Sau khi chaincode được cài đặt lên các peer trong một channel thì chúng có thể được deploy lên channel đó.
- Sau khi chaincode được deploy, các channel member có thể dùng nó để tạo hoặc cập nhật các asset của channel ledger.
Chaincode được deploy lên một channel thông qua một quá trình gọi là “Fabric chaincode lifecycle”. Quá trình này cho phép các tổ chức cùng thống nhất về cách mà chaincode sẽ được vận hành trước khi nó có thể được dùng để tạo các transaction.
Start the Network
Chúng ta sẽ deploy chaincode lên testnet ở trong fabric-samples/test-network
. Khởi chạy và tạo channel:
./network.sh up createChannel
Câu lệnh trên sẽ tạo ra một orderer cùng với hai peer là Org1 và Org21.
Setup Logspout
Để theo dõi log của chaincode, chúng ta có thể dùng tool logspout
để tổng hợp log từ các Docker container. Chạy tool này như sau:
./monitordocker.sh fabric_test
Với fabric_test
là testnet được tạo ra từ câu lệnh ./network.sh up createChannel
.
Package the Chaincode
Chúng ta cần đóng gói chaincode trước khi cài đặt trên các peer.
Thiết lập biến môi trường để sử dụng chương trình peer
:
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
Sử dụng câu lệnh sau để đóng gói chaincode:
peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-java/build/install/basic --lang java --label basic_1.0.1
Giải thích các option:
basic.tar.gz
: tên file chaincode đã được đóng gói.--path ../asset-transfer-basic/chaincode-java/build/install/basic
: đường dẫn đến source code của chaincode.--lang java
: ngôn ngữ của chaincode.--label basic_1.0.1
: tên chaincode và phiên bản (khuyến khích sử dụng).
Install the Chaincode Package
Bước tiếp theo chính là cài đặt chaincode package lên các peer. Chaincode cần phải được cài đặt lên tất cả các peer mà có thực hiện xác thực transaction.
Bởi vì endorsement policy yêu cầu cả Org1 và Org2 cùng tham gia xác thực nên ta cần cài đặt chaincode lên hai peer của hai tổ chức này, cụ thể là hai peer sau:
- peer0.org1.example.com
- peer0.org2.example.com
Trước tiên, ta cần thiết lập biến môi trường để chạy chương trình peer
dưới danh nghĩa của Org1:
export $(./setOrgEnv.sh Org1 | xargs)
Sau đó, sử dụng câu lệnh sau để cài đặt chaincode:
peer lifecycle chaincode install basic.tar.gz
Output khi cài đặt thành công:
2024-01-22 23:58:03.209 +07 0001 INFO [cli.lifecycle.chaincode] submitInstallProposal -> Installed remotely: response:<status:200 payload:"\nLbasic_1.0.1:9fc1aea9e8fb20b27ddb041e705e0e31fd6ccc036868263db24c457ca1eb02cd\022\013basic_1.0.1" >
2024-01-22 23:58:03.209 +07 0002 INFO [cli.lifecycle.chaincode] submitInstallProposal -> Chaincode code package identifier: basic_1.0.1:9fc1aea9e8fb20b27ddb041e705e0e31fd6ccc036868263db24c457ca1eb02cd
Có thể thấy, peer
sinh ra một package identifier (ID) là:
basic_1.0.1:9fc1aea9e8fb20b27ddb041e705e0e31fd6ccc036868263db24c457ca1eb02cd
Giá trị này bao gồm chaincode label và hash của chaincode binaries. Tất cả các peer đều sẽ sinh ra một package ID và sẽ được dùng cho bước approve chaincode tiếp theo.
Chúng ta cũng có thể truy vấn package ID bằng câu lệnh sau:
peer lifecycle chaincode queryinstalled
Thực hiện các bước tương tự với peer của Org2.
Approve a Chaincode Definition
Sau khi cài đặt chaincode lên peer và trước khi deploy chaincode lên channel, chúng ta cần phải approve chaincode definition cho từng peer. Chaincode definition bao gồm các tham số quan trọng cho việc quản trị chaincode chẳng hạn như tên, phiên bản và endorsement policy. Ví dụ:
{
sequence: 1,
endorsement info: (version: '1.0.1', plugin: 'escc', init required: false),
validation info: (plugin: 'vscc', policy: '12202f4368616e6e656c2f4170706c69636174696f6e2f456e646f7273656d656e74'),
collections: ()
}
Tập các channel member cần approve chaincode được quản lý bởi chính sách /Channel/Application/LifecycleEndorsement
. Mặc định, chính sách này quy định rằng chaincode definition cần phải được approve bởi đa số các channel member. Mà đa số của 2 là 2 nên chaincode definition trong testnet hiện tại cần phải được approve bởi cả Org1 và Org2.
Chúng ta sẽ cần phải dùng package ID được sinh ra từ bước trước đó để approve chaincode definition. Thiết lập biến môi trường cho package ID:
export CC_PACKAGE_ID=basic_1.0.1:9fc1aea9e8fb20b27ddb041e705e0e31fd6ccc036868263db24c457ca1eb02cd
Approve chaincode definition bằng câu lệnh sau (giả sử ta đang chạy peer
dưới danh nghĩa của Org2):
peer lifecycle chaincode approveformyorg \
-o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--channelID mychannel \
--name basic \
--version 1.0.1 \
--package-id $CC_PACKAGE_ID \
--sequence 1 \
--tls \
--cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"
Một số option mới:
--name basic
: tên của chaincode--version 1.0
: phiên bản của chaincode--package-id $CC_PACKAGE_ID
: package ID--sequence 1
: cho biết số lần chaincode được định nghĩa hoặc cập nhật.
Chúng ta cũng có thể dùng option --signature-policy
hoặc --channel-config-policy
để chỉ định endorsement policy cần dùng thay vì sử dụng policy mặc định.
Khi approve thành công, output sẽ có dạng như sau:
2024-01-23 00:26:57.273 +07 0001 INFO [chaincodeCmd] ClientWait -> txid [02bf88eab744f352c1c35807278348ed10f65410e7f2326b728222de69a3038d] committed with status (VALID) at localhost:9051
Chaincode được approve ở cấp độ tổ chức. Do đó, khi một peer approve thì tất cả các peer còn lại của tổ chức cũng sẽ approve theo.
Làm tương tự cho Org1.
Committing the Chaincode Definition to the Channel
Đây chính là lúc deploy chaincode lên channel.
Trước tiên, chúng ta có thể kiểm tra xem các channel member có approve cho cùng một chaincode definition hay chưa:
peer lifecycle chaincode checkcommitreadiness \
--channelID mychannel \
--name basic \
--version 1.0.1 \
--sequence 1 \
--tls \
--cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \
--output json
Output trả về sẽ có dạng như sau:
{
"approvals": {
"Org1MSP": true,
"Org2MSP": true
}
}
Sau khi có đa số các tổ chức approve cho chaincode definition, nó có thể được commit bằng câu lệnh sau:
peer lifecycle chaincode commit \
-o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--channelID mychannel \
--name basic \
--version 1.0.1 \
--sequence 1 \
--tls \
--cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \
--peerAddresses localhost:7051 \
--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" \
--peerAddresses localhost:9051 \
--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"
Câu lệnh trên sẽ gửi chaincode definition đến cho orderer để thêm mới một block. Đây là lý do mà ta cần chỉ định các thông tin của orderer.
Đồng thời, chúng ta cũng cần phải chỉ định đủ số lượng các tổ chức để thỏa mãn endorsement policy. Nếu tổ chức có nhiều peer, ta có thể chỉ định một trong số các peer đó chứ không cần phải chỉ định tất cả.
Kết quả:
2024-01-23 00:45:52.047 +07 0001 INFO [chaincodeCmd] ClientWait -> txid [9dcc04303f58f73a3112de06aadfac9a7dc8360c906cff8e57110ef7995211e7] committed with status (VALID) at localhost:9051
2024-01-23 00:45:52.051 +07 0002 INFO [chaincodeCmd] ClientWait -> txid [9dcc04303f58f73a3112de06aadfac9a7dc8360c906cff8e57110ef7995211e7] committed with status (VALID) at localhost:7051
Có thể thấy, hai peer thuộc về hai tổ chức đều có một transaction đã được commit thành công.
Related
list
from [[Hyperledger Fabric - Deploying a Chaincode to a Channel]]
sort file.ctime asc
Resources
Footnotes
-
xem thêm Hyperledger Fabric - Using the Test Network. ↩