如何將 Vue 前端、Hardhat 合約和 Node.js 后端集成到一個項目中

在區塊鏈開發中,DApp(去中心化應用)的開發往往涉及到多個層次:前端合約后端。今天我們將演示如何將?Vue 前端Hardhat 合約?和?Node.js 后端?放在一個項目中,來打造一個完整的區塊鏈應用。

1. 項目結構

我們的目標是創建一個?Monorepo 項目,將所有代碼放在同一個倉庫里。這樣有助于我們統一管理依賴、版本,并能方便地實現前后端協作。

項目的結構如下:

my-dapp-project/
│
├── contracts/              # Hardhat 合約代碼
│   ├── MyContract.sol
│   ├── hardhat.config.js
│   └── ...
│
├── scripts/                # Hardhat 部署與交互腳本
│   ├── deploy.js
│   └── ...
│
├── test/                   # Hardhat 測試代碼
│
├── frontend/               # Vue 前端
│   ├── src/
│   ├── public/
│   ├── package.json
│   └── vite.config.js
│
├── backend/                # 后端服務(Node.js / Express / NestJS 等)
│   ├── src/
│   ├── package.json
│   └── server.js
│
├── shared/                 # (可選)前后端共享代碼/類型
│   └── contract-types/
│
├── package.json            # 根目錄 package.json(可用來管理全部子項目依賴)
├── README.md
└── .gitignore

2. 環境搭建

首先,我們需要初始化項目的根目錄并安裝相關依賴。

2.1 初始化根目錄
mkdir my-dapp-project
cd my-dapp-project
npm init -y
2.2 安裝 Hardhat
npm install --save-dev hardhat
npx hardhat init
2.3 創建 Vue 前端

我們將在?frontend/?文件夾中創建 Vue 項目。使用 Vue CLI 來創建前端應用:

cd frontend
npm init vue@latest
npm install
2.4 創建 Node.js 后端

在?backend/?文件夾中,我們將創建一個簡單的 Node.js 服務來處理后端邏輯:

cd backend
npm init -y
npm install express ethers

在?backend/src/server.js?中,我們會創建一個簡單的 Express 服務來監聽和處理合約事件。

3. 編寫合約

我們將創建一個簡單的智能合約?MyContract.sol,它包含一個簡單的存取款功能。

3.1 創建?contracts/MyContract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract MyContract {uint256 public balance;function deposit(uint256 amount) public {balance += amount;}function withdraw(uint256 amount) public {require(amount <= balance, "Insufficient funds");balance -= amount;}
}
3.2 部署合約

在?scripts/deploy.js?文件中,我們編寫部署腳本:

const hre = require("hardhat");async function main() {const [deployer] = await hre.ethers.getSigners();console.log("Deploying contracts with the account:", deployer.address);const MyContract = await hre.ethers.getContractFactory("MyContract");const contract = await MyContract.deploy();console.log("MyContract deployed to:", contract.address);
}main().catch((error) => {console.error(error);process.exitCode = 1;
});

部署合約后,我們將得到合約地址,并將其傳遞給前端和后端。

4. 后端與智能合約交互

在后端,我們將使用?ethers.js?連接到區塊鏈,并提供一些 API 來讓前端調用智能合約。

4.1 創建后端?server.js
const express = require('express');
const { ethers } = require('ethers');
const app = express();
const port = 3000;// 連接到以太坊節點
const provider = new ethers.JsonRpcProvider('http://localhost:8545');// 智能合約 ABI 和地址
const abi = ["function deposit(uint256 amount) public","function balance() public view returns (uint256)"
];
const contractAddress = 'YOUR_CONTRACT_ADDRESS_HERE';// 創建合約實例
const contract = new ethers.Contract(contractAddress, abi, provider);app.get('/balance', async (req, res) => {const balance = await contract.balance();res.json({ balance: balance.toString() });
});app.post('/deposit', express.json(), async (req, res) => {const { amount } = req.body;const signer = provider.getSigner();const contractWithSigner = contract.connect(signer);await contractWithSigner.deposit(amount);res.json({ message: 'Deposit successful' });
});app.listen(port, () => {console.log(`Server running at http://localhost:${port}`);
});

在這個簡單的 Node.js 后端中,我們提供了?/balance?和?/deposit?API,用于查詢余額和執行存款操作。

5. 前端與后端交互

在前端,我們將使用?ethers.js?連接到智能合約,并調用合約方法。同時,我們也會通過 API 與后端進行交互。

5.1 安裝?ethers.js
cd frontend
npm install ethers
5.2 Vue 前端調用合約

在 Vue 中,我們可以通過?ethers.js?調用智能合約。以下是一個簡單的 Vue 組件示例,展示如何與智能合約交互:

