【发布时间】:2021-06-24 06:59:57
【问题描述】:
我正在研究以太坊,我有一个问题,以太坊如何在交易过程中验证我的余额是否足以执行交易? 是当前的智能合约做这个检查,是 EVM,以某种方式从世界状态树中检索数据? 提前感谢您!
【问题讨论】:
标签: ethereum smartcontracts evm
我正在研究以太坊,我有一个问题,以太坊如何在交易过程中验证我的余额是否足以执行交易? 是当前的智能合约做这个检查,是 EVM,以某种方式从世界状态树中检索数据? 提前感谢您!
【问题讨论】:
标签: ethereum smartcontracts evm
ETH 余额:
区块链存储状态变化,用于计算某个地址当前的 ETH 余额。
理论上,您可以创建和广播支出超过当前余额的交易。但 tx 将恢复。
验证发送者是否有足够的余额来支付 gas 费和 tx value,在 EVM 级别执行。例如,您可以在 go-ethereum 源代码中找到它的实现。它首先检查发送者是否可以购买足够的gas(如果余额不足,preCheck() 会调用buyGas() errors),然后检查发送者是否有足够的余额来支付value(
canTransfer()reference 和 definition)。
代币余额:
代币余额存储在代币合约存储中。 (在某些情况下,余额可能存储在另一个合约中,但它仍然是一些合约的存储空间。)
大多数代币合约的逻辑都包含验证发送方是否有足够的代币余额来发送代币。如果他们没有足够的代币余额,合约会创建一个无效的 EVM 操作码,这会导致交易恢复(因此代币余额不会改变)。或者有时合约只是让以太坊交易通过,但不会更新任何代币余额。
OpenZeppelin 实现 ERC-20 令牌的验证示例代码:GitHub link(_transfer() 函数中的 require() 语句)
只有少数代币合约有问题且没有此验证。但是一个错误的实现可能会让发送者发送比他们当前拥有的更多的令牌。
【讨论】: