Solidity

誠實彩票中獎者生成 - 偽隨機數獲取

  • January 2, 2021

假設我想組織一次誠實的彩票,並在需要中獎時防止作弊。我知道已知網路中的隨機數問題出現了。

我想嘗試以下算法來防止作弊。

這個想法是使用塊的雜湊值,但礦工/參與者和組織者不知道塊號以防止作弊。

  1. 在開始時,組織者定義了一個隨機 uint64 -用於獲勝者隨機數計算的**密鑰號。**uint 編號足夠大,組織者只在開始時才知道。
  2. 組織者通過提供總和的雜湊值來修復密鑰編號- 數字加上目前塊雜湊(作為鹽)。密鑰雜湊儲存在彩票合約中,可供所有參與者使用。然後使用密鑰雜湊來防止組織者作弊並修復密鑰編號。
  3. 參與者購買彩票,彩票合約儲存所有參與者地址。這些地址也用於獲勝者計算。
  4. 當條件滿足時(例如,所有的票都被售出或產生了必要數量的塊或在一段時間後),組織者開始計算獲勝者。
  5. Organizer 提供儲存的密鑰編號,並通過計算密鑰雜湊(在 init 上輸入)確認該數字完全相同。
  6. 密鑰號添加到地址總和中,我們得到總和的 mod 255 來檢測塊的數量,使用雜湊來檢測獲勝者。key number + address1 + address2 … + addressN % 255 = 獲勝者區塊數(區塊雜湊用於獲取獲勝者編號)

對於想猜中獎號碼的人來說,不可能得到號碼 - 在契約中我們只有號碼的雜湊值。該數字相當大 uint64(或可能更大)以防止“取消散列”數字。對於組織者來說,這個數字是固定的並且是徒勞的,因為必須知道所有門票所有者的地址才能計算獲勝者。

意見?邏輯上有漏洞嗎?

更新:在討論了建議的算法之後,有一個改進。

  1. 當參與者購買彩票時,允許傳遞額外的參與者密鑰號碼,該號碼也用於獲勝者計算。
  2. 假設票價是 100%。
  3. 當參與者想要提供自己的參與者密鑰號碼時,他支付更多費用,例如 300%。
  4. 如果在獲勝者檢測回合中提供參與者密鑰號碼,則返還 210% 的票價。
  5. 如果未提供參與者密鑰號碼,則將總和添加到彩票獎金中。

因此每個對組織者誠實有疑問的人都可以添加自己的隨機部分。不提供鑰匙意味著這樣的人失去了押金。這樣的誠實提供者可以獲得更便宜的(實際上)門票。

組織者可以通過嘗試許多不同的地址來欺騙系統,當將Key number + address1 + address2 ... + addressN % 255這些地址作為最後一個地址添加到您的公式中並獲取塊的雜湊時,使該地址成為獲勝者。

你可以這樣想:

  • 如果您的系統是安全的,則無法欺騙系統。
  • 如果沒有辦法欺騙系統,主辦方也無法欺騙系統。
  • 如果組織者沒有辦法欺騙系統,那麼知道鑰匙號碼並不會給你任何欺騙系統的方法。(否則主辦方會因為知道鑰匙號碼而欺騙系統)
  • 如果知道密鑰號碼不會給您任何欺騙系統的方法,那麼使用密鑰號碼的系統與沒有密鑰號碼的系統一樣安全。
  • 您可以擺脫鑰匙號碼。這個公式Key number + address1 + address2 ... + addressN % 255和這個一樣安全address1 + address2 ... + addressN % 255
  • 但是,上面沒有密鑰號的公式是不安全的,因為它會受到我在開始時描述的相同攻擊。在決定獲勝者之前,有人可以嘗試一堆地址並找到一個讓他成為獲勝者的地址。
  • 這意味著帶有密鑰編號的公式也是不安全的。

結果我們遇到了矛盾——我們假設我們的系統一開始是安全的,最後得出結論是不安全的。因此我們的假設是不正確的。


您應該做的是將彩票分為兩個階段:

  1. 購買門票時,參與者必須在交易中包括:
  • 一些隨機數的雜湊。
  • 門票的費用。
  • 一些相當大的存款。
  1. 當所有門票都售出時(或過期後),在第一階段購買門票的每個人都必須透露密碼。
  • 當你透露你的秘密號碼時,你會拿回你的押金。
  • 在每個人都透露了他們的秘密號碼之後,這些秘密號碼一起被用作隨機性的來源來確定獲勝者,例如將它們連接起來並散列。
  • 如果有人沒有透露他們的秘密號碼(或過期後),彩票將被取消:每個透露他們的秘密號碼的人都可以撤回他們支付的門票價格。每個沒有透露秘密號碼的人都會失去他們的押金和門票費用。
  • 存款提供了透露秘密號碼的動機。如果有人沒有透露他們的秘密號碼,則必須取消彩票的原因是,如果秘密號碼對攻擊者有利,則有一種方法可以通過不公開秘密號碼來欺騙系統。

以類似的方式實現RANDAO。查看附加規則激勵部分,了解您需要確保防止作弊的其他事情。

特別是,存款金額與門票價格之和必須不低於最高獎勵(通常是彩票中的總金額)。任何小於此的存款都將提供作弊的機會,正如lungj在這裡解釋的那樣

引用自:https://ethereum.stackexchange.com/questions/34988