2024-05-04|閱讀時間 ‧ 約 30 分鐘

1.1 Solidity的型別 Types 與變數 Variables + 小練習

    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 指的是何者提供的資訊? 

    指的是當前區塊鏈狀態和合約執行環境的資訊的一組特殊變數, 比如:

    1. block:提供有關當前區塊的資訊,如區塊號、時間戳和區塊難度等。
    2. msg:提供有關當前交易或訊息的資訊,如發送者地址、交易數據、gas 限制等。
    3. tx:提供有關當前交易的資訊,如交易哈希、發送者地址、接收者地址等。
    4. now(或 block.timestamp):提供當前區塊的時間戳。
    5. address(this):提供當前合約地址。

    練習題 6 請舉例「如何在 Solidity 之中進行字串比較。」

    keccak256(abi.encodePacked(_str1)) == keccak256(abi.encodePacked(_str2))
    1. abi.encodePacked(_str1) 將字符串 _str1 編碼為字節序列,不添加長度前綴和填充。
    2. keccak256(abi.encodePacked(_str1)) 計算 _str1 的 Keccak-256 哈希值。
    3. 同樣地,對 _str2 執行相同的操作:abi.encodePacked(_str2) 生成其字節序列,然後 keccak256 計算其哈希值。
    4. 最終,通過比較這兩個哈希值來判斷兩個字符串是否相等。

    這種比較字符串的方法並不直接比較字符串的內容,而是比較它們的哈希值。如果兩個字符串的內容完全相同,則它們的哈希值也應該完全相同。這種方法通常用於在 Solidity 中進行字符串比較,因為 Solidity 不支持直接比較字符串。

    練習題 7 請問在一個 .sol 檔案裡面,我們可以有幾個 contract?

    可以有多個 contract。

    練習題 8 在宣告 address 時加上 ____ ,代表可用於支付的地址。

    payable

    練習題 9 <account>.balance 回傳的單位是 ____。

    wei

    練習題 10 Solidity 是強型別語言還是弱型別語言,並簡單說明它們兩者的差別。

    Solidity 是強型別語言,與弱型別語言的差別是宣告變數的時候需要表明型態。

    [Reference]

    1. Solidity Tutorial: Basics 瞭解初階語法、型別 Types 與變數 Variables - BOOLEANS, INTEGER, STRING, Address, KryptoCamp 區塊鏈人才培育第一品牌, Jun 14, 2023
    2. Solidity 教學: 型別 Types & 變數 Variables, KryptoCamp - 智能合約教學與區塊鏈工程師課程
    3. Solidity 實戰工作坊 - 第 1 場精彩重播: 智能合約撰寫, KryptoCamp - 智能合約教學與區塊鏈工程師課程
    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.