0

我正在研究以太坊,我有一个问题,以太坊如何在交易过程中验证我的余额是否足以执行交易?是当前的智能合约做这个检查,是 EVM,以某种方式从世界状态树中检索数据?提前谢谢你!

4

1 回答 1

3

以太币余额:

区块链存储状态变化,用于计算地址的当前 ETH 余额。

理论上,您可以创建并广播一笔花费超过您当前余额的交易。但 tx 将恢复。

验证发送者是否有足够的余额来支付 gas 费用和 tx value,在 EVM 级别上执行。go-ethereum例如,您可以在源代码中找到它的实现。它首先检查发送者是否可以购买足够的气体(如果余额不足, preCheck()会调用buyGas()错误),然后检查发送者是否有足够的余额来覆盖valuecanTransfer() 参考定义)。


代币余额:

代币余额存储在代币合约存储中。(在某些情况下,余额可能存储在另一个合约中,但它仍然是某个合约的存储。)

大多数代币合约的逻辑都包含验证发送者是否有足够的代币余额来发送代币。如果他们没有足够的代币余额,合约会创建一个无效的 EVM 操作码,从而导致交易回滚(因此代币余额不会改变)。或者有时合约只是让以太坊交易通过,但不会更新任何代币余额。

OpenZeppelin 实现 ERC-20 令牌的验证示例代码:GitHub 链接(函数require()中的语句_transfer()

只有少数代币合约有问题并且没有此验证。但是一个错误的实现可能允许发送者发送比他们当前拥有的更多的令牌。

于 2021-03-27T18:00:34.607 回答