2017-10-09

版权声明:本文为博主原创文章,转载注明“龙棠博客”字样和原文链接。

Fabric-java-sdk 示例

package org.playchain.demo3.service;

import org.hyperledger.fabric.sdk.*;
import org.hyperledger.fabric.sdk.security.CryptoSuite;
import org.playchain.demo3.controller.SampleOrg;
import org.playchain.demo3.controller.SampleStore;
import org.playchain.demo3.controller.SampleUser;
import org.playchain.demo3.model.House;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;

import static org.apache.commons.codec.CharEncoding.UTF_8;

/**
 * Created by Liu on 2017/9/21.
 */
@Service
public class ChaincodeService {
    private static final Logger logger = LoggerFactory.getLogger(ChaincodeService.class);

    private HFClient hfClient;
    private ChaincodeID chaincodeID;
    private Channel channel;
    private Collection<ProposalResponse> successful;

    @Autowired
    protected void init() {
        logger.info("Init chaincode service");
        successful = new LinkedList<>();
        File sampleStoreFile = new File("D:/" + "/HFCSampletest.properties");
        if (sampleStoreFile.exists()) { //For testing start fresh
            sampleStoreFile.delete();
        }

        final SampleStore sampleStore = new SampleStore(sampleStoreFile);
        SampleOrg sampleOrg = new SampleOrg("peerOrg1", "Org1MSP");
        try {
            ClassLoader classLoader = getClass().getClassLoader();
            URL channelUrl = classLoader.getResource("channel/");
            URL keystoreUrl = classLoader.getResource("channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/sk");
            URL signcertsUrl = classLoader.getResource("channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem");
            SampleUser peerOrgAdmin = sampleStore.getMember("Org1MSP" + "Admin", "Org1MSP", sampleOrg.getMSPID(),
                    new File(keystoreUrl.getFile()),
                    new File(signcertsUrl.getFile()));
//                    Paths.get(keystoreUrl.getFile()).toFile(),
//                    Paths.get(signcertsUrl.getPath()).toFile());

            sampleOrg.setPeerAdmin(peerOrgAdmin);
            hfClient= HFClient.createNewInstance();
            hfClient.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());

            hfClient.setUserContext(sampleOrg.getPeerAdmin());

            chaincodeID = ChaincodeID.newBuilder().setName("playchain_chaincode")
                    .setVersion("1")
                    .setPath("github.com/playchain").build();

            ChannelConfiguration channelConfiguration = new ChannelConfiguration(new File(channelUrl.getPath() +"/foo.tx"));


            URL servercrtUrl = classLoader.getResource("channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt");
//            File cert = Paths.get(channelUrl.getPath() +"/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt").toFile();

            File cert = new File(servercrtUrl.getFile());

            Properties ret = new Properties();
            ret.setProperty("pemFile", cert.getAbsolutePath());
            ret.setProperty("trustServerCertificate", "true"); //testing environment only NOT FOR PRODUCTION!
            ret.setProperty("hostnameOverride", "orderer.example.com");
            ret.setProperty("sslProvider", "openSSL");
            ret.setProperty("negotiationType", "TLS");

            Orderer newOrder = hfClient.newOrderer("orderer.example.com", "grpc://127.0.0.1:7050", ret);

            channel = hfClient.newChannel("foo");
            channel.addOrderer(newOrder);


            URL servercrtUrl0 = classLoader.getResource("channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt");
//            File cert0 = Paths.get(channelUrl.getPath() +"/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt").toFile();
            File cert0 = new File(servercrtUrl0.getFile());
            Properties ret0 = new Properties();
            ret0.setProperty("pemFile", cert.getAbsolutePath());
            ret0.setProperty("trustServerCertificate", "true"); //testing environment only NOT FOR PRODUCTION!
            ret0.setProperty("hostnameOverride", "peer0.org1.example.com");
            ret0.setProperty("sslProvider", "openSSL");
            ret0.setProperty("negotiationType", "TLS");


            Peer peer0 = hfClient.newPeer("peer0.org1.example.com", "grpc://localhost:7051", ret0);

            channel.addPeer(peer0);
//            newChannel.addPeer(peer1);
            channel.initialize();

        } catch (Exception e) {
            logger.info(e.getMessage());
        }
    }

    public void add(House house, SampleUser user) {
        try {

            hfClient.setUserContext(user);
            TransactionProposalRequest transactionProposalRequest = hfClient.newTransactionProposalRequest();
            transactionProposalRequest.setChaincodeID(chaincodeID);
            transactionProposalRequest.setFcn("registerHouse");
//            transactionProposalRequest.setProposalWaitTime(testConfig.getProposalWaitTime());
//            transactionProposalRequest.setArgs(new String[] {"move", "a", "b", "100"});
            String argS = house.getHouseNo() + "," + house.getHouseCertNo() + "," + house.getHouseLocation() + ","
                    + "owner" + "," + "user" + "," + "sale" + "," + "1000";
            String[] args = argS.split(",");
//            transactionProposalRequest.setArgs(new String[] {name,"blue","35","tom"});
            transactionProposalRequest.setArgs(args);

            Map<String, byte[]> tm2 = new HashMap<>();
            tm2.put("HyperLedgerFabric", "TransactionProposalRequest:JavaSDK".getBytes(StandardCharsets.UTF_8)); //Just some extra junk in transient map
            tm2.put("method", "TransactionProposalRequest".getBytes(StandardCharsets.UTF_8)); // ditto
            tm2.put("result", ":)".getBytes(StandardCharsets.UTF_8));  // This should be returned see chaincode why.
//            tm2.put(EXPECTED_EVENT_NAME, EXPECTED_EVENT_DATA);  //This should trigger an event see chaincode why.

            transactionProposalRequest.setTransientMap(tm2);


            Collection<ProposalResponse> transactionPropResp = channel.sendTransactionProposal(transactionProposalRequest, channel.getPeers());
            successful.clear();
            for (ProposalResponse response : transactionPropResp) {
                if (response.getStatus() == ProposalResponse.Status.SUCCESS) {
                    logger.info(response.toString());
                    successful.add(response);
                    logger.info(response.toString());
//                    return response.toString();
                } else {
                    logger.info("error");
                }
            }

            Collection<Set<ProposalResponse>> proposalConsistencySets = SDKUtils.getProposalConsistencySets(transactionPropResp);
            if (proposalConsistencySets.size() != 1) {
                logger.info("error");
            }

            channel.sendTransaction(successful);

        } catch (Exception e) {
            logger.info(e.toString());
        }
    }

    public void query(String name) {
        try {
            QueryByChaincodeRequest queryByChaincodeRequest = hfClient.newQueryProposalRequest();
//            queryByChaincodeRequest.setArgs(new String[] {"query", "b"});
            queryByChaincodeRequest.setArgs(new String[] {name});

            queryByChaincodeRequest.setFcn("queryHouse");
            queryByChaincodeRequest.setChaincodeID(chaincodeID);

            Map<String, byte[]> tm2 = new HashMap<>();
            tm2.put("HyperLedgerFabric", "QueryByChaincodeRequest:JavaSDK".getBytes(UTF_8));
            tm2.put("method", "QueryByChaincodeRequest".getBytes(UTF_8));
            queryByChaincodeRequest.setTransientMap(tm2);


            Collection<ProposalResponse> queryProposals = channel.queryByChaincode(queryByChaincodeRequest, channel.getPeers());

            for (ProposalResponse proposalResponse : queryProposals) {
                if (!proposalResponse.isVerified() || proposalResponse.getStatus() != ProposalResponse.Status.SUCCESS) {
                    logger.info("xxxx");
                } else {
                    String payload = proposalResponse.getProposalResponse().getResponse().getPayload().toStringUtf8();
                    logger.info(payload);
//                    return  payload;
                }
            }
        } catch (Exception e) {
            logger.info(e.toString());
        }
    }

}