Hyperledger Fabric Java App Demo

编写一个应用程序来连接到 fabrc 网络中,通过调用智能合约来访问账本.

fabric gateway

fabric gateway 有两个项目,一个是 fabric-gateway-java , 一个是 fabric-gateway

fabric-gateway-java 是比较早的项目,使用起来较为麻烦需要提供一个 connection.json 配置文件,该配置文件中要详细配置网络中的各个节点的信息。

fabric-gateway 使用起来较为简单,不在需要 connection.json 配置文件,只需要指定网络中的一个节点连接就可以了。

fabric 官方建议如果是 fabrc 2.4 或者之后的版本建议使用 fabric-gateway

本篇内容基于 fabric-gateway 讲解,fabric 版本 v2.4.1


使用 fabric-gateway

Fabric Gateway 是 Hyperledger Fabric 区块链网络的核心组件,代表客户端应用程序协调提交事务和查询分类账状态所需的操作。通过使用 Gateway,客户端应用程序只需要连接到 Fabric 网络中的单个端点。

官方示例: https://github.com/hyperledger/fabric-samples/tree/main/asset-transfer-events https://github.com/hyperledger/fabric-samples/tree/main/asset-transfer-basic

fabric-gateway 依赖

<dependency>
	<groupId>org.hyperledger.fabric</groupId>
	<artifactId>fabric-gateway</artifactId>
	<version>1.0.1</version>
</dependency>

连接 fabric 网络

application.properties 配置文件:

# 应用名称
spring.application.name=hyperledger-fabric-app-java-demo
# 应用服务 WEB 访问端口
server.port=8080

fabric.networkConnectionConfigPath=src/main/resources/org1ProdNetworkConnection.json
fabric.mspId=Org1MSP
fabric.certificatePath=src/main/resources/crypto-config/prod-network/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem
fabric.privateKeyPath=src/main/resources/crypto-config/prod-network/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk
fabric.tlsCertPath=src/main/resources/crypto-config/prod-network/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
fabric.channel=businesschannel

logging.level.org.hyperledger=trace

src/main/resources/crypto-config/prod-network 路径下存放的是身份信息文件.

初始化 Gateway , Network , Contract 对象

import io.grpc.ManagedChannel;
import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.hyperledger.fabric.client.CallOption;
import org.hyperledger.fabric.client.Contract;
import org.hyperledger.fabric.client.Gateway;
import org.hyperledger.fabric.client.Network;
import org.hyperledger.fabric.client.identity.Identities;
import org.hyperledger.fabric.client.identity.Signers;
import org.hyperledger.fabric.client.identity.X509Identity;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.PrivateKey;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;

/**
 * author he peng
 * date 2022/1/22 21:21
 */

@Configuration
@AllArgsConstructor
@Slf4j
public class HyperLedgerFabricGatewayConfig {


    final HyperLedgerFabricProperties hyperLedgerFabricProperties;

    @Bean
    public Gateway gateway() throws Exception {


        BufferedReader certificateReader = Files.newBufferedReader(Paths.get(hyperLedgerFabricProperties.getCertificatePath()), StandardCharsets.UTF_8);

        X509Certificate certificate = Identities.readX509Certificate(certificateReader);

        BufferedReader privateKeyReader = Files.newBufferedReader(Paths.get(hyperLedgerFabricProperties.getPrivateKeyPath()), StandardCharsets.UTF_8);

        PrivateKey privateKey = Identities.readPrivateKey(privateKeyReader);

        Gateway gateway = Gateway.newInstance()
                .identity(new X509Identity(hyperLedgerFabricProperties.getMspId() , certificate))
                .signer(Signers.newPrivateKeySigner(privateKey))
                .connection(newGrpcConnection())
                .evaluateOptions(CallOption.deadlineAfter(5, TimeUnit.SECONDS))
                .endorseOptions(CallOption.deadlineAfter(15, TimeUnit.SECONDS))
                .submitOptions(CallOption.deadlineAfter(5, TimeUnit.SECONDS))
                .commitStatusOptions(CallOption.deadlineAfter(1, TimeUnit.MINUTES))
                .connect();

        log.info("=========================================== connected fabric gateway {} " , gateway);

        return gateway;
    }

    private ManagedChannel newGrpcConnection() throws IOException, CertificateException {
        Reader tlsCertReader = Files.newBufferedReader(Paths.get(hyperLedgerFabricProperties.getTlsCertPath()));
        X509Certificate tlsCert = Identities.readX509Certificate(tlsCertReader);

        return NettyChannelBuilder.forTarget("peer0.org1.example.com:7051")
                .sslContext(GrpcSslContexts.forClient().trustManager(tlsCert).build())
                .overrideAuthority("peer0.org1.example.com")
                .build();
    }

    @Bean
    public Network network(Gateway gateway) {
        return gateway.getNetwork(hyperLedgerFabricProperties.getChannel());
    }

    @Bean
    public Contract catContract(Network network) {
        return network.getContract("hyperledger-fabric-contract-java-demo" , "CatContract");
    }

    @Bean
    public ChaincodeEventListener chaincodeEventListener(Network network) {
        return new ChaincodeEventListener(network);
    }
}

链码事件监听

用来监听交易完成之后通知的事件,事件中可以携带数据。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.hyperledger.fabric.client.ChaincodeEvent;
import org.hyperledger.fabric.client.CloseableIterator;
import org.hyperledger.fabric.client.Network;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;

/**
 * @author he peng
 * @date 2022/3/4
 */

@Slf4j
public class ChaincodeEventListener implements Runnable {

    final Network network;

