我正在创建一个永久性的琐事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秒增加一次,而不中断游戏。
答案 0 :(得分:1)
您可能需要一个外部实体,例如游戏主机Web应用程序,该应用程序使用其自己的计时器来更改状态并发送交易,但是每笔交易都会耗费您大量的汽油。
或者您可以在前端跟踪状态(有点像同步),然后每当播放器与以太坊dapp交互以进行函数调用时,您都可以执行fetchState()来获取新状态并然后将玩家路由到正确的游戏状态。
例如,在网络应用前端确认用户已经付款之后,它会亲自跟踪状态并向用户提供与dapp预测状态相关的UI选项,然后当用户发送类似“ dapp将更新其状态并验证用户是否可以提交琐事答案。
function SubmitTriviaAnswer(int responseID) public {
fetchState()
...
}