solidity智能合约[37]-以太坊虚拟机数据存储
EVM
當(dāng)調(diào)用solidity函數(shù)時,都會在以太坊虛擬機(jī)當(dāng)中來執(zhí)行。因此了解以太坊虛擬機(jī)的細(xì)節(jié),了解其數(shù)據(jù)的存儲機(jī)制變得尤為重要。
以太坊虛擬機(jī)中的空間分為3大部分。分別為storage、stack與memory。 storage空間非常特殊,其值會被礦工提交到區(qū)塊鏈上,改變區(qū)塊鏈的狀態(tài)。
下面我們將分析下面例子中,每一個變量所在以太坊evm中的位置。
下面的例子中,在運行合約中的代碼時,變量a會存儲在以太坊evm的storage空間中。其實所有的狀態(tài)變量都會存儲在storage空間中。
add函數(shù)中的函數(shù)參數(shù)num存儲在memory空間中。
在函數(shù)中定義的變量,如在test函數(shù)中的i、j都存儲在stack空間中。
當(dāng)調(diào)用cahngeIt函數(shù)時,會修改storage空間中的a值。
當(dāng)調(diào)用add函數(shù)時,會將memory空間中的num值加1.
當(dāng)調(diào)用test方法時,會在stack中開辟空間i、j。i賦值為2. j賦值為add函數(shù)的返回值3.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | contract storageAndMemory{ ? ?uint ?a = 5; ? ?function changeIt() public { ? ? ? ?a ?= 1000; ? ?} ? ?function add(uint num) public ?returns(uint){ ? ? ? ?num = num +1; ? ? ? ?return num; ? ?} ? ?function test() public ? returns(uint,uint){ ? ? ? ? uint i ?= 2; ? ? ? ? uint j = add(i); ? ? ? ? return(i,j); ? ?} } |
總結(jié)
| 1 2 3 4 5 6 7 | 狀態(tài)變量總是存在于storage中 函數(shù)的參數(shù)默認(rèn)在memory中 函數(shù)中的本地變量默認(rèn)是在stack中 storage與memory都需要消耗gas,但是storage更貴 |
本文鏈接:?https://dreamerjonson.com/2018/11/22/solidity-37-evm-datastorage/
版權(quán)聲明:?本博客所有文章除特別聲明外,均采用?CC BY 4.0 CN協(xié)議?許可協(xié)議。轉(zhuǎn)載請注明出處!
轉(zhuǎn)載于:https://blog.51cto.com/13784902/2321840
總結(jié)
以上是生活随笔為你收集整理的solidity智能合约[37]-以太坊虚拟机数据存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iostat命令(转)
- 下一篇: 助力产教融合,阿里云教育一体机发布