Solidity

solidity - 永遠無法返回 msg.sender 餘額

  • March 22, 2018

這是我的契約程式碼

pragma solidity ^0.4.4;
contract IamHongKongTokenBack_00{ 

 // 現在我錢包的地址+Eth量
function SeeMyAddAndETHVar() public constant returns (address, uint) {
   address _myadd = msg.sender;
   return ( _myadd,  _myadd.balance);
}   

// 查看其他地址的Eth量
function SeeSheEthVar(address _InputAdd) public constant returns (address, uint) {
   address _SheAc = _InputAdd;
   return (_SheAc, _SheAc.balance);
}   


}

使用時SeeMyAddAndETHVar查看我的地址和 ETH 金額

並且SeeSheEthVar是使用輸入地址並查看此地址和 ETH 數量

如果我使用 0X123… 地址現在轉到此合約,我使用 SeeSheEthVar 輸入地址 0X789… 我可以看到正確的地址和正確的 ETH 金額

但使用 SeeMyAddAndETHVar 我會看到正確的地址和錯誤的 ETH 數量

太奇怪了當我更改使用 0X789… 地址轉到此合約時,我會看到 0X123… 正確的地址和正確的 ETH 金額,但 0X789… 地址都是錯誤的 ETH 金額 在此處輸入圖像描述

請問我的問題出在哪裡 謝謝解答~!!

編輯:呼叫值上 msg.sender.balance 的工作案例。使用者支付 gaz(從而發送 tx)將數據儲存在合約儲存中,然後可以自由呼叫為他的帳戶保存的最後一個值。即使使用元遮罩,它也會為我返回正確的餘額,這證明了我試圖向您解釋的問題,您需要發送一個 tx 以使用 msg.sender.balance (肯定有元遮罩,也許其他供應商可以工作):

pragma solidity ^0.4.4;
contract IamHongKongTokenBack_00{ 


//balance stored on call of saveBalance
mapping(address => uint256)  lastBalance;

function saveBalance() public  {
   lastBalance[msg.sender] = msg.sender.balance;
}   


function fetchBalance(address _address) constant public returns (uint256) {
   return lastBalance[_address];
}   


}

使用 msg.sender.balance 並嘗試在常量函式中返回它似乎是錯誤的。

我自己嘗試過使用 remix 和 metamask,但它沒有按應有的方式工作。

但是,如果您在一個需要費用(呼叫)的函式中使用,並且假設您將 msg.sender.balance 儲存在一個事件中或要求它超過一個總和,它會起作用,因為提供了一個 tx 對象。

檢查:

返回 msg.sender.balance 未按預期執行

https://github.com/ethereum/solidity/issues/2325

https://github.com/ethereum/go-ethereum/issues/14989

在“可呼叫”函式中為我工作的使用範例(執行成本為 gaz,修改我的契約的儲存):

require(msg.sender.balance >= 0.01 ether);

這對我有用,這意味著如果我的帳戶中有 >= 0.01 eth 呼叫它執行的函式,如果沒有,那麼它會恢復並且不執行。這意味著“msg.sender.balance”確實可以正常工作,並且包含發件人的正確餘額。

使用 metamask 作為 web3 供應商的程式碼結果:

0: address: 0xc544[...]
1: uint256: 115792089237316195423570985008687907853269984665640564039457434007913129639935

我的實際餘額是 4.424 ETH,所以它應該返回 4424000000000000000 WEI,而不是這個隨機字元串。

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