# fabric-net-server **Repository Path**: sikys/fabric-net-server ## Basic Information - **Project Name**: fabric-net-server - **Description**: HyperLedger/Fabric Net Server - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: http://www.cnblogs.com/aberic/ - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2018-07-01 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **注意:** 这是一个依赖于已经部署好的HyperLedger Fabric项目,关于前者搭建部署的方案可以通过参考[从零开始](https://www.cnblogs.com/aberic/category/1148898.html)或购买[开发实战](https://item.jd.com/12381034.html?dist=jd)等途径学习。Fabric环境部署等都不在当前项目的支持范围内,未来也许会计划开发一套基于Fabric深度定制的一键部署及管理平台(非K8S)。
# Fabric Net Server [![fabric-sdk image](https://img.shields.io/badge/made%20by-aberic-orange.svg)](http://www.cnblogs.com/aberic/) [![version](https://img.shields.io/badge/version-1.0RC2-green.svg)](https://github.com/aberic/fabric-net-server/tree/1.0-RC2) [![apache 2](https://img.shields.io/hexpm/l/plug.svg?longCache=true)](https://github.com/aberic/fabric-sdk-container/blob/master/LICENSE) [![codebeat badge](https://codebeat.co/badges/92aa24de-8a82-432b-83fb-ec7413615952)](https://codebeat.co/projects/github-com-aberic-fabric-net-server-master) [![Join the chat at https://gitter.im/fabric-net-server/Lobby](https://badges.gitter.im/fabric-net-server/Lobby.svg)](https://gitter.im/fabric-net-server/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

