Hyperledger Java SDK 工作示例

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/44585909/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 08:15:27  来源:igfitidea点击:

Hyperledger Java SDK working example

javahyperledger-fabric

提问by Xenonite

I am currently digging into Hyperledger Fabric and I can't get stuff started with the Java SDK (talking about 1.0.0-beta here). Is there a working example starting from connecting to the Fabric node, doing queries, etc? All I found so far through extensive googling are "let's-write-some-chaincode" examples.

我目前正在研究 Hyperledger Fabric,但我无法从 Java SDK 开始(这里谈论 1.0.0-beta)。是否有从连接到 Fabric 节点、执行查询等开始的工作示例?到目前为止,我通过广泛的谷歌搜索发现的只是“让我们编写一些链代码”的例子。

采纳答案by Ashishkel

You can take a look at the following

你可以看看下面的

  • Java SDK for Hyperledger Fabric 1.1. In this, there are two files given in the folder "fabric-sdk-java/src/test/java/org/hyperledger/fabric/sdkintegration/" ==> End2endAndBackAgainIT.java, End2endIT.java. This can help.
  • For a demonstration, refer to Youtube channel video: End to end Demo
  • For a fabric network which has everything (network & crypto) setup for the E2E demo: E2E Cli Setup
  • 用于 Hyperledger Fabric 1.1 的 Java SDK。在此,文件夹“fabric-sdk-java/src/test/java/org/hyperledger/fabric/sdkintegration/”中有两个文件 ==> End2endAndBackAgainIT.java, End2endIT.java。这可以提供帮助。
  • 有关演示,请参阅 Youtube 频道视频:端到端演示
  • 对于具有 E2E 演示的所有(网络和加密)设置的结构网络:E2E Cli 设置

回答by Dmitry Andrievsky

Here is an example, implementing some functionality from fabcar (query.js and invoke.js - only query by one car and change owner)

这是一个示例,从 fabcar 实现一些功能(query.js 和 invoke.js - 仅由一辆车查询并更改所有者)

I used Java8 on Windows. If you use another OS please update paths accordingly.

我在 Windows 上使用了 Java8。如果您使用其他操作系统,请相应地更新路径。

I used no implementation for json to avoid additional libraries (it is required to deal with certs a bit - see below).

我没有使用 json 的实现来避免额外的库(需要稍微处理证书 - 见下文)。

You will need fabcar example up and running. And (because of 'no json'):

