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

第 22-36 行显示了 ChaincodeBase 类(来自链代码 shim 客户端)的 run() 方法,我们可以在其中查看调用了哪个函数,以及该调用应委托给哪个处理函数。该类是可扩展的,因为 init 和 query 以外的其他任何函数(比如 log 函数)都由 handleOther() 处理,所以您还必须实现它。

现在打开 com.makotojava.learn.blockchain.chaincode 包中的 ChaincodeLog 类。

我只提供了一个框架供您填充 — 也就是说,我仅提供了编译它所需的代码。您需要编写剩余代码。您应该执行 JUnit 测试,然后会看到测试失败(因为还未编写实现)和失败的原因。换句话说,可以使用 JUnit 测试作为指导来正确地实现代码。

现在,如果感觉难以理解,不要担心;我在 com.makotojava.learn.blockchain.chaincode.solution 中提供了解决方案,以防您遇到阻碍(或者想根据参考来帮助完成实现)。

编写 Java 链代码

首先介绍一下在 ChaincodeLog 中实现链代码方法需要了解的一些背景。Java 链代码通过 ChaincodeStub 类与 Hyperledger Fabric 框架进行通信,另外需要记住,账本是区块链技术的透明性方面的核心。让智能合约(责任性)发挥其作用的是账本的状态,而链代码是通过 ChaincodeStub 来评估账本的状态。通过访问账本状态,可以实现一个智能合约(也即链代码)。

ChaincodeStub 上有许多方法可用于在账本的当前状态中存储、检索和删除数据项,但本教程仅讨论两个方法,它们用于存储和检索账本状态:

putState(String key, String value)— 将指定的状态值存储在账本中,该值被相应映射到指定的键。

getState()— 获取与指定键关联的状态值,并以字符串形式返回它。

为本教程编写代码时,只需在账本中存储或检索状态值,就会使用 putState() 或 getState() 函数。ChaincodeLog 类仅在账本中存储和检索值来实现其智能合约,所以实现这些方法只需知道该值即可。更复杂的链代码将使用 ChaincodeStub 中的其他一些方法(但这些方法不属于本教程的介绍范畴)。

我非常喜欢测试驱动开发 (TDD),所以按照 TDD 的方式,我首先编写单元测试。继续运行它们,并观察它们的失败过程。在这之后,编写符合规范的代码,直到单元测试得到通过。单元测试的工作是确保能够获得预期的行为,通过研究单元测试,您将获得实现这些方法所需的足够信息。

但是,我还在每个方法顶部编写了 javadoc 注释,这可能有所帮助(以防您不熟悉 TDD 或 JUnit)。在学完本节的内容后,在 JUnit 测试中的代码与框架 ChaincodeLog 中的 javadoc 注释之间,你应该知道有实现链代码所需的所有信息。

从 Project Explorer 视图(在 Java 透视图中),导航到 ChaincodeLogTest 类,右键单击它并选择 Run As > Gradle Test。在它运行时,您会看到如图 11 所示的结果,其中显示了运行的所有 Gradle 任务的树结构。成功完成的任务在旁边会用一个复选标记进行指示。

Gradle Executions 选项卡中的感叹号表示与失败的单元测试对应的 Gradle 任务(跟我们期望的一样,所有 4 个单元测试都失败了)。

由于我们编写 JUnit 测试案例的方式,每个测试方法对应于 ChaincodeLog 中的一个方法,您需要在本教程中正确实现它们。

实现 getChaincodeID()
首先,需要实现 getChaincodeID()。它的合约要求返回链代码的唯一标识符。我在 ChaincodeLog 类的顶部定义了一个名为 CHAINCODE_ID 的常量,您会用到它。可以自由更改它的值,但是,如果要更改 getChaincodeID() 返回的链代码 ID,请确保它在您的网络中是唯一的,而且不要忘记更改 JSON 消息的 ChaincodeID.name 属性。

/** * Returns the unique chaincode ID for this chaincode program. */ @Override public String getChaincodeID() { return null;// ADD YOUR CODE HERE }

练习:完成 getChaincodeID() 方法。如果需要一个参考,请参见 com.makotojava.learn.blockchain.chaincode.solution 包。

实现 handleInit()

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

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