最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

對(duì)solidity數(shù)據(jù)類型的分析梳理

2023-02-19 12:19 作者:東風(fēng)草綠  | 我要投稿

????在任何程序開發(fā)語言的知識(shí)結(jié)構(gòu)中,數(shù)據(jù)類型都屬于"基礎(chǔ)部分",solidity也不例外,helloworld之后就是數(shù)據(jù)類型。但說實(shí)話,solidity的數(shù)據(jù)類型不太一樣。所涉及的技術(shù)內(nèi)幕多,更麻煩的是它碎片化。一種東西一旦碎片化,缺少那種內(nèi)在的一致性,一種看上去統(tǒng)一的和諧的概念,簡潔明了,符合直覺,那它的理解和記憶就都會(huì)比較困難的,因?yàn)槲覀兊念^腦其實(shí)會(huì)通過一種知識(shí)的結(jié)構(gòu)性的延申去吸納和消化的。所以,對(duì)于solidity數(shù)據(jù)類型,應(yīng)該竭力從中整理出一套理解的秩序?,F(xiàn)在回頭看當(dāng)初講數(shù)據(jù)類型,講的不好,就是因?yàn)闆]有能夠把這個(gè)秩序提煉出來。不過文檔和別的視頻教程也都這樣--但也因?yàn)檫@樣,顯得更有必要。

????做這件事情的關(guān)鍵,應(yīng)該首先建立幾條線索,我們就按照這個(gè)方法來。

????關(guān)于變量的location

????location是讓數(shù)據(jù)類型(或變量。在表達(dá)上總會(huì)遇到一種二元概念,就是關(guān)于類型與其實(shí)例,變量是類型的實(shí)例,后面我們不再區(qū)分。說location,是指類型所聲明的變量的location)這個(gè)問題變得復(fù)雜化的最主要原因,沒有之一。

????首先我們要清楚一點(diǎn),其他語言沒有所謂location,它們用value type和reference type就能表達(dá)這個(gè)問題:value type的變量在stack上,而reference type的變量在堆上。evm模型中可以直接訪問一種叫storage的東西,它是“持久化的存儲(chǔ)”,這在其他語言中不存在。其他語言就是內(nèi)存和堆棧(或寄存器,我們忽略這種差別,都當(dāng)作一種堆棧機(jī)器),總之都是臨時(shí)性存儲(chǔ),而持久化問題跟核心機(jī)器模型無關(guān),是當(dāng)作外部設(shè)備的。這一點(diǎn)完全不同。這使得reference type變得復(fù)雜。其他語言中,reference的變量就是指向一個(gè)堆上的數(shù)據(jù)塊,但solidity中,它指向的位置可以是memory,可以是storage,也可以是直接指向來自上下文的msg的calldata數(shù)據(jù)塊中的一部分。這樣問題就復(fù)雜了。

value type和reference type和location的糾纏

? ?局部變量

????首先我們拋開成員變量,只討論局部變量。參數(shù)也跟局部變量類似,沒有單獨(dú)討論的必要。?message中的calldata是只讀的,沒有什么復(fù)雜性,也不涉及。

????? 要從根本上理解值與引用,還真是必須涉及匯編。

????先看其他面向?qū)ο蟾呒?jí)語言。對(duì)于java這種語言,無論是成員變量、局部變量還是函數(shù)參數(shù)或返回值,變量“本身”都是stack中的值,value type(的變量)就存儲(chǔ)被它本身持有,也就是在stack中。變量本身和變量的值是一體的,只存在于堆棧中。而refrence type的值在堆棧中,而且通過new操作分配。

???solidity中的局部變量也是如此,它本身都在stack中,如果是valuetype,那這個(gè)value也在stack中;但是如果是reference,卻指向不同性質(zhì)的存儲(chǔ)空間:內(nèi)存,或storage;這時(shí)就有一個(gè)關(guān)于賦值操作的規(guī)則:

  • location相同的兩個(gè)變量之間賦值,是引用賦值

  • location不同的兩個(gè)變量之間賦值,是數(shù)據(jù)拷貝

????這種語義使得問題復(fù)雜化,使用起來要相當(dāng)小心。對(duì)于java來所,引用就是引用,引用類型變量的賦值操作就是指向另一個(gè)堆中的數(shù)據(jù)塊。solidity設(shè)計(jì)這種語義的目的還是基于效率,gas費(fèi)用。但語言變得不夠安全。


