当前位置: 首页 > web >正文

FISCO BCOS【初体验笔记】

飞梭区块链搭建初体验笔记

    • 环境部署
      • 创建四个节点的飞梭区块链
      • 用的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?

http://www.xdnf.cn/news/4021.html

相关文章:

  • Python 闭包:函数式编程中的魔法变量容器
  • ciscn_2019_c_1
  • 普联的AC100+AP+易展路由组网方案的一些问题
  • docker介绍以及安装
  • sherpa-ncnn:Linux_x86交叉编译Linux_arm32上的sherpa-ncnn -- 语音转文本大模型
  • 蓝桥杯单片机备战笔记
  • 【中间件】brpc_基础_TimerThread
  • 五一假期作业
  • springboot单体项目的执行流程
  • LFU算法解析
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.5 清洗流程自动化(存储过程/定时任务)
  • 【中间件】brpc_基础_单例
  • FreeRTOS学习系列·二值信号量
  • Linux查询日志常用命令
  • 解锁现代健康密码:科学养生新主张
  • 基于PLC的换热器温度控制系统设计
  • 状态模式(State Pattern)
  • 电子商务商家后台运营专员模板
  • C++ 中二级指针的正确释放方法
  • 【KWDB 创作者计划】_Ubuntu 22.04系统KWDB数据库安装部署使用教程
  • Qt中的UIC
  • Amazon Bedrock Converse API:开启对话式AI新体验
  • Qt开发:容器组控件的介绍和使用
  • 20、数据可视化:魔镜报表——React 19 图表集成
  • 408考研逐题详解:2009年第8题
  • Java后端程序员学习前端之CSS
  • Python matplotlib 成功使用SimHei 中文字体
  • 详解RabbitMQ工作模式之发布订阅模式
  • 基于C++实现的深度学习(cnn/svm)分类器Demo
  • Baklib知识中台:智能服务架构新实践