FISCO BCOS【初体验笔记】

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

写在前面,这是我自己的小笔记,内容记得不全,主要是某些核心的步骤和bug的记录。暂时没有这方面深入的打算(纯课题组需求),欢迎交流

环境部署

创建四个节点的飞梭区块链

bash 复制代码
[yuegeyu@localhost fisco]$ bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545

启动四个节点(注意这个目录,执行脚本在127.0.0.1下面)

bash 复制代码
[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底下的环境变量路径

bash 复制代码
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检查一下当前防火墙状态即可

禁用防火墙

bash 复制代码
systemctl disable firewalld

智能合约设计

示例代码

javascript 复制代码
// 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不超过当前的foodItemCount

    logisticsRecordedCount++;  
    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不超过当前的foodItemCount
    FoodItem 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

报错如下:

bash 复制代码
[root@localhost abigen]# go build
# gopkg.in/olebedev/go-duktape.v3
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/dbgsockettransport.go:14:16: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/dbgsockettransport.go:16:15: undefined: DebugRequestFunc
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/dbgsockettransport.go:17:15: undefined: DebugDetachedFunc
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/dbgsockettransport.go:31:30: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/dbgsockettransport.go:33:14: undefined: DebugRequestFunc
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/dbgsockettransport.go:34:15: undefined: DebugDetachedFunc
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/timers.go:11:10: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/timers.go:30:10: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/timers.go:37:20: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/timers.go:63:22: undefined: Context
/opt/go/pkg/mod/gopkg.in/olebedev/[email protected]/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

运行这两行代码就解决啦

bash 复制代码
[root@localhost abigen]# export CGO_ENABLED=1
[root@localhost abigen]# yum install -y gcc  

后端项目配置

项目构建,依赖安装

1.在项目文件夹下构建项目比如在/demo下执行

go 复制代码
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?

相关推荐
chennalC#c.h.JA Ptho34 分钟前
Centos系统详解架构详解
linux·经验分享·笔记·系统架构·系统安全
饕餮争锋38 分钟前
Spring普通配置类 vs 自动配置类-笔记
java·笔记·spring
Aimyon_361 小时前
Java复习笔记-基础
java·开发语言·笔记
吃货界的硬件攻城狮2 小时前
【STM32 学习笔记】ADC数模转换器
笔记·stm32·单片机·学习
~菜鸟笔记~3 小时前
Git笔记
笔记·git
烟水寻常4 小时前
UE5 诺伊腾动捕使用笔记
笔记·ue5
moxiaoran57534 小时前
Python学习笔记--Django的安装和简单使用(一)
笔记·python·学习
Java与Android技术栈5 小时前
OpenCV 笔记(38):同态滤波
人工智能·笔记·opencv·计算机视觉
鸢想睡觉5 小时前
【基础复习笔记】计算机视觉
人工智能·笔记·计算机视觉
riri19195 小时前
学习笔记:数据库——事务
数据库·笔记·学习