成員變量

成員變量都存在storage中,那引用類型的成員變量之間的賦值,是否與引用類型的局部變量之間一樣,因其都是在storage中,所以也是引用賦值呢?比如如下代碼:


跟下面代碼:

表現(xiàn)是否一樣?是不一樣的。后者是引用賦值,前者是數(shù)據(jù)拷貝。理解起來非常麻煩!其實(shí)在成員變量中,引用數(shù)據(jù)類型中的“引用”這個(gè)詞失去意義了。

關(guān)于動(dòng)態(tài)數(shù)組

????應(yīng)該這樣講,由于受到location的影響,memory中的動(dòng)態(tài)數(shù)組跟storage中的動(dòng)態(tài)數(shù)組,完全是兩回事,簡直就是兩種不同的數(shù)據(jù)類型

  1. 概念不同,一種是運(yùn)行時(shí)動(dòng)態(tài)擴(kuò)展,一種是運(yùn)行時(shí)初始化

  2. 操作不同,memory動(dòng)態(tài)數(shù)組沒有push pop

  3. 初始化方式不同。memory中用 new 操作符。

關(guān)于new操作符

  • ? 使用new操作符的地方有三處:內(nèi)存動(dòng)態(tài)數(shù)組,bytes、string。后兩者內(nèi)存變量和成員變量都可以用new。

  • new 操作符是在“運(yùn)行時(shí)可以確定數(shù)據(jù)長度”時(shí)用;上述三種數(shù)據(jù)類型都是這樣

  • struct初始化就不用new,因?yàn)樗幾g時(shí)就能確定數(shù)據(jù)塊大小

    這些問題理解到位,也不太容易

定長字節(jié)數(shù)組

? 定長字節(jié)數(shù)組式value type中的特例,它是數(shù)組,卻歸為value type值類型,原因是它定長。當(dāng)然照此邏輯也可以定義一個(gè)value type的“定長16位整型數(shù)組”,不這么做,是因?yàn)橛锰幉淮蟆?span id="s0sssss00s" class="color-purple-01">這是特例!

關(guān)于string和bytes

string面向可讀的字符串,bytes面向二進(jìn)制,這兩個(gè)類型可以看作是元素為byte1的一般動(dòng)態(tài)數(shù)組的進(jìn)一步封裝,但他們在操作性質(zhì)上跟動(dòng)態(tài)數(shù)組差別很大

  • 它們在成員變量和memory中的初始化方式和操作沒有多少區(qū)別,都可以賦值字面量,用new初始化。

  • 它們之間的區(qū)別是,bytes按下標(biāo)可寫,string不行

  • 既然一個(gè)string變量可以用new 初始化出一個(gè)某個(gè)長度的數(shù)據(jù)塊,但這個(gè)數(shù)據(jù)塊有不能按照下標(biāo)寫操作,那這個(gè)初始化有什么用呢?這就涉及bytes和string之間的強(qiáng)制轉(zhuǎn)換:把它轉(zhuǎn)換成bytes,就可以照下標(biāo)寫操作。非常繞!

????就說這么多,其實(shí)還有很多情況,不一一列舉了。有時(shí)間可以做個(gè)視頻講。總之solidity數(shù)據(jù)類型是比較麻煩的。根本原因還是為了EVM這個(gè)資源緊張的運(yùn)行時(shí)環(huán)境而委屈了自己。

對(duì)solidity數(shù)據(jù)類型的分析梳理的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
柳林县| 禄劝| 和静县| 浦北县| 灵璧县| 苍山县| 白朗县| 额尔古纳市| 宾川县| 嫩江县| 昆山市| 襄樊市| 澄江县| 梅州市| 井研县| 台前县| 靖边县| 临武县| 如东县| 信阳市| 麻城市| 尚义县| 桐柏县| 邳州市| 枞阳县| 兴山县| 象山县| 余江县| 建宁县| 巴彦淖尔市| 西青区| 佛教| 博湖县| 凌源市| 西丰县| 虹口区| 巴彦淖尔市| 白朗县| 溧水县| 通渭县| 章丘市|