当前位置: 首页 > article >正文

NodeJS全栈WEB3面试题——P4Node.js后端集成 服务端设计

4.1 如何在 Node.js 中管理钱包与私钥的安全性?

  • 私钥管理原则:不暴露,不硬编码,不明文存储。

常见做法:

  1. 加密存储

    • 使用 cryptoethers.Wallet.encrypt() 加密私钥,存储到数据库或文件系统。

  2. 环境变量管理

    • 临时使用的热钱包可通过 .env 文件注入私钥(仅用于测试环境)。

  3. 密钥管理系统(KMS)

    • 在生产环境建议集成 AWS KMS、Google Secret Manager 等服务。

  4. 冷热钱包分离

    • 大额资产使用冷钱包手动签名;在线服务仅用热钱包处理小额自动化任务。

  5. 权限控制与日志审计

    • 加密模块、操作接口设权限访问,记录每次钱包操作行为日志。


4.2 如何用 NestJS 或 Express 实现 Web3 登录(签名 + 验证)?

Web3 登录基于钱包签名 + 后端验签,流程如下:

✅ 登录流程:
  1. 前端请求 nonce(防重放攻击);

  2. 用户用钱包签名 nonce

  3. 后端用公钥恢复地址进行验证

  4. 验证通过后返回 JWT 登录令牌

🔧 Express 示例代码:
// 后端生成 nonce
app.get("/auth/nonce", (req, res) => {const nonce = crypto.randomBytes(16).toString("hex");// 将 nonce 保存到数据库或 session 中res.send({ nonce });
});// 后端验证签名
app.post("/auth/verify", async (req, res) => {const { address, signature, nonce } = req.body;const msg = `Login nonce: ${nonce}`;const recovered = ethers.utils.verifyMessage(msg, signature);if (recovered.toLowerCase() === address.toLowerCase()) {const token = jwt.sign({ address }, JWT_SECRET, { expiresIn: "1h" });res.send({ token });} else {res.status(401).send("Invalid signature");}
});

✅ NestJS 实现类似,建议封装为 AuthService + JwtModule 组件。


4.3 如何设计一个支持 NFT 铸造和转移的后端服务?

✅ 功能设计:
  1. POST /mint:铸造 NFT(上传 metadata,调用合约 mint)

  2. POST /transfer:转移 NFT

  3. GET /nft/:address:获取某地址所有 NFT(链上查或 GraphQL 索引)

💡 核心模块:
  • IPFS 服务:上传图片/metadata(用 Pinata、web3.storage)

  • Ethers.js / Web3.js:与合约交互

  • 数据库:保存 NFT 记录、用户历史(可选)

  • 队列处理:大批量 mint 使用 Bull + Redis 队列,防止阻塞

🧱 示例:NFT 铸造伪代码
// mint.service.ts
async mintNFT(to: string, metadataUri: string) {const tx = await this.contract.mint(to, metadataUri);const receipt = await tx.wait();return receipt;
}

4.4 如何实现一个基于区块链的积分 / 投票系统?

✅ 积分系统思路:
  • 链上部署积分合约(类似 ERC-20)

  • 后端记录用户行为并触发链上转账积分

  • 可视化积分排行榜(通过事件或轮询)

✅ 投票系统设计:
  • 合约设计:

    • 创建提案、投票(基于 NFT、Token 权重)

    • 投票结束后链上自动执行结果或记录

示例合约接口:
function createProposal(string memory desc) public returns (uint);
function vote(uint proposalId, bool support) public;
function getProposalResult(uint proposalId) public view returns (bool);
后端功能模块:
  1. 创建提案:POST /proposal

  2. 发起投票:POST /vote

  3. 查询结果:GET /proposal/:id/result

🔐 可以结合 Web3 登录身份 + JWT + Gasless relay(使用 Biconomy、OpenZeppelin Defender)降低参与门槛。


4.5 如何处理与链上异步数据交互(如确认交易、轮询区块)?

