目标:用 scaffold-eth 搭个极简 质押 dApp,在本地就能体验 质押 ETH、锁仓及提取 全流程,为后续接入真实 以太坊2.0 质押 打下基础。
核心关键词:scaffold-eth、质押 dApp、质押合约、Solidity、Hardhat、ETH 锁仓。整篇教程将以这些关键词为主线,手把手带你逃开常见坑位。
质押 dApp 是什么?
一句话,我们把以太坊2.0的 32 ETH 门槛降到 1 ETH,做成新手上链向导:
- 任何人 都可把 ETH 质押进来;
- 余额实时追踪;
- 一旦 total_staked ≥ 1 ETH 或 deadline 到达,资金将锁定到 ExternalContract 之中,无法取回。
整个产品逻辑只有一张流程图:Stake → Threshold/Deadline → Lock。
👉 立刻体验如何锁仓后才明白 gas 费到底去哪儿了!看不看?
你会学到什么?
- scaffold-eth 项目从零 启动 与 配置;
- 写一份 质押合约,学会
payable、event、mapping组合三连; - 通过 Hardhat本地链 + React 双重调试模式;
- 单元测试 Hardhat 脚本、任务测试 React 界面;
- 把合约一次 部署到测试网。
环境一键到位
以下命令复制即用,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 # 下载依赖打开三个终端,分别跑:
yarn chain– 启动 Hardhat 本地节点,默认 RPC 为http://localhost:8545;yarn start– 启动 React 前端,http://localhost:3000;yarn deploy– 在本地部署合约并自动刷新前端。
每次改完 质押合约,只要再跑 yarn deploy 即可 秒级热更新。
热门资料速查
- Solidity 示例库:Solidity by Example
- Solidity 中文文档:solidity-cn
- Hardhat 中文文档:hardhat-cn
- ethers.js 中文文档:ethers.js-cn
- OpenZeppelin 官方文档(合约库+安全攻略)
Part1:实现 stake() 功能
任务:用户输入任意金额 ETH,调用 stake() 后,合约自动纪录余额并在前端刷新。关键 Solidity 概念速记
- payable – 只有带
payable的函数才能接收 ETH; - mapping – 让用户地址关联 质押余额;
- event – 区块链上的 日志通知,方便前端监听并刷新 UI。
动手写代码
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);
}
}解读:
mapping balances→ 存储每位用户 质押数量;threshold = 1 ether →1 ETH 锁仓线;stake()函数里emit Stake,前端捕捉到日志后即时 刷新余额 UI。
验证清单
准备就绪后,对着前端勾选以下五项:
- 拿到测试 ETH(默认账户自带 1000 ETH,够烧);
- 点击 Stake 按钮,输入
0.5 ETH,MetaMask 计 gas 并确认; - Stake 事件 实时出现在控制台;
balances[yourAddress]数值刷新为 0.5 ether;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 将完成两个进阶动作:
- 用 OpenZeppelin Timer + Access Control 限制在
deadline后 自动锁仓; - 一旦触达 1 ETH,执行
exampleExternalContract.complete(),把资金一次性迁移到 外部合约 继续生息。
小结
跟随以上步骤,你已经完成 scaffold-eth 挑战1 的 质押合约雏形。
关键词再次回顾:scaffold-eth、质押 dApp、质押合约、ETH 锁仓、Solidity、Hardhat。
这些技能可直接迁移到真实 以太坊2.0 质押 场景,Buff 已叠满,Part2 见!