智慧合約安全——私有資料訪問
這次我們將瞭解如何訪問合約中的私有資料(private 資料)。
目標合約
話不多說,直接上程式碼
這次我們的目標合約是部署在 Ropsten 上的一個合約。
合約地址:0x3505a02BCDFbb225988161a95528bfDb279faD6b
連結: http://ropsten.etherscan.io/...
漏洞分析
由上面的合約程式碼我們可以看到,Vault 合約將使用者的使用者名稱和密碼這樣的敏感資料記錄在了合約中,我們知道合約中修飾變數的關鍵字僅限制其呼叫範圍,這也就間接證明了合約中的資料均是公開的,可任意讀取的,將敏感資料記錄在合約中是不安全的。
讀取資料
首先,讓我們來學習一下solidity的 storage儲存方式:1)storage 中的資料被永久儲存。其以鍵值對的形式儲存在 slot 插槽中。
2)storage在插槽中資料從右向左排列,空間不足時,打包當前插槽,開啟下一個插槽儲存資料;儲存定長陣列(長度固定)時,陣列中每一個數據佔據一個插槽。
3)儲存變長陣列(長度隨元素的數量而改變)比較特殊,在遇到變長陣列時,會先啟用一個新的插槽 slotA 用來儲存陣列的長度,其資料儲存在另外的編號為 slotV 的插槽中。slotA 表示變長陣列宣告的位置,同時也儲存著變長陣列的長度length:length = sload(slotA)用slotV表示變長陣列資料儲存的位置(即key),index 表示 value 對應的索引下標:slotV = keccak256(slotA) + index
用 value 表示變長陣列某個資料的值:value = sload(slotV)下面我們就帶大家來讀取這個合約中的資料。首先我們先看 slot0 中的資料: 由合約中可以看到 slot0 中只儲存了一個 uint 型別的資料,我們讀取出來看一下:我這裡使用 Web3.py 取得資料,首先寫好程式
執行結果:
“7b”是16進位制數,轉換成10進位制數就是123。這裡我們就成功的去到了合約中的第一個插槽 slot0 中儲存的 uint 型別的變數 count=123 ,下面我們繼續: slot1 中儲存三個變數:u16, isTrue, owner
執行結果:
從右往左依次為owner = f36467c4e023c355026066b8dc51456e7b791d99isTrue = 01 = trueu16 = 1f = 31 slot2 中就儲存著私有變數 password 我們讀取看看
執行結果:
slot 3, 4, 5 中儲存著定長陣列中的三個元素
執行結果:
slot6 中儲存著變長陣列的長度
執行結果:
返回的結果顯示變長陣列的長度為3。我們從合約程式碼中可以看到使用者的 id 和 password 是由鍵值對的形式儲存的,下面我們來讀取兩個使用者的 id 和 password:user1
執行結果:
user2
執行結果:
這樣我們就成功的將合約中的所有資料讀取完成。由此可見,合約中的私有資料也是可以讀取的。總結大家可以看到,合約中的私有資料也是可以讀取的,所以一定不要將任何敏感資料存放在合約中哦。 如果想了解更多的智慧合約和區塊鏈知識,歡迎到區塊鏈交流社群CHAINPIP社群,一起交流學習~ 社群地址: http://www.chainpip.com/
- 天翼雲全場景業務無縫替換至國產原生作業系統CTyunOS!
- 以羊了個羊為例,淺談小程式抓包與響應報文修改
- 這幾種常見的 JVM 調優場景,你知道嗎?
- 如此狂妄,自稱高效能佇列的Disruptor有啥來頭?
- 為什麼要學習GoF設計模式?
- 827. 最大人工島 : 簡單「並查集 列舉」運用題
- 手把手教你如何使用 Timestream 實現物聯網時序資料儲存和分析
- 850. 矩形面積 II : 掃描線模板題
- Java 併發程式設計解析 | 基於JDK原始碼解析Java領域中的併發鎖,我們可以從中學習到什麼內容?
- 【手把手】光說不練假把式,這篇全鏈路壓測實踐探索
- 大廠鍾愛的全鏈路壓測有什麼意義?四種壓測方案詳細對比分析
- 寫個續集,填坑來了!關於“Thread.sleep(0)這一行‘看似無用’的程式碼”裡面留下的坑。
- 857. 僱傭 K 名工人的最低成本 : 列舉 優先佇列(堆)運用題
- Vue3 實現一個自定義toast(小彈窗)
- 669. 修剪二叉搜尋樹 : 常規樹的遍歷與二叉樹性質
- 讀完 RocketMQ 原始碼,我學會了如何優雅的建立執行緒
- 效能調優——小小的log大大的坑
- 1582. 二進位制矩陣中的特殊位置 : 簡單模擬題
- elementui原始碼學習之仿寫一個el-switch
- 646. 最長數對鏈 : 常規貪心 DP 運用題