Fabric区块链实践搭建简易版
预先准备
环境下载
- WSL2
- Docker (参考Docker常用命令)
- Go
详细可以参考官方文档-预先配置
拉取源码、下载镜像
以2.5.5版本为例子
- 拉取Fabric源码:Fabric
- 拉取Fabric-Sample源码:Fabric-Sample
- 拉取后放置在
\fabric\scripts
下
- 拉取后放置在
- 下载Fabrice编译文件Realse
- 下载名为
hyperledger-fabric-linux-amd64-x.x.x.tar.gz
- 解压后的
bin
和builders
、config
放在\fabric\scripts\sample
下
- 下载名为
拉取镜像1
2
3
4
5
6
7# 需要逐条执行
docker pull hyperledger/fabric-peer
docker pull hyperledger/fabric-orderer
docker pull hyperledger/fabric-ccenv
docker pull hyperledger/fabric-tools
docker pull hyperledger/fabric-baseos
docker pull hyperledger/fabric-ca
启动第一个网络
切换到Fabric\fabric\scripts\fabric-samples\test-network
下
执行./network.sh up
常见报错: 找不到/bin/bash^M
原因:WSL下,shell脚本博主在windows写的,直接copy到了linux中
解决方案:可以使用dos2unix命令
(参考文章)
先安装:sudo apt-get install dos2unix
输入命令dos2unix filename
即可,filename为报错文件
更建议用下面的命令直接全部替换!
1 | !/usr/bin/env bash |
执行./network.sh down
以关闭
部署链码
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
这是一个用于部署区块链智能合约的命令,它使用了Hyperledger Fabric框架,一个开源的区块链平台,用于构建可扩展、企业级的分布式账本技术解决方案。命令的各个部分含义如下:
./network.sh
: 这是一个脚本,可能用于设置、配置或管理一个Hyperledger Fabric网络。deployCC
: 这是脚本中的一个命令,用于部署一个新的智能合约。-ccn basic
: 这里的basic
是智能合约的名称,它指的是basic
智能合约。-ccp ../asset-transfer-basic/chaincode-go
: 这个参数指定了智能合约的代码所在的位置。../asset-transfer-basic/chaincode-go
可能是一个文件路径,指向包含 Go 语言编写的智能合约代码的目录。-ccl go
: 这个参数表明智能合约是用 Go 语言编写的。简单来说,这个命令的作用就是在一个Hyperledger Fabric网络中部署一个名为
basic
的智能合约,该合约的代码是用 Go 语言编写的,并且存放在某个指定路径中。智能合约是区块链系统中的自执行程序,它允许在满足某些条件时在区块链上自动执行预定义的业务逻辑。
常见问题:
代理链接被拒绝
Error: chaincode install failed with status: 500 - failed to invoke backing implementation of 'InstallChaincode': could not build chaincode: docker build failed: docker image build failed: docker build failed: Error returned from build: 1 "go: github.com/golang/protobuf@v1.3.2: Get "https://proxy.golang.org/github.com/golang/protobuf/@v/v1.3.2.mod": dial tcp 172.217.24.17:443: connect: connection refused
使用如下方案
1 | // 第一步:到链码所在的目录下提前下载依赖包 |
之后重启网络部署 重新使用deployCC
指令即可
初始化账本
依次执行下列内容,设置变量1
2
3
4
5
6
7
8
9
10export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
执行下面内容,初始化账本1
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'
执行操作
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
查询分类账
1 | [ |
- 转账操作
1 | peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}' |
输出:1
2024-01-13 23:01:50.539 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 payload:"Michel"
- 查询单个账本
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
输出{"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Christopher","Size":15}
前后端交互
基本概念
链码
链码交互
- peer chaincode upgrade: 用于升级已经部署的智能合约。
- peer chaincode install: 用于将智能合约的二进制文件安装到本地的 peer 节点上。
- peer chaincode invoke: 用于执行智能合约的提交操作,即发起交易。
- peer chaincode query: 用于执行智能合约的查询操作,即执行不改变区块链状态的操作。
- peer chaincode transaction: 这个命令是一个复合命令,包括了部署、提交和查询等多种操作。
- peer chaincode package: 用于创建智能合约的包文件,以便于部署和安装。
- peer chaincode lifecycle: 用于管理智能合约的生命周期,包括 instantiate、upgrade 等操作。
- peer chaincode install: 用于将智能合约的二进制文件安装到本地的 peer 节点上。
项目文件
区块链部分
区块链项目文件长这样——
1 | ├── chaincode # 链码(智能合约) |
启动脚本主要内容:检查镜像是否完整、启动区块链⽹络以及Mysql容器、区块链浏览器的容器、复制私钥文件。启动脚本简化了本项⽬区块链⽹络的启动流程。 这⾥解释⼀下为什么需要复制私钥文件,因为每次区块链⽹络重启后都会重新⽣成私钥文件,区块链浏览器、tape在使⽤时访问Fabric⽹络需要使⽤私钥文件。
启动区块链的核心在于——
1 | # 启动区块链⽹络、创建通道 |
Go是怎么调用的呢?1
2
3
4
5
6var args []string
args = append(args, user.UserID)
args = append(args, c.PostForm("userType"))
args = append(args, user.RealInfo)
res, err := pkg.ChaincodeInvoke("RegisterUser", args)
// "RegisterUser"是连码名,
fabric.go文件介绍
- 配置信息
cryptoPath 直接使⽤相对路径获取blockchain/network的密钥证书材料。其他参考了官⽅给的⽰例代码: assetTransfer.go。使⽤了Fabric Gateway模式连接
1 | const ( |