Ethereum 没有返回值
通过Remix使用以太坊和solidity探索区块链,我遇到以下代码: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
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)将不同于您的存款金额和账户余额。但最有可能的是,在开始时,你不会遇到这些边缘情况,所以现在你可以考虑“永远”。很高兴知道,在某些情况下,此代码段无法按预期工作