安装
脚本基于 Ubuntu,本文中使用的是 Ubuntu 18.04。
配套代码地址:https://github.com/alanhou/blockchain/tree/main/fabric-chaincode-development
考虑国情,有时 github 的连接并不稳定,比如在出现Failed to connect to raw.githubusercontent.com port 443: Connection refused时在/etc/hosts中添加类似如下内容(相应的 ip 可通过https://www.ipaddress.com/等地址查询):
1234 185.199.108.133 raw.githubusercontent.com185.199.109.133 raw.githubusercontent.com185.199.110.133 raw.githubusercontent.com185.199.111.133 raw.githubusercontent.com
环境安装及 Fabric 安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
cd network/setup ./install-prereqs.sh sudo -E ./install-fabric.sh # 验证脚本 ./validate/validate-prereqs.sh ./validate/validate-fabric.sh # 安装govendor并下载示例代码 ./install-gotools.sh # 安装 Hyperledger浏览器 ./install-explorer.sh # 验证脚本 ./validate/validate-explorer.sh # 安装nodejs ./install-node-utils.sh |
基础概念
分布式账本:追踪资产的状态
-
- 真实世界事物的数据化表现(建模)
交易:管理资产状态
- 业务逻辑调用
- 链码用于实现业务逻辑
- 在账本中进行记录
链码(chaincode):暴露一个或多个函数,Fabric 中的智能合约
- 应用以交易的形式执行这些函数
- 有些暴露的函数仅用于读取状态(无法写入)
客户端主要有两大api:invoke 和 query,区别在于前者会作为交易记入账本
链码生命周期
- 由组织Admin 在 peer 节点上独立安装
- peer chaincode install
- 读取 chaincode
- 将链码发到运行中的 peer 节点
- 验证、写入
- 通过交易在通道进行一次实例化
- Peer 节点链码实例化
- Peer(Endorser)读取
- 初始化链码
- 请求事务的广播
- 在区块中发送交易
- 通过交易进行升级
- 独立(手动)从 peer 节点上删除
实例化策略
- 限制可实例化的 peer 组织
- 标识组织的表达式
1OR(‘AcmeMSP.peer’) - 使用peer chaincode package 添加标记进行设置
链码 Docker 容器
- 首次调用(invoke)、查询(query)
- 创建 Docker镜像
- 创建链码容器
- 通过交易的形式升级
- 创建新版本的链码包
- 在 节点上安装新版本的链码
- 通过更新交易将链码升级到新版本
- 所有组织中的 Admin必须手动升级链码至最新版本
- 独立(手动)删除每个节点
- 组织可决定从 peer 节点中删除链码
- 删除链码不会影响到区块链网络或账本(删除需要手动执行,Fabric 不提供相关命令)
开发环境配置脚本
dev-init.sh 初始化开发配置
- 生成 crypto 文件
- 为网络生成配置文件
- 根据参数启动多个容器
- 设置 airline 通道
- -h 显示帮助
- -d 以DEV模式启动peer 节点(默认为 net)
- -c 启动命令行/工具容器
- -s 设置 peer 节点的数据库为 CouchDB
- -e 启动 Hyperledger浏览器容器
dev-validate.sh :安装示例链码、实例化,对 peer 节点进行调用、查询操作;已安装链码添加 skip 参数进行验证
dev-stop.sh:删除容器,但在容器系统中保留账本数据
dev-start.sh:重新启动容器并添加保留的账本数据
dev-mode.sh:在控制台打印启动模式,如Peer Launch Mode=net
设置、显示组织上下文:
1 2 3 4 5 6 |
source set-env.sh show-env.sh # peer channel list # peer channel getinfo -c airlinechannel # peer chaincode list --installed # peer chaincode list --instantiated -C airlinechannel |
启动浏览器
1 2 3 4 |
dev-init.sh -e exp-init.sh # 重置浏览器运行时 exp-stop.sh # 停止浏览器容器 exp-start.sh # 启动浏览器容器 |
链码执行工具
1 2 3 4 |
chain.sh # 执行 peer chaincode 命令,如 chain.sh list set-chain-env.sh # 设置链码参数环境变量,使用未指定参数显示当前设置,管理cc.env.sh中变量 # source set-env.sh acme # set-chain-env.sh -C airlinechannel # -n 链码名称 -v 版本 -p 源码路径 |
安装链码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
. set-env.sh acme set-chain-env.sh -n gocc -v 1.0 -p chaincode_example02 chain.sh package chain.sh install set-chain-env.sh -c '{"Args":["init","a","100","b","300"]}' chain.sh instantiate chain.sh list # 查询 query set-chain-env.sh -q '{"Args":["query","a"]}' chain.sh query # 调用 invoke(转账) set-chain-env.sh -i '{"Args":["invoke","a","b","5"]}' chain.sh invoke # 升级链码 # set-chain-env.sh -v 2.0 chain.sh package # 会升级一个小版本 chain.sh install # 自动打包、升级:chain.sh upgrade-auto |
日志
1 2 |
cc-logs.sh # 显示链码容器的日志, -o 组织名 -p 节点名 -t 打印尾部的行数 -f follow along cc-test.sh # 执行链码的测试脚本 |
net 模式:链码由peer 节点启动
dev 模式:链码由开发者启动
1 2 |
dev-init.sh -d # 仅用于开发 cc-run.sh # 交互式查看结果 |