跳至內容
0%

2025 年免費學習 Solidity 的最佳方法

作者 Frederik B

發布於 2023年9月22日閱讀時間 2 分鐘

Solidity 是一種物件導向的高階語言,用於撰寫智能合約。學會 Solidity 能讓你建立智能合約與去中心化應用程式

本文將介紹學習 Solidity 最常見的方法,並說明成為 Ethereum 開發者所需了解的重要 Solidity 概念。

為什麼學習 Solidity 很重要?

Solidity 是用來在 Ethereum 與相容 EVM 的區塊鏈上撰寫智能合約的程式語言,是區塊鏈開發者最重要的技能之一。隨著 Ethereum 及其他智能合約平台的生態系持續成長,對Solidity 開發者的需求也隨之增加。

資深 Solidity 開發者的平均年薪為每年 12 萬至 22.5 萬美元,尚未計入代幣形式的股權或員工認股權。根據 cryptocurrencyjobs.co 的資料,美國 Solidity 開發者的平均base薪資為 12.75 萬美元,最低base薪資為 8 萬美元,最高為 18 萬美元。相較之下,遠端工作的開發者年薪為 11.1 萬至 20 萬美元。而美國開發者的平均薪資為 10.3 萬美元,可見區塊鏈專業技能的需求相當高。

以下是各地區 Solidity 開發者的年薪範圍(以美元計):

  • 北美 - 12.5萬至20萬美元
  • 歐洲 - 8萬至13.5萬美元
  • 亞洲 - 4.6萬至11.6萬美元
  • 大洋洲 - 8.5萬至12萬美元
  • 南美 - 4.9萬至15萬美元
  • 非洲 - 4.9萬至7.5萬美元
  • 遠端 - 11.1萬至20萬美元

學習 Solidity 不僅能帶來可觀的財務機會,還能讓你打造出對世界有巨大影響力的應用程式。事實上,光是 Ethereum 上就有將近 3,000 個應用程式,涵蓋從金融普惠到永續能源等各種目標。

學習 Solidity 的方法

學習 Solidity 的方法有很多,包括線上課程、訓練營、教學文章,以及閱讀 Hardhat 等熱門 Solidity 開發工具的文件。

透過線上課程學習 Solidity

如果你想要比教學文章更有結構、更有引導性的學習方式,線上課程是不錯的選擇。市面上有許多高品質課程,包括Alchemy University 的免費 Solidity 開發課程

教學文章通常是自主步調進行,而線上課程往往有固定的課程進度與截止日期,能提供有時間限制的動力,讓學習者保持進度。此外,Solidity 課程通常包含測驗與其他作業,讓你在學習過程中檢視自己的理解程度。

透過 Ethereum 訓練營學習 Solidity

如果你想在結構化、沉浸式的環境中學習 Solidity 與其他區塊鏈開發技能,Solidity 訓練營或許適合你。區塊鏈訓練營提供密集的實作訓練,幫助你成為具備就業能力的區塊鏈開發者。

Alchemy 收購 ChainShot 後,重新設計了 ChainShot 為期 7 週、原價 3,000 美元的 Ethereum 開發者訓練營,並在 Alchemy University 底下免費開放給大眾。若想跟著專業講師與有動力的同儕一起學習 Solidity,可先預約Alchemy University 的 Ethereum 訓練營名額。

如果開發者是完全的程式設計新手,Alchemy University 的三週 JavaScript 速成課程是進入 Ethereum 訓練營前很好的先修課程。

透過教學文章學習 Solidity

如果你是自主學習者,想按照自己的步調學習,教學文章是學習 Solidity 的好方法。網路上有許多高品質的Solidity 教學文章,涵蓋從初階到進階的內容。

官方的Ethereum 開發者資源中有 53 篇標記為「Solidity」的教學文章,內容涵蓋從智能合約基礎到更進階的主題,例如gas 優化與安全簽章。

需要學習的重要 Solidity 概念

選定學習方式之後,接下來就要開始學習如何用 Solidity 撰寫程式碼。要寫出有效的程式碼,需要理解幾個核心的 Solidity 概念。

Solidity ABI

