Solidity(中文名稱:Solidity 語言)是一種面向智慧合約(Smart Contracts)的高階程式語言,最初由以太坊(Ethereum)的團隊開發並用於以太坊平臺上的智慧合約編寫。Solidity 的設計目標是簡化以太坊智慧合約的開發,使開發者能夠建立安全、可靠的去中心化應用程式(DApps)。
以下是 Solidity 的一些關鍵特點和重要概念:
Solidity 是一種用於編寫智慧合約的程式語言,它具有多種資料型別,用於定義合約中的變數和資料。以下是 Solidity 中常見的資料型別:
uint
:無符號整數型別,可以儲存正整數。int
:有符號整數型別,可以儲存正整數和負整數。uint8
表示一個8位元的無符號整數。address
:用於儲存以太坊地址的資料型別,通常用於儲存使用者地址或合約地址。address payable
:與 address
類似,但還可以接收以太幣(ether)的轉賬。bool
:用於儲存布林值,即 true
或 false
。bytes1
, bytes2
, ..., bytes32
:用於儲存固定大小的位元組陣列,可以儲存原始位元組資料。bytes
:用於儲存動態大小的位元組陣列,可以儲存變長位元組資料。string
:用於儲存文字字串,支援 UTF-8 編碼的字串。type[]
:用於儲存具有相同資料型別的元素的陣列,可以是固定大小或動態大小的。uint[]
表示一個儲存無符號整數的陣列。mapping(keyType => valueType)
:用於建立鍵-值對映,類似於雜湊表。keyType
必須是可雜湊的型別,而 valueType
可以是任何型別。struct
:用於自定義資料結構,可以包含多個欄位,每個欄位可以有不同的資料型別。enum
:用於定義一組有限的命名常數。每個列舉值都可以與一個整數值相關聯。function
:用於儲存函數的參照,通常用於回撥函數或將函數作為引數傳遞。view
和 pure
:用於標記函數,表示它們不會修改狀態,並且可以安全地讀取資料。這些資料型別允許 Solidity 開發者定義合約中的變數、函數引數和返回值。合約中的資料型別選擇取決於合約的需求和邏輯。 Solidity 還支援使用者自定義的複雜資料型別,如結構體和列舉,以便更好地組織資料。合理選擇和使用資料型別是 Solidity 智慧合約開發中的關鍵部分。
下面是一個簡單的 Solidity 合約範例,它實現了一個簡單的數位儲存合約,允許使用者設定和獲取一個整數值。這個合約將幫助你瞭解 Solidity 合約的基本結構和語法。
// 指定 Solidity 的版本
pragma solidity ^0.8.0;
// 定義一個合約
contract SimpleStorage {
// 宣告一個狀態變數,用於儲存整數值
uint256 private storedData;
// 定義一個事件,用於記錄狀態變數的變化
event ValueChanged(uint256 newValue);
// 合約建構函式,在部署合約時執行一次,用於初始化狀態變數
constructor() {
storedData = 0;
}
// 設定整數值的函數,只有合約的擁有者可以呼叫
function set(uint256 newValue) public {
storedData = newValue;
emit ValueChanged(newValue);
}
// 獲取整數值的函數,可以被任何人呼叫
function get() public view returns (uint256) {
return storedData;
}
}
在這個範例中,我們建立了一個名為 SimpleStorage
的合約。這個合約包括以下要點:
pragma solidity
指令指定 Solidity 的版本。storedData
的狀態變數,用於儲存整數值。這個變數是私有的,只能在合約內部存取。ValueChanged
事件,用於記錄狀態變數的變化。storedData
初始化為 0。set
函數,允許合約的擁有者設定整數值,並觸發 ValueChanged
事件。get
函數,允許任何人檢視儲存的整數值。要使用這個合約,你需要執行以下步驟:
set
函數,設定儲存的整數值。get
函數檢視儲存的整數值。這只是一個非常簡單的範例,但它涵蓋了 Solidity 合約的基本結構,包括狀態變數、建構函式、函數、事件等。你可以根據需要擴充套件這個範例,建立更復雜的智慧合約。注意,智慧合約的開發需要謹慎,特別是在處理資金和重要資料時,請務必小心編寫和測試程式碼。
下面的合約實現了一個簡單的數位投票系統。合約允許使用者為不同的候選人投票,並且可以查詢每個候選人的得票數。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// 宣告一個智慧合約
contract SimpleVoting {
// 宣告候選人結構體
struct Candidate {
uint256 id;
string name;
uint256 voteCount;
}
// 使用陣列儲存候選人列表
Candidate[] public candidates;
// 用於儲存每個地址的投票記錄
mapping(address => bool) public voters;
// 新增候選人
function addCandidate(string memory _name) public {
// 檢查呼叫者是否已投票
require(!voters[msg.sender], "You can only add one candidate.");
uint256 candidateId = candidates.length;
candidates.push(Candidate(candidateId, _name, 0));
voters[msg.sender] = true;
}
// 進行投票
function vote(uint256 _candidateId) public {
// 檢查呼叫者是否已投票
require(!voters[msg.sender], "You can only vote once.");
// 檢查候選人是否存在
require(_candidateId < candidates.length, "Candidate does not exist.");
// 增加候選人的得票數
candidates[_candidateId].voteCount++;
// 標記呼叫者已投票
voters[msg.sender] = true;
}
// 查詢候選人的得票數
function getVotes(uint256 _candidateId) public view returns (uint256) {
require(_candidateId < candidates.length, "Candidate does not exist.");
return candidates[_candidateId].voteCount;
}
}
這個合約包括以下主要部分:
Candidate
:包括候選人的ID、姓名和得票數。candidates
:用於儲存候選人的陣列。voters
:用於記錄哪些地址已經投票,防止重複投票。addCandidate
函數:允許任何地址新增候選人。vote
函數:允許任何地址投票給特定的候選人。getVotes
函數:允許查詢特定候選人的得票數。合約的呼叫者可以通過呼叫函數來新增候選人、投票和查詢候選人的得票數。這只是一個非常簡單的範例,用於演示 Solidity 合約的基本構建塊。在實際應用中,你可以根據需求擴充套件和優化合約。確保在以太坊測試網路上進行測試和部署合約,以確保其正常執行。
Remix IDE 是一個基於 Web 的區塊鏈智慧合約開發環境,它提供了許多有用的功能,包括智慧提示(程式碼補全)功能,以幫助開發者更高效地編寫 Solidity 智慧合約。智慧提示可以在你輸入程式碼時,自動顯示可能的選項,從而加速程式碼編寫和減少錯誤。
以下是如何在 Remix IDE 中偵錯智慧合約的步驟:
宣告:本作品採用署名-非商業性使用-相同方式共用 4.0 國際 (CC BY-NC-SA 4.0)進行許可,使用時請註明出處。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 戀水無意