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

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 集成重点是:

  • 安全地管理私钥

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

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

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

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

http://www.lqws.cn/news/72091.html

相关文章:

  • neo4j 5.19.0两种基于向量进行相似度查询的方式
  • Node.js 中使用 Express 框架系统详细讲解
  • Redis持久化机制详解:RDB与AOF的深度剖析
  • 风控研发大数据学习路线
  • 大数据学习(127)-hive日期函数
  • 使用Python进行函数作画
  • 超声波测距三大算法实测对比
  • 代码随想录算法训练营第60期第五十五天打卡
  • 详解一下RabbitMQ中的channel.Publish
  • flutter开发安卓APP适配不同尺寸的手机屏幕
  • mysql数据库实现分库分表,读写分离中间件sharding-sphere
  • 【数据分析】第三章 numpy(1)
  • MapReduce(期末速成版)
  • node-sass 报错
  • CppCon 2014 学习:Gamgee: A C++14 library for genomic data processing and analysis
  • Python Day41
  • Python趣学篇:用Pygame打造绚烂流星雨动画
  • C++.cstring string
  • 第七章.正则表达式
  • 电子电路:4017计数器工作原理解析
  • NodeJS全栈WEB3面试题——P7工具链 测试
  • PHP7+MySQL5.6 查立得轻量级公交查询系统
  • 8.linux文件与文件夹内处理命令cp,mv,rm
  • AlmaLinux OS 10 正式发布:兼容 RHEL 10 带来多项技术革新
  • JavaSE知识总结(集合篇) ~个人笔记以及不断思考~持续更新
  • 《深度探索C++对象模型》阅读笔记(完整版)
  • Linux之进程间通信
  • AJAX对于XML和JSON的处理
  • Missashe考研日记—Day51-Day57
  • 企业级开发中的 maven-mvnd 应用实践