Addresses

this.balance 出錯

  • April 18, 2020
pragma solidity 0.5.9;
contract Testing{

function participate()public  payable{ 
       uint winner = 9;
       require(msg.value == 0.1 ether);



       if ( winner==9)
       {

          require(msg.sender.call.value(this.balance)());

       }
   }
}

我收到以下錯誤消息:

> > solc testing8_2.sol testing8_2.sol:13:42:錯誤:在契約測試中進行參數相關查找後,未找到成員“餘額”或不可見。使用“address(this).balance”訪問此地址成員。要求(msg.sender.call.value(this.balance)()); > > >

但如果我嘗試:

if ( winner==9)
       {

          require(msg.sender.call.value(address(this).balance)());

       }

我收到以下錯誤消息:

> > solc testing8_2.sol testing8_2.sol:13:20:錯誤:函式呼叫的參數計數錯誤:給出了 0 個參數,但預期為 1。此函式需要一個字節參數。使用 "" 作為參數來提供空的呼叫數據。要求(msg.sender.call.value(地址(this).balance)());^——————————————–^ testing8_2.sol: 13:12:錯誤:在依賴於參數的查找後未找到匹配的聲明。要求(msg.sender.call.value(地址(this).balance)());^—–^ > > >

有人請指導我如何解決這個問題:

祖爾菲。

您只是缺少 bytes 參數call

pragma solidity 0.5.9;

contract Testing {

   function participate() public payable{ 
       uint winner = 9;
       require(msg.value == 0.1 ether);

       if (winner == 9)
       {
          (bool success, ) = msg.sender.call.value(address(this).balance)("");
           require(success, "Transfer failed.");

       }
   }
}

bytes 參數的目的是什麼?

由於您只想將 ether 發送到該地址,而不是在該地址呼叫函式,因此 bytes 參數只是一個空的"". 假設您想改為在該地址呼叫一個deposit()函式。msg.sender然後你會寫:

function makeDeposit(address bankAddress) public payable {
       bytes32 functionHash = keccak256("deposit()");      
       bytes4 function4bytes = bytes4(functionHash);
       bytes payload = abi.encode(function4bytes);

       if (msg.value > 0) {
           (bool success,) = bankAddress.call.value(msg.value)(payload);
           require(success, "Ether transfer failed.");
       }      
}

範例取自這篇關於如何使用 call.value的精彩教程。

引用自:https://ethereum.stackexchange.com/questions/82586