scaffold-eth 挑战1:手搓你的第一款质押 dApp(Part1)

·

目标:用 scaffold-eth 搭个极简 质押 dApp,在本地就能体验 质押 ETH、锁仓及提取 全流程,为后续接入真实 以太坊2.0 质押 打下基础。

核心关键词:scaffold-eth质押 dApp质押合约SolidityHardhatETH 锁仓。整篇教程将以这些关键词为主线,手把手带你逃开常见坑位。


质押 dApp 是什么?

一句话,我们把以太坊2.0的 32 ETH 门槛降到 1 ETH,做成新手上链向导:

  1. 任何人 都可把 ETH 质押进来;
  2. 余额实时追踪
  3. 一旦 total_staked ≥ 1 ETHdeadline 到达,资金将锁定到 ExternalContract 之中,无法取回。

整个产品逻辑只有一张流程图:Stake → Threshold/Deadline → Lock。
👉 立刻体验如何锁仓后才明白 gas 费到底去哪儿了!看不看?


你会学到什么?


环境一键到位

以下命令复制即用,Windows/Mac/Linux 全线兼容:

git clone https://github.com/austintgriffith/scaffold-eth.git challenge-1-decentralized-staking
cd challenge-1-decentralized-staking
git checkout challenge-1-decentralized-staking
yarn install      # 下载依赖

打开三个终端,分别跑:

  1. yarn chain – 启动 Hardhat 本地节点,默认 RPC 为 http://localhost:8545
  2. yarn start – 启动 React 前端,http://localhost:3000
  3. yarn deploy – 在本地部署合约并自动刷新前端。

每次改完 质押合约,只要再跑 yarn deploy 即可 秒级热更新


热门资料速查


Part1:实现 stake() 功能

任务:用户输入任意金额 ETH,调用 stake() 后,合约自动纪录余额并在前端刷新。

关键 Solidity 概念速记

动手写代码

contracts/Staker.sol 精简到这一段即可跑通:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "hardhat/console.sol";
import "./ExampleExternalContract.sol";

contract Staker {
    ExampleExternalContract public exampleExternalContract;

    mapping(address => uint256) public balances;
    uint256 public constant threshold = 1 ether;

    event Stake(address indexed staker, uint256 amount);

    constructor(address externalContract) {
        exampleExternalContract = ExampleExternalContract(externalContract);
    }

    function stake() external payable {
        require(msg.value > 0, "Cannot stake 0 ETH");
        balances[msg.sender] += msg.value;
        emit Stake(msg.sender, msg.value);
    }
}

解读:

验证清单

准备就绪后,对着前端勾选以下五项:

  1. 拿到测试 ETH(默认账户自带 1000 ETH,够烧);
  2. 点击 Stake 按钮,输入 0.5 ETH,MetaMask 计 gas 并确认;
  3. Stake 事件 实时出现在控制台;
  4. balances[yourAddress] 数值刷新为 0.5 ether
  5. yarn chain 终端输出的 block.number 正常增长。

常见问题合集 FAQ

Q1: 为什么运行 yarn chain 时端口 8545 被占用?
A: 可能已启动过其它链,或系统占用了 8545。修改 hardhat.config.js 里的 port 字段即可换端口。

Q2: 我在 Remix 部署提示缺失 artifact?
A: yarn deploy 已生成 abi,但没复制到 Remix。推荐用 scaffold-eth 自带的热加载前端调试,省心。

Q3: 0.8.4 版本与 ^0.8.0 有何区别?
A: 均可工作,新版本只在一些小 bugfix。保持锁定版本能避免社区合约差异。

Q4: 质押金额 能否随时提取?
A: Part1 阶段没写提取逻辑,后续 Part2 将引入 withdraw()deadline 规则。

Q5: 测试网选哪个?
A: 短期可选 Goerli 或 Sepolia,水龙头宽裕些;长期推荐本地 fork mainnet 以便和 真实质押水准 对齐。


下一步预告 & 彩蛋

Part2 将完成两个进阶动作:

  1. OpenZeppelin Timer + Access Control 限制在 deadline自动锁仓
  2. 一旦触达 1 ETH,执行 exampleExternalContract.complete(),把资金一次性迁移到 外部合约 继续生息。

👉 想在测试网提前薅利息?点这里先锁仓!


小结

跟随以上步骤,你已经完成 scaffold-eth 挑战1 的 质押合约雏形
关键词再次回顾:scaffold-eth质押 dApp质押合约ETH 锁仓SolidityHardhat

这些技能可直接迁移到真实 以太坊2.0 质押 场景,Buff 已叠满,Part2 见!