Solidity 中 require(send()) 的安全问题

问题描述

我正在开发一个基于区块链的 uni 项目,我必须审核我们的系统,检查已知的攻击等。 这是我检查的主要文件,因为我首先开始处理智能合约问题: Known-attack ethereum smart contract

我无法理解“Dos With (unexpected) revert attack”部分中使用的示例。我分享代码

    // INSECURE
contract Auction {
    address currentleader;
    uint highestBid;

    function bid() payable {
        require(msg.value > highestBid);

        require(currentleader.send(highestBid)); // refund the old leader,if it fails then revert

        currentleader = msg.sender;
        highestBid = msg.value;
    }}

他们说攻击者可以强制要求每次都恢复出价,因此没有人能够出价,这将使攻击者在认情况下赢得拍卖。 但是..他会怎么做,那是我不明白的部分。我们是否同意至少这份合同是“有效的”,而不是有效载荷?如果有效载荷是合同,谁能提供示例/解释?

我要补充一点,如果我在这里引用 solidity 合同,我们会与 Vyper 合作,但从我之前阅读的内容来看,这仍然是一种我也会在那里找到的问题。

提前致谢!

解决方法

如果 send() 目标地址是智能合约,它将执行 fallback function

如果 currentLeader 指向具有回退功能的智能合约,该功能有意在发送失败时恢复,则 bid() 将不会对任何参与者起作用,直到 currentLeader已更改。

More information here

这不是“DoS”攻击,而只是 Solidity 编程中的陷阱。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...