【问题标题】:Solidity, Member "transfer" not found or not visible after argument-dependentSolidity,在依赖于参数后未找到成员“转移”或不可见
【发布时间】:2019-04-29 05:06:33
【问题描述】:

使用 Solidity ^0.5.0, 我实际上是在尝试实现在 ^0.4.17 中工作的旧代码,但它在 Remix 上引发错误。 我检查了语法和所有内容,但无法发现问题所在。 任何帮助都非常感谢。

pragma solidity ^0.5.0;

contract Lottery{
  address public manager;
  address[] public players;

  constructor() public {
      manager = msg.sender;
  }

   function participate() public payable {
       require(msg.value > .01 ether);
       players.push(msg.sender);
  }

   function pseudoRandom() private view returns(uint){
    return uint(keccak256(abi.encodePacked(block.difficulty, now, players)));
  }

  function pickWinner() public {
    uint index = pseudoRandom() % players.length;
    players[index].transfer(address(this).balance);
  }
}

这里是错误信息:

browser/Lottery.sol:22:8: TypeError: Member "transfer" not found or not visible after argument-dependent 在地址中查找。

players[index].transfer(address(msg.sender).balance);

^---------------------^

【问题讨论】:

    标签: ethereum solidity smartcontracts


    【解决方案1】:

    据我了解,从您的合约业务逻辑来看,所有地址进入彩票都不会中奖,因此您无需将所有地址都设为应付。 更好的方法是通过将地址类型转换为以下应付地址,只使获胜者地址支付。

        address payable winnerAddress = payable(players[index]);
        winnerAddress.transfer(address(this).balance);
    

    【讨论】:

      【解决方案2】:

      请参阅Solidity v0.5.0 Breaking Changes

      正如here指出的那样:

      地址类型分为地址和应付地址,只有应付地址提供转账功能。

      查看我的回答here了解更多详情。

      改变这一行:

      address[] public players;
      

      到这里:

      address payable[] public players;
      

      编辑

      谢谢 smarx! ?

      【讨论】:

      • 这个答案已被接受,但我认为这不是上述代码中的实际问题。 players[index] 已经是 address,所以投射它不会做任何事情。我相信实际的问题是类型是address 而不是address payable。解决方法是使用address payable[] public players
      【解决方案3】:

      您在初始声明中缺少支付修饰符。 改变

      地址[]公共玩家;

      地址支付[]公共玩家;

      【讨论】:

        猜你喜欢
        • 2021-02-18
        • 2021-12-29
        • 2021-10-21
        • 2021-06-11
        • 2021-06-22
        • 1970-01-01
        • 2021-08-18
        相关资源
        最近更新 更多