You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solidity双合约问题:等额ETH收款验证失败求助

修复等额ETH收款问题的解决方案

问题核心

  1. 静态amount变量未同步:buying合约构造函数初始化时,amount仅取部署时的highestbid初始值(0),后续竞价更新highestbid后,amount不会自动更新,导致收款时金额校验失败。
  2. 竞价合约逻辑漏洞:
    • bid函数未声明payable,用户仅提交出价数值,未实际转入对应ETH,不符合真实竞价逻辑。
    • bidlist错误地将出价金额关联到合约owner,而非出价用户。
    • 未记录中标用户地址,缺少核心竞价信息。
  3. 收款校验依赖过时数据:用静态amount而非实时highestbid判断收款金额,导致校验逻辑失效。

修复后的竞价合约(List.sol)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract List {
    uint256 public highestBid;
    uint256 public bidId;
    address public owner;
    address public winnerAddress;
    mapping(uint256 => mapping(address => uint256)) public bidRecords;

    constructor() {
        owner = msg.sender;
    }

    /// @dev 用户出价,必须支付对应金额ETH,且高于当前最高出价
    function bid() public payable {
        require(msg.value > highestBid, "Bid must exceed current highest");
        require(msg.value > 0, "Bid amount can't be zero");

        highestBid = msg.value;
        winnerAddress = msg.sender;
        bidId++;
        bidRecords[bidId][msg.sender] = msg.value;
    }

    /// @dev 获取当前最高出价
    function getCurrentHighestBid() public view returns(uint256) {
        return highestBid;
    }
}

修复后的收款合约(Buying.sol)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "./List.sol";

contract Buying is List {
    /// @dev 接收ETH并校验金额,随后转给前房主
    receive() payable external {
        require(msg.value == highestBid, "Must pay exact highest bid amount");
        
        // 转ETH给前房主,处理转账失败情况
        (bool transferSuccess, ) = owner.call{value: msg.value}("");
        require(transferSuccess, "Failed to send ETH to owner");
    }
}

关键修复说明

  • 移除静态amount变量:直接使用实时的highestBid进行收款金额校验,确保始终匹配最新出价。
  • bid函数改为payable:强制用户出价时转入对应ETH,保证竞价的真实性。
  • 修正出价记录存储:将出价金额关联到出价用户msg.sender,而非合约部署者。
  • 添加转账逻辑:收到等额ETH后立即转至前房主,完成交易流程。
  • 简化校验逻辑:移除原funds modifier(用户余额检查无实际意义,只需确保出价金额高于当前最高且非零)。

内容的提问来源于stack exchange,提问作者Marcin Łętowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:25:06