# 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 [](http://www.cnblogs.com/aberic/)
[](https://github.com/aberic/fabric-net-server/tree/1.0-RC2)
[](https://github.com/aberic/fabric-sdk-container/blob/master/LICENSE)
[](https://codebeat.co/projects/github-com-aberic-fabric-net-server-master)
[](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镜像部署,也可以自定义源码二次开发。
由于个人人力实在有限,后面的工程和工作量会逐步变大变多,在保证个人工作顺利的情况下,会将大部分精力都投入到本项目中。
## 项目预览
后台首页界面预览

api执行介绍界面预览

api执行结果及使用方案界面预览

## 版本说明
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。
#### 架构(请无视小图标)

如上图,需要对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/)
## 社群
* 扫微信订阅号加入:

## 入门书籍
[《HyperLedger Fabric开发实战——快速掌握区块链技术》](https://item.jd.com/12381034.html?dist=jd)
[](https://item.jd.com/12381034.html?dist=jd)