飞梭区块链搭建初体验笔记
- 环境部署
- 创建四个节点的飞梭区块链
- 用的VMware17 centos 7.9 区块链是飞梭2.0用的webase-front
- Java环境的正确安装
- Webase-front搭建
- 智能合约设计
- 一点合约调试笔记
- 智能合约abi文件转为go文件
- 后端项目配置
- 相关工具
- linux常用命令(防忘记)
- centos7.9相关
- 更换国内镜像源
写在前面,这是我自己的小笔记,内容记得不全,主要是某些核心的步骤和bug的记录。暂时没有这方面深入的打算(纯课题组需求),欢迎交流
环境部署
创建四个节点的飞梭区块链
[yuegeyu@localhost fisco]$ bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545
启动四个节点(注意这个目录,执行脚本在127.0.0.1下面)
[yuegeyu@localhost 127.0.0.1]$ bash start_all.sh
用的VMware17 centos 7.9 区块链是飞梭2.0用的webase-front
参照官网文档搭建第一个区块链,
启动区块各个节点:bash start_all.sh
同理,停止各个节点则执行stop脚本: bash stop_all.sh
Java环境的正确安装
jdk-8u201-linux-x64.tar.gz的下载看这个文章
在etc/profile底下的环境变量路径
export JAVA_HOME=/home/yuegeyu/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
这个输出就装好了
Webase-front搭建
参照官网教程进行搭建
复制fisco/nodes/127.0.0.1当中的认证到webase-front/conf/下,再行启动,webase-front通过5002端口启动
这部分直接在虚拟机终端去启动webase-front(bash start.sh)就会显示权限不够,回到远程这里却可以。因为远程是登录的root的吧,终端没有使用管理员权限应该。
搭建完成后找到虚拟机ip
之后关闭centos防火墙
【解决记录】:视频中只做了禁用自启动操作,应该再systemctl stop firewalld一下,通过systemctl status firewalld检查一下当前防火墙状态即可
禁用防火墙
systemctl disable firewalld
智能合约设计
示例代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.10;
// 开启 ABIEncoderV2 支持
pragma experimental ABIEncoderV2; //solidity版本较低,支持变长数组contract FoodTrace { struct FoodItem { uint id; //食品id unit无符号整型string name; //食品名 address producer; //生产者 address区块链地址string details; //细节 string[] logisticsRecords; // 物流记录 bool logisticsRecorded; // 记录物流信息的状态 } address public owner; // 合约的拥有者 uint public logisticsRecordedCount; // 记录已注册物流信息的食品数 uint public foodItemCount; // 食品项计数mapping(uint => FoodItem) public foodItems; // 食品项存储 mapping(address => bool) public logisticsProviders; // 存储注册的物流方地址 // 事件定义 event FoodRegistered(uint id, string name, address producer); event LogisticsUpdated(uint id, string logisticsInfo); event LogisticsProviderRegistered(address provider); // 新事件 // 构造函数,设置合约的拥有者 constructor() public { owner = msg.sender; // 设定合约创建者为拥有者 } // 仅允许拥有者执行某些操作 modifier onlyOwner() { require(msg.sender == owner, "Only owner can call this function"); _; } // 注册物流方 function registerLogisticsProvider(address _provider) public onlyOwner { logisticsProviders[_provider] = true; // 注册物流方 emit LogisticsProviderRegistered(_provider); // 触发事件 } // 食品生产方注册食品 function registerFood(string memory _name, string memory _details) public onlyOwner{ foodItemCount++; foodItems[foodItemCount] = FoodItem({ id: foodItemCount, name: _name, producer: msg.sender, details: _details, logisticsRecords: new string[](0), // 初始化物流记录为空数组 logisticsRecorded: false // 默认未记录物流信息 }); emit FoodRegistered(foodItemCount, _name, msg.sender); } // 物流管理方记录食品物流信息 function updateLogistics(uint _foodId, string memory _logisticsInfo) public { require(foodItems[_foodId].id != 0, "Food item does not exist"); // 确保食品存在 require(logisticsProviders[msg.sender], "Not a registered logistics provider"); // 验证调用者是否是注册的物流方 require(_foodId <= foodItemCount, "Food ID exceeds the current food item count");//确保输入的ID不超过当前的foodItemCountlogisticsRecordedCount++; foodItems[_foodId].logisticsRecords.push(_logisticsInfo); // 添加物流信息 foodItems[_foodId].logisticsRecorded = true; // 设置为已记录物流信息 emit LogisticsUpdated(_foodId, _logisticsInfo); } // 用户查看食品记录 function getFoodInfo(uint _foodId) public view returns (string memory, address, string memory, string[] memory, bool) { require(foodItems[_foodId].id != 0, "Food item does not exist"); // 确保食品存在 require(_foodId <= foodItemCount, "Food ID exceeds the current food item count");//确保输入的ID不超过当前的foodItemCountFoodItem memory foodItem = foodItems[_foodId]; return (foodItem.name, foodItem.producer, foodItem.details, foodItem.logisticsRecords, foodItem.logisticsRecorded);//返回食品信息和物流状态 }
}
一点合约调试笔记
由于添加物流主的函数是限定onlyowner 才能执行,也就是食品从产商yuegeyu(自己起的名儿,部署合约的时候用的账号),所以需要yuegeyu调用添加物流主的函数才能添加物流主
所以provider部分填写的是物流主JDwang的哈希地址
JDwang成为物流主后拥有添加食品物流的权限
于是可以给包子添加物流信息
物流添加后的回执
智能合约abi文件转为go文件
安装abigen,目的是将合约的abi文件转换为go文件
期间有一个依赖的bug,可能是相关的设置没有打开,也可能是需要一个C编译器CGO
报错如下:
[root@localhost abigen]# go build
# gopkg.in/olebedev/go-duktape.v3
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/dbgsockettransport.go:14:16: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/dbgsockettransport.go:16:15: undefined: DebugRequestFunc
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/dbgsockettransport.go:17:15: undefined: DebugDetachedFunc
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/dbgsockettransport.go:31:30: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/dbgsockettransport.go:33:14: undefined: DebugRequestFunc
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/dbgsockettransport.go:34:15: undefined: DebugDetachedFunc
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/timers.go:11:10: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/timers.go:30:10: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/timers.go:37:20: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/timers.go:63:22: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/go-duktape.v3@v3.0.0-20200619000410-60c24ae608a6/timers.go:63:22: too many errors
[root@localhost abigen]# go env CGO_ENABLED
0
[root@localhost abigen]# go list -m gopkg.in/olebedev/go-duktape.v3
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6
运行这两行代码就解决啦
[root@localhost abigen]# export CGO_ENABLED=1
[root@localhost abigen]# yum install -y gcc
后端项目配置
项目构建,依赖安装
1.在项目文件夹下构建项目比如在/demo下执行
go mod init demo
然后
go mod tidy
相关工具
MobaXterm连接虚拟机
linux常用命令(防忘记)
查询ip:ip a
文件编辑:vim 文件名
进入编辑模式 : i
保存并退出:先按Esc退出编辑,然后输入:wq
回车后退出
管理员权限:命令前加sudo,或者直接切换管理员身份:su -
,然后填写密码即可
centos7.9相关
更换国内镜像源
不更换的话默认的镜像源无法安装git、go环境
参照这个笔记更换阿里云镜像源:https://blog.csdn.net/m0_51691302/article/details/120244799?