訪問私人數據|破解Solidity

在開始之前,我們需要了解狀態變量是如何通過SLOTS以穩定方式存儲的。 Slot SystemSolidity通過槽存儲合約中定義的變量。訪問說明符(私有)當為基於區塊鏈的應用程序(dApps)編寫代碼時,你可以定義一個變量為公共或私有。定義私有變量的目

在開始之前,我們需要了解狀態變量是如何通過SLOTS以穩定方式存儲的。

Slot System

Solidity通過槽存儲合約中定義的變量。

訪問說明符(私有)

當為基於區塊鏈的應用程序(dApps)編寫代碼時,你可以定義一個變量為公共或私有。定義私有變量的目的是防止其他合約修改它。但是,區塊鏈應該是透明的,這意味著不管變量是私有的還是公共的,每個人都可以讀取它。因此,存儲像密碼這樣的敏感信息是一個非常糟糕的主意。

通過例子來理解

Vault Contract定義了各種各樣的變量,但最有趣的是bytes32密碼,存儲id和密碼的struct Users數組。

addUsers函數將其他用戶推送到Users結構數組中。

合約已經部署在Ropsten TestNet地址:0x3505a02BCDFbb225988161a95528bfDb279faD6b

讓我們使用truffle來學習如何與插槽交互,並最終提取密碼。

Truffle Demo

讓我們連接到Ropsten並初始化到我們擁有的合約地址。

truffle — 連接到Ropsten

如果你正在查看上面的合約,我已經標記了哪些變量存儲在哪些槽中。

//Syntax to access the data stored in the slots web3.eth.getStorageAt(contractAddress, slotIndex, console.log)

在下面的例子中,我們讀取slotIndex=0的數據,然後將十六進制轉換為十進制。

在本例中,我們試圖讀取slotIndex=2的內容,即密碼變量。輸出為bytes32,可以通過web3.utils.toAscii轉換為Ascii碼。

讀取私有bytes32密碼變量

最後,讀取用戶id和密碼。第一個getStorageAt調用輸出數組長度。 soliditySha3返回第一個數組元素存儲的哈希值。

訪問下一個存儲項。我們需要將哈希值增加1。因此,3f - >40。

讀取struct Users數組中的數據

解決方案

區塊鏈在設計上是透明的,所以不要將敏感信息存儲在區塊鏈上。

Source:https://zuhaibmd.medium.com/accessing-private-data-hack-solidity-4-f94d479432c7

分享至:

作者:去中心化金融社区

本文為PANews入駐專欄作者的觀點,不代表PANews立場,不承擔法律責任。

文章及觀點也不構成投資意見

圖片來源:去中心化金融社区如有侵權,請聯絡作者刪除。

關注PANews官方賬號,一起穿越牛熊
推薦閱讀
2小時前
4小時前
2026-01-15 12:00
2026-01-15 10:10
2026-01-15 07:00
2026-01-15 03:00

熱門文章

行業要聞
市場熱點
精選讀物

精選專題

App内阅读