【问题标题】:How Ethereum verify that during the transaction i have enough money for the transaction?以太坊如何验证在交易过程中我有足够的钱进行交易?
【发布时间】:2021-06-24 06:59:57
【问题描述】:

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

【问题讨论】:

    标签: ethereum smartcontracts evm


    【解决方案1】:

    ETH 余额:

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

    理论上,您可以创建和广播支出超过当前余额的交易。但 tx 将恢复。

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


    代币余额:

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

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

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

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

    【讨论】:

    • 我觉得这并不能回答问题。我对这个问题的理解是:矿工/节点何时检查账户是否有足够的以太币来支付 gas 费用?它是在 JSON-RPC 级别、EVM 还是其他地方?我也在问自己同样的问题
    • @Donut 感谢您的跟进。我在原始答案的前半部分发现了一个逻辑错误(8 个月前我第一次发布该主题时,我对该主题的了解更加有限)并更正了该问题,并解释了您所询问的验证。
    • 太棒了 :) 很好的发现,太棒了,您将这些信息添加到您的答案中。我自己也在寻找这个功能。
    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2021-10-02
    • 2019-12-09
    • 1970-01-01
    相关资源
    最近更新 更多