Remix IDE自动执行交易及Goerli链无用户签名DApp开发咨询
实现方案拆解
一、智能合约:Owner+Student权限控制
先写出核心权限控制的Solidity合约,用OpenZeppelin的Ownable简化Owner逻辑,再通过映射维护学生白名单,自定义修饰器限制调用权限:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts/access/Ownable.sol"; contract StudentPortal is Ownable { // 记录已授权的学生地址 mapping(address => bool) public isStudent; // 添加学生,仅合约Owner可调用 function addStudent(address _student) external onlyOwner { require(!isStudent[_student], "该学生已被添加"); isStudent[_student] = true; } // 自定义修饰器:仅Owner或已授权学生可调用 modifier onlyOwnerOrStudent() { require(msg.sender == owner() || isStudent[msg.sender], "无操作权限"); _; } // 示例业务函数,仅授权地址可调用 function runStudentTask() external onlyOwnerOrStudent { // 这里写具体业务逻辑,比如记录任务完成状态、发放测试代币等 } }
- 部署时,部署者自动成为合约Owner,后续可以通过
addStudent添加授权学生地址。 - 所有需要权限控制的业务函数,加上
onlyOwnerOrStudent修饰器即可。
二、服务器端自动执行交易(无需用户签名)
核心逻辑是用服务器持有的钱包私钥签名并发送交易,用户完全不需要操作自己的钱包。用Node.js+Ethers.js实现的示例如下:
const { ethers } = require("ethers"); require("dotenv").config(); // 用dotenv管理环境变量 // 1. 连接Goerli测试链RPC节点 const provider = new ethers.JsonRpcProvider("https://goerli.infura.io/v3/你的INFURA_KEY"); // 2. 服务器钱包(私钥存在环境变量里,绝对不能硬编码) const serverWallet = new ethers.Wallet(process.env.SERVER_WALLET_PRIVATE_KEY, provider); // 3. 初始化合约实例(替换成你的合约地址和ABI) const contractABI = [/* 从Remix复制合约ABI */]; const contractAddress = "0x你的合约部署地址"; const studentPortal = new ethers.Contract(contractAddress, contractABI, serverWallet); // 4. 封装添加学生的交易函数 async function addStudent(studentAddr) { try { const tx = await studentPortal.addStudent(studentAddr); await tx.wait(); // 等待交易上链确认 console.log(`添加成功,交易哈希:${tx.hash}`); return { success: true, txHash: tx.hash }; } catch (err) { console.error("交易失败:", err); return { success: false, error: err.message }; } } // 5. 封装调用业务函数的交易 async function executeStudentTask() { try { const tx = await studentPortal.runStudentTask(); await tx.wait(); console.log(`任务执行成功,交易哈希:${tx.hash}`); return { success: true, txHash: tx.hash }; } catch (err) { return { success: false, error: err.message }; } }
注意事项:
- 私钥安全:用环境变量(dotenv)存储,不要提交到代码仓库,服务器要做好权限防护。
- Gas费准备:服务器钱包需要有足够的Goerli测试ETH,可从Goerli水龙头领取。
- 幂等处理:如果前端可能重复提交请求,服务器要记录已处理的请求ID,避免重复发送交易。
三、Remix中测试自动执行交易
Remix默认需要用户钱包签名,但可以模拟服务器端操作:
- 在Remix的「Deploy & Run Transactions」面板,环境选择「VM (London)」。
- 点击「Accounts」旁的「+」,导入服务器钱包的私钥,切换到该钱包地址。
- 部署合约或调用函数时,交易会自动用该钱包签名发送,无需额外确认,以此模拟服务器端的自动执行逻辑。
四、整体业务流程
- 在Remix或Hardhat中编写并部署上述合约到Goerli测试链。
- 搭建Node.js服务器,配置Goerli RPC、服务器钱包、合约信息。
- 前端DApp提供UI(比如添加学生的表单),用户提交请求后调用服务器API。
- 服务器接收到请求后,用自身钱包签名并发送交易到Goerli链,确认后返回结果给前端。
- 所有合约操作均由服务器发起,用户全程无需操作钱包或签名。
内容的提问来源于stack exchange,提问作者Saira Rao
相关产品推荐
相关产品推荐

