"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 量,根据调用函数的时间,它可以完成完全不同的工作量。
我有一个智能合约,其中一个功能(队列)是为了让用户找到与智能合约的其他用户的“匹配”。逻辑是,如果您调用队列并且没有人在等待,您现在就是排队的用户/钱包地址。如果您调用队列并且已经有一个排队的用户,您可以将他们从队列中清除并设置匹配。
如果第一个队列调用比第二个队列调用早几秒,则此方法工作正常,但如果两个用户同时调用队列,则第二个队列总是返回 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 量,根据调用函数的时间,它可以完成完全不同的工作量。