FISCO BCOS【初体验笔记】


写在前面,这是我自己的小笔记,内容记得不全,主要是某些核心的步骤和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不超过当前的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
报错如下:

[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?

FISCO BCOS是一个基于联盟链技术的企业级区块链平台。通过FISCO BCOS,可以搭建单一群组的FISCO BCOS链联盟。 首先,要搭建FISCO BCOS链联盟,需要进行以下几个步骤。 第一步,准备环境。搭建FISCO BCOS链联盟需要一台可用的服务器,可以选择云服务器或物理服务器。同时,需要安装和配置必要的软件和环境,包括操作系统、Java开发环境、MySQL数据库等。 第二步,下载FISCO BCOS源代码。可以从FISCO BCOS官方网站下载最新版的FISCO BCOS源代码,并解压到服务器上的指定目录。 第三步,配置节点参数。进入解压后的FISCO BCOS源代码目录,修改config目录下的节点配置文件,配置节点的IP地址、端口号、节点类型等信息。 第四步,生成节点证书。在源代码目录下的nodes目录中,使用FISCO BCOS提供的脚本工具生成节点的证书和私钥。 第五步,初始化创世块。在源代码目录下,使用FISCO BCOS提供的脚本工具初始化创世块,并设置相关的参数,如创世节点的账户余额、链 ID、共识算法等。 第六步,启动节点。进入源代码目录下的script目录,执行启动节点的脚本命令,启动FISCO BCOS链联盟的节点。 通过以上步骤,就可以成功搭建单一群组的FISCO BCOS链联盟。在链联盟中,各个节点可以进行交易和通信,实现数据的共享和验证。需要注意的是,在搭建和操作FISCO BCOS链联盟时,要确保网络安全和相应的权限控制,保护链上数据的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值