應用二進位介面(ABI)是一組規則,讓兩個不同的軟體能夠互相溝通。在 Solidity 的情境中,ABI 讓智能合約之間能互相溝通,也能與錢包等外部軟體溝通。

ABI 讓你可以撰寫能與任何合約互動的程式碼,不論你是否擁有該合約的原始碼。這是因為 ABI 包含了在合約之間編碼與解碼傳遞資料所需的所有資訊。

智能合約

智能合約是一段執行於 Ethereum 區塊鏈上的程式碼,當一組條件被滿足時會執行特定動作。智能合約可用來建立數位代幣、去中心化應用程式等。

常見的智能合約用途是建立 ERC20 代幣,只需幾行程式碼即可完成。更複雜的智能合約則包括代幣交換、流動性挖礦與合成資產。這些合約會透過Solidity 編譯器編譯,輸出用於部署合約的位元組碼(bytecode)。

ERC20 代幣

ERC20 代幣是一種在 Ethereum 區塊鏈上運行的數位資產類型。它們常被用來代表現實世界的資產,例如商品或法定貨幣。

ERC20 代幣是 Ethereum 上最常見的數位資產類型。由於 ERC20 代幣也是最容易撰寫的合約類型之一,學會如何建立它們是一項重要技能。

合約介面

介面是一種指定合約必須具備哪些函式的方式。介面讓你能建立容易重複使用與擴充的合約。舉例來說,你可以為代幣合約建立介面,之後任何實作該介面的合約都可以當作代幣使用。

繼承

繼承是 Solidity 中重複使用程式碼的一種方式。繼承讓你能建立「子」合約,繼承「父」合約中的所有程式碼。這能讓開發者避免重複撰寫程式碼,也讓智能合約的維護更加容易。

繼承是物件導向程式設計中的重要概念,也是讓 Solidity 如此強大的原因之一。學會如何建立可輕鬆擴充與修改的標準化合約,是一項重要的 Solidity 課題。

函式

如同任何程式語言一樣,函式是 Solidity 的核心組成部分。Solidity 函式是接收輸入、執行某些動作並回傳輸出的程式碼區塊。

函式可以寫入 Solidity 智能合約中,執行各式各樣的動作,從發送代幣到儲存資料都行。一組供重複使用的函式集合稱為函式庫(library)。

程式設計中有一個基本原則叫做「D.R.Y. 原則」,意思是「Don't Repeat Yourself」(不要重複自己)。這個原則說明開發者不應該撰寫兩次相同的程式碼,而是應該將函式寫一次,之後每次需要執行該動作時就呼叫這個函式。

函式可見性

關於 Solidity 函式,有一件重要的事要注意,那就是它們有可見性設定。可見性決定了誰能看到並執行該函式。Solidity 中有四種可見性層級:public、external、internal 與 private。

  • Public 函式任何人都可以看到並執行。
  • External 函式任何人都可以看到,但只能由其他合約執行。
  • Internal 函式只能被同一合約內的其他函式看到並執行。
  • Private 函式只能被該合約本身看到並執行。

Call 函式

call 函式讓你能執行另一個合約中的程式碼。這就是 Ethereum 上合約之間互相溝通的方式。

call 函式讓你可以撰寫能與任何合約互動的程式碼,不論你是否擁有該合約的原始碼。這是因為 ABI 包含了在合約之間編碼與解碼傳遞資料所需的所有資訊。

Delegatecall 函式

delegatecall 函式與 call 方法類似,但有一個重要差異:它會在呼叫者的情境(context)中執行程式碼。這表示被呼叫合約所做的任何儲存變更,實際上會作用在呼叫者的儲存空間上。

delegatecall 函式讓你能撰寫可被其他合約重複使用的合約。舉例來說,你可以撰寫一個實作某介面的合約,之後其他合約就能透過 delegatecall 呼叫該合約來使用該介面。

修飾器(Modifiers)

修飾器類似函式,但有一些重要差異。首先,修飾器只能用在函式上。第二,修飾器會在函式執行前先被呼叫。payable 就是修飾器的一個例子,它讓函式能夠接收 Ether 進入合約。

