用Java为Hyperledger Fabric(超级账本)编写区块链智能合约链代码

编写第一个 Java 链代码程序

在上一节中,您已经熟悉了如何构建、运行、部署和调用链代码,但尚未编写任何 Java 代码。

在本节中,将会使用 Eclipse IDE、一个用于 Eclipse 的 Gradle 插件,以及一个名为 ChaincodeTutorial 的 Java 链代码框架项目,编写第一个 Java 链代码程序。您将从我为此教程创建的 GitHub 存储库中获取框架代码,将该代码导入 Eclipse 中,添加代码来让链代码智慧合同按要求生效,然后在 Eclipse IDE 内使用 Gradle 构建该代码。

您将执行的步骤如下:

安装适用于 Eclipse 的 Gradle Buildship 插件。

从 GitHub 克隆 ChaincodeTutorial 项目。

将该项目导入 Eclipse 中。

探索该链代码框架项目。

编写 Java 链代码。

构建 Java 链代码。
完成本节后,您的链代码就可以在本地区块链网络上运行了。

1.安装适用于 Eclipse 的 Gradle Buildship 插件

您使用自己喜欢的任何 IDE,但本教程中的说明是针对 Eclipse 的。备注:Buildship Gradle 插件有助于将 Gradle 与 Eclipse 集成,但仍然需要将 Gradle 安装在计算机上。

如果您一直在按照教程进行操作,那么您应该已经将 Gradle 安装在计算机上;如果尚未安装它,请立即安装。请参阅 “安装构建软件” 部分,了解如何将 Gradle 安装在计算机上。

Buildship Gradle Integration 下,单击 Install 按钮并按照提示进行操作。单击 Finish 后,将安装适用于 Eclipse 的 Buildship Gradle 插件,而且会要求您重启 Eclipse。

重新打开 Eclipse 后,Gradle 应该已经与 Eclipse IDE 全面集成。您现在已准备好从 GItHub 克隆 ChaincodeTutorial 存储库。

从 GitHub 克隆 ChaincodeTutorial 项目

配置 Eclipse IDE 和 Gradle集成后,将从 GitHub 克隆 ChaincodeTutorial 代码并将其导入 Eclipse 中。打开一个命令提示符或终端窗口,导航到 $GOPATH 并执行以下命令:

git clone https://github.com/makotogo/ChaincodeTutorial.git

命令输出应类似于:

$ export GOPATH=http://www.likecs.com/Users/sperry/home/mychaincode $ cd $GOPATH $ git clone https://github.com/makotogo/ChaincodeTutorial.git Cloning into 'ChaincodeTutorial'... remote: Counting objects: 133, done. remote: Compressing objects: 100% (90/90), done. remote: Total 133 (delta 16), reused 118 (delta 1), pack-reused 0 Receiving objects: 100% (133/133), 9.39 MiB | 1.95 MiB/s, done. Resolving deltas: 100% (16/16), done. $ cd ChaincodeTutorial $ pwd /Users/sperry/home/mychaincode/ChaincodeTutorial

此命令将 Blockchain ChaincodeTutorial 存储库从 GitHub 克隆到 $GOPATH。它包含一个 Java 链代码框架项目,您可以在本地区块链网络中构建、运行和测试它。

但在执行所有这些操作之前,需要将该代码导入 Eclipse 中。

3.将该项目导入 Eclipse 中

在 Eclipse 中,转到 File > Import...> Gradle > Existing Gradle Project。这会打开一个向导对话框(参见图 9)。

Eclipse Import Wizard:Gradle Project

单击 Next。在向导中随后出现的对话框中(参见图 10),浏览到 $GOPATH/ChaincodeTutorial,然后单击 Finish 导入该项目。

Eclipse Import Wizard:Gradle Project(项目的 root 目录)

完成项目导入后,确保选择了 Java Perspective,您刚导入的 ChaincodeTutorial 项目会显示在 Project Explorer 视图中。

将代码导入 Eclipse 工作区后,就可以编写链代码了。

4.探索该链代码框架项目

在本节中,将探索该链代码项目,以便理解在编写任何 Java 代码前它应该如何运行。

作为开发人员,我们喜欢编写代码,所以我不想让您失去编写 Java 代码的机会。但是,项目设置可能很复杂,我不想让这些设置阻碍实现本教程的主要目的。为此,我提供了您所需的大部分代码。

首先让我们快速查看一下基类 AbstractChaincode,它位于 com.makotojava.learn.blockchain.chaincode 包中,如清单 1 所示。

清单 1. AbstractChaincode 类

package com.makotojava.learn.blockchain.chaincode; import java.util.Arrays; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hyperledger.java.shim.ChaincodeBase; import org.hyperledger.java.shim.ChaincodeStub; public abstract class AbstractChaincode extends ChaincodeBase { private static final Log log = LogFactory.getLog(AbstractChaincode.class); public static final String FUNCTION_INIT = "init"; public static final String FUNCTION_QUERY = "query"; protected abstract String handleInit(ChaincodeStub stub, String[] args); protected abstract String handleQuery(ChaincodeStub stub, String[] args); protected abstract String handleOther(ChaincodeStub stub, String function, String[] args); @Override public String run(ChaincodeStub stub, String function, String[] args) { String ret; log.info("Greetings from run(): function -> " + function + " | args -> " + Arrays.toString(args)); switch (function) { case FUNCTION_INIT: ret = handleInit(stub, args); break; case FUNCTION_QUERY: ret = handleQuery(stub, args); default: ret = handleOther(stub, function, args); break; } return ret; } @Override public String query(ChaincodeStub stub, String function, String[] args) { return handleQuery(stub, args); } }

我想指出的第一点是,AbstractChaincode 是 ChaincodeBase 的子类,后者来自该结构的 shim 客户端(第 7、10 行)。

第 17-19 行显示了需要在 ChaincodeLog 类(AbstractChaincode 的子类)中实现的方法,这些方法分别用于实现初始化、账本查询和日志功能。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydwfp.html