初衷

java调用fabric智能合约最新的资料不多,小编我摸索了一段时间,成功实现调用。分享一下,能帮助到读者的地方,希望大家祝福我一句,给我点个赞。

环境

本人环境
东西版本
windows11
ubuntu22.04
fabricv2.5.9
jdk21

解释一下:我的电脑是windows11,fabric安装在虚拟机的ubuntu系统上。我用idea编写java代码,用的是Maven环境,使用的是测试网络的示例java链码。

准备工作

1、Ubuntu运行fabric的测试网络,部署链码,给个官方文档,熟悉的可以直接用下面的命令。第一次使用java的示例链码可能要等很久,可以耐心一点。

关闭已经打开的。
./network.sh down

打开新的
./network.sh up

创建通道
./network.sh up createChannel -c mychannel -ca

启动链码
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-java/ -ccl java

2、idea上创建一个项目,项目结构如下。没啥好说的,创建就完事了。项目结构如下。我创建一个项目名字为fabirc的项目,把原始的Main.java文件删除了-这个是纯纯看着烦,创建了一个Example.java文件。

重点来了--在resources文件夹下面有一个org1.example.com文件夹,这个文件夹要在Ubuntu里面拿过来,放在你自己项目的resources文件夹下,OKkkkk  ,给个相对路径吧,就在你的拉取的fabric-samples里面。下面是相对路径哈:     

fabric-samples/test-network/organizations/peerOrganizations/org1.example.com

注意拿出来的时候要拿全,别丢失文件了!!!

正文

1、话不多啥直接上代码。首先是pom.xml。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>fabric</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.hyperledger.fabric</groupId>
            <artifactId>fabric-gateway</artifactId>
            <version>1.6.0</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty-shaded</artifactId>
            <version>1.67.1</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

</project>
2、然后给调用的代码 Example.java, 这边参考的是官方代码,链接放这官方示例

          这个代码里的配置信息特别重要,别搞错了,

       如果项目结构跟我一样,就只需要改一下下面的一个ip地址,我的ubuntu的ip是192.168.87.148,记得要换成你自己的安装了fabric的虚拟机的ip地址。端口号不需要变的。

        项目结构一样的,要自己对应上相应的文件位置。注意本机与虚拟机的连通性,可以ping以下测试测试。

package org.example;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParser;
import io.grpc.ChannelCredentials;
import io.grpc.Grpc;
import io.grpc.ManagedChannel;
import io.grpc.TlsChannelCredentials;
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.InvalidKeyException;
import java.security.PrivateKey;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

import org.hyperledger.fabric.client.*;
import org.hyperledger.fabric.client.identity.Identities;
import org.hyperledger.fabric.client.identity.Identity;
import org.hyperledger.fabric.client.identity.Signer;
import org.hyperledger.fabric.client.identity.Signers;
import org.hyperledger.fabric.client.identity.X509Identity;

public final class Example {
    public static void main(final String[] args)
            throws IOException, CertificateException, InvalidKeyException, GatewayException, CommitException,
            InterruptedException {
        // Create client identity based on X.509 certificate.
        Reader certReader = Files.newBufferedReader(Paths.get("src/main/resources/org1.example.com/users/User1@org1.example.com/msp/signcerts/cert.pem"));
        X509Certificate certificate = Identities.readX509Certificate(certReader);
        Identity identity = new X509Identity("Org1MSP", certificate);

        // Create signing implementation based on private key.
        Reader keyReader = Files.newBufferedReader(Paths.get("src/main/resources/org1.example.com/users/User1@org1.example.com/msp/keystore/cc7c75e70fbbe08b86abc4d0d0c47aadc12284f662a924879ee1d2705cd9b0bf_sk"));
        PrivateKey privateKey = Identities.readPrivateKey(keyReader);
        Signer signer = Signers.newPrivateKeySigner(privateKey);

        // Create gRPC client connection, which should be shared by all gateway connections to this endpoint.
        ChannelCredentials tlsCredentials = TlsChannelCredentials.newBuilder()
                .trustManager(Paths.get("src/main/resources/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt").toFile())
                .build();
        ManagedChannel grpcChannel = Grpc.newChannelBuilder("192.168.87.148:7051", tlsCredentials)
                .overrideAuthority("peer0.org1.example.com")
                .build();
        // Create a Gateway connection for a specific client identity.
        Gateway.Builder builder = Gateway.newInstance()
                .identity(identity)
                .signer(signer)
                .hash(Hash.SHA256)
                .connection(grpcChannel);
        Example aa= new Example();
        try (Gateway gateway = builder.connect()) {
            // Obtain smart contract deployed on the network.
            Network network = gateway.getNetwork("mychannel");
            Contract contract = network.getContract("basic");
            var result = contract.getChaincodeName();
             aa.run(contract);


        } finally {
            grpcChannel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
        }

    }
    public void run(Contract con) throws GatewayException, CommitException {
        System.out.println("\n--> Evaluate Transaction: GetAllAssets, function returns all the current assets on the ledger");

        var result = con.evaluateTransaction("GetAllAssets");

        System.out.println("*** Result: " + prettyJson(result));
    }

    private String prettyJson(final byte[] json) {
        return prettyJson(new String(json, StandardCharsets.UTF_8));
    }
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    private String prettyJson(final String json) {
        var parsedJson = JsonParser.parseString(json);
        return gson.toJson(parsedJson);
    }
}

结尾

打完收工。韩信有红有蓝二级必二杀。额,github密码忘记了,不上传了,祝好运。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