天天看點

使用NodeJS開發Hyperledger Fabric筆記3——部署合約

上一章步步分析了hyperledger fabric搭建網絡節點和建立channel。本章基于章節2部署官方示例的智能的合約,也會一步步做分析。

老規矩,先給出官方示例的下載下傳網址:https://github.com/hyperledger/fabric-samples

使用NodeJS開發Hyperledger Fabric筆記3——部署合約

上圖是我上一章搭建的fabric測試網,我建立了6個org節點,1個order節點。

在fabric中智能合約叫做chaincode。

第一步:打包chaincode

什麼是打包chaincode,就是打包你寫的contract,你可以使用go,java,nodejs開發contract,這些代碼需要按照特定格式建項,然後通過bin裡面的

peer

指令工具打包。

CC_NAME=mychannel
CC_SRC_PATH=你的智能合約代碼位址
CC_RUNTIME_LANGUAGE=javascript # or go, java, typescript
CC_VERSION=1.0
peer lifecycle chaincode package ${CC_NAME}.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label ${CC_NAME}_${CC_VERSION}
           

打包出一個tar.gz檔案,這個就是fabric節點可以用來安裝的chaincode安裝包。

注意本章所有名詞:chaincode=contract=智能合約,我不知道為啥IBM要把這個叫做chaincode,我更喜歡智能合約叫法,contract。

第二步:安裝chaincode

# 為orgX設定環境變量
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051

peer lifecycle chaincode install ${CC_NAME}.tar.gz
           

注意,hyperledger給的bin下

peer

指令用途很多,可以拿來裝chaincode,但是需要設定terminal級别的環境變量,這也是我要吐槽的,為啥不能直接通過config檔案或者option來執行呢,這種操作很想ssl常用的遠端連接配接操作。

如果你現在是為org2,3,4…安裝chaincode,那麼你需要修改成他們的環境變量,指向其他org的加密檔案位址,這些加密檔案也就是我們上一章用

cryptogen

建立的,用于org的鑒權,都在organizations目錄下,裡面是節點的數字證書。

第三步:同意chaincode

給每個節點安裝完chaincode之後還需要節點同意這些合約,也就是approve操作,這一點其實也是很累贅的,我覺得可以簡略成:安裝即同意,沒必要整這麼一個環節,既然節點安裝了這份合約(chaincode)就等于預設同意了。Farbic裡很多的操作指令我都覺很雞肋。。。

# 設定目前org環境變量
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051

ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
PACKAGE_ID= #上一個步驟安裝chaincode獲得的id碼
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "$ORDERER_CA" --channelID mychannel --name fabcar --version 1 --package-id ${PACKAGE_ID} --sequence 1 --init-require
           

注意所有用到

peer

指令工具的地方都需要配置目前節點的環境變量,跟上一步驟一樣。當然你有org2,3,4…的話需要重複上述shell并且更改環境變量指向對應org加密檔案位址,

第四步:Commit Chaincode

額。。。這一步我個人覺得也是雞肋步驟,節點都安裝了,同意了合約居然還要commit,而且commit的步驟很複雜,我也是醉了。但官方文檔是這麼寫的,我們就按部就班吧。

parsePeerConnectionParameters() {
  PEER_CONN_PARMS=()
  PEERS=""
  while [ "$#" -gt 0 ]; do
    setGlobals $1
    PEER="peer0.org$1"
    ## Set peer addresses
    if [ -z "$PEERS" ]
    then
	PEERS="$PEER"
    else
	PEERS="$PEERS $PEER"
    fi
    PEER_CONN_PARMS=("${PEER_CONN_PARMS[@]}" --peerAddresses $CORE_PEER_ADDRESS)
    ## Set path to TLS certificate
    ORG=$1
	CA="${PWD}/organizations/peerOrganizations/org${ORG}.example.com/peers/peer0.org${ORG}.example.com/tls/ca.crt"
    TLSINFO=(--tlsRootCertFiles $CA)
    PEER_CONN_PARMS=("${PEER_CONN_PARMS[@]}" "${TLSINFO[@]}")
    # shift by one to get to the next organization
    shift
  done
}

ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "$ORDERER_CA" --channelID mychannel --name ${CC_NAME} "${PEER_CONN_PARMS[@]}" --version 1 --sequence 1 --init-require
           

這裡用到一個自定義的shell函數,并不完成,這裡其實就是周遊出了所有peer節點的

tlsRoorCertFiles

,實際指令行很長,shell最終輸出的指令如下:

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name fabcar --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --version 1 --sequence 1 --init-required
           

源代碼中,我實際一共使用了6個org節點,這裡我簡化為2個,指令格式一樣的。

這裡簡單做個解釋:這個commit操作呢其實就是類似org向order彙報接受chaincode的結果,是以指令的結構是order節點+org1+org2…這個樣子,後面有多少個org通過了合約就接多少個org,附上org的

tlsRootCertFiles

第五步:執行合約初始化代碼invoke(非必要)

這一步是執行一下chaincode裡的init函數,不是必要的,但是使用者在讀寫合約的時候也是要執行一下的,是以這一步可以歸結到部署合約過程中。

還是使用

peer

工具執行invoke

這段指令跟前面的是一樣的格式,隻是執行了

function initLedger

,也就是初始化賬本。

結束

繼續閱讀