首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保已注册的数组/队列总是相同的?

如何确保已注册的数组/队列总是相同的?
EN

Ethereum用户
提问于 2022-01-07 11:20:08
回答 1查看 60关注 0票数 0

我正在尝试一种智能契约,用户可以注册自己(在一个排序的数组中),当注册了一定数量的人(在这里2),创建了一个战斗,第一注册用户之间的战斗。

代码不是一个问题,但我主要关心的是,如果多个请求在同一个集群中出现,而矿工将在队列中对请求进行排序(每个人都必须是相同的),那么会追加什么呢?我怎样才能避免冲突?

示例:我有3个用户(A、B和C)。A已经在合同上注册,B和C试图在同一个区块注册。什么是矿工,接受事务并执行一种、B、C,以便A将战斗B和C将留在注册数组中。但以同样的方式,另一个矿工采取、C、B,在A和C之间创建一个战斗并保持B。A+B和A+C的战斗都在同一时间进行,而剩下的数组是不一样的。这个案子会怎么样?

我试着在网上搜索(没有发现什么好的),或者编写一个简单的示例,并在Remix上使用Ganache和多个浏览器对其进行测试,但是测试它真的很痛苦。

这是我的测试代码(谁工作很好..)但我不知道怎么确定?任何想法,联系,建议.

代码语言:javascript
复制
// 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;
    }
}
EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-01-07 13:05:50

你不必担心,是的,两名矿工可以收到不同版本的交易,就像你怀疑的那样,他们可能也会开采,并向网络广播,但只有一家会被网络确认和记录。

因此,在这种情况下,最好的情况就是等待很少的确认。

您可以在这些QA中阅读更多关于种族状况的文章。

如果两种不同的智能契约冲突状态会发生什么?

在单个事务中,对合同的多个调用的顺序和并发行为是什么?

调用远程合同时的争用条件

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/118227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档