"Out of Gas" 快速调用函数两次,但调用间隔时不是?

"Out of Gas" when calling function twice quickly, but not when calls are spaced out?

我有一个智能合约,其中一个功能(队列)是为了让用户找到与智能合约的其他用户的“匹配”。逻辑是,如果您调用队列并且没有人在等待,您现在就是排队的用户/钱包地址。如果您调用队列并且已经有一个排队的用户,您可以将他们从队列中清除并设置匹配。

如果第一个队列调用比第二个队列调用早几秒,则此方法工作正常,但如果两个用户同时调用队列,则第二个队列总是返回 Out of Gas 错误。增加 gas 量并不能解决问题。

如有任何想法,我将不胜感激!

代码在 if 块中失败。如果我删除大部分逻辑,它会成功,但我无法找出任何韵律或原因。

if (awaitingMatch != address(0)) {
  userMap[awaitingMatch].opponent = msg.sender;
  userMap[awaitingMatch].matchedBlock = block.number;
  userMap[awaitingMatch].matchWins = 0;
  userMap[awaitingMatch].playAmount = msg.value;
  userMap[awaitingMatch].winsNeeded = winsToWin;

  userMap[msg.sender].opponent = awaitingMatch;
  userMap[msg.sender].matchedBlock = block.number; 
  userMap[msg.sender].matchWins = 0;
  userMap[msg.sender].winsNeeded = winsToWin;

  awaitingMatch = address(0);

  emit Match(msg.sender);
  emit Match(userMap[msg.sender].opponent);

// add this guy to the list awaiting a match, and set his desposit flag true
} else {
  awaitingMatch = msg.sender;
}

我想我已经弄明白了。问题是 MetaMask 试图估计将用于每笔交易的气体量。 MetaMask 非常擅长这一点,它会在估算 gas 之前分析合约的状态。 if 部分(运行 由第二个调用者完成)比 else 部分(运行 由第二个调用者完成更多工作第一个来电者)。如果我同时拨打两个电话,他们都估计他们会 运行 较轻的 else 部分,但其中一个会结束 运行ning第一个更贵 if 部分。

我认为我最好的选择是调整任何调用这样的函数时提供的 gas 量,根据调用函数的时间,它可以完成完全不同的工作量。