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

閱讀時間約 10 分鐘

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可以節省儲存空間。然而,請注意,如果數值超出此範圍,將會導致錯誤。
raw-image
    • uint32:這是一種32位元的無符號整數型態,範圍從0到4294967295。如果你的數值可能會超過uint16的範圍,但仍在uint32的範圍內,那麼使用uint32可以提供更大的範圍而不會增加太多的儲存空間成本。
raw-image
    • uint256:這是一種256位元的無符號整數型態,提供了極大的範圍,但也需要更多的儲存空間。如果你需要處理非常大的數值,或者你不確定數值的範圍,那麼uint256可能是一個選擇。
raw-image

練習題 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 - 智能合約教學與區塊鏈工程師課程
    尋大神腳印, 亦步亦趨。
    留言0
    查看全部
    發表第一個留言支持創作者!
    2.1 多簽錢包
    閱讀時間約 9 分鐘
    4.2 SBTx10
    閱讀時間約 1 分鐘
    3.2 荷蘭拍
    閱讀時間約 1 分鐘
    1.18 Todo List
    閱讀時間約 5 分鐘
    KOL to follow
    閱讀時間約 1 分鐘
    4.3 [實作] 猜數字合約
    閱讀時間約 8 分鐘
    你可能也想看
    1-1 以此為始 熾熱的太陽高高的掛在天空,熱浪滾滾的燃燒著這片大地,這樣的天氣讓在全山環繞下的薩爾多顯得更加悶熱,一群群在訓練場裡鍛鍊的菜鳥們也更加的難熬,一名叫多羅姆的青年正大汗淋漓的認真揮舞著木劍練習著,熱汗隨著擺動的身軀如雨珠般落下滋潤著薩爾多荒蕪的土地上。
    avatar
    蒙面俠浣熊
    2024-04-21
    1.1如何清楚說出自己是誰?(自我介紹的重要性和技巧)自我介紹是一個展示你的風格和態度的機會。提供瞭如何清楚地表現出自己的優勢和開場白、背景介紹、重點突出、關聯聯繫的技巧,以及在教授個人品牌建立的課程詢問如何用一句話介紹你自己,這是最簡單也是最重要的開始,為讀者提供了大量如何定位和充分展現自己的建議。
    avatar
    Ash Yang 楊萱
    2024-04-13
    1.1 奇觀 THE WONDER在伊登,人活到三十歲便可以去死了,因為到了這個年紀,你已經看遍凡世所有奇觀,也經歷了人一生可以遇到的所有鳥事。 那是母親在我年幼時說過的一句話。很奇怪,比起她的其他教誨,又或者是她髮色的印象,這句說話更有力、更有色彩,像愛神聖殿裏刺下的黃金刺青一樣讓人不容忽視。 也大概因母親的緣故,我少
    Thumbnail
    avatar
    諾蒂西亞
    2024-03-08
    1.1 佛倫卡卡瑰寶 Francaca's Gem古丁平原的邊陲小鎮,不知何時開始流傳起一些故事。提及一位獨行傭兵會在危難當前時伸出援手。但不是任何危機——只有危及性命時他才會現身。 而且,他總是會收取和受助人「性命相等」的高昂價格,身上卻依舊穿着鏽蝕板甲,錢都不知花到哪裏去了。有人說他是魔格納化身,也有人說是審判者。
    Thumbnail
    avatar
    諾蒂西亞
    2024-03-01
    1/1-1/7食安新聞重點整理112年公共運輸場站周邊餐飲業稽查結果出爐 ! ! 其中有2件豆製品不合格、3件自製飲品的腸桿菌科超標、某業者的火鍋湯底沒有標示、使用的原料過期 ! ! ....韓國「蛋黃派」驗出食物中毒菌 ! ! 台灣是否有進口 ? ?
    avatar
    一顆小紅豆
    2024-01-07
    1/1(一),起床—kg,睡前54.9kg,總熱量2,345cal連假最後一天整個依依不捨的氛圍。
    Thumbnail
    avatar
    中年婦女
    2024-01-02
    1/1 股市閒談- 明年印度 GDP 預估成長 7%,依然是全球最亮眼的市場之一,過去八年年年上漲的印度股市,今年資產配置應該也不能錯過 - 越南房企倒了很多家,2024 年 GDP 預估 6%,或許可以趁現在股市低點買一些 - 紡織產業2023Q1 基期低,今年Q1 成長可期
    avatar
    時間的朋友 Max
    2024-01-01
    1/1 英格蘭冠軍聯賽英格蘭冠軍聯賽 中岸水手(主) vs 珀斯光榮(客)比賽時間 : 12/31 16:00pm ​ 戰績 : 李斯特城(主)近10場比賽,7勝2平1負,勝率70%,英冠排名第1名。 ​ 哈德斯菲爾德(客) 近10場比賽,2勝2平6負,勝率20%,英冠排名第20
    Thumbnail
    avatar
    姜楚凡
    2024-01-01
    【開發智能合約 — Solidity系列】實作篇Ep.11 — 繼承同源但不同意圖的函數覆寫我們在「【開發智能合約 — Solidity系列】實作篇Ep.9 — 何謂繼承(Inheritance)」有提到繼承的一些基本概念,然而在繼承的過程中我們可能會用到上游的方法,甚至加工,而方法名稱重複了,是否能被允許呢? 答案是「允許」的,就好比我們雖然繼承了父親的「處事技巧」,但在求新求變的時代中
    Thumbnail
    avatar
    阿Han
    2023-05-16
    【開發智能合約 — Solidity系列】實作篇Ep.1 — 看懂智能合約的脈絡本篇章會以實際的程式碼來說明開發Solidity的組成脈絡與重要的區塊,讓我們不再害怕閱讀艱澀難懂的程式碼,並且具備基礎知識以後也能看懂外面的合約。 開源程式碼常常會面臨到法律的問題,因此License的宣告就變得非常重要,而Solidity也考慮到這一塊,因此特別規劃了一塊License宣告的區塊
    Thumbnail
    avatar
    阿Han
    2023-05-02