淺談Solidity: 5. 變量數(shù)據(jù)存儲和作用域 storage/memory/calldata

Solidity中的引用類型:引用類型(Reference Type):包括數(shù)組(array),結構體(struct)和映射(mapping),這類變量占空間大,賦值時候直接傳遞地址(類似指針)。由于這類變量比較復雜,占用存儲空間大,我們在使用時必須要聲明數(shù)據(jù)存儲的位置。

數(shù)據(jù)位置:solidity數(shù)據(jù)存儲位置有三類:storage,memory和calldata。不同存儲位置的gas成本不同。storage類型的數(shù)據(jù)存在鏈上,類似計算機的硬盤,消耗gas多;memory和calldata類型的臨時存在內存里,消耗gas少。大致用法:

1,storage:合約里的狀態(tài)變量默認都是storage,存儲在鏈上。

2,memory:函數(shù)里的參數(shù)和臨時變量一般用memory,存儲在內存中,不上鏈。

3,calldata:和memory類似,存儲在內存中,不上鏈。與memory的不同點在于calldata變量不能修改(immutable),一般用于函數(shù)的參數(shù)。例子:

數(shù)據(jù)位置和賦值規(guī)則:在不同存儲類型相互賦值時候,有時會產生獨立的副本(修改新變量不會影響原變量),有時會產生引用(修改新變量會影響原變量)。規(guī)則如下:

1,storage(合約的狀態(tài)變量)賦值給本地storage(函數(shù)里的)時候,會創(chuàng)建引用,改變新變量會影響原變量。例子:

2,storage賦值給memory,會創(chuàng)建獨立的復本,修改其中一個不會影響另一個;反之亦然。例子:

3,memory賦值給memory,會創(chuàng)建引用,改變新變量會影響原變量。

4,其他情況,變量賦值給storage,會創(chuàng)建獨立的復本,修改其中一個不會影響另一個。

變量的作用域:Solidity中變量按作用域劃分有三種,分別是狀態(tài)變量(state variable),局部變量(local variable)和全局變量(global variable)。

1,狀態(tài)變量:狀態(tài)變量是數(shù)據(jù)存儲在鏈上的變量,所有合約內函數(shù)都可以訪問 ,gas消耗高。狀態(tài)變量在合約內、函數(shù)外聲明??梢栽诤瘮?shù)里更改狀態(tài)變量的值:

2,局部變量:局部變量是僅在函數(shù)執(zhí)行過程中有效的變量,函數(shù)退出后,變量無效。局部變量的數(shù)據(jù)存儲在內存里,不上鏈,gas低。局部變量在函數(shù)內聲明。

3,全局變量:全局變量是全局范圍工作的變量,都是solidity預留關鍵字。他們可以在函數(shù)內不聲明直接使用:

在上面例子里,我們使用了3個常用的全局變量:msg.sender,?block.number和msg.data,他們分別代表請求發(fā)起地址,當前區(qū)塊高度,和請求數(shù)據(jù)。

下面是一些常用的全局變量,更完整的列表請看這個:全局變量。

blockhash(uint blockNumber): (bytes32)給定區(qū)塊的哈希值 – 只適用于256最近區(qū)塊, 不包含當前區(qū)塊。

block.coinbase: (address payable) 當前區(qū)塊礦工的地址

block.gaslimit: (uint) 當前區(qū)塊的gaslimit

block.number: (uint) 當前區(qū)塊的number

block.timestamp: (uint) 當前區(qū)塊的時間戳,為unix紀元以來的秒

gasleft(): (uint256) 剩余 gas

msg.data: (bytes calldata) 完整call data

msg.sender: (address payable) 消息發(fā)送者 (當前 caller)

msg.sig: (bytes4) calldata的前四個字節(jié) (function identifier)

msg.value: (uint) 當前交易發(fā)送的wei值

我是溫馭臣,一個Solidity的開發(fā)學習者,以上是我的簡單總結,如果有缺陷,希望在評論區(qū)看到您的補充。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容