1. 程式人生 > >六、hyperledger fabric 投票應用(java-sdk)

六、hyperledger fabric 投票應用(java-sdk)

繼上篇文章編寫的投票鏈碼,並且在fabric網路中測試成功,本節將通過java-sdk呼叫寫好的投票鏈碼。

一、編寫啟動指令碼,包含啟動網路、初始化鏈碼、安裝鏈碼。

#!/bin/bash
#
# Copyright IBM Corp All Rights Reserved
#
# SPDX-License-Identifier: Apache-2.0
#
# Exit on first error
set -e

# don't rewrite paths for Windows Git Bash users
export MSYS_NO_PATHCONV=1

CC_SRC_PATH=github.com/vote

starttime=$(date +%s)

# launch network; create channel and join peer to channel
cd ../basic-network
./start.sh

# Now launch the CLI container in order to install, instantiate chaincode
# and prime the ledger with our 10 cars
docker-compose -f ./docker-compose.yml up -d cli

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/
[email protected]
/msp" cli peer chaincode install -n vote -v 1.0 -p "$CC_SRC_PATH" docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp" cli peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n vote -v 1.0 -c '{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')" sleep 10 docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/
[email protected]
/msp" cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n vote -c '{"function":"getUserVote","Args":[""]}'

二、啟動網路

三、Java呼叫鏈碼程式(java-sdk)

1、註冊admin使用者

public void enroll(String username, String password, String certDir) throws Exception {
        HFClient client = HFClient.createNewInstance();
        CryptoSuite cs = CryptoSuite.Factory.getCryptoSuite();
        client.setCryptoSuite(cs);
        Properties prop = new Properties();
        prop.put("verify", false);
        HFCAClient caClient = HFCAClient.createNewInstance("http://192.168.137.3:7054", prop);
        caClient.setCryptoSuite(cs);
        Enrollment enrollment = caClient.enroll(username, password);
        CertUtils.saveEnrollment(enrollment, certDir, username);
    }

2、註冊普通使用者

public void regist(String username, String certDir) throws Exception {
        HFClient client = HFClient.createNewInstance();
        CryptoSuite cs = CryptoSuite.Factory.getCryptoSuite();
        client.setCryptoSuite(cs);
        Properties prop = new Properties();
        prop.put("verify", false);
        HFCAClient caClient = HFCAClient.createNewInstance("http://192.168.137.3:7054", prop);
        caClient.setCryptoSuite(cs);
        RegistrationRequest rr = new RegistrationRequest(username, "org1");
        String enrollmentSecret = caClient.register(rr,  new CarUser(
                "admin",
                CertUtils.loadEnrollment("cert", "admin")));
        Enrollment enrollment = caClient.enroll(username, enrollmentSecret);
        CertUtils.saveEnrollment(enrollment, certDir, username);
    }

3、給指定使用者投票、存在則票數+1,不存在則新建使用者

public void voteUser(final String name) throws Exception {
        HFClient client = HFClient.createNewInstance();
        Channel channel = initChannel(client);
        TransactionProposalRequest req = client.newTransactionProposalRequest();
        ChaincodeID cid = ChaincodeID.newBuilder().setName("vote").build();
        req.setChaincodeID(cid);
        req.setFcn("voteUser");
        req.setArgs(name);
        Collection<ProposalResponse> resps = channel.sendTransactionProposal(req);
        channel.sendTransaction(resps);
    }

4、查詢所有使用者的票數情況

public void queryVote() throws Exception {
        HFClient client = HFClient.createNewInstance();
        Channel channel = initChannel(client);
        QueryByChaincodeRequest req = client.newQueryProposalRequest();
        ChaincodeID cid = ChaincodeID.newBuilder().setName("vote").build();
        req.setChaincodeID(cid);
        req.setFcn("getUserVote"); // queryAllCars
        req.setArgs("");
        Collection<ProposalResponse> resps = channel.queryByChaincode(req);
        for (ProposalResponse resp : resps) {
            String payload = new String(resp.getChaincodeActionResponsePayload());
            System.out.println("response: " + payload);
        }
    }

查詢結果