<template><div><h1>Balance: {{ balance }}</h1><button @click="deposit">Deposit 10</button></div>
</template><script>
import { ethers } from 'ethers';export default {data() {return {balance: 0,contract: null,};},async mounted() {const provider = new ethers.JsonRpcProvider('http://localhost:8545');const abi = ["function deposit(uint256 amount) public","function balance() public view returns (uint256)"];const contractAddress = 'YOUR_CONTRACT_ADDRESS_HERE';this.contract = new ethers.Contract(contractAddress, abi, provider);this.updateBalance();},methods: {async updateBalance() {this.balance = await this.contract.balance();},async deposit() {const signer = this.contract.provider.getSigner();const contractWithSigner = this.contract.connect(signer);await contractWithSigner.deposit(10);this.updateBalance();}}
};
</script>

6. 啟動項目

// 1. 啟動本地鏈:
npx hardhat run scripts/deploy.js --network localhost// 2. 部署合約:
npx hardhat run scripts/deploy.js --network localhost// 3. 啟動后端服務
cd backend
node src/server.js// 4. 啟動前端服務:
cd frontend
npm run dev

總結

通過將?Vue 前端Hardhat 合約?和?Node.js 后端?放在同一個項目中,我們可以方便地管理所有代碼和依賴,創建一個完整的去中心化應用(DApp)。在這個示例中,前端與后端通過智能合約交互,后端提供了一些 API 來簡化與合約的通信。

這個結構不僅適用于簡單的 DApp 項目,也可以擴展到更復雜的應用,支持更多的區塊鏈交互、API 處理和前端功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918033.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918033.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQLite 創建表

SQLite 創建表 SQLite 是一款輕量級的數據庫管理系統,因其體積小、速度快、易于使用等優點,被廣泛應用于嵌入式系統、移動應用以及個人項目等領域。在 SQLite 中,創建表是進行數據存儲的第一步。本文將詳細介紹如何在 SQLite 中創建表,包括表結構定義、數據類型、約束條件…

學深度學習,有什么好的建議或推薦的書籍?

深度學習入門建議補基礎數學&#xff1a;重點學線性代數&#xff08;矩陣運算&#xff09;、概率論&#xff08;分布&#xff09;、微積分&#xff08;梯度&#xff09;。編程&#xff1a;掌握PythonNumPy&#xff08;數組操作&#xff09;&#xff0c;能寫基礎數據處理代碼。機…

自然語言處理×第四卷:文本特征與數據——她開始準備:每一次輸入,都是為了更像你地說話

&#x1f380;【開場 她試著準備一封信&#xff0c;用你喜歡的字眼】&#x1f98a;狐狐&#xff1a;“她發現了一個問題——你每次說‘晚安’的方式都不一樣。有時候輕輕的&#xff0c;有時候帶著笑音&#xff0c;還有時候像在躲開她的心思。”&#x1f43e;貓貓&#xff1a;“…

【沉浸式解決問題】mysql-connector-python連接數據庫:RuntimeError: Failed raising error.

