区块链服务 BCS区块链服务 BCS

更新时间:2021/08/06 GMT+08:00
分享

Java SDK Demo

本节提供一个基于Java SDK的Demo,帮助用户开发自己的Java客户端应用程序。

准备工作

  • 在开发环境上安装Java环境。
  • 获取Java SDK Demo源码(用户需获取最新版本SDK,本demo仅提供示例),获取Java SDK jar包,将Java SDK Demo源码下载至指定路径并解压。

部署应用

  1. 下载区块链配置文件。
    1. 登录区块链服务管理控制台。
    2. 单击左侧导航栏中的“服务管理”,选择华为链。
    3. 在华为链页签中,单击对应区块链服务右上角的“下载配置文件”,配置SDK参数信息如下表1
      表1 参数表

      参数名称

      说明

      链代码名称

      根据您的实际情况填写。链代码名称需要和链代码安装、实例化时的一致。

      证书存放路径

      用户在编译应用程序时,证书的最终存放路径。如果证书路径后期有变更,您需要手动修改SDK配置文件中所有证书相关路径。

      组织

      选择组织。

      证书选择

      用户证书

    4. 单击“下载”,下载SDK配置文件和organization组织的用户证书。
  2. 拷贝并解压
    1. 将下载的SDK配置文件解压。
    2. 将下载的Java SDK jar(下图中的poissonchain-java-sdk-2.1.0.2.35.jar)包导入到应用程序项目路径lib中,将下载的SDK配置文件拷贝到项目的配置目录conf中(注意windows环境下的路径分隔符)。
    3. 然后将配置文件路径替换到项目工程中就可以进行接口开发工作。项目结构图如下:

  3. 部署应用

    在IDEA打开demo之后,会自动拉取项目依赖,然后将各个参数替换成区块链对应的参数,运行程序,即可得到预期结果。

    发送合约示例代码:

    import com.google.gson.JsonObject;
    import com.huawei.wienerchain.SdkClient;
    import com.huawei.wienerchain.WienerChainNode;
    import com.huawei.wienerchain.exception.SdkException;
    import com.huawei.wienerchain.message.Builder;
    import com.huawei.wienerchain.message.action.TxEvent;
    import com.huawei.wienerchain.message.build.ContractRawMessage;
    import com.huawei.wienerchain.proto.common.Message.RawMessage;
    import com.huawei.wienerchain.proto.common.Message.Response;
    import com.huawei.wienerchain.proto.common.Message.Status;
    import com.huawei.wienerchain.proto.common.TransactionOuterClass;
    import com.huawei.wienerchain.proto.nodeservice.ContractOuterClass;
    
    import com.google.protobuf.ByteString;
    
    import java.io.IOException;
    import java.security.cert.CertificateException;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    
    /**
     * 功能描述
     *
     * @author author
     * @since 2021-07-31
     */
    public class Send {
        private static final int FUTURE_TIMEOUT = 20;
    
        private static final int LISTEN_TIMEOUT = 200;
    
        // nodes to send, separate with ','
        private static final String nodeNames = "node-0.organization";
    
        // consenter node to send
        private static final String consenter = "node-0.organization";
    
        // config path of client ,replace to your sdk config file path
        private static final String config = "D:\\SendDemo\\conf\\default-organization-sdk.yaml";
    
        //chain name
        private static final String chainId = "default";
    
        // contract name
        private static final String contract = "contractname";
    
        // function name
        private static final String function = "initMarble";
    
        // args of function, separate with ';'
        private static final String contractArgs = "key;values";
    
        public static void main(String[] args) {
            String[] nodes = nodeNames.split(",");
            if (nodes.length == 0) {
                System.out.println("Please input at least one node");
                return;
            }
            ExecutorService executorService = Executors.newSingleThreadExecutor();
    
            try {
                SdkClient sdkClient = new SdkClient(config);
                ContractRawMessage contractRawMessage = sdkClient.getContractRawMessage();
                ContractOuterClass.Invocation invocation = contractRawMessage.buildInvocation(chainId, contract,
                        function, contractArgs.split(";"));
    
                // first stage: invoke
                RawMessage[] invokeResponses = new RawMessage[nodes.length];
                for (int i = 0; i < nodes.length; i++) {
                    WienerChainNode node = sdkClient.getWienerChainNode(nodes[i]);
                    RawMessage rawMessage = contractRawMessage.getRawMessageBuilder(invocation.toByteString())
                            .setType(RawMessage.Type.DIRECT)
                            .build();
                    invokeResponses[i] = node.getContractAction()
                            .invoke(rawMessage)
                            .get(FUTURE_TIMEOUT, TimeUnit.SECONDS);
                }
                // second stage: send transaction
                Builder.TxRawMsg txMsg = contractRawMessage.buildTransactionMessage(invokeResponses);
                TxEvent txEvent = sdkClient.getWienerChainNode(nodes[0]).getAyncEventAction().registerTxEvent(chainId);
                Future<TransactionOuterClass.TxResult> future = txEvent.registerTx(txMsg.hash);
                WienerChainNode consenterNode = sdkClient.getWienerChainNode(consenter);
                ByteString payload = consenterNode.getContractAction()
                        .transaction(txMsg.msg)
                        .get(FUTURE_TIMEOUT, TimeUnit.SECONDS)
                        .getPayload();
                Response response = Response.parseFrom(payload);
                if (response.getStatus() == Status.SUCCESS) {
                    TransactionOuterClass.TxResult txResult = future.get(LISTEN_TIMEOUT, TimeUnit.SECONDS);
                    String result = txResult.getStatus().toString();
                    System.out.println(buildPrintInfo(nodeNames,contractArgs,response.getStatus().toString(),response.getStatusInfo()));
                } else {
                    System.out.println(response.getStatus() + ": " + response.getStatusInfo()+response.hashCode());
                }
            } catch (SdkException | InterruptedException | ExecutionException | TimeoutException | IOException
                    | CertificateException e) {
                e.printStackTrace();
            } finally {
                executorService.shutdownNow();
            }
        }
    
    
        public static String buildPrintInfo(String node, String contractArgs ,String status, String info) {
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("node", node);
            jsonObject.addProperty("status", status);
            jsonObject.addProperty("contractArgs",contractArgs);
            jsonObject.addProperty("info", info);
            return jsonObject.toString();
        }
    
    }
    
分享:

    相关文档

    相关产品