飛梭區塊鏈搭建初體驗筆記
- 環境部署
- 創建四個節點的飛梭區塊鏈
- 用的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?