Ethereum 没有返回值

Ethereum 没有返回值,ethereum,solidity,Ethereum,Solidity,通过Remix使用以太坊和solidity探索区块链,我遇到以下代码: pragma solidity ^0.8.1; contract AccountsDemo{ address public whoDeposited; uint public depositAmt; uint public accountBalance; function deposit() public payable{ w

通过Remix使用以太坊和solidity探索区块链,我遇到以下代码:


pragma solidity ^0.8.1;

contract AccountsDemo{
    
    address public whoDeposited;
    uint public depositAmt;
    uint public accountBalance;
    
    
    function deposit() public payable{
        
        whoDeposited = msg.sender;
        depositAmt = msg.value;
        
        accountBalance += address(this).balance 
    }
}
根据我正在使用的书,调用
存款
应该会导致
账户余额
存款金额
增加。当我尝试时,什么都没有发生。交易记录在区块链上,但没有增加。这本书使用了旧版本的solidity-0.6.0,不确定这是否是我沮丧的原因


你知道我这里遗漏了什么吗?

你的活期存款功能是什么:

  • whoseposted=msg.sender

    将发件人地址存储到属性
    who
    。请注意,每次执行
    deposit()
    函数时,
    whoDeposit
    的值都会被覆盖

  • depositAmt=msg.value

    将交易值存储到属性
    存款金额
    。请注意,每次执行
    deposit()
    函数时,
    depositAmt
    的值都会被覆盖

  • accountBalance+=地址(此).balance

    按当前合同余额增加属性
    账户余额的值。当前合同余额(
    地址(this).balance
    )已经反映了在执行
    存款()
    函数时发送的交易值

    所以,如果你的合同已经有了10维的余额,
    accountBalance
    是10维,现在你发送了2维。。。在执行过程中,
    地址(this).balance
    现在是12(因为您发送的是2个wei),然后是
    accountBalance+=12
    ,这是您不想要的结果

    顺便说一句,您的代码段有一个语法错误,并且由于行尾缺少分号而无法编译


  • 为了实现您的目标-将当前合同余额同时存储在
    depositAmt
    accountBalance
    中(因此它们总是具有相同的值,也与
    地址(此)相同。余额
    ),您可以执行以下操作:

    depositAmt += msg.value;
    accountBalance = address(this).balance;
    
    我切换了
    +=
    =
    操作符。现在,当您向
    存款()函数发送值时:

  • whoseposted=msg.sender

    行为保持与上述相同

  • depositAmt+=msg.value

    每次执行
    deposit()
    函数时,
    depositAmt
    的值都会增加交易的值。这有效地反映了您合同的当前余额

  • accountBalance=地址(this).balance

    每次执行
    deposit()
    函数时,
    accountBalance
    的值都设置为当前合同余额。当前合同余额已反映您在当前交易中发送的价值


  • 注意:我在这个答案中使用了“总是”这个词几次。实际上并不总是这样-有些边缘案例,例如从
    自毁功能或在合同部署之前为合同地址提供资金,其中
    地址(this.balance)将不同于您的
    存款金额
    账户余额
    。但最有可能的是,在开始时,你不会遇到这些边缘情况,所以现在你可以考虑“永远”。很高兴知道,在某些情况下,此代码段无法按预期工作