热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(Fabric超级账本学习【1】)Fabcar网络调用FabricJavaSDK进行简单开发FabCar

Fabric2.3网络调用Fabric-Java-SDK

Fabric 2.3网络调用Fabric-Java-SDK进行简单开发 FabCar

1、先进入fabcar文件夹
在这里插入图片描述
2、启动网络 ./startFabric.sh down
在这里插入图片描述
启动成功
在这里插入图片描述

3、查看启动情况 docker 镜像
在这里插入图片描述
4、新建SpringBoot工程项目。导入如下Fabric依赖包

<dependency><groupId>org.hyperledger.fabric-sdk-javagroupId><artifactId>fabric-sdk-javaartifactId><version>1.4.7version>
dependency><dependency><groupId>org.hyperledger.fabricgroupId><artifactId>fabric-gateway-javaartifactId><version>2.2.0version>
dependency>

5、工程目录结构如下

在test-network目录下面找到 ordererOraganizations和peerOrganizations在这里插入图片描述
把ordererOraganizations和peerOrganizations复制到你IDEA的resource目录下
在这里插入图片描述
修改 connection.json 网络连接文件
注意&#xff1a;所有的私钥、证书和ip等都要换成自己虚拟机里的或者服务器上的&#xff0c;具体位置如下图所示
在这里插入图片描述

{"name": "basic-network","version": "1.0.0","dependencies": {},"client": {"organization": "Org1","connection": {"timeout": {"peer": {"endorser": "300"},"orderer": "300"}}},"channels": {"mychannel": {"orderers": ["orderer.example.com"],"peers": {"peer0.org1.example.com": {"endorsingPeer": true,"chaincodeQuery": true,"ledgerQuery": true,"eventSource": true},"peer0.org2.example.com": {"endorsingPeer": true,"chaincodeQuery": true,"ledgerQuery": true,"eventSource": true}}}},"organizations": {"Org1": {"mspid": "Org1MSP","peers": ["peer0.org1.example.com"],"certificateAuthorities": ["ca-org1"],"adminPrivateKeyPEM": {"path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/users/Admin&#64;org1.example.com/msp/keystore/5874889f2c0f604d3139e99c215a06c27293759407544fc152f5d91fa7e93303_sk"},"signedCertPEM": {"path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/users/Admin&#64;org1.example.com/msp/signcerts/cert.pem"}},"Org2": {"mspid": "Org2MSP","peers": ["peer0.org2.example.com"],"certificateAuthorities": ["ca-org2"],"adminPrivateKeyPEM": {"path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/users/Admin&#64;org2.example.com/msp/keystore/1382e74e25dfe94a4bc9d98cb6b4083d2fc7de3b7532e24a7f1429e449efacc4_sk"},"signedCertPEM": {"path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/users/Admin&#64;org2.example.com/msp/signcerts/cert.pem"}}},"orderers": {"orderer.example.com": {"url": "grpcs://10.65.93.38:7050","mspid": "OrdererMSP","grpcOptions": {"ssl-target-name-override": "orderer.example.com","hostnameOverride": "orderer.example.com"},"tlsCACerts": {"path": "src/main/resources/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt"},"adminPrivateKeyPEM": {"path": "src/main/resources/crypto-config/ordererOrganizations/example.com/users/Admin&#64;example.com/msp/keystore/648bc99748eaa1e193e037c857bada1fbf75742a3c678a1d8475ba3e102359bb_sk"},"signedCertPEM": {"path": "src/main/resources/crypto-config/ordererOrganizations/example.com/users/Admin&#64;example.com/msp/signcerts/cert.pem"}}},"peers": {"peer0.org1.example.com": {"url": "grpcs://10.65.93.38:7051","grpcOptions": {"ssl-target-name-override": "peer0.org1.example.com","hostnameOverride": "peer0.org1.example.com","request-timeout": 120001},"tlsCACerts": {"path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt"}},"peer0.org2.example.com": {"url": "grpcs://10.65.93.38:9051","grpcOptions": {"ssl-target-name-override": "peer0.org2.example.com","hostnameOverride": "peer0.org2.example.com","request-timeout": 120001},"tlsCACerts": {"path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"}}},"certificateAuthorities": {"ca-org1": {"url": "https://10.65.93.38:7054","grpcOptions": {"verify": true},"tlsCACerts": {"path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem"},"registrar": [{"enrollId": "admin","enrollSecret": "adminpw"}]},"ca-org2": {"url": "https://10.65.93.38:8054","grpcOptions": {"verify": true},"tlsCACerts": {"path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem"},"registrar": [{"enrollId": "admin","enrollSecret": "adminpw"}]}}
}&#96;&#96;&#96;xml

打开hosts文件&#xff0c;添加IP映射

cd c:\\Windows\System32\drivers\etcnotepad .\hosts10.65.93.36 peer0.org1.example.com
10.65.93.36 peer0.org2.example.com
10.65.93.36 orderer.example.com

fabcar.properties文件内容如下&#xff0c;相关目录私钥换成你自己的

# 网络配置文件路径
networkConfigPath &#61; src/main/resources/connection.json
# 用户1&#xff0c;机构2证书路径
certificatePath &#61; src/main/resources/crypto-config/peerOrganizations/org2.example.com/msp/signcerts/cert.pem
# 用户1&#xff0c;机构2证书私钥路径
privateKeyPath &#61; src/main/resources/crypto-config/peerOrganizations/org2.example.com/msp/keystore/003a5bc024c5fa2a284c947a2a13bad77a6485f80e0b79b9bb105a79d275d8d5_sk
# 通道名字
channelName &#61; mychannel
# 链码名字
contractName &#61; fabcar
# 运行端口
server.port&#61;8081

