017:Solidity語法之?dāng)?shù)組|《ETH原理與智能合約開發(fā)》筆記

待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》疑枯,馬良老師講授寥掐。此簡書文集記錄我的學(xué)習(xí)筆記您旁。

課程共8節(jié)課烙常。其中,前四課講ETH原理鹤盒,后四課講智能合約蚕脏。
第六課分為三部分:

  1. Solidity語法之?dāng)?shù)組
  2. Solidity語法之合約
  3. 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

數(shù)組知識點(diǎn)

在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驳遵,不要太高淫奔。

本課的例子

操作:

  1. 點(diǎn) Deploy 部署。

  2. 點(diǎn) TestArray 執(zhí)行堤结。再看控制臺唆迁,可以看到 TestArray 函數(shù)的返回值:bts1的長度變成了5。

  3. 點(diǎn)控制臺上的debug竞穷,調(diào)試唐责。

  4. 點(diǎn)擊行號可以設(shè)置斷點(diǎn),此處演示把57行和69行設(shè)置為斷點(diǎn)来庭。
    右邊可以在 solidity state 和 solidity locals 看到各變量的值妒蔚。

  5. 點(diǎn)擊調(diào)試按鈕,最后一個:跳到下一個斷點(diǎn)月弛。


    執(zhí)行結(jié)果1
  6. 點(diǎn)擊調(diào)試按鈕(第一行最后一個按鈕),使走完一個循環(huán)科盛。


    執(zhí)行結(jié)果2

可以看到:ex_1的第0個元素發(fā)生了變化帽衙,bts2 變成了0x09020304。

  1. 再點(diǎn)擊幾次“跳到下一個斷點(diǎn)”按鈕贞绵。使跳出循環(huán)厉萝。


    執(zhí)行結(jié)果3

可以看到:bts1 變成了0x0506070809,bts2 變成了0x09020304榨崩。

  1. 點(diǎn)擊memory谴垫,可以看到變量在內(nèi)存中的存儲情況。
變量的存儲

ex_1母蛛,見代碼第48行翩剪,byte 就是bytes1 ,ex_1是字節(jié)數(shù)組(見47行注釋)彩郊。它的每一個元素都是32字節(jié)前弯。如圖上半部分四個小框。

而bts1秫逝,是原始字節(jié)串恕出,整個元素占一個字節(jié)。它不能按偏移量修改违帆,能整體修改浙巫。如圖下半部分。

  1. 點(diǎn)擊停止按鈕刷后。結(jié)束調(diào)試的畴。

2.2 例子② 刪除

操作:

  1. 修改代碼廉油。取消注釋82行,注釋掉84行苗傅,先演示默認(rèn)刪除的效果抒线。

  2. 重新部署代碼。Deploy

  3. 點(diǎn)擊TestDelete渣慕,觀察到返回值為4嘶炭,意思是并沒有刪除,只是清零了逊桦。


    默認(rèn)刪除效果
  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ù)組和字符串的使用只洒。


不足之處,請批評指正劳坑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毕谴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涝开,老刑警劉巖循帐,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舀武,居然都是意外死亡拄养,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門银舱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘪匿,“玉大人,你說我怎么就攤上這事寻馏∑迕郑” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵诚欠,是天一觀的道長顽染。 經(jīng)常有香客問我,道長轰绵,這世上最難降的妖魔是什么粉寞? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮藏澳,結(jié)果婚禮上仁锯,老公的妹妹穿的比我還像新娘。我一直安慰自己翔悠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布野芒。 她就那樣靜靜地躺著蓄愁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狞悲。 梳的紋絲不亂的頭發(fā)上撮抓,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機(jī)與錄音摇锋,去河邊找鬼丹拯。 笑死,一個胖子當(dāng)著我的面吹牛荸恕,可吹牛的內(nèi)容都是我干的乖酬。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼融求,長吁一口氣:“原來是場噩夢啊……” “哼咬像!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤县昂,失蹤者是張志新(化名)和其女友劉穎肮柜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倒彰,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡审洞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了待讳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芒澜。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耙箍,靈堂內(nèi)的尸體忽然破棺而出撰糠,到底是詐尸還是另有隱情,我是刑警寧澤辩昆,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布阅酪,位于F島的核電站,受9級特大地震影響汁针,放射性物質(zhì)發(fā)生泄漏术辐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一施无、第九天 我趴在偏房一處隱蔽的房頂上張望辉词。 院中可真熱鬧,春花似錦猾骡、人聲如沸瑞躺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幢哨。三九已至,卻和暖如春嫂便,著一層夾襖步出監(jiān)牢的瞬間捞镰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工毙替, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岸售,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓厂画,卻偏偏與公主長得像凸丸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子木羹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容