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.mzph.cn/bicheng/79902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内容社区系统开发文档

1 系统分析 1.1 项目背景 1.2 需求分析 2 系统设计 2.1 系统功能设计 2.2 数据库设计 2.2.1 数据库需求分析 2.2.2 数据库概念结构设计 2.2.3 数据库逻辑结构设计 2.2.4 数据库物理结构设计 2.2.5 数据库视图设计 2.2.6 函数设计 2.2.7 存储过程设计 2.2.8 触发器…

BigemapPro小技巧:调整线方向及延长线

今天为大家分享两个 BigemapPro 处理矢量数据的小技巧&#xff0c;分别是调整线方向和延长线要素&#xff0c;掌握这些技巧能够大幅提升数据处理的效率和准确性。 01 调整线方向 在BigemapPro中&#xff0c;线要素其实是带有方向属性的&#xff0c;正常情况下看不出来 但是如果…

nt!MiSessionAddProcess函数分析和nt!MmSessionSpace全局变量的关系

第一部分&#xff1a; 1: kd> g Breakpoint 42 hit nt!MiSessionAddProcess: 80ab2fbe 55 push ebp 1: kd> kc # 00 nt!MiSessionAddProcess 01 nt!MmCreateProcessAddressSpace 02 nt!PspCreateProcess 03 nt!NtCreateProcessEx 04 nt!_KiSystemServic…

2025年消防设施操作员考试题库及答案

一、判断题 31.消防用水不作他用的技术措施应每季度进行检查&#xff0c;若发现故障应及时进行处理。&#xff08;&#xff09; 答案&#xff1a;错误 解析&#xff1a;本题考查的是消防水池、高位消防水箱的保养方法。每月检查消防用水不作他用的技术措施&#xff0c;发现故…

Ray开源程序 是用于扩展 AI 和 Python 应用程序的统一框架。Ray 由一个核心分布式运行时和一组用于简化 ML 计算的 AI 库组成

​一、软件介绍 文末提供程序和源码下载 Ray开源程序 是用于扩展 AI 和 Python 应用程序的统一框架。Ray 由一个核心分布式运行时和一组用于简化 ML 计算的 AI 库组成 二、Ray AI 库的更多信息 数据&#xff1a;适用于 ML 的可扩展数据集训练&#xff1a;分布式训练Tune&…

软件设计师-软考知识复习(3)

在磁盘上存储数据的排列方式会影响I/O服务的总时间。假设每个磁道被划分成10个物理块&#xff0c;每个物理块存放1个逻辑记录。逻辑记录R1,R2…R10存放在同一个磁道上&#xff0c;记录的排列从1到10。 假定磁盘的旋转速度为10ms/周&#xff0c;磁头当前处在R1的开始处。若系统…

Unity Editor 扩展:查找缺失的 Image Sprite

在 Unity 开发过程中&#xff0c;缺失的 Sprite 引用&#xff08;特别是在 UI 元素上&#xff09;可能导致程序运行时出现问题&#xff0c;尤其是在使用 Image 组件时。当你拥有多个 Prefab 和大量的 UI 资源时&#xff0c;手动检查每个 Prefab 是否缺失了 Source Image 变得十…

在VTK中使用VTKCamera

文章目录 概要Cpp代码概要 在VTK(Visualization Toolkit)中,vtkCamera 类用于控制三维场景中相机的视角。相机决定了你从哪个角度和位置观察三维场景。使用 vtkCamera 的一般步骤包括创建相机对象、配置相机参数、将相机设置为渲染器的活动相机,以及更新相机视图。 Cpp代…

【Docker系列】使用格式化输出与排序技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

临床智能体AI与环境感知AI的融合:基于python的医疗自然语言处理深度分析

引言 医疗领域的数智化进程正以前所未有的速度推进,人工智能技术的应用尤为显著。随着大型语言模型(LLMs)的迅猛发展,医疗AI已从简单的辅助工具升级为复杂的智能体系统。临床智能体AI与环境感知AI的融合代表了医疗AI的最新发展方向,为重塑医疗运营自然语言处理提供了全新…

JAVA SE(9)——多态

