首页
社区
课程
招聘
[原创] openzeppelin - fallback
发表于: 2025-3-25 13:55 2261

[原创] openzeppelin - fallback

2025-3-25 13:55
2261

准备

环境的准备工作主要是在浏览器上安装一个MetaMask钱包,然后创建一个账户

这个系列的挑战还需要准备一些sepoliaETH,这个网上有不少教程,有的地方可以直接申请领一些,大概0.3左右,有些可能给的更多,不过因为众所周知的网络原因,以及有些网站为了避免滥用问题,要求主钱包里至少要有0.01ETH,这是要花钱买的,因此很多都用不了;第二个方法就是自己用算法挖一点,我就是这么做的,一晚上大概能出一个sepolia多一点,用来学习够用了

分析

需要在关卡里生成一个新的实例,然后按F12,就能在控制台看到你的实例地址,这个就是闯关需要用到的地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
 
contract Fallback {
    mapping(address => uint256) public contributions;
    address public owner;
 
    constructor() {
        owner = msg.sender;
        contributions[msg.sender] = 1000 * (1 ether);
    }
 
    modifier onlyOwner() {
        require(msg.sender == owner, "caller is not the owner");
        _;
    }
 
    function contribute() public payable {
        require(msg.value < 0.001 ether);
        contributions[msg.sender] += msg.value;
        if (contributions[msg.sender] > contributions[owner]) {
            owner = msg.sender;
        }
    }
 
    function getContribution() public view returns (uint256) {
        return contributions[msg.sender];
    }
 
    function withdraw() public onlyOwner {
        payable(owner).transfer(address(this).balance);
    }
 
    receive() external payable {
        require(msg.value > 0 && contributions[msg.sender] > 0);
        owner = msg.sender;
    }
}

代码部分内容不多,但是第一次接触Solidity还是会有点儿懵;直接看contribute函数,转账可以小于0.001 eth,然后贡献值随着你的转账变大而变大,当转账数值大于所有者的贡献值的时候,用户就会变成所有者;然后执行withdraw函数,则会将实例账户中的余额全都转到所有者账户中;综上所述,解决方案如下:

1、调用contribute函数,并发送一些ether

2、再次向实例地址发送一些ether,此时触发receive函数,同时满足了转账大于0和贡献大于0,成为所有者

3、调用withdraw函数,将合约地址中的ether转回到自己的钱包地址

解决

我这里使用remix IDE完成挑战,这个IDE我感觉还挺好用的

首先创建一个sol文件,将挑战页面给出的源代码copy到IDE中,左侧边栏中有一个Solidity编译器选项,点进去之后就可以编译了,需要注意的是,Solidity的版本需要和源码中的版本相同

编译完成后点击部署,环境选择 injected provider,此时如果你浏览器安装了MetaMask,则会弹窗提示连接,点击确定后就会连接到钱包,同时显示余额 ,此时将实例地址填写到 at address 栏中,然后点击按钮,就会出现这个关卡的挑战按钮

在以太币数量栏中输出1000000000000000 wei,然后点击contribute按钮,此时钱包会有交易提示,点击确认后,很快交易就会完成,钱包中会少一些ether,这些ether会转移到实例地址中,也可以点击getContribute按钮来查看自己的贡献率

然后在以太币数量栏中再次输入1000000000000000 wei,点击Transact按钮,和上面一样,钱包有交易提示,此时会触发receive函数,owner会变成自己

最后点击withdraw按钮,由于owner变成了自己,那么实例地址中的ether将全部都转回到自己的钱包地址中

此挑战完成


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (1)
雪    币: 15172
活跃值: (18538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
请勿在真实生产环境中使用此Solidity代码,否则造成的损失后果自负
2025-3-26 17:05
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册