摘要:狀態(tài)變量合約內(nèi)聲明的公有變量還有一個存儲位置是,用來存儲函數(shù)參數(shù),是只讀的,不會永久存儲的一個數(shù)據(jù)位置。稱這個為狀態(tài)改變,這也是合約級變量稱為狀態(tài)變量的原因。
本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:智能合約語言 Solidity 教程系列4 - 數(shù)據(jù)存儲位置分析原文已更新,請讀者前往原文閱讀
Solidity教程系列第4篇 - Solidity數(shù)據(jù)位置分析。
寫在前面Solidity 是以太坊智能合約編程語言,閱讀本文前,你應該對以太坊、智能合約有所了解,
如果你還不了解,建議你先看以太坊是什么
這部分的內(nèi)容官方英文文檔講的不是很透,因此我在參考Solidity官方文檔(當前最新版本:0.4.20)的同時加入了深入分析部分,歡迎訂閱專欄。
數(shù)據(jù)位置(Data location)在系列第一篇,我們提到 Solidity 類型分為兩類:
值類型(Value Type) 及 引用類型(Reference Types),
前面我們已經(jīng)介紹完了值類型,接下來會介紹引用類型。
引用類型是一個復雜類型,占用的空間通常超過256位, 拷貝時開銷很大,因此我們需要考慮將它們存儲在什么位置,是memory(內(nèi)存中,數(shù)據(jù)不是永久存在)還是storage(永久存儲在區(qū)塊鏈中)
所有的復雜類型如數(shù)組(arrays)和數(shù)據(jù)結構(struct)有一個額外的屬性:數(shù)據(jù)的存儲位置(data location)??蔀?strong>memory和storage。
根據(jù)上下文的不同,大多數(shù)時候數(shù)據(jù)位置有默認值,也通過指定關鍵字storage和memory修改它。
函數(shù)參數(shù)(包含返回的參數(shù))默認是memory。
局部復雜類型變量(local variables)和 狀態(tài)變量(state variables) 默認是storage。
局部變量:局部作用域(越過作用域即不可被訪問,等待被回收)的變量,如函數(shù)內(nèi)的變量。狀態(tài)變量:合約內(nèi)聲明的公有變量
還有一個存儲位置是:calldata,用來存儲函數(shù)參數(shù),是只讀的,不會永久存儲的一個數(shù)據(jù)位置。外部函數(shù)的參數(shù)(不包括返回參數(shù))被強制指定為calldata。效果與memory差不多。
數(shù)據(jù)位置指定非常重要,因為他們影響著賦值行為。
在memory和storage之間或與狀態(tài)變量之間相互賦值,總是會創(chuàng)建一個完全獨立的拷貝。
而將一個storage的狀態(tài)變量,賦值給一個storage的局部變量,是通過引用傳遞。所以對于局部變量的修改,同時修改關聯(lián)的狀態(tài)變量。
另一方面,將一個memory的引用類型賦值給另一個memory的引用,不會創(chuàng)建拷貝(即:memory之間是引用傳遞)。
注意:不能將memory賦值給局部變量。
對于值類型,總是會進行拷貝。
下面看一段代碼:
pragma solidity ^0.4.0; contract C { uint[] x; // x的存儲位置是storage // memoryArray的存儲位置是 memory function f(uint[] memoryArray) public { x = memoryArray; // 從 memory 復制到 storage var y = x; // storage 引用傳遞局部變量y(y 是一個 storage 引用) y[7]; // 返回第8個元素 y.length = 2; // x同樣會被修改 delete x; // y同樣會被修改 // 錯誤, 不能將memory賦值給局部變量 // y = memoryArray; // 錯誤,不能通過引用銷毀storage // delete y; g(x); // 引用傳遞, g可以改變x的內(nèi)容 h(x); // 拷貝到memory, h無法改變x的內(nèi)容 } function g(uint[] storage storageArray) internal {} function h(uint[] memoryArray) public {} }總結 強制的數(shù)據(jù)位置(Forced data location)
外部函數(shù)(External function)的參數(shù)(不包括返回參數(shù))強制為:calldata
狀態(tài)變量(State variables)強制為: storage
默認數(shù)據(jù)位置(Default data location)函數(shù)參數(shù)及返回參數(shù):memory
復雜類型的局部變量:storage
深入分析storage 存儲結構是在合約創(chuàng)建的時候就確定好了的,它取決于合約所聲明狀態(tài)變量。但是內(nèi)容可以被(交易)調(diào)用改變。
Solidity 稱這個為狀態(tài)改變,這也是合約級變量稱為狀態(tài)變量的原因。也可以更好的理解為什么狀態(tài)變量都是storage存儲。
memory 只能用于函數(shù)內(nèi)部,memory 聲明用來告知EVM在運行時創(chuàng)建一塊(固定大小)內(nèi)存區(qū)域給變量使用。
storage 在區(qū)塊鏈中是用key/value的形式存儲,而memory則表現(xiàn)為字節(jié)數(shù)組關于棧(stack)
EVM是一個基于棧的語言,棧實際是在內(nèi)存(memory)的一個數(shù)據(jù)結構,每個棧元素占為256位,棧最大長度為1024。
值類型的局部變量是存儲在棧上。
storage 會永久保存合約狀態(tài)變量,開銷最大
memory 僅保存臨時變量,函數(shù)調(diào)用之后釋放,開銷很小
stack 保存很小的局部變量,幾乎免費使用,但有數(shù)量限制。
參考視頻我們也推出了目前市面上最全的視頻教程:深入詳解以太坊智能合約語言Solidity
目前我們也在招募體驗師,可以點擊鏈接了解。
Solidity官方文檔-類型
深入淺出區(qū)塊鏈 - 系統(tǒng)學習區(qū)塊鏈,打造最好的區(qū)塊鏈技術博客
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23952.html
摘要:引言給迷失在如何學習區(qū)塊鏈技術的同學一個指引,區(qū)塊鏈技術是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術,應該先了解下比特幣。但區(qū)塊鏈技術不單應用于比特幣,還有非常多的現(xiàn)實應用場景,想做區(qū)塊鏈應用開發(fā),可進一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術學習指引 原文已更新,請讀者前往原文閱讀 本章的文章越來越多,本文是一個索引帖,方便找到自己感興趣的文章,你也可以使用左側...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列結構體與映射原文已更新,請讀者前往原文閱讀教程系列第篇結構體與映射。不能聲明一個同時將自身作為成員,這個限制是基于結構體的大小必須是有限的。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言Solidity教程系列6 - 結構體與映射原文已更新,請讀者前往原文閱讀 Solidity 教程系列第6篇 - Solidity 結構體與...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列錯誤處理原文已更新,請讀者前往原文閱讀這是教程系列文章第篇介紹錯誤處理。如果合約沒有修飾符的的函數(shù)在接收以太幣時包括構造函數(shù),和回退函數(shù)。如果合約通過一個的函數(shù)接收以太幣。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列9 - 錯誤處理原文已更新,請讀者前往原文閱讀 這是Solidity教程系列文章...
摘要:地址類型的成員屬性及函數(shù)這里是地址類型相關成員的快速索引用來查詢賬戶余額,用來發(fā)送以太幣以為單位。因此,為了保證安全,必須檢查的返回值,如果交易失敗,會回退以太幣。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列2 - 地址類型介紹原文已更新,請讀者前往原文閱讀 Solidity教程系列第二篇 - Solidity地址類型介紹. Solidity 系列完...
摘要:還需注意的一點是,定長數(shù)組,不能與變長數(shù)組相互賦值,我們來看下面的代碼無法編譯已經(jīng)計劃在未來移除這樣的限制。的變長數(shù)組,可以通過給賦值調(diào)整數(shù)組長度。的變長數(shù)組不支持。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言Solidity教程系列5 - 數(shù)組介紹原文已更新,請讀者前往原文閱讀 Solidity 教程系列第5篇 - Solidity 數(shù)組介紹。Solidity 系列完整的文章...
閱讀 2418·2021-11-16 11:44
閱讀 852·2021-09-10 11:16
閱讀 2228·2019-08-30 15:54
閱讀 1057·2019-08-30 15:53
閱讀 1900·2019-08-30 13:00
閱讀 620·2019-08-29 17:07
閱讀 3514·2019-08-29 16:39
閱讀 3138·2019-08-29 13:30