java调用fabric智能合约-Fabric Gateway
java调用fabric智能合约最新的资料不多,小编我摸索了一段时间,成功实现调用。
初衷
java调用fabric智能合约最新的资料不多,小编我摸索了一段时间,成功实现调用。分享一下,能帮助到读者的地方,希望大家祝福我一句,给我点个赞。
环境
东西 | 版本 |
windows | 11 |
ubuntu | 22.04 |
fabric | v2.5.9 |
jdk | 21 |
解释一下:我的电脑是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密码忘记了,不上传了,祝好运。
更多推荐
所有评论(0)