6、核心业务层代码如下&#xff1a;
启动类

package com.hp.fabcar;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;&#64;SpringBootApplication
public class FabcarApplication {public static void main(String[] args) {SpringApplication.run(FabcarApplication.class, args);}}

操作链码的控制层 FabcarController 文件

package com.hp.fabcar.controller;import com.google.common.collect.Maps;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.StringUtils;
import org.hyperledger.fabric.gateway.*;
import org.hyperledger.fabric.sdk.Peer;
import org.springframework.web.bind.annotation.*;import java.util.EnumSet;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeoutException;&#64;RestController
&#64;RequestMapping("/car")
&#64;Slf4j
&#64;AllArgsConstructor
public class FabcarController {final Gateway gateway;final Contract contract;/*根据key查询对应的car*/&#64;GetMapping("/{key}")public Map<String, Object> queryCarByKey(&#64;PathVariable String key) throws GatewayException {Map<String, Object> result &#61; Maps.newConcurrentMap();byte[] queryAssets &#61; contract.evaluateTransaction("QueryCar",key);result.put("payload", StringUtils.newStringUtf8(queryAssets));result.put("status", "ok");return result;}/*查询所有的car*/&#64;GetMapping("/all")public Map<String, Object> queryAllCar() throws GatewayException{Map<String, Object> result &#61; Maps.newConcurrentMap();byte[] queryAllAssets &#61; contract.evaluateTransaction("QueryAllCars");result.put("payload", StringUtils.newStringUtf8(queryAllAssets));result.put("status", "ok");return result;}/*新增一个car的资产*/&#64;PostMapping("/add")&#64;ResponseBodypublic Map<String,Object> createCar(&#64;RequestParam("carnumber")String carnumber,&#64;RequestParam("make")String make,&#64;RequestParam("model")String model,&#64;RequestParam("colour")String colour,&#64;RequestParam("owner")String owner) throws GatewayException, TimeoutException, InterruptedException {Network network &#61; gateway.getNetwork("mychannel");Map<String, Object> result &#61; Maps.newConcurrentMap();byte[] transaction &#61; contract.createTransaction("CreateCar").setEndorsingPeers(network.getChannel().getPeers(EnumSet.of(Peer.PeerRole.ENDORSING_PEER))).submit(carnumber, make, model, colour, owner);result.put("payload", StringUtils.newStringUtf8(contract.evaluateTransaction("QueryCar", carnumber)));result.put("status", "ok");return result;}
}

HyperLedgerFabricGatewayJavaConfig 文件

package com.hp.fabcar.controller;import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.hyperledger.fabric.gateway.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
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.util.Properties;&#64;Configuration
&#64;AllArgsConstructor
&#64;Slf4j
public class HyperLedgerFabricGateway {&#64;Beanpublic Gateway gateway() throws Exception {// 主要读取java的配置文件Properties properties &#61; new Properties();InputStream inputStream &#61; Gateway.class.getResourceAsStream("/fabcar.properties");properties.load(inputStream);String networkConfigPath &#61; properties.getProperty("networkConfigPath");String certificatePath &#61; properties.getProperty("certificatePath");X509Certificate certificate &#61; readX509Certificate(Paths.get(certificatePath));String privateKeyPath &#61; properties.getProperty("privateKeyPath");PrivateKey privateKey &#61; getPrivateKey(Paths.get(privateKeyPath));Wallet wallet &#61; Wallets.newInMemoryWallet();wallet.put("user1", Identities.newX509Identity("Org2MSP", certificate, privateKey));Gateway.Builder builder &#61; Gateway.createBuilder().identity(wallet, "user1").networkConfig(Paths.get(networkConfigPath));Gateway gateway &#61; builder.connect();log.info("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; connected fabric gateway {} ", gateway);return gateway;}/*获取合约的办法*/&#64;Beanpublic Contract fabcar(Gateway gateway) {// 获取mychannel的网络 也就是通道Network network &#61; gateway.getNetwork("mychannel");// 获取contract的链码 名字为fabcarContract contract &#61; network.getContract("fabcar");return contract;}/*获取证书的办法*/private static X509Certificate readX509Certificate(final Path certificatePath) throws IOException, CertificateException {// 通过路径获取到文件 如果成功获取 返回身份识别证书的结果try (Reader certificateReader &#61; Files.newBufferedReader(certificatePath, StandardCharsets.UTF_8)) {return Identities.readX509Certificate(certificateReader);}}/*获取私钥的办法 */private static PrivateKey getPrivateKey(final Path privateKeyPath) throws IOException, InvalidKeyException {// 通过路径获取到文件 如果成功获取 返回身份识别私钥的结果try (Reader privateKeyReader &#61; Files.newBufferedReader(privateKeyPath, StandardCharsets.UTF_8)) {return Identities.readPrivateKey(privateKeyReader);}}
}

启动springboot项目
在这里插入图片描述
7、测试接口

创建一个car如下&#xff0c;成功添加
在这里插入图片描述


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • hyperledger fabric超级账本java sdk样例e2e代码流程分析
    一checkConfigBefore1.1privatestaticfinalTestConfigtestConfigTestConfig.getCo ... [详细]
  • 如果说以比特币为代表的货币区块链技术为1.0,以以太坊为代表的合同区块链技术为2.0,那么实现了完备的权限控制和安全保障的Hyperledger项目毫无疑问代表着区块链技术3.0 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • intellij idea的安装与使用(保姆级教程)
    intellijidea的安装与使用(保姆级教程)IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(gi ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
author-avatar
UTOB
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有