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

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

對(duì)引用的再次辨析

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

????對(duì)solidity中的引用問(wèn)題總是想再說(shuō)說(shuō),再說(shuō)說(shuō)。前天直播講了講,感覺(jué)還不錯(cuò),算是說(shuō)明白了,在寫幾句話,總結(jié)的更精煉一些。

????兩個(gè)算法

????對(duì)于引用類型變量的賦值操作:

????x = a

????其實(shí)有兩件事情要做:

????1. 確定它的賦值語(yǔ)義:是引用拷貝還是值拷貝

????2. 如果是值拷貝,檢查它是否允許

? ? 這兩個(gè)算法上次的文章講過(guò)了。第一個(gè)算法供我們判斷賦值操作干了什么事情,第二個(gè)算法讓我們理解這個(gè)賦值操作沒(méi)通過(guò)編譯檢查的原因。

????對(duì)這兩個(gè)算法我們今天再做一個(gè)辨析。

????關(guān)于判定算法

????solidity的引用類型變量賦值被兩個(gè)因素影響:

????1. 其成員變量相比一般面向?qū)ο笳Z(yǔ)言的對(duì)象的成員變量的特殊之處在于,java對(duì)象的成員變量在內(nèi)存中,而合約的成員變量在持久化存儲(chǔ)中,這使得合約成員變量的這個(gè)“引用”的含義發(fā)生了變化:它永遠(yuǎn)引用到固定的數(shù)據(jù)塊。它不可能再去指向別的數(shù)據(jù)塊。既然如此,當(dāng)x是成員變量,只能是值拷貝操作。

????2. 變量的location對(duì)賦值操作的影響是:它將其他語(yǔ)言中統(tǒng)一的數(shù)據(jù)存在空間分割成三個(gè)子空間(calldata memory storage),當(dāng)賦值操作穿過(guò)子空間的邊界,就必須是賦值操作了。具體的說(shuō),一種location的變量只能在一個(gè)子空間內(nèi)切換指向不同數(shù)據(jù)塊,但不能跑出這個(gè)子空間,跨子空間的賦值,也就是x和a的location不同時(shí),必須、只能解釋為賦值,這正是solidity編譯器和evm運(yùn)行時(shí)做的事情。

????這是判定算法的完整解釋。

????關(guān)于檢查算法

????檢查算法是在判定算法完成,輸出了結(jié)果之后執(zhí)行的。如果判定為引用拷貝,那就不必檢查了,因?yàn)闄z查的兩件事情:calldata數(shù)據(jù)塊只讀和mapping不能遍歷從而無(wú)法實(shí)現(xiàn)數(shù)據(jù)拷貝,在引用拷貝中都不會(huì)發(fā)生,所以沒(méi)有檢查的必要。

? ? 判定算法輸出值拷貝時(shí),關(guān)于calldata的檢查是,x不能是calldata的。這不言而喻,因?yàn)槟銦o(wú)法向message數(shù)據(jù)體的calldata數(shù)據(jù)域中拷東西,正如你不能修改msg.sender或msg.value。但值拷貝右側(cè)的a是calldata沒(méi)有問(wèn)題。

????判定算法輸出值拷貝時(shí),關(guān)于mapping的檢查更嚴(yán)格:x和a的類型必須與mapping無(wú)關(guān),即它本身不是mapping也不能嵌套擁有mapping的成分。mapping不能拷貝的原因不再贅述。





對(duì)引用的再次辨析的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
安图县| 昭通市| 阆中市| 竹北市| 五指山市| 武威市| 承德县| 炉霍县| 南京市| 江安县| 房山区| 柏乡县| 福州市| 武城县| 揭东县| 林芝县| 屏东县| 车险| 商水县| 利川市| 长垣县| 青田县| 昌图县| 广东省| 石楼县| 永嘉县| 商洛市| 依安县| 申扎县| 临颍县| 永寿县| 昌都县| 吉安市| 信宜市| 汝州市| 汪清县| 天津市| 大港区| 汨罗市| 海安县| 云南省|