Dark Forest 神器挖掘机制“考古”

Dark Forest 游戏的乐趣很大程度上来源于随机性,游戏中内建的随机主要来源于以下几方面

  • 玩家的出生点
  • 游戏内地图的随机分布
  • 多个玩家间的不可预知互动
  • 不同效果神器的随机开出

上述随机性其实也是任何一个策略类游戏应当具备的,但是Crypto-Native 游戏的特点是这些随机性是由区块链和代码来保证的,不会有运营方操纵概率。

上述随机性中,前三项是自游戏诞生以来便存在的,而神器则是在V0.5才加入到游戏中,个人认为缺少神器的Dark Forest 只是简单的“命令与征服”,意即命令星球发送能量,然后占领另外一个星球,缺乏动人心魄的争夺战和策略运用的余地,加入神器后,Dark Forest 才变得更加完整,同时神器也是Dark Forest未来最具扩展性的部分,因为神器本身就是符合ERC721标准的Token,因此未来可做的事情很多。

既然Dark Forest游戏的随机性是由代码保证的,那么成也代码,败也代码,这些随机性也最容易被从代码上攻破,不得不感叹,在物理世界里随机无处不在,而人类想要不借助物理世界产生随机数却难比登天,似乎真正的随机才是生命的奥义。

而在V0.5版本中,Dark Forst神器挖掘的随机性就曾经被攻破,造成玩家可以利用漏洞按照自己的需求任意挖掘“传说”等级的神器。

这个漏洞起源于神器生成的算法:

  • findArtifact() 用以下三个参数调用 DarkForestUtils._artifactSeed() : planetId, planetEventsCount, and planetId
  • _artifactSeed() 对三个参数进行哈希计算来生成seed,但是其中有一个参数的名字叫blockTimestamp,而block.timestamp 却并没有被使用,这是一个漏洞
  • DarkForestUtils._randomArtifactTypeAndLevelBonus() 用这个seed来计算神器的稀有度等级
  • 因此用户可以发送move,待planetEventsCount到达合适的数值,然后调用findArtifact()来挖掘神器

通过上述方法,玩家可以利用这个漏洞来挖掘高稀有度的神器,由此打破游戏的平衡。

出现上述漏洞的原因是,在调用DarkForestUtils._artifactSeed()时错误的提供了两遍planetId,而没有使用block.timestamp,造成游戏失去了随机性,但即便使用了block.timestamp时间戳,也仍然避免不了玩家利用这个漏洞,因为玩家可以预测未来一段时间内planetEventsCount的数量增加情况,并结合时间戳进行提前计算,来提高自己获取高稀有度神器的概率。

为了提升游戏的随机性,在随后的版本中,改进了神器的挖掘机制,将blockhash加入到了seed生成算法中,由于hash是无法提前预测的,因此玩家也就无法提前进行计算。但是由于历史区块的blockhash只会保留256个区块,因此也就出现了Prospect之后必须在256个区块之内进行Find的机制,也就是说这个机制其实是个美丽的副作用,是为了保证随机性的代价。

上述是游戏随机性博弈的一个例子,在后续的版本中,玩家的出生点、游戏地图的随机分布这两个随机性也曾经被玩家攻破,这个故事我们后面再讲。

下面是神器挖掘机制的官方blog:Exploiting DF v0.5 Artifact Minting

By:EliteMetaverse.eth

Subscribe to EliteMetaverse
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.