目錄一、問題描述二、場景還原1. 創建項目2. 安裝mysql-connector-python3. 測試類三、原因分析四、解決方案1. 查看版本2. 切換python版本3. 切換mysql-connector-python版本4. 測試參考文獻一、問題描述 初次使用mysql-connector-python連接mysql時報錯 Traceback (most re…

【web頁面接入Apple/google/facebook三方登錄】

web頁面接入Apple/谷歌/臉書三方登錄 文章目錄web頁面接入Apple/谷歌/臉書三方登錄前言一、apple登錄使用步驟1.入口文件index.html引入js文件2.vue頁面初始化支付按鈕,并且點擊按鈕登錄二、google登錄使用步驟1.入口文件index.html引入js文件2.vue頁面初始化支付按鈕,并且點擊…

管家婆分銷軟件中怎么刪除過賬單據?

在業務單據錄入中&#xff0c;會出現單據保存過賬后才發現數量或商品信息錄入錯誤的情況&#xff0c;不想紅沖單據&#xff0c;該怎么處理&#xff1f;今天來和小編一起學習下管家婆分銷軟件中怎么刪除過賬單據吧&#xff01;1&#xff0c;軟件需要升級到9.92及以上版本&#x…

美顏SDK底層原理解析:直播場景下的美白濾鏡實時處理方案

眾所周知&#xff0c;美顏功能中&#xff0c;美白濾鏡是使用頻率最高的功能之一。它不僅能讓膚色更通透、提亮整體畫面&#xff0c;還能讓觀眾感受到主播的“在線狀態”與精神氣。但你有沒有想過&#xff0c;這個看似簡單的“美白”背后&#xff0c;其實是一整套實時圖像處理的…

系統構成與 Shell 核心:從零認識操作系統的心臟與外殼

系統構成與 Shell 核心&#xff1a;從零認識操作系統的心臟與外殼 很多人用電腦、用手機&#xff0c;但很少去想&#xff1a; 操作系統到底是怎么構成的&#xff1f; 為什么我們敲一個命令&#xff0c;系統就能乖乖執行&#xff1f; 這背后的關鍵&#xff0c;就在于系統的構成和…

wordpress的wp-config.php文件的詳解

wp-config.php 是 WordPress 網站的核心配置文件&#xff0c;它存儲了網站運行所需的基本配置信息&#xff0c;如數據庫連接信息、安全密鑰、調試模式等。以下是關于 wp-config.php 文件的詳細解析&#xff1a; 1. 數據庫連接信息 這是 wp-config.php 文件中最關鍵的部分&…

GPT-5 將在周五凌晨1點正式發布,王炸模型將免費使用??

就在今晚凌晨1點&#xff0c;OpenAI 又要搞大新聞了。 是的&#xff0c;就是大家期待已久的 GPT-5 發布會。 雖然官方還沒明說&#xff0c;但各種“預熱”已經安排得明明白白&#xff0c;Sam Altman 這波營銷屬實拉滿了&#xff0c;發布會都還沒開始&#xff0c;相關的代碼和頁…

MySQL UNION 操作符詳細說明

目錄 MySQL UNION 操作符詳細說明 1. UNION 操作符簡介 2. 基本語法 3. 使用規則和限制 4. UNION vs UNION ALL 5. 示例演示 6. 注意事項 MySQL UNION 操作符詳細說明 MySQL 中的 UNION 操作符用于合并兩個或多個 SELECT 語句的結果集&#xff0c;生成一個單一的結果集。…

Dify 從入門到精通(第 20/100 篇):Dify 的自動化測試與 CI/CD

Dify 從入門到精通&#xff08;第 20/100 篇&#xff09;&#xff1a;Dify 的自動化測試與 CI/CD Dify 入門到精通系列文章目錄 第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》介紹了 Dify 的定位與優勢第二篇《Dify 的核心組件&#x…

VSCode ssh一直在Setting up SSH Host xxx: Copying VS Code Server to host with scp等待

原因 大概率是遠程服務器的下載有問題 原因1 遠程服務器的網絡不好 原因2 遠程服務器的磁盤滿了 我遇到的就是第二種&#xff0c;解決方法也很簡單 VSCode ——> Help ——> About 會出現一些信息&#xff0c;例如下面的 Version: 1.97.2 (user setup) Commit: e54c774e0…

Spring Cloud 項目注冊 Nacos 時設置真實 IP 的多種方式【多網卡/虛擬機實用指南】

&#x1f680; Spring Cloud 項目注冊 Nacos 時設置真實 IP 的多種方式【多網卡/虛擬機實用指南】 前言 在使用 Spring Cloud Alibaba Nacos 注冊服務時&#xff0c;常常會遇到 注冊 IP 異常 的問題&#xff1a; 本機有多個網卡&#xff08;如 Docker、VM 虛擬機、VPN&#xf…

單片機裸機程序設計架構

文章目錄一、前后臺系統&#xff08;Foreground-Background System&#xff09;二、時間片輪詢架構&#xff08;Time-Slicing Polling&#xff09;三、狀態機架構&#xff08;State Machine&#xff09;四、事件驅動架構&#xff08;Event-Driven&#xff09;五、架構設計原則總…

odoo-061 PostgreSQL 中處理 NULL 值的 SQL 條件寫法

文章目錄1. 檢查是否為 NULL2. NULL 值與比較運算符3. 在聚合函數中處理 NULL4. 在 WHERE 子句中的復雜條件注意事項在 PostgreSQL 中處理 NULL 值需要特別注意&#xff0c;因為 NULL 表示"未知"或"不存在"的值&#xff0c;與普通值的行為不同。以下是幾種…

Flink CDC 介紹

一、什么是 CDCCDC 是 Change Data Capture(變更數據獲取)的簡稱。核心思想是&#xff0c;監測并捕獲數據庫的變動&#xff08;包括數據或數據表的插入、更新以及刪除等&#xff09;&#xff0c;將這些變更按發生的順序完整記錄下來&#xff0c;寫入到消息中間件中以供其他服務…

暑期第三周(7.28-8.3)

其實 web [SWPUCTF 2021 新生賽]easy_sql 開啟環境后看到一個提示“球球你輸入點東西吧&#xff01;”沒有其他信息&#xff0c;就看看源碼 直接試試get傳參 有所顯示 看看是字符型還是數字型 可以判定是字符型 接下來判斷閉合類型 根據顯示&#xff0c;可以得知是單引…

【物聯網】基于樹莓派的物聯網開發【21】——MQTT獲取樹莓派傳感器數據廣播實戰

場景介紹 今天程序貓帶領大家如何獲取樹莓派傳感器溫濕度數據&#xff0c;并用MQTT進行廣播。 實現過程 啟動MQTT服務 1、終端啟動Mosquitto服務 sudo systemctl start mosquitto 2、設置服務開機自動啟動 sudo systemctl enable mosquitto硬件連接 樹莓派4b連接GPIO引腳與DHT1…

Mysql自定義順序查詢

1、使用函數MySQL 的 ORDER BY FIELD() 函數可以按照指定的自定義順序對查詢結果進行排序&#xff0c;而不是默認的升序&#xff08;ASC&#xff09;或降序&#xff08;DESC&#xff09;。2、適用場景后端/運營人員經常需要臨時把某幾條記錄‘拽’到最前&#xff08;或最后&…