dev開發者模式調試智能合約

一、使用nodejs編寫智能合約

第一步:在chaincode目錄下新建一個fishcc文件夾,名字自己起;
第二步:進入fishcc文件夾,執行npm init命令;
第三步:安裝fabric-shim;

npm install --save fabric-shim

第四步:新建app.js文件,文件名稱自己指定。
第五步:編寫合約。

const shim = require('fabric-shim');
const util = require('util');

let Chaincode = class {
	
  async Init(stub) {
    console.info('實例化chaincode...');
    return shim.success('');
  }
  
  async Invoke(stub) {
    let ret = stub.getFunctionAndParameters();
    let method = this[ret.fcn];
    if (!method) {
      console.error('找不到要調用的函數,函數名:' + ret.fcn);
      throw new Error('找不到要調用的函數,函數名:' + ret.fcn);
    }
    try {
      let payload = await method(stub, ret.params);
      return shim.success(payload);
    } catch (err) {
      console.log(err);
      return shim.error(err);
    }
  }
  
  async xxx(stub, args) {
    console.info('調用智能合約方法,xxx方法名根據實際自己指定');
  }
  
}
  
shim.start(new Chaincode());

上面的代碼可以作爲nodejs合約模板使用。

第六步:修改package.json文件,在scripts中添加start命令;

"scripts": {
  "start": "node app.js"
},

到此爲止智能合約編寫完成。

二、dev開發者模式調試智能合約

Hyperledge Fabric的智能合約由各個節點負責啓動和維護。但是使用開發者模式後,智能合約的編譯和啓動工作就交給了用戶負責。在智能合約的開發階段,使用開發者模式去編寫、編譯、運行智能合約是非常有用的。

啓動開發者模式非常簡單,我們關閉所有節點的tls功能。

- CORE_PEER_TLS_ENABLED=false

修改peer節點的command命令,在peer node start命令後面加上-peer-chaincodedev=true參數。

command: peer node start --peer-chaincodedev=true	

爲所有peer節點配置7052端口。7052端口用戶節點之間的grpc通訊。
在這裏插入圖片描述
最後,我們按照如下步驟進行測試。

第一步:啓動所有節點;

docker-compose up -d

第二步:啓動完成後進行其中peer節點容器的scripts目錄,執行start.sh腳本。

#!/bin/bash
rm -f ../channel-artifacts/mychannel.block
printf "start create channel...\n"
peer channel create -o orderer.example.com:7050 -c mychannel -f ../channel-artifacts/channel.tx
printf "end create channel...\n"
mv mychannel.block ../channel-artifacts
printf "peer0.org1.example.com start join channel...\n"
peer channel join -b ../channel-artifacts/mychannel.block
printf "peer0.org1.example.com end join channel...\n"
printf "peer0.org1.example.com start install chaincode...\n"
peer chaincode install -n fishcc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/fishcc
printf "peer0.org1.example.com end install chaincode...\n"

export CORE_PEER_ADDRESS=peer1.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
export CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.crt
export CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.key
printf "peer1.org1.example.com start join channel...\n"
peer channel join -b ../channel-artifacts/mychannel.block
printf "peer1.org1.example.com end join channel...\n"
printf "peer1.org1.example.com start install chaincode...\n"
peer chaincode install -n fishcc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/fishcc
printf "peer1.org1.example.com end install chaincode...\n"

export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
export 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
export CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.crt
export CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.key
printf "peer0.org2.example.com start join channel...\n"
peer channel join -b ../channel-artifacts/mychannel.block
printf "peer0.org2.example.com end join channel...\n"
printf "peer0.org2.example.com start install chaincode...\n"
peer chaincode install -n fishcc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/fishcc
printf "peer0.org2.example.com end install chaincode...\n"
export CORE_PEER_ADDRESS=peer1.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
export CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.crt
export CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.key
printf "peer1.org2.example.com start join channel...\n"
peer channel join -b ../channel-artifacts/mychannel.block
printf "peer1.org2.example.com end join channel...\n"
printf "peer1.org2.example.com start install chaincode...\n"
peer chaincode install -n fishcc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/fishcc
printf "peer1.org2.example.com end install chaincode...\n"

上面shell腳本執行創建通道、加入通道、創建鏈碼等工作。

第三步:退出peer容器,進入chaincode/fishcc目錄,然後執行執行npm start --peer.address grpc://localhost:7052 --chaincode-id-name fishcc:1.0,執行成功後的界面如下所示:
在這裏插入圖片描述
第四步:打開另外一個shell窗口,重新進入peer容器,實例化合約。

peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n fishcc -l node -v 1.0 -c '{"Args":[""]}' -P "AND('Org1MSP.member', 'Org2MSP.member')"

執行實例化後,可以看到運行合約窗口如下:
在這裏插入圖片描述
我們可以在合約窗口中看到實例化合約的結果信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章