1.多态的概念&作用 多态(Polymorphism)是面向对象编程的三大基本特性之一&#xff08;封装和继承已经讲过了&#xff09;&#xff0c;它允许不同类的对象对同一消息做出不同的响应。具体来说&#xff0c;多态允许基类/父类的引用指向派生类/子类的对象&#xff08;向上转型…

GPS定位方案

目录 一、常用的GPS定位方案包括&#xff1a; 二、主流品牌及热销型号 三、常用GPS算法及核心逻辑&#xff1a; 一、基础定位算法 二、高精度算法 三、辅助优化算法 四、信号处理底层算法 四、基本原理&#xff08;想自己写算法的琢磨一下原理&#xff09; 一、常用的GP…

PCIe - ZCU106(RC) + KU5P(EP) + 固化

目录 1. 简介 1.1 Data Mover 1.2 描述符 2. ZCU102 2.1 Ubuntu OS 2.2 USB Host 2.2.1 连接拓扑 2.2.2 设备类型 2.2.3 USB 跳帽设置 2.3 无线网卡 2.4 PCIe Info 2.4.1 Diagram 2.4.2 lspci -tv 2.4.3 lspci -v 2.4.2.1 设备基本信息 2.4.2.2 控制与状态寄存…

精益数据分析(43/126):媒体网站商业模式的盈利与指标解析

精益数据分析&#xff08;43/126&#xff09;&#xff1a;媒体网站商业模式的盈利与指标解析 在创业和数据分析的学习旅程中&#xff0c;我们不断探索各种商业模式的奥秘&#xff0c;今天让我们一同深入《精益数据分析》&#xff0c;聚焦媒体网站商业模式&#xff0c;剖析其盈…

Android数据库全栈开发实战:Room+SQLCipher+Hilt企业级应用构建

简介 在移动应用开发中,数据库作为数据存储的核心组件,其安全性和性能对企业级应用至关重要。本文将从零开始,全面讲解Android数据库开发的最新技术,包括Room框架的深度使用、SQLCipher加密数据库的实现、Hilt依赖注入的集成以及前后端数据同步的完整方案。通过一个加密任…

HarmonyOS 5.0 低时延音视频开发​​

大家好&#xff0c;我是 V 哥。 在HarmonyOS 5.0的开发中&#xff0c;支持低时延音视频开发&#xff0c;为了确保语法正确&#xff0c; V 哥以下代码符合HarmonyOS NEXT API 14的规范。为了方便初学者更好入门&#xff0c;V 哥伙同2位小伙伴花了1年时间&#xff0c;搞了三本鸿蒙…

微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT

微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT 数据集准备常用数据集自定义数据集AlpacaShareGPT数据集准备 常用数据集 预训练数据集 Wiki Demo (en)RefinedWeb (en)RedPajama V2 (en)Wikipedia (en)Wikipedia (zh)Pile (en)

2025年OpenAI重大架构调整:资本与使命的再平衡

目录 前言 一、调整核心&#xff1a;三重架构的重构 1.1 控制权的重新锚定 1.2 营利部门的角色转型 1.3 资金池的重新配置 二、调整动因&#xff1a;三重矛盾的破解 2.1 资金需求与融资限制的冲突 2.2 商业竞争与使命纯度的博弈 2.3 内部治理与外部监管的张力 三、产…

GD32/STM32 ADC/DMA使用指南

首先我们对ADC及DMA的基础知识作一下简单介绍。 一、 GD32/STM32 ADC模块的核心要点 一&#xff09;、ADC基础特性 ‌12位逐次逼近型‌ GD32/STM32 ADC为12位分辨率&#xff0c;最大量化值为4095&#xff08;对应3.3V参考电压&#xff09;&#xff0c;支持0-3.3V模拟输入范…

Linux(十四)进程间通信(IPC),管道

一、进程间通信 &#xff08;一&#xff09;系统介绍进程间通信 进程间通信&#xff08;IPC&#xff09;介绍 小编插入的这篇文章详细介绍了进程间通信的一些内容&#xff0c;大家可以一起学习。 &#xff08;二&#xff09;进程间通信的方法 1、管道 2、信号量 3、共享…