iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
自我挑戰組

Solidity 初學之路系列 第 4

DAY 4 - 變數類型[數值類型]

  • 分享至 

  • xImage
  •  

Solidity 的變數類型

主要分成下列幾種,今天介紹的是數值類型。

  1. 數值類型(Value Type)
  2. 函數類型(Function Type)
  3. 引用類型(Reference Type)
  4. 映射類型(Mapping Type)

數值類型

數值類型賦值時可直接傳遞數值,且數值類型的變數是互相獨立的。
分成以下類型:

  1. 布林類型:bool
  2. 整數類型:intuint
  3. 地址類型:addressaddress payable
  4. 固定長度位元組陣列:bytes1bytes32
  5. 枚舉類型:enum

1. 布林類型

bool 的值只有 truefalse 兩種。

bool public _bool = true;

布林值的運算符:

  • ! NOT,非
  • && AND,與
  • || OR,或
  • == 等於
  • != 不等於
bool public _bool1 = !_bool; // 取 NOT,_bool1 結果是 false
bool public _bool2 = _bool && _bool1; // AND,_bool2 結果是 false
bool public _bool3 = _bool || _bool1; // OR,_bool3 結果是 true
bool public _bool4 = _bool == _bool1; // 相等,_bool4 結果是 false
bool public _bool5 = _bool != _bool1; // 不相等,_bool5 結果是 true

短路規則

  • 若存在 f(x) || g(y) 的表達式,如果 f(x) 是 true,結果一定是 true,第二個條件 g(y) 就不會被計算、判斷。
  • 若存在 f(x) && g(y) 的表達式,如果 f(x) 是 false,結果一定是 false,第二個條件 g(y) 就不會被計算、判斷。

2. 整數類型

  • int 是有號整數,從 int8int16 ……到 int256,後面都是接 8 的倍數,表示占幾位元,int8 的範圍是 -128 ~ 127。int256 可直接由 int 表示。
  • uint 是無號整數,從 uint8uint256,後面都是接 8 的倍數,表示佔幾位元,uint8 的範圍是 0~ 255。uint256 可直接由 uint 表示。

整數運算符

比較運算符 算術運算符
<= 小於等於 + 加法
< 小於 - 減法
== 等於 * 乘法
!= 不等於 / 除法
>= 大於等於 % 取餘數
> 大於 ** 冪次
int public _int = -1; // 整數,包含負數
uint public _uint = 1; // 正整數
uint256 public _number = 20220330; // 256 位元正整數

uint256 public _number1 = _number + 1; // 四則運算,_number1 是 20220331
uint256 public _number2 = 2**2; // 指數,_number2 是 4
uint256 public _number3 = 7 % 2; // 取餘數,_number3 是 1
bool public _numberbool = _number2 > _number3; // 比大小,_number4 是 true

3. 地址類型

地址類型分成:

  • address:儲存 20 byte 的乙太坊地址。
  • address payable 類似 address 但比普通地址多了 transfersend 的成員方法,用於轉帳乙太幣,不過 send 在轉帳失敗時只會回傳 false,而不會回復交易狀態,開發者需要自行處理失敗狀況。
address public _address = 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;
address payable public _address1 = payable(_address);
uint256 public balance = _address1.balance; 
_address1.transfer(1);

說明:

  • payable(_address) 將普通的 address 轉換為 payable address,用來允許此地址之後可以轉帳、查餘額。
  • _address1.balance 用來獲取地址持有的乙太幣餘額。
  • _address1.transfer(1); 從合約的餘額中向 _address1 地址發送 1 wei(1 以太幣等於 10^18 wei)。transfer() 會在發送失敗時自動回退交易並拋出錯誤,因此它是一個安全進行資金轉移的方式。

4. 固定長度位元組陣列

位元組陣列分成固定長度和不固定長度兩種,固定長度的位元組陣列屬於數值類型,陣列長度在宣告之後不能改變,長度分為從 bytes1bytes8、……,最多到 bytes32
不定長度的位元組陣列屬於引用類型,在宣告後可以改變長度,包含 bytes,之後會提到。

bytes32 public _byte32 = "MiniSolidity";
bytes1 public _byte1 = _byte32[0];
bytes2 public _byte2 = _byte32[1];

說明:

"MiniSolidity" 以位元組的方式儲存進變數 _byte32,用 16 進制來看就是 0x4d696e69536f6c69646974790000000000000000000000000000000000000000_byte32[0] 擷取第一個位元組 0x4d 的部分,存入變數 _byte1 中,_byte32[1] 擷取第二個位元組 0x69 的部分,存入變數 _byte2 中。

5. 枚舉類型

enum 是 Solidity 中由使用者定義的資料類型,主要用在位 uint 分配名稱,使程式易於閱讀和維護,他與 C 語言的 enum 類似,使用名稱來代替從 0 開始的 uint

enum ActionSet { Buy, Hold, Sell }
ActionSet action = ActionSet.Buy;
function enumToUint() external view returns(uint){
    return uint(action);
}

說明:

  • enum ActionSet { Buy, Hold, Sell } 用 enum 將 uint 0, 1, 2 表示為 Buy, Hold, Sell
  • ActionSet action = ActionSet.Buy; 建立 enum 變數 action,並將 action 初始化為 ActionSet.Buy,action 變數當前的值對應 enum 中的 Buy,其數值是 0。
  • external 是一個外部函數,可以被外部合約或外部使用者呼叫。
  • view 表示這個函數不會改變合約的狀態,只是查看(讀取)資料。
  • returns(uint) 指定函數的返回類型為 uint
  • return unit(action) 將 action 的值轉換為 uint,並返回這個值。由於 action 被設為 ActionSet.Buy,其對應的整數值是 0。
  • enum 可以和 uint 進行顯式轉換,轉換的正整數需在枚舉長度內,否則會 Error。

上一篇
DAY 3 - Solidity 介紹
下一篇
DAY 5 - 變數類型[函數類型]、函數、函數輸出
系列文
Solidity 初學之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言