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

By [EliteMetaverse](https://paragraph.com/@elitemetaverse) · 2021-11-18

---

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

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

**上述随机性其实也是任何一个策略类游戏应当具备的，但是**[**Crypto-Native**](https://gubsheep.substack.com/p/the-strongest-crypto-gaming-thesis) **游戏的特点是这些随机性是由区块链和代码来保证的，不会有运营方操纵概率。**

上述随机性中，前三项是自游戏诞生以来便存在的，而神器则是在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](https://blog.zkga.me/artifact-minting-exploit)

By:[EliteMetaverse.eth](https://twitter.com/amolisi_)

![](https://storage.googleapis.com/papyrus_images/84b3f1a0781c3262e16326ba62c0ba8df8480d3dd4857a24b9cb6c8d02bb47e2.jpg)

---

*Originally published on [EliteMetaverse](https://paragraph.com/@elitemetaverse/dark-forest)*