常见场景:
  • 等待交易确认

  • 监听合约事件

  • 获取最新区块/交易状态

✅ 方法1:等待交易确认(ethers.js
const tx = await contract.doSomething();
const receipt = await tx.wait();  // 等待确认
✅ 方法2:监听事件(实时)
contract.on("Transfer", (from, to, value, event) => {console.log("Detected transfer event:", from, to, value.toString());
});
✅ 方法3:轮询区块变化(定时)
setInterval(async () => {const block = await provider.getBlockNumber();console.log("Latest block:", block);
}, 5000);
✅ 方法4:使用任务队列处理交易状态(异步处理)
  • 使用 Bull 队列监听待确认交易

  • 用状态机标记交易是否成功、失败、超时

  • 后端数据库记录每笔操作状态


📌 总结:
Node.js 后端 Web3 集成重点是:

  • 安全地管理私钥

  • 提供签名验证类登录机制

  • 搭建与合约交互的服务接口

  • 处理链上异步状态,如事件、交易确认

  • 结合队列与数据库保障稳定性和数据一致性

相关文章:

NodeJS全栈WEB3面试题——P4Node.js后端集成 服务端设计

4.1 如何在 Node.js 中管理钱包与私钥的安全性? 私钥管理原则:不暴露,不硬编码,不明文存储。 常见做法: 加密存储: 使用 crypto 或 ethers.Wallet.encrypt() 加密私钥,存储到数据库或文件系统…...

SQL进阶之旅 Day 12:分组聚合与HAVING高效应用

【SQL进阶之旅 Day 12】分组聚合与HAVING高效应用 在SQL的世界里,分组聚合(Grouping and Aggregation)是处理大规模数据集时最常用的技术之一。它允许我们将数据按照某些列进行分类,并对每个分类进行统计计算。而 HAVING 子句则是…...

深入剖析C#构造函数执行:基类调用、初始化顺序与访问控制

导言 在面向对象编程中,理解对象构造过程至关重要。C#的构造函数执行遵循严格的顺序规则,尤其是涉及继承和成员初始化时。本文将深入解析构造函数的执行流程、初始化语句的妙用以及类访问修饰符的影响,助你写出更健壮、可维护的代码。 构造…...

Java 大数据处理:使用 Hadoop 和 Spark 进行大规模数据处理

Java 大数据处理:使用 Hadoop 和 Spark 进行大规模数据处理 在当今数字化时代,数据呈现出爆炸式增长,如何高效地处理大规模数据成为企业面临的重要挑战。Java 作为一门广泛使用的编程语言,在大数据处理领域同样发挥着关键作用。本文将深入探讨如何利用 Hadoop 和 Spark 这…...

使用Python绘制节日祝福——以端午节和儿童节为例

端午节 端午节总算是回家了,感觉时间过得真快,马上就毕业了,用Python弄了一个端午节元素的界面,虽然有点不像,祝大家端午安康。端午节粽子(python)_python画粽子-CSDN博客https://blog.csdn.net…...

探索大语言模型(LLM):参数量背后的“黄金公式”与Scaling Law的启示

引言 过去十年,人工智能领域最震撼的变革之一,是模型参数量从百万级飙升至万亿级。从GPT-3的1750亿参数到GPT-4的神秘规模,再到谷歌Gemini的“多模态巨兽”,参数量仿佛成了AI能力的代名词。但参数真的是越多越好吗?这…...

Excel to JSON 插件 2.4.0 版本更新

我们很高兴地宣布 Excel to JSON 插件已升级到 2.4.0 版本!本次更新带来了两项重要功能,旨在为您提供更大的灵活性和更强大的数据处理能力。 主要更新内容: 1. 用户可以选择从行或列中选择标题 在之前的版本中,插件通常默认从第…...

黑马点评后端笔记

1.基于Session实现登录流程 发送验证码: 先前端校验,后端再校验(防小人),合法生成验证码(RandomUtil生成),后端保存,在通过短信去发送给用户 短信验证码登录和注册: 拿到验证码和手机号后,后端通过session(spring mvc注入)拿到验证码,进行校验,如果用户…...

C#项目07-二维数组的随机创建

实现需求 创建二维数组,数组的列和宽为随机,数组内的数也是随机 知识点 1、Random类 Public Random rd new Random(); int Num_Int rd.Next(1, 100);2、数组上下限。 //定义数组 int[] G_Array new int[1,2,3,4];//一维数组 int[,] G_Array_T …...

光伏功率预测 | LSTM多变量单步光伏功率预测(Matlab完整源码和数据)

光伏功率预测 | MATLAB实现基于LSTM长短期记忆神经网络的光伏功率预测 目录 光伏功率预测 | MATLAB实现基于LSTM长短期记忆神经网络的光伏功率预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 光伏功率预测 | LSTM多变量单步光伏功率预测(Matlab完整源码和…...

解锁 AI 大语言模型的“知识宝藏”:知识库的奥秘与优化之道

1. 知识库在 AI 大语言模型中的作用 1.1 提供准确信息 知识库是 AI 大语言模型的重要组成部分,能够为模型提供准确的信息。在处理用户问题时,模型可以参考知识库中的数据,从而给出更准确的答案。例如,在医疗领域,知识…...

一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录——3. 服务器软件更新,以及常用软件安装

前言 前面,我们已经 安装好了 Ubuntu 服务器系统,并且 配置好了 ssh 免密登录服务器 ,现在,我们要来进一步的设置服务器。 那么,本文,就是进行服务器的系统更新,以及常用软件的安装 调整 Ubu…...

第四十天打卡

知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业:仔细学习下测试和训练代码…...

【请关注】ELK集群部署真实案例分享

ELK集群部署 1,准备es配置 es.yml: -------------------------------------------------------------- #集群名称 cluster.name: elasticsearch-cluster #节点名称 node.name: es-node1 #设置绑定的ip地址,可以使ipv4或者ipv6 #绑定这台机器的任何一个ip network.bind_hos…...

odoo17 windows server布署错误分析

odoo17 windows server布署错误分析 错误代码: File "C:\od172406\odoo\sql_db.py", line 681, in borrow result psycopg2.connect( ^^^^^^^^^^^^^^^^^ File "C:\od172406\venv\Lib\site-packages\psycopg2\__init__.py"…...

PyTorch 入门学习笔记

一、简介 PyTorch 是由 Meta(原 Facebook) 开源的深度学习框架。其前身 Torch 是一个基于 LuaJIT 的科学计算框架,核心功能是提供高效的张量(Tensor)操作和神经网络支持。由于 Lua 语言的生态限制,Torch 逐…...

【 Samba】Windows 用户访问Docker服务器上当前A用户的 ~/aaa目录

要让 Windows 用户访问 ~/aaa目录,需要在 Linux 系统上配置 Samba 共享服务,并设置合适的权限。以下是具体步骤: 1. 安装 Samba bash sudo apt update sudo apt install samba 2. 创建 Samba 用户(可选) 如果你希望 …...

pycharm生成图片

文章目录 图片例子生成图片并储存,设置中文字体支持两条线绘制散点图和直方图绘制条形图(bar)绘制条形图(横着的)(plt.barh)分组的条形图 颜色和线条风格1. **颜色字符 (color)**其他颜色指定方…...

Android 云手机横屏模式下真机键盘遮挡输入框问题处理

一、背景 打开横屏应用,点击云机EditText输入框,输入框被键盘遮挡,如下图: 未打开键盘状态: 点击第二个输入框,键盘遮挡了输入框: 二、解决方案(推荐第三中方案,博主采用的也是第三种方案) 博主这里整理了三种方案:…...

Redis 中的 5 种数据类型和示例场景

Redis 作为一款高性能的键值对数据库,凭借其丰富的数据类型,在缓存、消息队列、排行榜等众多场景中发挥着重要作用。本文将详细介绍 Redis 的 5 种核心数据类型,并结合示例场景和代码,让你快速掌握它们的使用方法。 一、String&am…...

Axure设计案例——科技感对比柱状图

想让数据对比展示摆脱平淡无奇,瞬间抓住观众的眼球吗?那就来看看这个Axure设计的科技感对比柱状图案例!科技感设计风格运用独特元素打破传统对比柱状图的常规,营造出一种极具冲击力的视觉氛围。每一组柱状体都仿佛是科技战场上的士…...

SpringBoot项目搭建指南

SpringBoot项目搭建指南 文章目录 SpringBoot项目搭建指南一、SpringBoot项目搭建1.1 SpringBoot 版本选择1.2 SpringBoot 框架引入方式1.2.1 继承 Starter Parent POM1.2.2 不使用 Parent POM 来使用 Spring Boot 1.3 SpringBoot 打包插件 二、日志框架引入2.1 引入SpringBoot…...

分布式锁剖析

一、分布式锁 1. 为什么需要分布式锁? 在单体应用中,通过synchronized或ReentrantLock等进程内锁即可解决多线程资源竞争问题。但在分布式系统中,多个服务实例运行在不同进程中,传统进程内锁失效,此时需要一种跨进程…...

C语言中函数指针和指针函数的定义及用法

在C/C中,函数指针和指针函数是两个容易混淆但完全不同的概念。以下是它们的详细对比和学习指南,结合代码示例帮助你彻底掌握。 1. 函数指针(Function Pointer) 本质:一个指向函数的指针变量,用于动态调用…...

Spring Boot DevTools 热部署

在Spring Boot项目中加入 spring-boot-devtools 热部署依赖启动器后,通常不需要手动重启项目即可让更改生效。spring-boot-devtools 的核心特性之一就是自动重启或热加载。 Spring Boot DevTools 热部署关键知识点 🔥 目的:spring-boot-devt…...

unix/linux source 命令,其基本属性、语法、操作、api

现在像解剖精密仪器一样,来细致地审视 source (或 .) 命令的各个方面:它的属性、语法、操作方式,以及可以称之为“API”的交互接口。这种细致的分析有助于我们精确地理解和使用它。 让我们深入细节: 一、基本属性 (Core Attributes) 命令类型 (Command Type): Shell 内置…...

FPGA仿真中阻塞赋值(=)和非阻塞赋值(<=)区别

FPGA仿真中阻塞赋值和非阻塞赋值的区别 单独仿真小模块对但将小模块加入整个工程仿真不对就有可能是没有注意到仿真中阻塞赋值和非阻塞赋值的区别 目录 前言 一、简介 二、设计实例 三、仿真实例 1、仿真用非阻塞赋值 2、仿真用阻塞赋值 总结 前言 网上很多人介绍verilo…...

LabVIEW轴角编码器自动检测

LabVIEW 开发轴角编码器自动检测系统,针对指控系统中高故障率的轴角编码器性能检测需求,通过模块化硬件架构与软件设计,实现编码器运转状态模拟、扭矩 / 转速实时监测、19 位并行编码采集译码、数据自动分析及报告生成等功能,解决…...

MySQL数据库从0到1

目录 数据库概述 基本命令 查询命令 函数 表的操作 增删改数据和表结构 约束 事务 索引 视图 触发器 存储过程和函数 三范式 数据库概述 SQL语句的分类: DQL:查询语句,凡是select语句都是DQL。 DML:insert,delete,up…...

WiFi万能钥匙鲲鹏服务器部署 TiDB 集群实战指南

作者: TiDBer_yangxi 原文来源: https://tidb.net/blog/15a234d0 一、环境准备 1. 硬件要求 服务器架构 :鲲鹏服务器(ARM架构),TiDB 官方明确支持 ARM 架构服务器部署 推荐配置 (生产环…...