You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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默认需要用户钱包签名,但可以模拟服务器端操作:

  1. 在Remix的「Deploy & Run Transactions」面板,环境选择「VM (London)」。
  2. 点击「Accounts」旁的「+」,导入服务器钱包的私钥,切换到该钱包地址。
  3. 部署合约或调用函数时,交易会自动用该钱包签名发送,无需额外确认,以此模拟服务器端的自动执行逻辑。

四、整体业务流程

  1. 在Remix或Hardhat中编写并部署上述合约到Goerli测试链。
  2. 搭建Node.js服务器,配置Goerli RPC、服务器钱包、合约信息。
  3. 前端DApp提供UI(比如添加学生的表单),用户提交请求后调用服务器API。
  4. 服务器接收到请求后,用自身钱包签名并发送交易到Goerli链,确认后返回结果给前端。
  5. 所有合约操作均由服务器发起,用户全程无需操作钱包或签名。

内容的提问来源于stack exchange,提问作者Saira Rao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:10:27