Integer, Bool, Address, string
A. 註解
// 單行註解: 快速了解接下來的目標, 或是解釋代碼/*
多行註解
*/
B. 布林
表示真或假, true or false
C. 整數
int -> integer, 有負數 int8 to int256
uint -> unsigned integer, 無符號整數(無負數)) uint8 to uint256
D. string 字串
為了要讓開發者, 一般人看得懂, 由編碼呈現
E. Bytes (很重要, 多看幾次)
1個byte = 8 bit, 最多32個byte, 16進制
一種序列化的表示方式, 為了讓計算機看得懂的內容
F. Address
智能合約特有的型別, 以太訪地址為160 bit, 20byte
可以表示個人錢包地址, 也可以表示合約地址
(transfer都不要用了)
G. Variables變數
值可能會變, 變數便於我們閱讀, 儲存, 計算及操作流程
把型別應用在需要的變數上
H. 以太坊單位
I. 程式碼解析
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract BasicTypes{
// 型別公式: <type> < visibility> <name> = <value>
// 1. 以下都是正整數, 可視性如果沒寫, 預設是internal
// 正整數最小值= 0, uint256: 0 ~ (2^256-1)
// uint8: 0 ~ (2^8 -1)
uint256 public myUint = 123;
uint32 public myUint32 = 111;
uint public myUint16 = 222;
uint8 public myUin8 = 333;
// 2. 以下為負整數以是負數
int256 public myInt = -123;
int32 public myInt32 = -111;
int16 public myInt16 = -222;
int8 public myInt8 = -333;
// 3. 取得uint最大數值的兩種方式
uint8 public uint8_max = 2**8 -1;
// 取得最小值: uint public uint_min = 0;
uint256 public max = type(uint256).max;
// int8 public int8_min = type(int8).min;
// 4. 功能:整數運算
function doMath(uint256 a, uint b) public pure returns(uint, uint, uint, uint, uint) {
uint sum = a + b;
uint diff = a - b;
uint product = a * b;
uint quotient = a / b;
uint remainder = a % b;
return (sum, diff, product, quotient, remainder);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract Logic {
// 5. 邏輯運算
function testLogic(uint256 x, uint256 y) public pure returns(bool, bool, bool, bool, bool) {
bool isBiggerThan5 = x > 5;
bool isLessThan10 = y < 10;
bool isBiggerThanAddEqual5 = x >=5;
bool isLessThanAndEqual10 = y <=10;
bool isEqual20 = x == 20;
return (isBiggerThan5, isLessThan10, isBiggerThanAddEqual5,isLessThanAndEqual10,isEqual20);
}
function testLogic2(bool x, bool y) public pure returns (bool, bool, bool) {
bool andResult = x && y; // &&: and, true && true = true
bool orResult = x || y; // ||: or, false|| false = false, 只要有一個true, 那就是true -> 邏輯運算
bool notResult = !x; // !:not, !true= false, !false = true
return (andResult, orResult, notResult);
}
}
J 練習
練習題 1
- uint 在其後宣告完 bits 之後該整數的數值範圍為__________。
- 數值範圍為0到2的bits次方次方減1之間,即為 0 ~ 2n-1
- int 在其後宣告完 bits 之後該整數的數值範圍為__________。
- 數值範圍為 -2n-1 ~ 2n-1 -1
練習題 2 請問如何在 Solidity 之中表示浮點數?
- Solidity 之中沒有浮點數型態 (要換算成整數)
練習題 3 請問狀態變數 State variables 預設的可視性是 public 還是 private?
- private
練習題 4 請舉出 3 種我們如何用來節省 String gas 花費的儲存型態。
- uint16:這是一種16位元的無符號整數型態,範圍從0到65535。如果你知道你的數值絕對不會超過這個範圍,那麼使用uint16可以節省儲存空間。然而,請注意,如果數值超出此範圍,將會導致錯誤。

- uint32:這是一種32位元的無符號整數型態,範圍從0到4294967295。如果你的數值可能會超過uint16的範圍,但仍在uint32的範圍內,那麼使用uint32可以提供更大的範圍而不會增加太多的儲存空間成本。

- uint256:這是一種256位元的無符號整數型態,提供了極大的範圍,但也需要更多的儲存空間。如果你需要處理非常大的數值,或者你不確定數值的範圍,那麼uint256可能是一個選擇。

練習題 5 請問全局訊息 Global Variables 指的是何者提供的資訊?
指的是當前區塊鏈狀態和合約執行環境的資訊的一組特殊變數, 比如:
- block:提供有關當前區塊的資訊,如區塊號、時間戳和區塊難度等。
- msg:提供有關當前交易或訊息的資訊,如發送者地址、交易數據、gas 限制等。
- tx:提供有關當前交易的資訊,如交易哈希、發送者地址、接收者地址等。
- now(或 block.timestamp):提供當前區塊的時間戳。
- address(this):提供當前合約地址。
練習題 6 請舉例「如何在 Solidity 之中進行字串比較。」
keccak256(abi.encodePacked(_str1)) == keccak256(abi.encodePacked(_str2))
abi.encodePacked(_str1)將字符串_str1編碼為字節序列,不添加長度前綴和填充。keccak256(abi.encodePacked(_str1))計算_str1的 Keccak-256 哈希值。- 同樣地,對
_str2執行相同的操作:abi.encodePacked(_str2)生成其字節序列,然後keccak256計算其哈希值。 - 最終,通過比較這兩個哈希值來判斷兩個字符串是否相等。
這種比較字符串的方法並不直接比較字符串的內容,而是比較它們的哈希值。如果兩個字符串的內容完全相同,則它們的哈希值也應該完全相同。這種方法通常用於在 Solidity 中進行字符串比較,因為 Solidity 不支持直接比較字符串。
練習題 7 請問在一個 .sol 檔案裡面,我們可以有幾個 contract?
可以有多個 contract。
練習題 8 在宣告 address 時加上 ____ ,代表可用於支付的地址。
payable
練習題 9 <account>.balance 回傳的單位是 ____。
wei
練習題 10 Solidity 是強型別語言還是弱型別語言,並簡單說明它們兩者的差別。
Solidity 是強型別語言,與弱型別語言的差別是宣告變數的時候需要表明型態。


















