Solidity
如何使用 Oraclize Ledger-Proof 隨機數將 N 字節限制在值範圍內——不公平抽獎
假設您有 50 張抽獎券。您選擇從賬本證明 RNG( https://github.com/oraclize/ethereum-examples/blob/master/solidity/random-datasource/randomExample.sol)中返回 4 個隨機字節。生成的字節可以返回一個最大為 2^(8*4) = 4294967296 的數字。
您有 50 張彩票 - 因此 RN 的 4294967251–4294967296 代表 1-46 彩票持有人的獲勝機會略高,而 47–50 彩票持有人的獲勝機會略低。公平的差距很小……但非零。
你知道這個問題有什麼好的解決方案嗎?
1.在支付Oraclize時,丟棄4294967251-4294967296號有成本價值。
編輯:為了澄清,我完全相信在這種情況下以及使用完整的 32 字節時票證之間的差異很小。然而,我沒有提到我覺得有必要適應“外行人的觀點”(有誰去火星的彩票,我的票比我的鄰居去火星的機會微乎其微——我是一個外行並且不太了解統計數據、偏見等……我所了解的是,我的鄰居在 10 個 googleplexes 中比我有更多的機會去)。所以似乎拒絕抽樣是唯一的方法。但這意味著我必須編寫多個呼叫與以某種方式調整隨機字節的程式碼。
因此,您丟棄數字的解決方案被稱為
rejection sampling
並且確實是解決給定輸入問題的方法。正如您還注意到的,由於 Oraclize 的性質,與此相關的成本。如果您不想有額外的成本,那麼您唯一的其他選擇是通過更改您將數字限制為 2 的冪的範圍來消除模運算的這種偏差影響。
因此,通過出售 32 張或 64 張門票,您不必執行拒絕抽樣,並且在取模後不會有任何偏差。