iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Web 3

從 區塊鏈 到 去中心化應用程式(DApp)系列 第 19

智能合約開發: Solidity 與 智能合約基礎介紹

  • 分享至 

  • xImage
  •  

Solidity 與 智能合約基礎介紹

智能合約 讓人興奮的環節

該如何開始呢?

現在就以下幾點開始進入智能合約的世界

  1. 智能合約基礎觀念
  2. Solidity
  3. Solidity 型態
  4. Solidity 修飾
  5. Solidity 基本模樣

智能合約基礎觀念

智能合約(Smart Contracts 是區塊鏈技術中的一個關鍵概念,
它們代表著 去中心化、自動化和安全性 的結合。

智能合約的出現使得人們能夠在沒有中介機構的情況下執行協議和合同,這對於金融、供應鏈、不動產等領域都有巨大的影響。

什麼是智能合約?

智能合約是一種以編程方式定義的協議,
它們在區塊鏈上運行,自動執行合同條款,無需信任中介機構。

這意味著,當特定的條件滿足時,智能合約將自動執行相應的操作,而不需要人工干預。

智能合約的特點

  1. 自動執行
    智能合約能夠自動執行,根據事先編寫的程式碼和條件,無需人工參與。
  2. 不可變性
    一旦智能合約被創建和部署,其代碼是不可更改的,確保了合約的不變性。
  3. 去中心化
    智能合約運行在分散的區塊鏈網絡上,無需中央機構的參與。
  4. 安全性
    智能合約的代碼需要經過仔細審核和測試,以確保其安全運行。
  5. 透明性
    智能合約的代碼和交易歷史都可以在區塊鏈上查詢,實現了高度透明。

Solidity

Solidity是一種高級編程語言,專為區塊鏈上的智能合約開發而設計。

它的語法和特性借鑒了Python、JavaScript和C++等語言,使開發者更容易理解和編寫智能合約。

Solidity的由來

Solidity最早是由Gavin Wood於2014年創建的,
他是以太坊的聯合創始人之一。

它的設計目的是實現以太坊區塊鏈上的智能合約。

由於以太坊的成功,
Solidity已經成為最廣泛使用的智能合約開發語言之一。

Solidity 型態

基本型態(Primitive Types):

  1. 布林型(bool)
    它用於表示真偽值。

  2. 整數型(int / uint)
    整數型分為有符號(int)和無符號(uint)(無負數)兩種。

  3. 固定位數型(fixed / ufixed)
    fixed(有正負號分別) ufixed(無正負差別)
    固定位數型用於表示小數,它們具有固定的小數位數。
    例如,fixed128x18表示有128位整數和18位小數的固定位數型。

  4. 地址型(address)
    地址型用於存儲以太坊帳戶的地址。它可以是外部帳戶地址或合約地址。

  5. 位元組型(bytes)
    它可以用來處理原始數據或任何二進制數據。

複合型態(Composite Types):

  1. 陣列型(array)
    陣列型允許您創建一組相同型態的數據元素。

  2. 映射型(mapping)
    用於建立鍵值對的關聯數據結構。

  3. 結構型(struct)
    結構型允許您創建自定義的複合數據型態,其中包含多個不同型態的字段。

  4. 列舉型(enum)
    列舉型用於定義有限的可能值集合。

  5. 函數型(function)
    函數型用於聲明函數類型,可用於定義合約內部的函數變數。

Solidity 修飾

權限修飾:

  1. public
    變數或函數可以被任何地址訪問。這通常用於合約的外部介面。

  2. private
    變數或函數僅在合約內部可見。其他合約或外部地址無法訪問它。

  3. internal
    變數或函數只能在當前合約及其衍生合約中可見。

  4. external
    函數只能由外部地址調用,無法在合約內部調用。

普通修飾:

  1. pure
    函數表示它不訪問或修改狀態,並且不讀取存儲變數。它只返回計算結果。

  2. view
    函數表示它不修改狀態,但可以讀取存儲變數。
    它只返回計算結果,並不改變合約內部狀態。

  3. immutable
    允許在合約創建時進行一次性的賦值操作,之後不可更改。

  4. payable
    允許接受以太幣(ETH)支付,可以傳送ETH一起進行支付或轉賬操作。

事件修飾:

  1. anonymous
    不將事件簽名存儲為主題(topic),提高事件日誌的隱私性。

  2. indexed
    事件參數被標記為 indexed,以實現更快速的事件日誌查詢。

備註:

合約中的事件(Event) 是一種用於記錄和通知
外部應用程序和用戶關於合約內部活動的重要機制。

事件允許智能合約發出通知,
這些通知以事件日誌的形式存儲在區塊鏈上,
可以被外部觀察者查詢和監控。

繼承相關修飾:

  1. abstract
    合約被標記表示它是一個抽象合約,不能被實例化。

  2. virtual
    函數和修飾符允許它們的行為在衍生合約中被修改或覆蓋。

  3. override
    函數、修飾符或公共狀態變數被標記表明它們改變了基本合約中的函數或修飾符的行為。

Solidity 基本模樣

// 首先定義是用甚麼版本
pragma solidity ^0.8.0;

// 合約定義
contract Contract {
    // 可以有各樣的變數
    int256 public intVar;
    address public addrVar;
    
    // 構造函數(初始化的地方)
    constructor(uint256 initialValue) {
        intVar = initialValue;
    }

    // 各式各樣的函數定義
    function diversiformFunction() public {
        
    }
    
    // 定義事件
    event Event(address indexed user, int256 value);
}

這就是一個合約的基礎模樣

  1. 各樣變數
  2. 構造函數
  3. 可讓外部呼叫的函數
  4. 事件(可用函數紀錄事件)

因此合約建立後就可以透過函數與外部做互動

當然還有須多細節
比如透過函式作為過濾器、合約繼承、接收金額 等等等

所以要寫好一個合約也不簡單~~~

結言

今天透過一整個系統性的概略介紹

想應該是很難完全理解合約的概念及撰寫方式等等

但是有個基礎的概念那是一定的吧?

透過官方文檔學習 也是件很重要的事
可以隨時去查詢 https://soliditylang.org/

希望透過這篇能夠理解

  1. 甚麼是智能合約
  2. Solidity 是 甚麼
  3. Solidity 的 型態、修飾、基本模樣

下回預告

我想感覺很想趕進進入實戰環節了吧?

好想趕緊寫一個合約出來呢!!!

但是別急 在那之前要先解決環境與帳戶問題

不過那難道我要直接使用真實的區塊鏈 (寫錯怎麼辦)

因此要是能在開發環境 進行練習顯得格外重要

下回 "智能合約開發: 測試網路(Ganache)與虛擬錢包(MetaTask)"


上一篇
區塊鏈建立: 區塊鏈 實際運作
下一篇
智能合約開發: 測試網路(Ganache)與虛擬錢包(MetaTask)
系列文
從 區塊鏈 到 去中心化應用程式(DApp)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言