Dark Forest 是一款實時策略遊戲。星球移動和攻占是遊戲的策略重點,為了在不公開星球坐標的情況,還能證明星球的移動正確,引入了零知識證明技術。
原文標題:《Dark Forest – 採用零知識證明技術的遊戲》
撰文: Star Li
Dark Forest 是一款MMO (大型多人在線遊戲類型)遊戲。我比較感興趣的是這款遊戲使用了零知識證明技術。零知識證明技術應用越來越豐富:隱私、跨鏈、ZK Rollup,遊戲等等。本文介紹Dark Forest 的基本策略,如何結合零知識證明技術。在文章的最後,介紹最新版本v0.6 Round 3 的遊戲體驗和截圖。
目前Dark Forest 版本已經迭代到0.6。但是,github 上的最新的代碼並沒有公開電路的部分。為了方便理解它如何採用零知識證明技術,可以查看github 公佈的0.3 的 完整代碼。
遊戲策略
看看智能合約的源代碼,可以對Dark Forest 的遊戲策略有一定的了解。智能合約的源代碼在目錄:
darkforest-v0.3/eth/contracts
整個遊戲宇宙由「星球」(Planet)組成:
struct Planet { address owner; uint256 range; uint256 population; uint256 populationCap; uint256 populationGrowth; PlanetResource planetResource; uint256 silverCap; uint256 silverGrowth; uint256 silver; uint256 silverMax; uint256 planetLevel; PlanetType planetType; }
一個星球有兩種「資源」:人口(population)和礦(目前支持silver-銀)。人口和礦慢慢增長,但是有上限。有礦可以升級。 DarkForestInitialize.sol 定義了幾種星球類型。
struct ArrivalData { uint256 id; address player; uint256 fromPlanet; uint256 toPlanet; uint256 popArriving; uint256 silverMoved; uint256 departureTime; uint256 arrivalTime; }
從一個星球能將資源移動到另外一個星球。星球的移動存在速度。移動的同時可以指明攜帶的資源。當到達時,如果攜帶的人員超過該星球的人口,就可以攻占星球。攻占邏輯可以查看darkforest-v0.3/eth/contracts/DarkForestLazyUpdate.sol 的applyArrival 函數(當移動完成後觸發):
function applyArrival( DarkForestTypes.Planet storage_planet, DarkForestTypes.ArrivalData storage_planetArrival ) private { // checks whether the planet is owned by the player sending ships if (_planetArrival.player ==_planet.owner) { // simply increase the population if so _planet.population = SafeMath.add( _planet.population, _planetArrival.popArriving ); } else { if (_planet.population >_planetArrival.popArriving) { _planet.population = SafeMath.sub( _planet.population, _planetArrival.popArriving ); } else { _planet.owner =_planetArrival.player; _planet.population = SafeMath.sub( _planetArrival.popArriving, _planet.population ); } } _planet.silver = Math.min( _planet.silverMax, SafeMath.add(_planet.silver,_planetArrival.silverMoved) ); }
如果是到達自己的星球,人口和銀礦直接累加。如果是其他人的星球,如果作戰人數不夠(小於星球人口),到達星球的人口相應減少。如果作戰人數大於到達星球人口,攻占星球,並更新人口(作戰犧牲)。
星球的移動和攻占是整個遊戲的策略重點。既然是移動攻擊,每個星球有一個坐標。為了增加遊戲的策略體驗,星球的具體坐標並不公開。有點像在浩瀚的宇宙中,只能觀察(枚舉)周圍有限空間(hash 碰撞)尋找其他星球。為了在不公開星球坐標的情況,還能證明星球的移動正確,引入了零知識證明技術。
零知識證明應用
asDark Forest 遊戲V0.3 利用零知識證明技術證明了兩個和星球位置有關的操作:1/ 星球初始化(init) 2/ 星球移動(move)。電路邏輯在darkforest-v0.3/circuits/ 中。電路採用circom 開發。電路的證明採用Groth16 協議。兩個電路相對都比較簡單:
init 電路
init 電路用來確保星球創建的時候,坐標在範圍內。 x 和y 坐標都不超過2^32 次方。
/* check abs(x), abs(y), abs(r) < 2^32 */ component rp = MultiRangeProof(2, 40, 2**32); rp.in[0] <== x; rp.in[1] <== y;
在半徑為r 的圓形範圍內:
/* check x^2 + y^2 < r^2 */ component comp = LessThan(32); signal xSq; signal ySq; signal rSq; xSq <== x * x; ySq <== y * y; rSq <== r * r; comp.in[0] <== xSq + ySq comp.in[1] <== rSq comp.out === 1;
mimc(x,y) 的hash 計算正確。 x/y 是private input,hash 值是public input。
/* check MiMCSponge(x,y) = pub */ /* 220 = 2 * ceil(log_5 p), as specified by mimc paper, where p = 21888242871839275222246405745257275088548364400416034343698204186575808495617 */ component mimc = MiMCSponge(2, 220, 1); mimc.ins[0] <== x; mimc.ins[1] <== y; mimc.k <== 0; pub <== mimc.outs[0];
move 電路
在星球移動時,檢查移動的範圍不能超過半徑為distMax 的圓:
/* check (x1-x2)^2 + (y1-y2)^2 <= distMax^2 */ signal diffX; diffX <== x1 - x2; signal diffY; diffY <== y1 - y2; component ltDist = LessThan(32); signal firstDistSquare; signal secondDistSquare firstDistSquare <== diffX * diffX; secondDistSquare <== diffY * diffY; ltDist.in[0] <== firstDistSquare + secondDistSquare; ltDist.in[1] <== distMax * distMax + 1; ltDist.out === 1;
確定原始坐標的hash 值以及移動後的hash 值,顯然具體坐標是private input,hash 值是public input。
component mimc1 = MiMCSponge(2, 220, 1); component mimc2 = MiMCSponge(2, 220, 1); mimc1.ins[0] <== x1; mimc1.ins[1] <== y1; mimc1.k <== 0; mimc2.ins[0] <== x2; mimc2.ins[1] <== y2; mimc2.k <== 0; pub1 <== mimc1.outs[0]; pub2 <== mimc2.outs[0];
隨著Dark Forest 版本的迭代,更新了不少新的玩法。和位置有關的證明的電路也變多了,但是基本邏輯類似,感興趣的小伙伴可以自行查看。
體驗v0.6 Round 3
體驗了一下最新的遊戲版本:v0.6 Round 3。目前參加遊戲需要邀請碼。
進入遊戲的主界面如上,由4 部分組成:1/ 最左邊是工具欄,玩家可以查看自己的星球(Planets)和裝備(Artifacts)。遊戲支持各種插件(plugins)。 2/ 最右邊是交易記錄3/ 中間是整個宇宙星球分佈圖。從某個玩家的視角看,整個宇宙由黑色背景和霧色組成。黑色背景是已經開拓的宇宙世界。霧色區域是沒有開拓的宇宙世界。在開拓的宇宙世界中有各種等級的星球。 4/ 底部是開拓掃描控制欄,可以控制掃描是否開始,從什麼坐標掃描。注意在宇宙分佈圖中的靶向圖標,這個圖標就是指明正在掃描的宇宙空間。進入遊戲的時候,嚮導程序會引導熟悉基本的功能按鈕。默認情況下,掃描程序不停的掃描未知宇宙空間。
點擊某個星球,可以查看該星球的具體參數。下圖是攻占的一個星球的參數信息:
紅色:當前人口數/ 人口上限。藍色:當前的礦數/ 礦上限。粉紅色:防禦率(百分制)/ 移動速度/ 攻擊範圍。咖啡色:裝備。 「send」按鈕可以發送人口和礦到其他星球上。 「send」功能就是對應電路中的move 操作。在move 的移動過程中,兩個星球中間有白色連線。白色連線上會顯示移動的進度。
各種星球的屬性不同,有些可以產礦,有些有裝備,有些能升級,有些不能升級等等。
每個星球從level 1 開始。 Round 3 的目標是攻占並擁有level 3 以上的星球。離原點越近的星球,分數越高者排名越高。在原點還設置了level 9 的星球,攻占了這個星球的玩家為第一名。
總結
Dark Forest 是一款實時策略遊戲。星球的移動和攻占是整個遊戲的策略重點。為了在不公開星球坐標的情況,還能證明星球的移動正確,引入了零知識證明技術。
免責聲明:作為區塊鏈信息平台,本站所發布文章僅代表作者個人觀點,與鏈聞ChainNews 立場無關。文章內的信息、意見等均僅供參考,並非作為或被視為實際投資建議。