本项目目前提供一套Fabric网络后台服务,包括对已经在Fabric网络中创建好的org、peer、channel、chaincode等进行网络新增,并基于已经新增成功的内容提供[REST API](https://github.com/aberic/fabric-net-server/blob/master/API_DEMO.md)服务,目前支持合约安装、实例化、执行、查询以及溯源功能,未来计划支持后台动态加入通道等基于[fabric-sdk-java](https://github.com/hyperledger/fabric-sdk-java)已有接口的实现。

本项目开发环境和框架大致有:IntelliJ IDEA、Maven、JDK8+、spring-boot、thymeleaf以及Docker等。具体实践可使用项目中提供的Docker镜像部署,也可以自定义源码二次开发。

由于个人人力实在有限,后面的工程和工作量会逐步变大变多,在保证个人工作顺利的情况下,会将大部分精力都投入到本项目中。

## 项目预览 后台首页界面预览
![首页视图](https://raw.githubusercontent.com/aberic/fabric-sdk-container/master/img/index.jpeg "Fabric 网络")

api执行介绍界面预览

![首页视图](https://raw.githubusercontent.com/aberic/fabric-sdk-container/master/img/chaincode1.jpeg "Fabric 网络")

api执行结果及使用方案界面预览
![首页视图](https://raw.githubusercontent.com/aberic/fabric-sdk-container/master/img/chaincode2.jpeg "Fabric 网络") ## 版本说明 1、如有源码学习需要的,可以参阅[v0.1](https://github.com/abericyang/fabric-net-server/tree/0.1)或含MySQL数据库的[v0.2](https://github.com/abericyang/fabric-net-server/tree/0.2)版本。
2、从[v1.0-RC](https://github.com/aberic/fabric-net-server/tree/1.0-RC1)开始提供后台视图服务,之前的beta版仅提供接口方案。
3、如有二次开发需求,建议以[v0.1](https://github.com/abericyang/fabric-net-server/tree/0.1)为蓝本。
4、下一版计划实现安装、实例化智能合约及加入通道等功能。

## 版本历史
| version | Description | | :-- | :-- | | [v0.1](https://github.com/aberic/fabric-net-server/tree/0.1) | 无数据库版,适合轻量级的Fabric平台应用。 | | [v0.2](https://github.com/aberic/fabric-net-server/tree/0.2) | 含关系型数据库版,适合单服务管理多Fabric网络。 | | [v1.0-alpha](https://github.com/aberic/fabric-net-server/tree/1.0-alpha) | 提供Docker容器服务,方便SDK快速部署。此版本为单排序服务及单节点服务配置,符合绝大部分需求。 | | [v1.0-beta](https://github.com/aberic/fabric-net-server/tree/1.0-beta) | 新增支持多服务节点。 | | [v1.0-beta2](https://github.com/aberic/fabric-net-server/tree/1.0-beta2) | 修复重新新增组织、排序服务和节点服务的bug;提供更新组织、排序服务和节点服务的接口;新增Swagger2文档支持。| | [v1.0-beta3](https://github.com/aberic/fabric-net-server/tree/1.0-beta3) | 删除docker-sdk.yaml环境变量配置,取消hash标识(容易被误会),细化Fabric网络及数据库结构,简化启动脚本。| | [v1.0-RC1](https://github.com/aberic/fabric-net-server/tree/1.0-RC1) | 提供后台视图服务,结构解耦度高,相对灵活,需部署多镜像 | | [v1.0-RC2](https://github.com/aberic/fabric-net-server/tree/1.0-RC2) | 新增智能合约安装、实例化功能,结构增加耦合,部署难度降低 |


## 使用 1、确定Linux内核在`3.10`及以上。
2、在待部署SDK服务器上安装`Docker`及`docker compose`环境。
3、执行`docker pull aberic/fabric-edge:1.0-RC2`下载镜像。
4、编辑`docker-fabric-net-server.yaml`,主要目的就是选择你所计划启用的物理机端口号。
5、执行`docker-compose -f docker-fabric-net-server.yaml up`启动镜像,如不需要观察日志,则在命令最后追加`-d`即可。
6、服务启动完成后,通过http://localhost:port 访问即可。
7、后台部署可参考由微信群的[Larryleo5](https://github.com/Larryleo5)编写的[详细说明文档](https://github.com/aberic/fabric-net-server/blob/master/operationDocument.md)。

#### docker-fabric-net-server.yaml说明 ```yaml version: '2' services: edge: container_name: edge image: aberic/fabric-edge command: bash /home/init-edge.sh ports: - 8080:8080 ``` 1、上述配置主要关注自己的端口映射,edge的端口号决定了项目访问的最终地址。
2、yaml启动需要指定镜像版本号,或tag镜像版本号为latest。

#### 架构(请无视小图标) ![FabricNet](https://raw.githubusercontent.com/aberic/fabric-sdk-container/master/img/FabricNet.png "Fabric 网络")
如上图,需要对Fabric网络有一个简单的理解一致,并对以下几个点说明一下:
1、一个Fabric网络即是一个league(联盟链),一个league包含一个或多个org(组织)且含有不少于一个orderer(排序服务),一个org包含一个或多个peer(节点服务),一个peer可以加入一个或多个channel(通道),一个channel可以安装一个或多个chaincode(智能合约)。
2、根据1所述,仅有league对象集合查询不需要指定id。org集合查询需要指定联盟id,orderer及peer集合查询需要指定orgId,channel集合查询需要指定peerId,chaincode集合查询需要指定channelId。
3、可以根据某一个chaincode逆向查出该chaincode的整个league网络,因此执行state和trace接口时只需要传入chaincodeId即可。
4、执行state接口中的`strArray`是调用Fabric网络中部署的chaincode所传入的参数,在用go编写chaincode的时候,chaincode所接收的参数为一个字符串数组,其中字符串数组的第一个参数是chaincode的方法名。chaincode接口中的args所传入的参数就是智能合约所接收的数组参数。如[chaincode_example02](https://github.com/aberic/fabric-net-server/blob/master/chaincode_example02/chaincode_example02.go)中执行invoke时传入的参数为`["invoke", "a", "b", "10"]`,那么在本项目中执行state接口时传入的参数即为`[invoke,a,b,10]`,与Fabric网络中安装的chaincode所需参数保持一致,实现与业务解耦,仅用于维护Fabric项目和做业务与chaincode的桥梁,不参与实际业务当中。
5、执行trace接口可使用项目中在chaincode管理中提供的测试工具进行测试,上一步中的操作也可以通过该方法测试,测试结果会将正确的请求方式显示出来,以便对外提供服务。
6、Fabric网络新增操作必须遵循第2点所述,即必须从league开始新增,直到最后新增chaincode。
7、新增org中需要上传用`zip`压缩的`crypto-config`目录,`crypto-config`是[二进制](https://www.cnblogs.com/aberic/p/7542835.html)生成的证书文件目录。目录下的内容可参考[crypto-config.dir](https://github.com/aberic/fabric-net-server/tree/master/crypto-config),配置方案可参考[crypto-config](https://github.com/aberic/fabric-sdk-container/blob/master/yaml_config_from/crypto-config.yaml)。

#### 对象新建字段部分释义 league、org、orderer、peer、channel及chaincode中后台创建所需的字段有如下表中释义:
| Params | Description | Map | | :-- | :-- | :-- | | ORG_NAME | 节点所属组织名称 | 参见[crypto-config](https://github.com/aberic/fabric-sdk-container/blob/master/yaml_config_from/crypto-config.yaml)文件中 -> PeerOrgs-Name | | ORG_TLS | 节点是否开启TLS | 根据自身创建网络情况选择true或false | | ORG_USERNAME | 节点所属组织用户名称 | 参见[crypto-config](https://github.com/aberic/fabric-sdk-container/tree/master/crypto-config/peerOrganizations/org1.example.com/users)目录下的两个用户,默认配置中选择的Admin | | ORG_CRYPTO_CONFIG_DIR | 映射到容器中的crypto-config目录 | 即[crypto-config](https://github.com/aberic/fabric-sdk-container/tree/master/crypto-config/peerOrganizations/org1.example.com/users)目录 | | ORG_MSP_ID | 节点所属组织ID | 参见[configtx](https://github.com/aberic/fabric-sdk-container/blob/master/yaml_config_from/configtx.yaml)文件中 -> Organizations-&Org1-Name | | ORG_DOMAIN_NAME | 节点所属组织域名名称 | 参见[crypto-config](https://github.com/aberic/fabric-sdk-container/blob/master/yaml_config_from/crypto-config.yaml)文件中 -> PeerOrgs-Domain | | ORG_ORDERER_DOMAIN_NAME | 节点所属排序服务域名名称 | 参见[crypto-config](https://github.com/aberic/fabric-sdk-container/blob/master/yaml_config_from/crypto-config.yaml)文件中 -> OrdererOrgs-Domain | | ORDERER_NAME | 排序服务名称 | 参见[configtx](https://github.com/aberic/fabric-sdk-container/blob/master/yaml_config_from/configtx.yaml)文件中 -> Orderer-Addresses | | ORDERER_LOCATION | 排序服务访问路径 | 根据自身设置实际情况修改,一般为`grpc://host:port`的格式 | | PEER_NAME | 节点服务域名名称 | 参见[crypto-config](https://github.com/aberic/fabric-sdk-container/tree/master/crypto-config/peerOrganizations/org1.example.com/peers)目录下的节点域名列表 | | PEER_EVENT_HUB_NAME | 节点服务事件域名名称 | 同上 | | PEER_LOCATION | 节点服务路径 | 根据自身设置实际情况修改,一般为`grpc://host:port`的格式 | | PEER_EVENT_HUB_LOCATION | 节点服务事件路径 | 根据自身设置实际情况修改,一般为`grpc://host:port`的格式 | | PEER_IS_EVENT_LISTENER | 节点所属组织名称 | 根据自身需求选择是否监听回调服务 | | CHANNEL_NAME | 自行创建的通道名称 | 如:`peer channel create -o orderer.example.com:7050 -c mychannel -t 50 -f ./channel-artifacts/mychannel.tx` 命令所创建的mychannel | | CHAINCODE_NAME | 智能合约名称 | 如:`peer chaincode install -n testcc -p github.com/hyperledger/fabric/aberic/chaincode/go/chaincode_example02 -v 1.0 `命令所创建的testcc | | CHAINCODE_PATH | 智能合约路径 | 如:`peer chaincode install -n testcc -p github.com/hyperledger/fabric/aberic/chaincode/go/chaincode_example02 -v 1.0 `命令中的github.com/hyperledger/fabric/aberic/chaincode/go/chaincode_example02 | | CHAINCODE_VERSION | 智能合约版本 | 如:`peer chaincode install -n testcc -p github.com/hyperledger/fabric/aberic/chaincode/go/chaincode_example02 -v 1.0 `命令中的1.0 | | CHAINCODE_PROPOSAL_WAIT_TIME | 单个提案请求超时时间以毫秒为单位 | 默认90000 | | CHAINCODE_INVOKE_WAIT_TIME | 事务等待时间以秒为单位 | 默认120 |
**API参考** | Method | REST API | Description | | :--: | :-- | :-- | | POST | /state/invoke | 执行智能合约 | | POST | /state/query | 查询智能合约 | | POST | /trace/hash | 根据交易hash查询区块 | | POST | /trace/number | 根据交易区块高度查询区块 | | POST | /trace/txid | 根据交易ID查询区块 | | GET | /trace/info/{id} | 根据当前智能合约id查询当前链信息 | 如果有SaaS/BaaS服务的紧急需求,可以自行参考[v0.1](https://github.com/abericyang/fabric-net-server/tree/0.1)中的方案来解决。
## 讨论 * [HyperLedger/Aberic](http://www.cnblogs.com/aberic/)
## 社群 * 扫微信订阅号加入:
![HLFStudy](https://images2017.cnblogs.com/blog/1240530/201802/1240530-20180201103733812-1730907548.jpg "HLFStudy 微信订阅号")
## 入门书籍 [《HyperLedger Fabric开发实战——快速掌握区块链技术》](https://item.jd.com/12381034.html?dist=jd)
[![HyperLedger Fabric开发实战](https://images2018.cnblogs.com/blog/1240530/201806/1240530-20180614234142771-2017750800.png "HyperLedger Fabric开发实战")](https://item.jd.com/12381034.html?dist=jd)