我正在尝试一种智能契约,用户可以注册自己(在一个排序的数组中),当注册了一定数量的人(在这里2),创建了一个战斗,第一注册用户之间的战斗。
代码不是一个问题,但我主要关心的是,如果多个请求在同一个集群中出现,而矿工将在队列中对请求进行排序(每个人都必须是相同的),那么会追加什么呢?我怎样才能避免冲突?
示例:我有3个用户(A、B和C)。A已经在合同上注册,B和C试图在同一个区块注册。什么是矿工,接受事务并执行一种、B、C,以便A将战斗B和C将留在注册数组中。但以同样的方式,另一个矿工采取、C、B,在A和C之间创建一个战斗并保持B。A+B和A+C的战斗都在同一时间进行,而剩下的数组是不一样的。这个案子会怎么样?
我试着在网上搜索(没有发现什么好的),或者编写一个简单的示例,并在Remix上使用Ganache和多个浏览器对其进行测试,但是测试它真的很痛苦。
这是我的测试代码(谁工作很好..)但我不知道怎么确定?任何想法,联系,建议.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
contract RegisteredQueue {
struct Registered {
address addr;
uint value;
}
struct Battle {
Registered reg1;
Registered reg2;
}
event NewRegistered (Registered indexed registered);
event NewBattle (Battle indexed battle);
Registered[] public registeredValues;
Battle[] public battlesDone;
function register(uint _value) public {
for (uint i=0; i<registeredValues.length; i++) {
require(registeredValues[i].addr != msg.sender, "You're already registred");
}
registeredValues.push(Registered(msg.sender, _value));
uint l = registeredValues.length;
emit NewRegistered(registeredValues[l-1]);
if (l >= 2) {
// Create a Battle between both
battlesDone.push(Battle(registeredValues[0], registeredValues[1]));
emit NewBattle(battlesDone[battlesDone.length - 1]);
// Remove 2 firsts elements in the array without creating gap
for (uint idx=2; idx<l; idx++) {
registeredValues[idx-2] = registeredValues[idx];
}
// Remove the 2 lasts (if exist)
registeredValues.pop();
registeredValues.pop();
}
}
function countRegistered() public view returns(uint) {
return registeredValues.length;
}
function countBattle() public view returns(uint) {
return battlesDone.length;
}
}发布于 2022-01-07 13:05:50
你不必担心,是的,两名矿工可以收到不同版本的交易,就像你怀疑的那样,他们可能也会开采,并向网络广播,但只有一家会被网络确认和记录。
因此,在这种情况下,最好的情况就是等待很少的确认。
您可以在这些QA中阅读更多关于种族状况的文章。
https://ethereum.stackexchange.com/questions/118227
复制相似问题