以太坊如何验证在交易过程中我有足够的钱进行交易?

How Ethereum verify that during the transaction i have enough money for the transaction?

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

ETH 余额:

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

理论上,您可以创建并广播花费超过当前余额的交易。但是 tx 将要还原。

验证发送者是否有足够的余额来支付 gas 费和 tx value,是在 EVM 级别执行的。例如,您可以在 go-ethereum 源代码中找到它的实现。它首先检查发送方是否可以购买足够的 gas(preCheck() calls buyGas() that errors 如果余额不足),然后检查发送方是否有足够的余额来支付 valuecanTransfer() reference and definition).


代币余额:

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

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

OpenZeppelin 实现ERC-20 token 验证示例代码:GitHub link_transfer()函数中的require()语句)

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