    public ChaincodeEventListener(Network network) {
        this.network = network;

        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread thread = new Thread(r);
                thread.setDaemon(true);
                thread.setName(this.getClass() + "chaincode_event_listener");
                return thread;
            }
        });

        executor.execute(this);
    }

    @Override
    public void run() {
        CloseableIterator<ChaincodeEvent> events = network.getChaincodeEvents("hyperledger-fabric-contract-java-demo");
        log.info("chaincodeEvents {} " , events);


        while (events.hasNext()) {
            ChaincodeEvent event = events.next();

            log.info("receive chaincode event {} , block number {} , payload {} "
                    , event.getEventName() , event.getBlockNumber() , JSONArray.toJSONString(Base64.decodeBase64(event.getPayload())));

        }
    }
}

异步调用合约

    @PutMapping("/async")
    public Map<String, Object> createCatAsync(@RequestBody CatDTO cat) throws Exception {
        Map<String, Object> result = Maps.newConcurrentMap();

        contract.newProposal("createCat")
                .addArguments(cat.getKey(), cat.getName(), String.valueOf(cat.getAge()), cat.getColor(), cat.getBreed())
                .build()
                .endorse()
                .submitAsync();

        result.put("status", "ok");

        return result;
    }

完整示例代码项目:DevX/hyperledger-fabric-app-java-demo

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hyperledger Fabric是一个面向企业的开源分布式账本技术平台,它以模块化的方式架构,可以在多个利益相关方之间建立信任关系,为企业提供高度安全、可扩展和灵活的区块链解决方案。 Hyperledger FabricJava SDK将Hyperledger Fabric的能力以易于理解的方式呈现给Java开发人员,方便他们构建基于Hyperledger Fabric的分布式应用程序。该SDK包括API和工具,可以让Java开发人员轻松地创建和管理带有身份验证、身份管理和隐私的分布式账本网络。 Hyperledger FabricJava SDK支持以下功能: 1.管理通道:Java开发人员可以使用SDK创建和管理Hyperledger Fabric账本中的通道。通道是指两个或多个组织之间的私有信息流,可确保信息的安全性和隐私性。 2.身份管理:Java开发人员可以使用SDK为Hyperledger Fabric中的参与者创建和管理数字身份。数字身份是指Hyperledger Fabric账本中的参与者的数字表示。 3.创建和部署智能合约:Hyperledger FabricJava SDK支持Java智能合约,并且可以将它们部署到Hyperledger Fabric区块链网络中。 总之,Hyperledger Fabric Java SDK从Java开发人员的角度提供了一个简单易用的抽象层,使他们可以很容易地使用Hyperledger Fabric平台的强大功能。 ### 回答2: Hyperledger Fabric Java 是一种基于 Java 编程语言的区块链开发框架,用于构建分布式应用程序。该框架使用可插入式的共识算法和智能合约引擎,提高了可扩展性和可定制性。Hyperledger Fabric Java 利用面向对象编程和通用 Java 语言的特性,使得区块链的开发更加方便、高效。 Hyperledger Fabric Java 利用 Java 语言优秀的特性,简化了开发过程。它提供了一组 Java API,使得程序员可以在 Hyperledger Fabric 框架上进行区块链应用程序的编写,包括封装了区块链交易、丰富的身份认证、链代码等。此外,由于 Java 运行时环境的跨平台特性,开发人员可以使用 Hyperledger Fabric Java 框架在任何平台上简单地构建区块链解决方案,从而大大提高了开发效率。 Hyperledger Fabric Java 的另一个优点是可以通过低级别 API 来集成底层服务。这些 API 使开发人员可以使用重要的 Hyperledger Fabric 框架服务,例如区块存储、共识模块和交易处理。这样一来,开发人员就可以使用自己熟悉的开发工具和编程语言来创建适合特定需求的区块链应用程序。 总之,Hyperledger Fabric Java 是一种灵活、可扩展的开发框架,具备高度定制化和可插拔性功能,可以大大降低区块链的开发难度。由于其强大的集成能力和开放的架构,该框架广泛应用于企业级区块链项目。 ### 回答3: Hyperledger Fabric是一个可扩展的区块链框架,可以在分布式环境中实现可编程的智能合约。该框架具有高度的灵活性和可定制性,可以根据具体需求进行相应的调整和扩展。Hyperledger Fabric JavaHyperledger Fabric框架的一个实现,其主要作用是在Java环境下开发Hyperledger Fabric应用。 Hyperledger Fabric Java主要使用Java语言和一些与之相关的技术来提供区块链解决方案。开发人员可以使用这个框架来开发和部署区块链应用,如供应链、农业、医疗、金融等领域。该框架提供了完整的开发套件和网络支持,可以与其他Hyperledger Fabric组件交互。 通过Hyperledger Fabric Java,开发人员可以使用Java虚拟机(JVM)来开发和测试应用程序,而无需使用其他语言或环境。该框架提供了许多API和SDK,可以访问Hyperledger Fabric中的数据,使用智能合约,创建新的数据交易和发起交易。此外,该框架还包括一些安全功能,例如身份验证和访问控制,来保护网络中的数据和信息。 Hyperledger Fabric Java还提供了一个模拟网络,可以快速地创建和测试Hyperledger Fabric应用程序。使用该网络,开发人员可以模拟各种场景和条件,以测试其应用程序的可靠性和稳定性。 总之,Hyperledger Fabric Java是一个功能强大、灵活和可扩展的区块链框架。它为开发人员提供了一个全面的开发套件和API,可以帮助他们轻松开发Hyperledger Fabric应用,而无需担心底层技术的实现细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值