solidity智慧合約[52]-安全-storage陷阱
阿新 • • 發佈:2018-11-30
storage陷阱
下面的合約是一個鎖定金額的合約,使用者將資金儲存在此合約中,只有當過了一段時間時候才能夠提取出來。
下面的案例是為了說明storage屬性預設性帶來的陷阱。payIn函式是當用戶儲存金額時呼叫的函式。傳遞的引數似乎解鎖的時間。在合約payIn中,HoldRecord newRecord; 其實預設為storage型別,並且,當不為storage變數賦值的時候,變數預設引用的位置是storage空間中的0號位置。這也意味著在當前的案例中,newRecord指標指向了ownerAmount,當對newRecord 執行newRecord.amount += msg.value; 實則將ownerAmount即合約擁有者的金額增加了。 這時,合約擁有者就可以呼叫ownerWithdrawal將使用者儲存在合約的錢轉移出來。
1 |
pragma solidity ^0.4.23; |
解決辦法
HoldRecord newRecord 修改為 HoldRecord memory newRecord
總結
1 |
// 這個例子是要舉出在 smart contract 中 storage 預設行為的危險性。其實只要維持一個原則就可以避免這個問題。 |
本文連結: https://dreamerjonson.com/2018/11/25/solidity-52-security-storage/
版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY 4.0 CN協議 許可協議。轉載請註明出處!