修飾器讓你能夠改變函式的行為,而不需要動到實際的程式碼。舉例來說,修飾器可以在執行函式前檢查使用者的餘額是否足夠,或是加入一個在函式被呼叫時觸發的事件。

陣列(Arrays)

陣列是一種線性資料結構,用來儲存固定數量、相同資料型別的元素,這些元素儲存在連續且相鄰的記憶體位置中。陣列可以是固定大小或動態大小。動態陣列在宣告時不需要預先定義大小,而固定陣列則有預先定義的大小。

如果開發者需要對一組資料進行迭代(例如使用迴圈),就該使用陣列。如果不需要迭代整組資料,而是可以根據已知的鍵值取得對應的值,那就該考慮使用 mapping。

Structs

struct 是一種在 Solidity 合約中儲存資料的方式。struct 適合用來建立擁有多個屬性、較為複雜的資料型別。

Mappings

mapping 是一種在 Solidity 合約中儲存資料的方式。mapping 與陣列類似,但鍵值可以是任意型別,而不僅限於整數。這項特性讓 mapping 非常靈活且強大。mapping 讓你能以彈性且易用的方式在合約中儲存資料。

事件(Events)

事件是一種在特定條件被滿足時觸發程式碼執行的機制。舉例來說,開發者可以撰寫一個在使用者購買代幣時觸發的事件,或是在交易於區塊鏈上被確認時觸發的事件。

Solidity 事件讓開發者能撰寫因應現實世界事件而執行的程式碼。這也是許多應用程式能與現實世界互動的方式,例如在某個條件被滿足時發送電子郵件或簡訊。

Require(錯誤處理)

"require" 關鍵字是三個特殊函式之一,另外兩個是 assertrevert。require 會檢查某個條件是否為真,如果不是,就會回退(revert)交易並回傳錯誤訊息。

使用 require 能讓你預防合約中發生錯誤。舉例來說,你可以用 require 來檢查使用者是否有足夠的餘額進行購買,或是在發送交易前確認地址是否有效。

可升級智能合約

可升級智能合約是一種不需要重新部署合約就能升級的合約類型。可升級智能合約讓你能在合約部署後修改內容,而不會影響區塊鏈上已存在的任何資料或程式碼。

代理合約(Proxy contracts)

代理合約是一種可更新的路由合約,設計用來將函式呼叫導向最新版本的實作合約。

透過這種方式,協議可以升級其實作,而不需要所有使用者更新程式碼以對應新地址。透過使用代理合約,開發者能讓其函式擁有一個固定不變的地址。

代理合約有一個更新函式,團隊可以呼叫該函式,將函式的路由路徑更新指向新的實作合約地址。

多重簽章合約(Multisig contracts)

多重簽章合約是一種需要多個簽章才能執行其程式碼的合約類型。當開發者希望要求多人核准某筆交易後才能執行時,Solidity 多重簽章合約就很有用。

多重簽章合約也適用於開發者想限制特定時間內可花費金額上限的情況。舉例來說,你可以使用多重簽章合約,要求任何超過 1,000 美元的交易都需要兩個簽章。

重入攻擊(Reentrancy attacks)

重入攻擊是一種可能發生在 Solidity 合約中的攻擊方式:當一個合約呼叫另一個合約,而第二個合約又回頭呼叫第一個合約,或呼叫另一個不受信任的合約,通常是在第一個合約尚未執行完畢之前發生。

重入攻擊可用來利用合約中的漏洞。舉例來說,攻擊者可以利用重入攻擊將合約中的所有 Ether 抽乾。

學習 Solidity 的最佳方式

不論你的目標是什麼,都有適合你需求的方式來學習 Solidity。如果你想要快速上手的簡單方法,教學文章是不錯的選擇,你也可以參考我們的 Solidity 入門介紹。如果你想要更多結構與引導,線上課程或許更適合你。而如果你想要沉浸式的實作體驗,訓練營可能是更好的選擇。

選定學習方式之後,還有一些重要概念需要確實掌握,包括智能合約、函式、事件等等。理解這些概念之後,你就能朝成為一名熟練的 Solidity 開發者邁進一大步。

Background gradient

打造區塊鏈魔法

Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。