真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Solidity數(shù)據(jù)存儲(chǔ)位置是在哪

本篇內(nèi)容介紹了“Solidity數(shù)據(jù)存儲(chǔ)位置是在哪”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

發(fā)展壯大離不開(kāi)廣大客戶長(zhǎng)期以來(lái)的信賴與支持,我們將始終秉承“誠(chéng)信為本、服務(wù)至上”的服務(wù)理念,堅(jiān)持“二合一”的優(yōu)良服務(wù)模式,真誠(chéng)服務(wù)每家企業(yè),認(rèn)真做好每個(gè)細(xì)節(jié),不斷完善自我,成就企業(yè),實(shí)現(xiàn)共贏。行業(yè)涉及集裝箱等,在網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)、WAP手機(jī)網(wǎng)站、VI設(shè)計(jì)、軟件開(kāi)發(fā)等項(xiàng)目上具有豐富的設(shè)計(jì)經(jīng)驗(yàn)。

數(shù)據(jù)位置(Data location)

在系列第一篇,我們提到 Solidity 類型分為兩類: 值類型(Value Type)引用類型(Reference Types), 前面我們已經(jīng)介紹完了值類型,接下來(lái)會(huì)介紹引用類型。

引用類型是一個(gè)復(fù)雜類型,占用的空間通常超過(guò)256位, 拷貝時(shí)開(kāi)銷很大,因此我們需要考慮將它們存儲(chǔ)在什么位置,是memory(內(nèi)存中,數(shù)據(jù)不是永久存在)還是storage(永久存儲(chǔ)在區(qū)塊鏈中) 所有的復(fù)雜類型如數(shù)組(arrays)和結(jié)構(gòu)體(struct)有一個(gè)額外的屬性:數(shù)據(jù)的存儲(chǔ)位置(data location)??蔀?strong>memory和storage

根據(jù)上下文的不同,大多數(shù)時(shí)候數(shù)據(jù)位置有默認(rèn)值,也通過(guò)指定關(guān)鍵字storage和memory修改它。

函數(shù)參數(shù)(包含返回的參數(shù))默認(rèn)是memory。 局部復(fù)雜類型變量(local variables)和 狀態(tài)變量(state variables) 默認(rèn)是storage。

局部變量:局部作用域(越過(guò)作用域即不可被訪問(wèn),等待被回收)的變量,如函數(shù)內(nèi)的變量。狀態(tài)變量:合約內(nèi)聲明的公有變量

還有一個(gè)存儲(chǔ)位置是:calldata,用來(lái)存儲(chǔ)函數(shù)參數(shù),是只讀的,不會(huì)永久存儲(chǔ)的一個(gè)數(shù)據(jù)位置。外部函數(shù)的參數(shù)(不包括返回參數(shù))被強(qiáng)制指定為calldata。效果與memory差不多。

數(shù)據(jù)位置指定非常重要,因?yàn)樗麄冇绊懼x值行為。 在memory和storage之間或與狀態(tài)變量之間相互賦值,總是會(huì)創(chuàng)建一個(gè)完全獨(dú)立的拷貝。 而將一個(gè)storage的狀態(tài)變量,賦值給一個(gè)storage的局部變量,是通過(guò)引用傳遞。所以對(duì)于局部變量的修改,同時(shí)修改關(guān)聯(lián)的狀態(tài)變量。 另一方面,將一個(gè)memory的引用類型賦值給另一個(gè)memory的引用,不會(huì)創(chuàng)建拷貝(即:memory之間是引用傳遞)。

  1. 注意:不能將memory賦值給局部變量。

  2. 對(duì)于值類型,總是會(huì)進(jìn)行拷貝。

下面看一段代碼:

pragma solidity ^0.4.0;

contract C {
    uint[] x; //  x的存儲(chǔ)位置是storage

    // memoryArray的存儲(chǔ)位置是 memory
    function f(uint[] memoryArray) public {
        x = memoryArray;    // 從 memory 復(fù)制到 storage
        var y = x;          // storage 引用傳遞局部變量y(y 是一個(gè) storage 引用)
        y[7];               // 返回第8個(gè)元素
        y.length = 2;       // x同樣會(huì)被修改
        delete x;           // y同樣會(huì)被修改

        // 錯(cuò)誤, 不能將memory賦值給局部變量
        // y = memoryArray;  

        // 錯(cuò)誤,不能通過(guò)引用銷毀storage
        // delete y;        

        g(x);               // 引用傳遞, g可以改變x的內(nèi)容
        h(x);               // 拷貝到memory, h無(wú)法改變x的內(nèi)容
    }

    function g(uint[] storage storageArray) internal {}
    function h(uint[] memoryArray) public {}
}

總結(jié)

強(qiáng)制的數(shù)據(jù)位置(Forced data location)
  • 外部函數(shù)(External function)的參數(shù)(不包括返回參數(shù))強(qiáng)制為:calldata

  • 狀態(tài)變量(State variables)強(qiáng)制為: storage

默認(rèn)數(shù)據(jù)位置(Default data location)
  • 函數(shù)參數(shù)及返回參數(shù):memory

  • 復(fù)雜類型的局部變量:storage

深入分析

storage 存儲(chǔ)結(jié)構(gòu)是在合約創(chuàng)建的時(shí)候就確定好了的,它取決于合約所聲明狀態(tài)變量。但是內(nèi)容可以被(交易)調(diào)用改變。

Solidity 稱這個(gè)為狀態(tài)改變,這也是合約級(jí)變量稱為狀態(tài)變量的原因。也可以更好的理解為什么狀態(tài)變量都是storage存儲(chǔ)。

memory 只能用于函數(shù)內(nèi)部,memory 聲明用來(lái)告知EVM在運(yùn)行時(shí)創(chuàng)建一塊(固定大?。﹥?nèi)存區(qū)域給變量使用。

storage 在區(qū)塊鏈中是用key/value的形式存儲(chǔ),而memory則表現(xiàn)為字節(jié)數(shù)組

關(guān)于棧(stack)

EVM是一個(gè)基于棧的語(yǔ)言,棧實(shí)際是在內(nèi)存(memory)的一個(gè)數(shù)據(jù)結(jié)構(gòu),每個(gè)棧元素占為256位,棧最大長(zhǎng)度為1024。 值類型的局部變量是存儲(chǔ)在棧上。

不同存儲(chǔ)的消耗(gas消耗)

  • storage 會(huì)永久保存合約狀態(tài)變量,開(kāi)銷最大

  • memory 僅保存臨時(shí)變量,函數(shù)調(diào)用之后釋放,開(kāi)銷很小

  • stack 保存很小的局部變量,幾乎免費(fèi)使用,但有數(shù)量限制。

“Solidity數(shù)據(jù)存儲(chǔ)位置是在哪”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


新聞名稱:Solidity數(shù)據(jù)存儲(chǔ)位置是在哪
URL標(biāo)題:http://weahome.cn/article/jhejdo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部