Randomness
這個簡單的RNG能被黑嗎?
對於一款遊戲,我已經為小遊戲實現了Chainlink VRF和基本 RNG,Chainlink 的費用沒有意義。
對於第三個參數
abi.encodePacked
(一些種子數據?文件很爛,所以不太確定),我傳遞了所有進入遊戲的玩家的公鑰。function basicRNG(address[] memory players) public view returns (uint256) { return uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp, players))); }
由於這比 VRF 簡單得多,我想知道是否有缺點?:
- 可以以某種方式操縱隨機數生成嗎?我想唯一的方法是攻擊者是唯一進入遊戲的人,因為他們如何控制影響隨機數的未知公鑰?
還有一個好處:知道通過一個大陣列的氣體密集度有多大嗎?比如1000名玩家(1000個公鑰)的遊戲?
您的 RNG 程式碼存在一些問題:
- block.timestamp 可以被礦工操縱,所以它不應該被用作隨機性的來源。由於 block.difficulty 和 player 數組在執行時是固定值,礦工只需要選擇一個合適的 block.timestamp 來產生期望的結果。
- 傳遞大量玩家只是為了用 keccak256 計算隨機性是 gas 效率低的(如果你在交易中呼叫它)。僅僅因為您將更多數據傳遞給雜湊函式並不會使其“更加隨機”。相反,嘗試找到更好的隨機數來源。
祝你好運:)