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

发布于:2025-06-03 ⋅ 阅读:(30) ⋅ 点赞:(0)

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

  • 安全地管理私钥

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

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

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

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


网站公告

今日签到

点亮在社区的每一天
去签到