Contract-Development
網路/EVM 如何在相同的區塊內使用相同的氣體處理相同的合約呼叫?
以下面的測試合約為例:
pragma solidity ^0.4.24; contract DoubleCall { address public superHero; uint256 public price = 1 ether; function becomeSuperHero() public payable{ require(msg.value >= price); superHero = msg.sender; price = price * 2; } }
如果兩個賬戶發送一個呼叫合約的交易
becomeSuperHero()
——都發送 1Eth 和相同數量的氣體,那麼 superHero 將會是什麼。兩個交易都應該包含在同一個區塊中。結果如何?
交易以特定順序包含在塊中。在您的範例中,即使兩個事務都在同一個塊中,一個也會先於另一個。
在這種情況下,區塊的 tx 列表中的第一個 tx 將成為超級英雄,價格將增加到 2 ETH。
當第二個 tx 被執行時,它會在第一個 tx 已經被探勘的智能合約版本中執行。這將導致它失敗,因為 1 ETH 低於要求的價格。