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ù)內不聲明直接使用:

下面是一些常用的全局變量,更完整的列表請看這個:全局變量。
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ū)看到您的補充。