iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 8
1
Blockchain

區塊練起來-智能合約與DApp開發系列 第 8

[區塊練起來-智能合約與DApp開發] DAY 08 - Solidity 控制結構與函式

貼心小語

上一篇了解了修飾詞在函式上的使用,這一篇就會來說說 Solidity 的基本控制結構的使用方式以及函式的基本用法。


函式

有回傳值的函式

一個基本有回傳值的函式長這樣:

function alert(string memory text) public pure returns (string memory) {
  return text;
}

大家應該都不陌生吧!其實 Solidity 還可以回傳多個值喔!

回傳多值的函式

回傳的資料可以是一個以上!

function show(string memory text) public pure returns (string memory, string memory) {
  return ("Your message:", text);
}

函式呼叫函式

可以讓函式之間互相呼叫(好像不是很稀奇的事情XD):

function test() public pure returns (string memory) {
  return sayHello();
}

function sayHello() private pure returns (string memory) {
  return "Hello";
}

條件敘述

與 JavaScript 的條件敘述差不多~

if...else

function test() public pure returns (string memory) {
  uint num = 2;
  if (num > 1) {
    return "HelloWorld";
  } else {
    return "HAHA";
  }
}

switch case

在 Solidity 中沒有 switch 可以使用,這需要注意一下!

三元運算子

function test4() public pure returns (uint) {
  uint num = 20;
  num = (num == 20)? 1 : 3;
  return num;
}

迴圈敘述

forwhiledo...while 可以使用。

for

function test() public pure returns (uint) {
  uint num = 0;
  for (uint i = 0; i < 10; i++) {
    num++;
  }
  return num;
}

while

function test() public pure returns (uint) {
  uint num = 0;
  while(num < 10) {
    num++;
  }
  return num;
}

do...while

function test() public pure returns (uint) {
  uint num = 0;
  do {
    num++;
  } while(num < 10);
  return num;
}

錯誤處理

在 Solidity 中,特別設置了攸關 Gas 的錯誤處理,共有三個:

require

這在前面篇章有出現過,經常用在 modifier 裡做驗證。 require 的用途就是進行條件判斷,如果條件不成立,會將剩餘的 Gas 歸還,並將合約狀態回復,也是最常使用到的錯誤處理方式。
概念有點類似下方的 JavaScript 範例,針對輸入值做驗證,不成立就return來終止運行:

const example = (isFalse = false) => {
  if (isFalse) {
    return;
  }
  console.log('Hello'); //不會執行
}

require 範例,寫在修飾詞中,並判斷是否為合約部署者:

pragma solidity ^0.5.0;

constract Permission {
  address private admin;
  
  modifier onlyAdmin {
    require(msg.sender == admin, "You don't have permission.");
    _; //要加這個
  }
  
  constructor() {
    admin = msg.sender;
  }

}

revert

require 十分接近但沒有條件判斷,當呼叫時會歸還剩餘的 Gas 並回復合約狀態。

function test() public pure returns (string memory) {
  uint num = 0;
  if (num != 1) {
    resvert("is false");
  }
  return "HelloWorld";
}

assert

require 一樣做判斷,但當條件不成立時,會將 Gas 全數消耗,不會返回任何的 Gas ,並回復合約狀態。通常用來處理較嚴重的錯誤,如:程式 bug ,為最不該被經常使用到的錯誤處理。

function test() public pure returns (string memory) {
  uint num = 0;
  assert(num != 1); //基本上不可能發生,除非程式錯誤
  return "HelloWorld";
}

今日小結

了解 Solidity 的函式基本用法、條件敘述、迴圈敘述以及錯誤處理,特別要注意的是沒有 switch 的用法,以及 requirerevertassert 的區別。


參考資料

Solidity 中Require(), Assert(), Revert()的用法和區別


上一篇
[區塊練起來-智能合約與DApp開發] DAY 07 - Solidity 修飾詞
下一篇
[區塊練起來-智能合約與DApp開發] DAY 09 - Solidity 作用域與合約的繼承
系列文
區塊練起來-智能合約與DApp開發31

尚未有邦友留言

立即登入留言