您将需要启动并运行 fabcar 示例。并且(因为“没有 json”):

  1. Put Private key (cd96d5260ad4757551ed4a5a991e62130f8008a0bf996e4e4b84cd097a747fec-priv from example) to c:\tmp\cert\PeerAdm.priv
  2. Put Certificate from PeerAdmin file (value of json's "certificate", with '\n' replaced by newlines) to c:\tmp\cert\PeerAdm.cert
  1. 将私钥(示例中的 cd96d5260ad4757551ed4a5a991e62130f8008a0bf996e4e4b84cd097a747fec-priv)放到 c:\tmp\cert\PeerAdm.priv
  2. 将 PeerAdmin 文件中的证书(json 的“证书”的值,'\n' 替换为换行符)到 c:\tmp\cert\PeerAdm.cert

The code (fabrictest/fabcar/Program.java):

代码(fabrictest/fabcar/Program.java):

package fabrictest.fabcar;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import javax.xml.bind.DatatypeConverter;

import org.hyperledger.fabric.sdk.ChaincodeID;
import org.hyperledger.fabric.sdk.Channel;
import org.hyperledger.fabric.sdk.Enrollment;
import org.hyperledger.fabric.sdk.HFClient;
import org.hyperledger.fabric.sdk.ProposalResponse;
import org.hyperledger.fabric.sdk.QueryByChaincodeRequest;
import org.hyperledger.fabric.sdk.TransactionProposalRequest;
import org.hyperledger.fabric.sdk.User;
import org.hyperledger.fabric.sdk.security.CryptoSuite;

public class Program {

    private static HFClient client = null;

    public static void main(String[] args) throws Throwable {
        /*
         * wallet_path: path.join(__dirname, './creds'), user_id: 'PeerAdmin',
         * channel_id: 'mychannel', chaincode_id: 'fabcar', network_url:
         * 'grpc://192.168.99.100:7051', orderer: grpc://192.168.99.100:7050
         * 
         */

        // just new objects, without any payload inside
        client = HFClient.createNewInstance();
        CryptoSuite cs = CryptoSuite.Factory.getCryptoSuite();
        client.setCryptoSuite(cs);

        // We implement User interface below in code
        // folder c:\tmp\creds should contain PeerAdmin.cert (extracted from HF's fabcar
        // example's PeerAdmin json file)
        // and PeerAdmin.priv (copy from
        // cd96d5260ad4757551ed4a5a991e62130f8008a0bf996e4e4b84cd097a747fec-priv)
        User user = new SampleUser("c:\tmp\creds", "PeerAdmin");
        // "Log in"
        client.setUserContext(user);

        // Instantiate channel
        Channel channel = client.newChannel("mychannel");
        channel.addPeer(client.newPeer("peer", "grpc://192.168.99.100:7051"));
        // It always wants orderer, otherwise even query does not work
        channel.addOrderer(client.newOrderer("orderer", "grpc://192.168.99.100:7050"));
        channel.initialize();

        // below is querying and setting new owner

        String newOwner = "New Owner #" + new Random(new Date().getTime()).nextInt(999);
        System.out.println("New owner is '" + newOwner + "'\n");

        queryFabcar(channel, "CAR1");
        updateCarOwner(channel, "CAR1", newOwner, false);

        System.out.println("after request for transaction without commit");
        queryFabcar(channel, "CAR1");
        updateCarOwner(channel, "CAR1", newOwner, true);

        System.out.println("after request for transaction WITH commit");
        queryFabcar(channel, "CAR1");

        System.out.println("Sleeping 5s");
        Thread.sleep(5000); // 5secs
        queryFabcar(channel, "CAR1");
        System.out.println("all done");
    }

    private static void queryFabcar(Channel channel, String key) throws Exception {
        QueryByChaincodeRequest req = client.newQueryProposalRequest();
        ChaincodeID cid = ChaincodeID.newBuilder().setName("fabcar").build();
        req.setChaincodeID(cid);
        req.setFcn("queryCar");
        req.setArgs(new String[] { key });
        System.out.println("Querying for " + key);
        Collection<ProposalResponse> resps = channel.queryByChaincode(req);
        for (ProposalResponse resp : resps) {
            String payload = new String(resp.getChaincodeActionResponsePayload());
            System.out.println("response: " + payload);
        }

    }

    private static void updateCarOwner(Channel channel, String key, String newOwner, Boolean doCommit)
            throws Exception {
        TransactionProposalRequest req = client.newTransactionProposalRequest();
        ChaincodeID cid = ChaincodeID.newBuilder().setName("fabcar").build();
        req.setChaincodeID(cid);
        req.setFcn("changeCarOwner");
        req.setArgs(new String[] { key, newOwner });
        System.out.println("Executing for " + key);
        Collection<ProposalResponse> resps = channel.sendTransactionProposal(req);
        if (doCommit) {
            channel.sendTransaction(resps);
        }
    }

}

/***
 * Implementation of user. main business logic (as for fabcar example) is in
 * getEnrollment - get user's private key and cert
 * 
 */
class SampleUser implements User {
    private final String certFolder;
    private final String userName;

    public SampleUser(String certFolder, String userName) {
        this.certFolder = certFolder;
        this.userName = userName;
    }

    @Override
    public String getName() {
        return userName;
    }

    @Override
    public Set<String> getRoles() {
        return new HashSet<String>();
    }

    @Override
    public String getAccount() {
        return "";
    }

    @Override
    public String getAffiliation() {
        return "";
    }

    @Override
    public Enrollment getEnrollment() {
        return new Enrollment() {

            @Override
            public PrivateKey getKey() {
                try {
                    return loadPrivateKey(Paths.get(certFolder, userName + ".priv"));
                } catch (Exception e) {
                    return null;
                }
            }

            @Override
            public String getCert() {
                try {
                    return new String(Files.readAllBytes(Paths.get(certFolder, userName + ".cert")));
                } catch (Exception e) {
                    return "";
                }
            }

        };
    }

    @Override
    public String getMspId() {
        return "Org1MSP";
    }
    /***
     * loading private key from .pem-formatted file, ECDSA algorithm
     * (from some example on StackOverflow, slightly changed)
     * @param fileName - file with the key
     * @return Private Key usable
     * @throws IOException
     * @throws GeneralSecurityException
     */
    public static PrivateKey loadPrivateKey(Path fileName) throws IOException, GeneralSecurityException {
        PrivateKey key = null;
        InputStream is = null;
        try {
            is = new FileInputStream(fileName.toString());
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder builder = new StringBuilder();
            boolean inKey = false;
            for (String line = br.readLine(); line != null; line = br.readLine()) {
                if (!inKey) {
                    if (line.startsWith("-----BEGIN ") && line.endsWith(" PRIVATE KEY-----")) {
                        inKey = true;
                    }
                    continue;
                } else {
                    if (line.startsWith("-----END ") && line.endsWith(" PRIVATE KEY-----")) {
                        inKey = false;
                        break;
                    }
                    builder.append(line);
                }
            }
            //
            byte[] encoded = DatatypeConverter.parseBase64Binary(builder.toString());
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
            KeyFactory kf = KeyFactory.getInstance("ECDSA");
            key = kf.generatePrivate(keySpec);
        } finally {
            is.close();
        }
        return key;
    }
}

回答by CX gamer

I find this Java example to be more helpful than the links provided. Out of the box it provides you with an end to end test without bloat. Shows you how to do everything without CLI, in plain Java.

我发现这个 Java 示例比提供的链接更有帮助。开箱即用,它为您提供端到端测试而不会膨胀。向您展示如何在没有 CLI 的情况下使用纯 Java 完成所有操作。

https://github.com/venugopv/FabricJavaSDKSample

https://github.com/venugopv/FabricJavaSDKSample