區塊鏈中的隨機數演算法

2021-10-07 14:10:16 字數 726 閱讀 5006

randao是一種非常簡單的隨機性方法,因此非常常用。 一般的想法是,網路的參與者首先都是私下選擇乙個偽隨機數,然後向該私密選擇的數字提交承諾,都使用某種共識演算法就某些承諾達成一致,然後全部透露其選擇的數字,得出乙個 對顯示的數字達成共識,並對顯示的數字進行xor作為協議的輸出。

它是不可**的,並且與基礎共識協議具有相同的活躍性,但存在偏差。 具體來說,一旦其他人開始透露其編號,惡意行為者便可以觀察網路,並根據到目前為止所觀察到的編號進行異或運算,選擇是否透露其編號。 這允許單個惡意行為者對輸出產生一點影響,而控制多個參與者的惡意行為者具有與其所控制的參與者數量一樣多的影響。

為了使randao變得不偏不倚,一種方法是使輸出不僅是xor,而且要花費比分配的時間更多的時間來顯示數字。如果最終輸出的計算花費的時間比揭示階段所需的時間長,那麼惡意行為者將無法**它們揭示或不揭示其數量的效果,因此不會影響結果。

雖然我們希望用於計算隨機性的函式對生成隨機數的參與者花費很長時間,但我們希望隨機數的使用者不必再次執行相同的昂貴函式。因此,他們需要以某種方式能夠快速驗證隨機數是否正確生成,而無需重做昂貴的計算。

這種方法的最大挑戰是,需要以一種方式配置vdf,即使是擁有非常昂貴的專用硬體的參與者也無法在顯示階段結束之前計算vdf,並且理想情況下具有一些有意義的安全裕度,例如10倍。下圖顯示了具有專用asic的參與者的攻擊,該參與者使他們能夠以比分配randao承諾的時間更快的速度執行vdf。這樣的參與者仍然可以計算出有或沒有其份額的最終輸出,並根據這些輸出選擇顯示或不顯示:

演算法 隨機數

include include include 功能,隨機生成n個隨機數,並按公升序排序 int main void printf 從小到大排列為 n for i 0 i for i 0 i printf 4d arr i return0 這裡生成隨機數的關鍵 includesrand unsign...

概率 隨機數演算法

int generate01 int func else if num1 0 num2 1 return ret int generaterandomnum int max int bit num 0,i 0 int result 0 while 0x01 bit num max bit num w...

PHP隨機數演算法

tmp range 1,30 print r array rand tmp,10 輸出 array 0 6 1 8 2 13 3 16 4 17 5 20 6 21 7 22 8 28 9 29 參考 無論是web應用,還是wap或者移動應用,隨機數都有其用武之地。在最近接觸的幾個小專案中,我也經常...