亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

solidity智能合約[52]-安全-storage陷阱

發布時間:2020-06-20 04:43:05 來源:網絡 閱讀:168 作者:jonson_jackson 欄目:開發技術

storage陷阱

下面的合約是一個鎖定金額的合約,用戶將資金存儲在此合約中,只有當過了一段時間時候才能夠提取出來。
下面的案例是為了說明storage屬性預設性帶來的陷阱。payIn函數是當用戶存儲金額時調用的函數。傳遞的參數似乎解鎖的時間。在合約payIn中,HoldRecord newRecord; 其實默認為storage類型,并且,當不為storage變量賦值的時候,變量默認引用的位置是storage空間中的0號位置。這也意味著在當前的案例中,newRecord指針指向了ownerAmount,當對newRecord 執行newRecord.amount += msg.value; 實則將ownerAmount即合約擁有者的金額增加了。 這時,合約擁有者就可以調用ownerWithdrawal將用戶存儲在合約的錢轉移出來。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
pragma solidity ^0.4.23;

contract HodlFraud {
   uint public ownerAmount;  //合約擁有者的金錢
   uint public  numberOfPayouts; //次數
   address public owner;  //合約的擁有者

   struct HoldRecord {
       uint amount;  //存儲的金錢
       uint unlockTime;  //解鎖的時間
   }

   mapping (address => HoldRecord) public balance;  //地址  => 存儲的金錢,時間

   //構造函數初始化
   function HodlFraud () public payable {
       owner = msg.sender;
       ownerAmount = msg.value;
   }

   //某一個用戶存儲金錢,
   //@param  holdTime 代表的是解鎖時間
   function payIn(uint holdTime) public payable {
       require(msg.value > 0);


       HoldRecord  newRecord;


       newRecord.amount += msg.value;
       newRecord.unlockTime = now + holdTime;
       balance[msg.sender] = newRecord;
   }

   //轉賬,使用這筆錢
   function withdraw () public {
       require(balance[msg.sender].unlockTime < now && balance[msg.sender].amount > 0);

       msg.sender.transfer(balance[msg.sender].amount);

       balance[msg.sender].amount = 0;
       numberOfPayouts++;
   }

   //合約的擁有著,轉移自己的錢
   function ownerWithdrawal () public {
       require(msg.sender == owner && ownerAmount > 0);
       msg.sender.transfer(ownerAmount);
       ownerAmount = 0;
   }
}

解決辦法

HoldRecord newRecord 修改為 HoldRecord memory newRecord

總結

1
2
3
// 這個例子是要舉出在 smart contract 中 storage 預設行為的危險性。其實只要維持一個原則就可以避免這個問題。
// 養成明確定義使用 storage 還是 memory 的好習慣
// 一般來說,指定 storage 時就直接給初始值;而在 function 里面需要用到的緩存器都用 memory,除非想要直接修改鏈上的值。現在 compiler 都會很聰明的提醒開發者要定義 storage 還是 memory,而當 storage pointer 沒有初始值時也會提醒開發者。
  • 本文鏈接: https://dreamerjonson.com/2018/11/25/solidity-52-security-storage/

  • 版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY 4.0 CN協議 許可協議。轉載請注明出處!

solidity智能合約[52]-安全-storage陷阱

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马边| 叙永县| 肇庆市| 新昌县| 新津县| 潞西市| 光山县| 清镇市| 甘谷县| 桓仁| 体育| 淮阳县| 延长县| 邹城市| 南丰县| 白河县| 建昌县| 乐陵市| 宁明县| 开阳县| 尼木县| 岐山县| 昌吉市| 滦平县| 河东区| 沁源县| 城步| 读书| 时尚| 青川县| 文山县| 郴州市| 东乡县| 高唐县| 吐鲁番市| 香格里拉县| 梓潼县| 桦川县| 塔城市| 济源市| 盘山县|