Addresses
this.balance 出錯
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的精彩教程。