摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列結(jié)構(gòu)體與映射原文已更新,請(qǐng)讀者前往原文閱讀教程系列第篇結(jié)構(gòu)體與映射。不能聲明一個(gè)同時(shí)將自身作為成員,這個(gè)限制是基于結(jié)構(gòu)體的大小必須是有限的。
本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:智能合約語言Solidity教程系列6 - 結(jié)構(gòu)體與映射原文已更新,請(qǐng)讀者前往原文閱讀
Solidity 教程系列第6篇 - Solidity 結(jié)構(gòu)體與映射。
Solidity 系列完整的文章列表請(qǐng)查看分類-Solidity。
Solidity 是以太坊智能合約編程語言,閱讀本文前,你應(yīng)該對(duì)以太坊、智能合約有所了解,
如果你還不了解,建議你先看以太坊是什么
本系列文章一部分是參考Solidity官方文檔(當(dāng)前最新版本:0.4.20)進(jìn)行翻譯,另一部分是Solidity深入分析,這部分請(qǐng)訂閱區(qū)塊鏈技術(shù)專欄閱讀。
結(jié)構(gòu)體(Structs)Solidity提供struct來定義自定義類型,自定義的類型是引用類型。
我們看看下面的例子:
pragma solidity ^0.4.11; contract CrowdFunding { // 定義一個(gè)包含兩個(gè)成員的新類型 struct Funder { address addr; uint amount; } struct Campaign { address beneficiary; uint fundingGoal; uint numFunders; uint amount; mapping (uint => Funder) funders; } uint numCampaigns; mapping (uint => Campaign) campaigns; function newCampaign(address beneficiary, uint goal) public returns (uint campaignID) { campaignID = numCampaigns++; // campaignID 作為一個(gè)變量返回 // 創(chuàng)建一個(gè)結(jié)構(gòu)體實(shí)例,存儲(chǔ)在storage ,放入mapping里 campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0); } function contribute(uint campaignID) public payable { Campaign storage c = campaigns[campaignID]; // 用mapping對(duì)應(yīng)項(xiàng)創(chuàng)建一個(gè)結(jié)構(gòu)體引用 // 也可以用 Funder(msg.sender, msg.value) 來初始化. c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value}); c.amount += msg.value; } function checkGoalReached(uint campaignID) public returns (bool reached) { Campaign storage c = campaigns[campaignID]; if (c.amount < c.fundingGoal) return false; uint amount = c.amount; c.amount = 0; c.beneficiary.transfer(amount); return true; } }
上面是一個(gè)簡(jiǎn)化版的眾籌合約,但它可以讓我們理解structs的基礎(chǔ)概念,struct可以用于映射和數(shù)組中作為元素。其本身也可以包含映射和數(shù)組等類型。
不能聲明一個(gè)struct同時(shí)將自身struct作為成員,這個(gè)限制是基于結(jié)構(gòu)體的大小必須是有限的。
但struct可以作為mapping的值類型成員。
注意在函數(shù)中,將一個(gè)struct賦值給一個(gè)局部變量(默認(rèn)是storage類型),實(shí)際是拷貝的引用,所以修改局部變量值的同時(shí),會(huì)影響到原變量。
當(dāng)然,也可以直接通過訪問成員修改值,而不用一定賦值給一個(gè)局部變量,如campaigns[campaignID].amount = 0
映射(Mappings)映射類型,一種鍵值對(duì)的映射關(guān)系存儲(chǔ)結(jié)構(gòu)。定義方式為mapping(_KeyType => _KeyValue)。鍵類型允許除映射、變長(zhǎng)數(shù)組、合約、枚舉、結(jié)構(gòu)體外的幾乎所有類型()。值類型沒有任何限制,可以為任何類型包括映射類型。
映射可以被視作為一個(gè)哈希表,所有可能的鍵會(huì)被虛擬化的創(chuàng)建,映射到一個(gè)類型的默認(rèn)值(二進(jìn)制的全零表示)。在映射表中,并不存儲(chǔ)鍵的數(shù)據(jù),僅僅存儲(chǔ)它的keccak256哈希值,這個(gè)哈希值在查找值時(shí)需要用到。
正因?yàn)榇耍?strong>映射是沒有長(zhǎng)度的,也沒有鍵集合或值集合的概念。
映射類型,僅能用來作為狀態(tài)變量,或在內(nèi)部函數(shù)中作為storage類型的引用。
可以通過將映射標(biāo)記為public,來讓Solidity創(chuàng)建一個(gè)訪問器。通過提供一個(gè)鍵值做為參數(shù)來訪問它,將返回對(duì)應(yīng)的值。
映射的值類型也可以是映射,使用訪問器訪問時(shí),要提供這個(gè)映射值所對(duì)應(yīng)的鍵,不斷重復(fù)這個(gè)過程。
來看一個(gè)例子:
pragma solidity ^0.4.0; contract MappingExample { mapping(address => uint) public balances; function update(uint newBalance) public { balances[msg.sender] = newBalance; } } contract MappingUser { function f() public returns (uint) { MappingExample m = new MappingExample(); m.update(100); return m.balances(this); } }
注意:
映射并未提供迭代輸出的方法,可以自行實(shí)現(xiàn)一個(gè)這樣的數(shù)據(jù)結(jié)構(gòu)。參考iterable mapping
我們也推出了目前市面上最全的視頻教程:深入詳解以太坊智能合約語言Solidity
目前我們也在招募體驗(yàn)師,可以點(diǎn)擊鏈接了解。
Solidity官方文檔
? 深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。
? 我的知識(shí)星球為各位解答區(qū)塊鏈技術(shù)問題,歡迎加入討論。
? 關(guān)注公眾號(hào)“深入淺出區(qū)塊鏈技術(shù)”第一時(shí)間獲取區(qū)塊鏈技術(shù)信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/24112.html
摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場(chǎng)景,想做區(qū)塊鏈應(yīng)用開發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請(qǐng)讀者前往原文閱讀 本章的文章越來越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...
摘要:還需注意的一點(diǎn)是,定長(zhǎng)數(shù)組,不能與變長(zhǎng)數(shù)組相互賦值,我們來看下面的代碼無法編譯已經(jīng)計(jì)劃在未來移除這樣的限制。的變長(zhǎng)數(shù)組,可以通過給賦值調(diào)整數(shù)組長(zhǎng)度。的變長(zhǎng)數(shù)組不支持。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言Solidity教程系列5 - 數(shù)組介紹原文已更新,請(qǐng)讀者前往原文閱讀 Solidity 教程系列第5篇 - Solidity 數(shù)組介紹。Solidity 系列完整的文章...
摘要:狀態(tài)變量合約內(nèi)聲明的公有變量還有一個(gè)存儲(chǔ)位置是,用來存儲(chǔ)函數(shù)參數(shù),是只讀的,不會(huì)永久存儲(chǔ)的一個(gè)數(shù)據(jù)位置。稱這個(gè)為狀態(tài)改變,這也是合約級(jí)變量稱為狀態(tài)變量的原因。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列4 - 數(shù)據(jù)存儲(chǔ)位置分析原文已更新,請(qǐng)讀者前往原文閱讀 Solidity教程系列第4篇 - Solidity數(shù)據(jù)位置分析。 寫在前面 Solidity...
摘要:如果想對(duì)輸入的變量說明其不同的單位,可以使用下面的方式參考視頻我們也推出了目前市面上最全的視頻教程深入詳解以太坊智能合約語言目前我們也在招募體驗(yàn)師,可以點(diǎn)擊鏈接了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列7 - 以太單位及時(shí)間單位原文已更新,請(qǐng)讀者前往原文閱讀 這是Solidity教程系列文章第7篇介紹以太單位及時(shí)間單位,系列帶你全面深入理解S...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列完全理解函數(shù)修改器原文已更新,請(qǐng)讀者前往原文閱讀這是教程系列文章第篇,帶大家完全理解的函數(shù)修改器。在此上下文中,所有的函數(shù)中引入的符號(hào),在修改器中均可見。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列10 - 完全理解函數(shù)修改器原文已更新,請(qǐng)讀者前往原文閱讀 這是Solidity教程系列文章第10...
閱讀 3015·2021-10-28 09:32
閱讀 3087·2021-10-11 10:57
閱讀 3282·2021-10-08 10:05
閱讀 2747·2021-09-28 09:36
閱讀 2291·2019-08-30 15:55
閱讀 2334·2019-08-30 15:44
閱讀 2456·2019-08-30 14:02
閱讀 3136·2019-08-29 17:16