1. 主页
  2. 文档
  3. Ethernaut 题库闯关
  4. #5 Token

#5 Token

Ethernaut 题库闯关 #5 — Token

这一关的目标是破解下面 token 合约, 初始时, 我们有20个token的余额 , 需要我们做的是,通过某种方法可以增加你手中的 token 数量。

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

contract Token {

  mapping(address => uint) balances;
  uint public totalSupply;

  constructor(uint _initialSupply) public {
    balances[msg.sender] = totalSupply = _initialSupply;
  }

  function transfer(address _to, uint _value) public returns (bool) {
    require(balances[msg.sender] - _value >= 0);
    balances[msg.sender] -= _value;
    balances[_to] += _value;
    return true;
  }

  function balanceOf(address _owner) public view returns (uint balance) {
    return balances[_owner];
  }
}

研究合约

Token合约是ERC20代币的一个精简版本。该合约有这些状态变量:

  • mapping(address => uint256) balances来保存用户余额
  • uint256 public totalSupply;用于跟踪总发行量。总发行量可以被声明为 “不可变”,因为它只在合约中被初始化,而且从不更新。

然后,我们有一个构造方法constructor(uint256 _initialSupply) public,合约的创建者将initialSupply赋值到totalSupply和创建者的余额。

我们看到另外两个函数

  • function balanceOf(address _owner) public view returns (uint256 balance),简单地返回指定的_owner地址的余额。
  • function transfer(address _to, uint256 _value) public returns (bool),应该把_value的代币…
这篇文章对您有用吗?

我们要如何帮助您?