如何在定时状态机(实体)中触发新状态

时间:2018-07-30 20:21:19

标签: solidity

我正在创建一个永久性的琐事dapp(出于学习目的),它具有3个阶段。每个阶段应持续约30秒。示例:

enum Stages {
    AcceptingEntryFees,
    RevealQuestion,
    Complete
}

modifier transitionToReveal(uint _playerCount) {
    _;
    if (stage == Stages.AcceptingEntryFees && now >= creationTime + 30 seconds && _playerCount > 0) {
        nextStage();
    }
}

modifier transitionToComplete() {
    _;
    if (stage == Stages.RevealQuestion && now >= creationTime + 60 seconds) {
        nextStage();
    }
}

modifier transitionToAcceptingFees() {
    _;
    if (stage == Stages.Complete && now >= creationTime + 90 seconds) {
        nextStage();
    }
}

function nextStage() internal {
    stage = Stages(uint(stage) + 1);
}

我正在努力解决一旦满足时间要求就如何使载物台递增的解决方案。我完全不需要30秒。

进行第一次过渡(接受费用)。

function payEntryFee() external payable transitionToReveal(getPlayerCount()) atStage(Stages.AcceptingEntryFees) {
    ....
}

我目前已经设置好了,人们可以付费玩到30秒为止。但是,为了增加tx的阶段,必须进行。因此,对于这种设置,第一个在30秒后加入的人将招致汽油价格并触发下一阶段。这是不理想的,因为如果另一个玩家一段时间不出现怎么办。

根据我的研究,没有办法在内部按时间触发方法,而尝试从前端触发该方法将需要耗费汽油,然后由谁付款?

有人能想到一个优雅的解决方案吗?我希望舞台每30秒增加一次,而不中断游戏。

1 个答案:

答案 0 :(得分:1)

您可能需要一个外部实体,例如游戏主机Web应用程序,该应用程序使用其自己的计时器来更改状态并发送交易,但是每笔交易都会耗费您大量的汽油。

或者您可以在前端跟踪状态(有点像同步),然后每当播放器与以太坊dapp交互以进行函数调用时,您都可以执行fetchState()来获取新状态并然后将玩家路由到正确的游戏状态。

例如,在网络应用前端确认用户已经付款之后,它会亲自跟踪状态并向用户提供与dapp预测状态相关的UI选项,然后当用户发送类似“ dapp将更新其状态并验证用户是否可以提交琐事答案。

function SubmitTriviaAnswer(int responseID) public {

    fetchState()

    ...

}