Hyperledger Fabric Java智能合约Contract类与依赖选型问题
问题1:差异原因说明
不存在教程过时或者你引用API版本过旧的问题,两个同名Contract属于Hyperledger Fabric Java生态里完全不同分层的组件,只是命名重合:
org.hyperledger.fabric.gateway.Contract是fabric-gateway-java依赖提供的客户端侧SDK接口,作用是给业务应用提供连接Fabric网络、提交交易、查询账本的客户端调用能力,也就是你当前运行的EnrollAdmin、RegisterUser、ClientApp这类客户端程序使用的API,和智能合约本身的编写逻辑没有关联。- 教程中提到的包含
beforeTransaction()、afterTransaction()、createContext()生命周期方法的Contract基类,是fabric-chaincode-shim依赖中org.hyperledger.fabric.contract包提供的链码侧开发基类,运行在Peer节点的链码执行环境中,专门用于智能合约逻辑开发。
问题2:智能合约开发的依赖要求
编写新的Java版智能合约必须单独引入fabric-chaincode-shim依赖,现有gateway包下的Contract接口完全无法支撑智能合约开发:
fabric-gateway-java 2.1.1的所有能力都面向客户端调用场景,只具备调用已部署上链的智能合约的能力,不提供智能合约开发所需的生命周期钩子、交易上下文、序列化、链码通信等核心能力,不能用来编写链码逻辑。- 开发自定义智能合约时,需要创建独立的Java项目,引入对应版本的
fabric-chaincode-shim依赖,继承链码侧的Contract基类,按需重写交易生命周期方法,实现自定义业务逻辑后打包成链码包部署到Peer节点,之后才能通过你当前写的gateway客户端程序调用新合约的逻辑。
补充说明:你当前参考的Fabcar Java示例是客户端调用示例,不是智能合约开发示例,因此它的pom文件中只引入了客户端侧依赖,找不到链码开发相关类是正常情况。智能合约项目和客户端调用项目是两个完全独立的工程,依赖不通用,运行位置也不同:前者运行在Peer节点的链码容器中,后者运行在业务服务侧。
内容的提问来源于stack exchange,提问作者Ashish Parab
相关产品推荐
相关产品推荐

