# Hyperledger Fabric 2.0 java sdk使用入门

By [kk](https://paragraph.com/@qiling) · 2022-08-23

---

概述
--

fabric官方提供的java sdk包含两个项目fabric-sdk-java和fabric-gateway-java，前者用于与fabric网络交互的低级API（比如创建channel、加入channel、安装chaincode等），fabric-sdk-java还包含了fabric-ca client的实现，后者为高级API（主要针对chaincode的调用），fabric-gateway-java使用了fabric-sdk-java的api。

一、fabric-gateway-java的基本用法
--------------------------

依赖

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

官方示例：

    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.concurrent.TimeoutException;
    
    import org.hyperledger.fabric.gateway.Contract;
    import org.hyperledger.fabric.gateway.ContractException;
    import org.hyperledger.fabric.gateway.Gateway;
    import org.hyperledger.fabric.gateway.Network;
    import org.hyperledger.fabric.gateway.Wallet;
    import org.hyperledger.fabric.gateway.Wallets;
    
    class Sample {
        public static void main(String[] args) throws IOException {
        
           // 载入一个存在的持有用户身份的钱包，用于访问fabric网络
            Path walletDirectory = Paths.get("wallet");
            Wallet wallet = Wallets.newFileSystemWallet(walletDirectory);
    
            //Path为fabric网络配置文件的路径
            Path networkConfigFile = Paths.get("connection.json");
    
            // 配置gateway连接用于访问fabric网络（用户和网络配置文件）
            Gateway.Builder builder = Gateway.createBuilder()
                    .identity(wallet, "user1")
                    .networkConfig(networkConfigFile);
    
            // 创建一个gateway连接
            try (Gateway gateway = builder.connect()) {
    
                //根据gateway获取指定的通道网络
                Network network = gateway.getNetwork("mychannel");
                //根据chaincode名称从通道网络中获取智能合约
                Contract contract = network.getContract("fabcar");
    
                // 提交事务 存储到账本
                byte[] createCarResult = contract.createTransaction("createCar")
                        .submit("CAR10", "VW", "Polo", "Grey", "Mary");
                System.out.println(new String(createCarResult, StandardCharsets.UTF_8));
    
                // 从账本中查询状态
                byte[] queryAllCarsResult = contract.evaluateTransaction("queryAllCars");
                System.out.println(new String(queryAllCarsResult, StandardCharsets.UTF_8));
    
            } catch (ContractException | TimeoutException | InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

这里抽象出了钱包、网关的概念，网关即API调用的入口，每个钱包可以存放多个用户身份，构造网关的时候指定钱包其中一个用户。

👌

---

*Originally published on [kk](https://paragraph.com/@qiling/hyperledger-fabric-2-0-java-sdk)*
