Ethernaut题库闯关连载的第5题题解。
今天这篇是Ethernaut 题库闯关连载的第5篇,难度等级:中等。
Ethernaut 题库闯关我已经整理为一个专栏了, 欢迎大家订阅专栏。
这一关的目标是破解下面 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
的代币...如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!