Ethernaut 题库闯关 #5 — Token

Ethernaut题库闯关连载的第5题题解。

今天这篇是Ethernaut 题库闯关连载的第5篇,难度等级:中等。

Ethernaut 题库闯关我已经整理为一个专栏了, 欢迎大家订阅专栏。

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的代币...

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

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

0 条评论

请先 登录 后评论
Ethernaut CTF
Ethernaut CTF
信奉 CODE IS LAW.