如何将 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;或最后&…