Contract-Development

智能合約和信任編譯字節碼固有的缺乏安全性

  • April 18, 2018

編譯區塊鏈上的智能合約。是否有任何系統來驗證所有公共 dapp 合約是否按照他們的提議執行?

即,這可以通過編譯開源合約和驗證合約雜湊簽名來完成,或者在封閉源但公共 d-apps 的情況下,可能會反編譯編譯的字節碼並驗證程式碼路徑/函式呼叫,儘管這是一個更加模糊的領域.

參見例如https://etherscan.io/address/0xf97e0a5b616dffc913e72455fde9ea8bbe946a2b#code這是 CryptoKitties “基因組合”算法。雖然 CryptoKitties 的其餘部分是開源的,但這個特定的程式碼模組是閉源的。然而,它已經過逆向工程——這是一篇關於它的部落格文章,https://medium.com/@sean.soria/cryptokitties-mixgenes-function-69207883fc80。雖然這是一個小程式碼功能,但似乎有可能啟動 dapp,提出並乍一看似乎是開源的,但實際上包含一個隱藏的定時炸彈,例如將乙太幣的餘額轉移到一個壞演員在硬編碼的未來日期上的帳戶。

我們是否需要建立一些框架或服務來在某種程度上驗證所有已發布的智能合約程式碼?

這可以通過編譯開源合約和驗證合約雜湊簽名來完成

這幾乎就是 Etherscan 已經在做的事情。您知道 Etherscan 在這裡的功能嗎?您是否提出了比 Etherscan 已經做的更多的事情?

對於沒有發布原始碼的智能合約,根本不要信任它們。(或者如果您能夠直接審核字節碼,請相信他們,我認為幾乎沒有人能做到這一點。)

$$ T $$這可以通過編譯開源合約和驗證合約雜湊簽名來完成,或者在封閉原始碼但公共 d-apps 的情況下,可能會反編譯編譯的字節碼並驗證程式碼路徑/函式呼叫,儘管這是一個更加模糊的領域。

如果你使用solc編譯solidity程式碼的編譯器,你可以編譯合約的發布者聲稱代表區塊鏈上的合約的原始碼。如果您編譯和發布有問題的原始碼,您必須使用帶有標誌的編譯器--bin-runtime來獲取將放置在區塊鏈上的程式碼。看看這個答案:solc bin vs. bin-runtime

然後,您可以將返回的二進制程式碼solc與 geth 中呼叫返回的程式碼進行比較eth.getCode(contractaddress)(此呼叫返回儲存在 address 上的二進制contractaddress程式碼。這是放置在區塊鏈上的合約的 EVM 程式碼)。這兩個操作的二進制程式碼應該匹配。

就像你說的,你也可以熟悉乙太坊合約編譯成的虛擬機程式碼,稱為 EVM。如果這樣做,您將能夠直接從區塊鏈中讀取合約的內容。如果您想學習 EVM,黃皮書是一個很好的資源

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