【開發智能合約 - Solidity系列】實作篇Ep.3 - 資料型態的特性與流程控制
資料型態
資料型態在合約當中扮演著什麼角色呢? 我們在「【開發智能合約 — Solidity系列】實作篇Ep.2 — 合約中的基本組成元素」有介紹過狀態變數可以儲存一些變化值,而儲存什麼類型的值就是所謂的資料型態,不同的資料型態可以處理的事物也有所不同,因此我們也需要了解一些基本的資料型態以及特性之後,未來開發合約之時才能更加穩固。
而Solidity的基本資料型態如下圖:
Boolean
主要是提供簡單的「是」或「否」的表達方式,而在程式語言的世界裡會用「true」、「false」描述。
... contract Example { /// @dev 是否已經被檢查過 bool private hasChecked = false; }
Integer
Integer的種類就非常多了,根據限定大小分為不同的整數型別,包括: int、uint、int8、uint8、int256…,主要用來存放數字,並用於計算。
... contract Example { int256 private xInt256 = -100; // int256's alias int private xInt = -100; // @dev uint無符號的整數型態 uint8 private xUint8 = 128; }
String
基本上就是儲存想要展示的字眼,但這邊要注意的是僅支援utf-8,因此直接輸入中文字串會被編譯器提示「ParserError: Invalid character」。
... contract Example { // correct string private str = "dynamic"; // ParserError: Invalid character string private str1 = "中文"; }
Address
Address則是非常特殊的一種資料型態,因為智能合約總是圍繞著虛擬貨幣錢包,而錢包的地址正是Address這種資料型態,而地址的型態又區分為以下兩種:
- 僅收款的地址: address。
- 可付款的地址: address payable,不同之處在於多了「 transfer」跟「send」的功能。
address payable payableAddr = payable(0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF); address addr = address(this); function assignAddress() public { // the balance of an address using the property payableAddr.balance; // end Ether (in units of wei) to a payable address payableAddr.transfer(10); }
流程控制
智能合約之所以能夠那麼智能就是因為具備了流程控制的功能,什麼條件下觸發什麼樣的處理機制,過程就如同機器人一般,不需經由人工干預,逐關審查,
圖片來源
流程結構
以下的流程關鍵字是我們在合約中常常會看到的控制撰寫方式,不外乎就是判斷什麼條件成立之後做什麼事情,或者連續做清單中的待辦事項。
// for... uint count0 = 0; // 累加10次的流程 for (uint i = 0; i < 10; i++) { count0 += i; } // 相當於上述的for ... uint count1 = 0; do { count1++; } while(count1 < 10); /// @dev if ... else ... bool isOpen = true; string memory status = ""; if (isOpen) { status = "activated"; } else { status = "closed"; }
結語
我們可以看到簡單的幾個流程加上資料型態就能夠變化出許多複雜的結果,這就是智能合約的強大之處,提供了材料,而能夠做出什麼成品就取決於我們的創造力,所以市面上才會創造出各式各樣的智能合約,但魔鬼都藏在細節裡,如果我們完全外行,僅相信這份合約是完美的,安慰自己世界都是美好的,那麼就很容易落入陷阱,因此就算不會撰寫合約至少也要能夠看得懂合約,才不會平白無故的損失。
今天的範例都在這裡「📦 solidity-remix-toturial/Ep3」歡迎自行取用。
喜歡撰寫文章的你,不妨來了解一下:
Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入?
歡迎加入一起練習寫作,賺取知識,累積財富!