首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >地址(此).balance未正确更新

地址(此).balance未正确更新
EN

Ethereum用户
提问于 2022-08-11 11:07:02
回答 1查看 79关注 0票数 0

我已经为这个问题签订了一些测试合同,并且我在所有的测试结果中都遇到了相同的结果,所以很明显,我没有理解什么。

在下面的契约中,我在DepositedBalance变量中跟踪接收到的以太。我还通过address(this).balance检查NativeBalance的值。

代码语言:javascript
复制
    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(这个).balance从来没有反映任何更改,当我发送以太到合同时,它总是为零。我创建变量ContractAddress只是为了确认该地址是否与它所做的已部署契约的地址匹配。

最令人惊讶的是,当我用契约地址( BalanceCheck() )作为参数对外调用ContractAddress时,它确实返回了正确的值(?)。这公然与ContractAddress = address(this)相矛盾。

我在这里错过了什么?address(this)有什么问题?

提前感谢

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-08-11 12:19:11

代码语言:javascript
复制
uint256 public NativeBalance = address(this).balance;

这一行代码只是在部署契约时初始化了NativeBalance变量(与在构造函数中分配初始值的效果相同),并且永远不会被更新(您没有在任何地方更新),这并不意味着NativeBalance将自动跟踪address(this).balance;的值。

如果您想要余额,那么address(this).balance是您最好的选择,因为有些次要情况下,您的合同余额将在不执行任何契约代码的情况下被更新。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/133437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档