合約變數變動預測
我相信這是一個非常簡單的問題,但我在文件或Google中找不到直接答案。我是 Solidity/ethereum 的新手,也許我還沒有完全理解一些核心概念。
所以,讓我們使用這樣的簡單程式碼
contract StrangeToken { uint256 private repurchasePrice; mapping(address => uint256) balances; function setPrice(uint256 price) { repurchasePrice = price; } }
任何人都可以呼叫
setPrice()
函式來設置repurchasePrice
變數。假設有成千上萬的使用者,setPrice()
每分鐘甚至更頻繁地呼叫一次,並且該值設置為某個隨機數。問題是:預測和/或影響最近未來/即將到來的區塊的 repurchasePrice 的價值有多難。
據我了解,乙太坊不一定會保留一系列呼叫,因此沒有實際的可能性來計時,因此攻擊者必須至少是礦工,而不是普通使用者。但是我對這個領域的礦工的可能性並不完全清楚。
謝謝!
我不確定我是否完全理解你的問題,但我想我明白了它的要點。
使用允許任何人更改數字的公開訪問功能,沒有明顯的方法來預測下一個確認的數字,因為在探勘一個塊之前不會建立交易順序。獲勝者將永遠是最近開采的交易。
每個人都可以將候選者視為待處理的交易(由於網路延遲,對排序的看法有所不同)。
我製作了一個稍作修改的範例,可能有助於說明正在發生的事情。
pragma solidity ^0.4.13; contract NotSoSecret { bytes32 public secretHash; // put some money in with a hashed secret function deposit(bytes32 _secretHash) public payable returns(bool success) { secretHash = _secretHash; return true; } // if you know the magic word, you get the pot function claim(bytes32 password) public returns(bool success) { if(sha3(password) == secretHash) { msg.sender.transfer(this.balance); return true; } return false; } }
這看起來應該可以工作,但不會。
deposit
接受資金和雜湊。看起來需要知道密碼才能獲得戰利品。實際上,將會發生的事情是有人知道
password
將向其發送交易,claim
並且未確認的交易將被廣播到網路(礦工和全節點會聽到)。這將鼓勵比賽,因為每個人都會看到密碼。因此,當攻擊者使用該知識進行自己的交易(為自己索取獎勵)時,他們將有(大約)50/50 的成功機率。為什麼一試就停下來?一旦秘密被揭露,契約可能會被索賠轟炸。
希望能幫助到你。
問題是:預測和/或影響最近未來/即將到來的區塊的 repurchasePrice 的價值有多難。
根據我的理解和我得到你問題的方式,repurchasePrice 價值的預測與可靠性或乙太坊本身無關,但是使用者在那裡設定價格的好處意味著它必須在經濟方面而不是技術方面。
所以攻擊者必須至少是礦工,而不是普通使用者。但是我對這個領域的礦工的可能性並不完全清楚。
從礦工的角度來看,主要任務是根據探勘時間的難度找到有效的雜湊值。如果他試圖廣播一個包含無效交易的區塊(比如說攻擊你的合約),當它被驗證時,由於交易無效,他探勘的區塊將被拒絕。
所以攻擊你的合約的方法是發送一個有效的交易,但利用你的合約的漏洞。因此,您可以做的是遵循開發安全合約的最佳實踐。您可以參考連結:soldity 文件和這篇寫安全可靠的文章。
DOA 攻擊是一個很好的例子,為什麼你應該編寫安全的 Solidity 程式碼而不讓其他人利用你的合約來謀取利益。