資料型態
而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";
}
結語
我們可以看到簡單的幾個流程加上資料型態就能夠變化出許多複雜的結果,這就是智能合約的強大之處,提供了材料,而能夠做出什麼成品就取決於我們的創造力,所以市面上才會創造出各式各樣的智能合約,但魔鬼都藏在細節裡,如果我們完全外行,僅相信這份合約是完美的,安慰自己世界都是美好的,那麼就很容易落入陷阱,因此就算不會撰寫合約至少也要能夠看得懂合約,才不會平白無故的損失。