以太坊如何验证在交易期间我有足够的钱进行交易?

问题描述

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

解决方法

ETH 余额:

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

理论上您可以创建和广播一笔花费超过您当前余额的交易。但是网络会拒绝此交易为无效:

您很可能找不到任何矿工将这笔交易包含在一个区块中。如果你有一个矿工将 tx 包含在一个区块中,网络的其余部分将拒绝这个(无效)区块,并接受其他人的(有效)区块。


代币余额:

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

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

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

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