框架搭建
1.整体目录
整个目录可以分为三个部分,即fabric相关,app相关;其中app分为server后端和web前端。
故创建如下文件夹:fixture、app/server和app/web
1.1 fabric相关(fixture)
这一部分参考自己搭建网络
其中,fabric部分可以:
- 仅保留配置文件、创世块等文件,不需要写网络启动脚本。完全通过go-sdk启动
- 也可以像正常网络一样启动,然后go-sdk仅调用
需要注意的是,第一种方式只需要生成一次创世块等等文件,后续就不要再重新生成了,也无需利用fabric创建通道部署链码等,这些操作都交给sdk;而第二种方式更倾向于一次完整的fabric网络启动,所有的步骤都由fabric脚本完成,而sdk仅负责调用链码,不负责启动fabric网络。
这两种分类是我自己总结出来的,不是非常标准。目前在众多教程中标准的应该是第一种,整个周期比较完整,接口较多,因此这篇教程针对于第一种方式进行一次详细的解释,两种方法是相通的,后续看情况在写第二种方式。
1. cryptogen
编写配置文件crypto-config.yaml
这里采用直接拷贝已有的配置文件,因此不需要重新写。
生成配置文件
cryptogen generate --config=./crypto-config.yaml --output="organizations"
{% asset_img fabric-1.1.png This is an image %}
这时会生成一个crypto-config文件夹,里面包含了所有的组织信息
{% asset_img fabric-1.2.png This is an image %}
2.configtx
同样,可以将已有的configtx拷贝过来
然后对路径进行更改
之后生成相关块
- 生成genesis.block
export FABRIC_CFG_PATH=${PWD}
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block -channelID fabric-channel
{% asset_img fabric-1.3.png This is an image %}
目录中会多出
{% asset_img fabric-1.4.png This is an image %}
- 生成channel.tx
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
{% asset_img fabric-1.5.png This is an image %}
目录中会多出
{% asset_img fabric-1.6.png This is an image %}
- 生成Org1MSPanchors.tx和Org2MSPanchors.tx
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
{% asset_img fabric-1.7.png This is an image %}
目录中会多出
{% asset_img fabric-1.8.png This is an image %}
3.创建peer节点(其他节点同理)
有两种方式 一种是利用core.yaml 一种是利用docker(常用)
在此仅操作docker
因此仅编写docker-compose.yaml
我选择了copy test-network目录下的docker-compose-test文件
但是注意! 需要把所有路径换为自己的路径
- 3.1 开始启动网络
docker-compose up -d
# 上面这条命令需要在docker.yaml路径下,如果不想在该路径下执行,则应该在命令中标注路径,即利用-f参数
# docker-compose -f ./docker/docker-compose-net.yaml up -d
{% asset_img fabric-1.9.png This is an image %}
本地目录此时不会多出相关的东西。
这时,就可以不再操作fabric了,后续的创建通道、部署链码等都可以使用sdk来解决。
1.2 server相关(app/server)
1.2.1 fabric-go-sdk
首先是sdk的使用。
顾名思义,sdk是后端调用的接口,所以首先建如下目录:
{% asset_img fabric-1.10.png This is an image %}
其中,sdkInit是负责连接fabric的代码;router是后端部署、对应接口的代码;models是存放数据结构的代码;api是接口具体实现的代码。main.go则是启动后端的代码;config.yaml是fabric的相关配置信息。
- config.yaml
这个文件一般都是有模板的,前期只需要根据自己的fabric配置进行更改即可,要注意节点名称、路径、通道名称等问题即可。
- sdkInit。
这里可以直接放入写好的代码,一般sdk不怎么需要大的改动。
整个调用过程如下:
2.1. setup
2.2. create channel and join
2.3. create chaincode lifecycle
2.4. invoke chaincode set status
这些的逻辑就是正常启动网络的逻辑,很好理解。
按照此逻辑编写main.go。
(如果想要了解sdk的原理可以上网自己搜索一下,很多讲原理的)
1.2.2 router
写好sdk后,下一步就是写router,这个有点后端基础的同学应该都差不多能看懂,可以参照很多基础教程,这里给一个非常新新手的教程,这个教程中的handlers就是我的api/v1这些。
这里需要注意的是,router中只是声明了有哪些接口,方便前端调用,但是具体的api实现应该在api/v1中实现。
之后只需要在main.go中调用router.init()即可
至此,整个后端就ok了.
终端会显示如图:
{% asset_img fabric-1.11.png This is an image %}
1.3 web
在上面那个教程里有 就不多写了
!!!注意!!!
给的项目中接口没有写,写了的也是写了一半的,你们可以根据自己的链码接口啥的自己重新写