Addresses
address(this).balance 未正確更新
我已經為這個問題制定了一些測試契約,並且我在所有這些契約中都遇到了相同的結果,所以很明顯我不理解某些東西。
在下面的契約中,我跟踪
DepositedBalance
變數中收到的乙太幣。我還檢查了address(this).balance
via的值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 函式中分配初始值的效果相同)並且永遠不會更新(您沒有在任何地方更新),這並不意味著NativeBalance
會address(this).balance;
自動跟踪 的值。如果你想要餘額,address(this).balance 是你最好的選擇,因為在一些小情況下,你的合約餘額將在不執行任何合約程式碼的情況下更新。