Transactions

礦工可以“欺騙”我的彩票智能合約嗎?

  • June 8, 2017

我開發了一個智能合約,你:

  1. 向一個地址發送 1 個乙太幣,合約保存你的地址

  2. 5 個人發送 1 個乙太幣後,合約隨機選擇一個地址,將 5 個乙太幣發送到該地址

我在這裡讀到:單個事務中多次呼叫合約的順序和並發行為是什麼?

礦工決定交易的順序。

如果在同一個區塊內向合約發送了超過 5 筆交易,礦工是否可以通過遊戲系統輸入自己的交易並按照他決定每次獲勝的訂單執行智能合約?

中獎地址是使用

       random = uint(block.blockhash(block.number-1))%5 + 1;

我知道一個礦工每挖出一個區塊就能獲得 5 個乙太幣 + 費用,所以我將輸入限制為總共 5 個乙太幣。隨機函式不是那麼隨機,但低支出(我認為)應該讓礦工不關心遊戲它。這是函式的程式碼:

function () payable {
   require(msg.value == 1 ether);

   my_length +=1;

   gamblers[my_length] = msg.sender;

   if (my_length == 5) {
       // pick a random number between 1 and 5
       random = uint(block.blockhash(block.number-1))%5 + 1;
       gamblers[random].transfer(5 ether);
       my_length = 0;
   }

謝謝

是的他們可以

時間戳(現在,block.timestamp)可靠嗎?

這取決於您所說的“可靠”是什麼意思。一般來說,它們是由礦工提供的,因此很容易受到攻擊。

(…)

切勿使用 now 或 block.hash 作為隨機源,除非您知道自己在做什麼!

文件

使用 Oracle 獲得隨機性有更可靠的方法。但是,您必須信任 Oracle 和數據源(例如 random.org),而不是信任礦工。這裡有更多的技術方法來實現這一點。

從技術上講,除了礦工之外,一些玩家可能能夠玩這個系統。由於您使用的是前一個塊的雜湊,礦工可以簡單地等待將交易包含到您的彩票中,直到前一個塊具有有利的雜湊。如果新的鏈頭包含有利的時間戳,使用者還可以嘗試在下一個區塊中獲取他們的交易。

如果兩類使用者都試圖博弈系統,礦工可以通過首先將他們的交易包含在區塊中來獲勝。

請注意,這可能需要他們方面的一些自定義基礎設施,並且可能不太可能……但是能夠玩這個系統的玩家是一個更緊迫的問題。

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