Addresses

address(this).balance 未正確更新

  • August 11, 2022

我已經為這個問題制定了一些測試契約,並且我在所有這些契約中都遇到了相同的結果,所以很明顯我不理解某些東西。

在下面的契約中,我跟踪DepositedBalance變數中收到的乙太幣。我還檢查了address(this).balancevia的值NativeBalance

contract BalanceChecker{

   uint256 public DepositedBalance;
   uint256 public NativeBalance = address(this).balance;
   address public ContractAddress = address(this);
   
   receive() external payable {
       DepositedBalance += msg.value;
   }

// 1. This function returns correct balance

   function ShowDepositedBalance() public view returns(uint256){
       return DepositedBalance;
   }

// 2. This function always returns zero as balance:

   function ShowNativeBalance() public view returns(uint256){
       return NativeBalance;
   }

// 3. This function returns correct balance when called with the contract address as argument

   function BalanceCheck(address _addr) public view returns(uint256){
       return address(_addr).balance;
   }

}

問題是address(this).balance 在我將乙太幣發送到合約時永遠不會反映任何變化,它始終為零。我創建變數ContractAddress只是為了確認地址與已部署合約的地址匹配,它確實如此。

最令人驚訝的是,當我BalanceCheck()使用合約地址 ( ContractAddress) 作為參數進行外部呼叫時,它確實返回了正確的值(¿?)。這與此公開相矛盾ContractAddress = address(this)

我在這裡想念什麼?有什麼問題address(this)

提前致謝

uint256 public NativeBalance = address(this).balance;

這行程式碼只是NativeBalance在部署合約時初始化了變數(與您在 costructor 函式中分配初始值的效果相同)並且永遠不會更新(您沒有在任何地方更新),這並不意味著NativeBalanceaddress(this).balance;自動跟踪 的值。

如果你想要餘額,address(this).balance 是你最好的選擇,因為在一些小情況下,你的合約餘額將在不執行任何合約程式碼的情況下更新。

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