待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》疑枯,馬良老師講授寥掐。此簡書文集記錄我的學(xué)習(xí)筆記您旁。
課程共8節(jié)課烙常。其中,前四課講ETH原理鹤盒,后四課講智能合約蚕脏。
第六課分為三部分:
- Solidity語法之?dāng)?shù)組
- Solidity語法之合約
- Truffle簡介與使用
這篇文章是第六課第一部分的學(xué)習(xí)筆記:Solidity語法之?dāng)?shù)組。
上一小節(jié)簡要介紹了 Solidity 的基礎(chǔ)語法侦锯。還有兩部分重要的內(nèi)容要重點(diǎn)講解一下驼鞭,分別是數(shù)組和合約。
這節(jié)課主要講解 Solidity 數(shù)組相關(guān)知識尺碰,并有若干實(shí)例輔助理解挣棕。
1、動態(tài)數(shù)組亲桥,bytes洛心,string
在Solidity語法中,數(shù)組中主要有兩種题篷。一種是動態(tài)數(shù)組词身,主要是storage類型;另一種是定長數(shù)組,一般是memory類型深啤。
在這兩個類型之外渔欢,還有兩種特殊的類型奥额,一是字節(jié)數(shù)組(bytes)韩肝,一個是字符串(string),通常字符串可以轉(zhuǎn)換成字節(jié)數(shù)組催蝗。
1.1 動態(tài)數(shù)組
- length 在聲明后可以改變,從而調(diào)整數(shù)組大小(靜態(tài)數(shù)組不可以)怀薛。
- push 向數(shù)組尾部附加一個元素三热,返回新的 length 呐能。
- bytes 數(shù)組指的是原始的字節(jié)串首妖。其它類型(例如byte)的動態(tài)數(shù)組一個元素會占32字節(jié)象踊,但是bytes每一個元素就是一個字節(jié)(更為緊湊袖外,節(jié)省GAS)粘姜〈吭桑可以把String 轉(zhuǎn)換為 bytes 获讳。
對于定長的bytes,index 操作是只讀!這里要特別注意。
而對動態(tài)數(shù)組,index操作是可讀寫! - delete 只是 reset 該元素(重置為0),并不是通常意義的刪除奋隶±匏停【例子②】
1.2 字符串
- UTF-8 編碼的結(jié)果团甲。沒有l(wèi)ength 的概念。
- UTF-8 是變長的編碼方式,1-4個字節(jié)表示一個符號。對于英文和ASCII碼是相同的酌泰。中文常見是3個字節(jié)衰琐。
- 所以String的長度一般是通過轉(zhuǎn)化為 bytes 數(shù)組后,只能得到 bytes 數(shù)組的長度炼蹦。
- 缺乏缺省的各類 string 操作狗热,需要庫支持(比如strcmp,strlen)瑟枫。
- bytes 無法直接轉(zhuǎn)換到string斗搞,需要庫支持。
后面這兩條是不完善的地方慷妙,不方便編程僻焚。
后面通過例子來理解這些知識點(diǎn)。
2膝擂、實(shí)例講解
2.0 概覽
對于動態(tài)數(shù)組虑啤,講解四個知識點(diǎn):
- uint 動態(tài)數(shù)組【例子①】
- bytes 定長數(shù)組【例子①】
- string轉(zhuǎn)換bytes【例子③】
- 手動的刪除【例子②⑤】
對于字符串,講解兩個知識點(diǎn):
- 字符串的長度架馋。根據(jù) UTF-8 編碼的規(guī)定來計(jì)算字符長度狞山。【例子③】
- 字符串的比較叉寂。Keccak256 取巧的辦法萍启。【例子④】
演示代碼在老師的代碼托管網(wǎng)站上,獲取方法見第二課第3小節(jié)勘纯。
2.1 例子①
拉取代碼后局服,用 Remix 打開 example_1.sol 文件。在 settings 設(shè)置 Solidity version 為0.4.17驳遵,不要太高淫奔。
操作:
點(diǎn) Deploy 部署。
點(diǎn) TestArray 執(zhí)行堤结。再看控制臺唆迁,可以看到 TestArray 函數(shù)的返回值:bts1的長度變成了5。
點(diǎn)控制臺上的debug竞穷,調(diào)試唐责。
點(diǎn)擊行號可以設(shè)置斷點(diǎn),此處演示把57行和69行設(shè)置為斷點(diǎn)来庭。
右邊可以在 solidity state 和 solidity locals 看到各變量的值妒蔚。-
點(diǎn)擊調(diào)試按鈕,最后一個:跳到下一個斷點(diǎn)月弛。
-
點(diǎn)擊調(diào)試按鈕(第一行最后一個按鈕),使走完一個循環(huán)科盛。
可以看到:ex_1的第0個元素發(fā)生了變化帽衙,bts2 變成了0x09020304。
-
再點(diǎn)擊幾次“跳到下一個斷點(diǎn)”按鈕贞绵。使跳出循環(huán)厉萝。
可以看到:bts1 變成了0x0506070809,bts2 變成了0x09020304榨崩。
- 點(diǎn)擊memory谴垫,可以看到變量在內(nèi)存中的存儲情況。
ex_1母蛛,見代碼第48行翩剪,byte 就是bytes1 ,ex_1是字節(jié)數(shù)組(見47行注釋)彩郊。它的每一個元素都是32字節(jié)前弯。如圖上半部分四個小框。
而bts1秫逝,是原始字節(jié)串恕出,整個元素占一個字節(jié)。它不能按偏移量修改违帆,能整體修改浙巫。如圖下半部分。
- 點(diǎn)擊停止按鈕刷后。結(jié)束調(diào)試的畴。
2.2 例子② 刪除
操作:
修改代碼廉油。取消注釋82行,注釋掉84行苗傅,先演示默認(rèn)刪除的效果抒线。
重新部署代碼。Deploy
-
點(diǎn)擊TestDelete渣慕,觀察到返回值為4嘶炭,意思是并沒有刪除,只是清零了逊桦。
-
取消注釋84行眨猎,注釋掉82行。再觀察手動刪除效果强经。這里使用了137行的自定義函數(shù)睡陪。
實(shí)現(xiàn)方法是:把待刪除位置之后的元素都向前移動一位,把最后一個元素置0匿情,再把長度減少1兰迫。調(diào)試結(jié)果如圖。
返回值為長度3炬称,88被刪除了汁果。
2.3 例子③ 字符串長度
如果返回值是第38行,返回6玲躯;如果返回返回值是40行据德,則是2。后者符合期望值跷车。實(shí)現(xiàn)方法在代碼的第114行棘利。(對UTF-8不懂,先放下不看)
2.4 例子④ 字符串比較
通過計(jì)算 Keccak256 朽缴,如果這個值相等善玫,則字符串是相等的。(演示略)
2.5 例子⑤ 映射的刪除
默認(rèn)的刪除操作也是只清零不铆,并沒有真的刪除(演示略)蝌焚。編程時(shí)要注意。
小結(jié)一下誓斥,本節(jié)通過例子介紹了solidity數(shù)組和字符串的使用只洒。
不足之處,請批評指正劳坑。