scaffold-eth 挑战:实现锁定机制和资金撤回(Part2)

练习2:实现锁定机制和资金撤回

正如我们之前所说,这个合约的最终目标是实现一个质押dApp,当满足一些条件,用户就可以质押 ETH。如果没有达到这些条件,用户可以撤回他们的 ETH 。

这些条件是:

  • 至少向质押合约质押1个ETH
  • 在deadline(30秒)内达到1个ETH的质押阈值

需要掌握的重要概念

  • 调用外部合约 - 区块链上的每个合约都像一个公共的 REST API 。如果合约被声明为 publicexternal,你可以从 web3 app 或直接从另一个合约调用它们。
  • 函数修改器(Function Modifier) - 修改器是可以在函数调用之前和/或之后运行的代码。它们可以用来限制访问,验证输入,或防范重入性攻击
  • 错误处理 - 错误处理很重要,因为它可以还原智能合约的状态(准确地说是让改变不生效),并通知用户还原的原因。你可以把这种还原比作数据库的 rollback
  • 发送 ETH(转账、发送、调用) - Solidity 有本地方法可以将 ETH 从一个合约转账到另一个合约/地址。

练习实现

  • 声明一个 deadline,它是区块时间延后30秒
  • 创建一个 public timeLeft()函数,用于返回剩余时间,直到时间到 deadline 为止
  • 创建一个修改器(Modifier),用于检查外部合约是否已经完成
  • 创建一个修改器(Modifier),用于动态检查 deadline 是否到了
  • 只允许用户在时间没到 deadline(有效期内) 且没有执行外部合约的情况下质押 ETH
  • 只有当时间没有到 deadline 且 balances 没有达到阀值,用户才可以撤回资金
  • 创建一个execute()方法,将资金从质押合约转移到外部合约并执行另一个合约外部函数

当你在本地测试合约是一定要注意:区块链的状态只有在区块被打包时才会更新。区块编号和区块时间都只有在交易完成后才会更新。这意味着timeLeft()只有在交易完成后才会更新。如果你想模拟真实场景,可以改变 Hardhat 配置来模拟区块自动挖矿。如果你想了解更多,请看mining-mode 文档

合约代码更新


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

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

/**
* @title Stacker Contract
* @author scaffold-eth
* @notice A contract that allow users to stack ETH
*/
contract Staker {

  // External contract that will old stacked funds
  ExampleExternalContract public exampleExternalContract;

  // 用户质押余额
  mapping(address => uint256) public balances;

  // Staking threshold
  uint256 public constant threshold = 1 ether;

  // Staking deadline
  uint256 public deadline = block.timestamp + 30 seconds;

  // 合约事件
  event Stake(address indexed sender, uint256 amount);

  // Contract's Modifiers
  /**
  * @notice Modifier that require the deadline to be reached or not
  * @param requireReached Check if the deadline has reached or not
  */
  modifier deadlineReached( bool requireReached ) {
    uin...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 2
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
翻译小组
翻译小组
0x9e64...7c84
大家看到好的文章可以在 GitHub 提 Issue: https://github.com/lbc-team/Pioneer/issues 欢迎关注我的 Twitter: https://twitter.com/UpchainDAO