在本節中,我們將討論如何使用Solidity編寫基本的智能合約。課程將涵蓋變量、函數和修飾符等基本內容,併以一個簡單的代幣合約示例來詳細介紹實現過程。
變量、函數和修飾符
我們用Solidity來創建一個簡單的代幣合約,允許用戶在多個賬戶之間轉移代幣併查看任一賬戶的代幣餘額。
TypeScript
pragma solidity ^0.8.0;
contract SimpleToken {
// Declare state variables
address public owner;
mapping(address => uint256) public balances;
// Initialize the token contract
constructor(uint256 initialSupply) {
owner = msg.sender;
balances[owner] = initialSupply;
}
// Function to transfer tokens
function transfer(address to, uint256 amount) public {
require(balances[msg.sender] >= amount, "Insufficient balance");
balances[msg.sender] -= amount;
balances[to] += amount;
}
// Function to check the token balance of an account
function balanceOf(address account) public view returns (uint256) {
return balances[account];
}
}
該合約包含:
owner
和 balances
,分別用於存儲合約所有者的地址和所有地址的代幣餘額。constructor
構造函數,用於設置代幣的初始供應併將其分配給合約所有者。transfer
函數,允許用戶將代幣轉移到其他賬戶。它使用require
語句來確保髮送者有足夠的代幣可以轉移。balanceOf
函數,用於返回指定帳戶的代幣餘額。TypeScript
pragma solidity ^0.8.0;
contract VotingSystem {
mapping (bytes32 => uint256) public votesReceived;
bytes32[] public candidateList;
constructor(bytes32[] memory candidateNames) {
candidateList = candidateNames;
}
function voteForCandidate(bytes32 candidate) public {
require(validCandidate(candidate), "Invalid candidate.");
votesReceived[candidate] += 1;
}
function totalVotesFor(bytes32 candidate) public view returns (uint256) {
require(validCandidate(candidate), "Invalid candidate.");
return votesReceived[candidate];
}
function validCandidate(bytes32 candidate) public view returns (bool) {
for (uint256 i = 0; i < candidateList.length; i++) {
if (candidateList[i] == candidate) {
return true;
}
}
return false;
}
}
在此示例中,VotingSystem
合約允許用戶通過調用voteForCandidate
函數爲候選人投票。合約使用voteForCandidate
映射統計每個候選人收到的票數,統計基於候選人的名稱,值則是票數。CandateList
變量存儲有效候選人列錶。可以調用totalVotesFor
函數來查看特定候選人穫得的票數,併通過validCandidate
函數檢查候選人是否有效。通過這一示例,我們學習了如何使用Solidity構建具有覆雜邏輯的去中心化應用。
要點
在本節中,我們將討論如何使用Solidity編寫基本的智能合約。課程將涵蓋變量、函數和修飾符等基本內容,併以一個簡單的代幣合約示例來詳細介紹實現過程。
變量、函數和修飾符
我們用Solidity來創建一個簡單的代幣合約,允許用戶在多個賬戶之間轉移代幣併查看任一賬戶的代幣餘額。
TypeScript
pragma solidity ^0.8.0;
contract SimpleToken {
// Declare state variables
address public owner;
mapping(address => uint256) public balances;
// Initialize the token contract
constructor(uint256 initialSupply) {
owner = msg.sender;
balances[owner] = initialSupply;
}
// Function to transfer tokens
function transfer(address to, uint256 amount) public {
require(balances[msg.sender] >= amount, "Insufficient balance");
balances[msg.sender] -= amount;
balances[to] += amount;
}
// Function to check the token balance of an account
function balanceOf(address account) public view returns (uint256) {
return balances[account];
}
}
該合約包含:
owner
和 balances
,分別用於存儲合約所有者的地址和所有地址的代幣餘額。constructor
構造函數,用於設置代幣的初始供應併將其分配給合約所有者。transfer
函數,允許用戶將代幣轉移到其他賬戶。它使用require
語句來確保髮送者有足夠的代幣可以轉移。balanceOf
函數,用於返回指定帳戶的代幣餘額。TypeScript
pragma solidity ^0.8.0;
contract VotingSystem {
mapping (bytes32 => uint256) public votesReceived;
bytes32[] public candidateList;
constructor(bytes32[] memory candidateNames) {
candidateList = candidateNames;
}
function voteForCandidate(bytes32 candidate) public {
require(validCandidate(candidate), "Invalid candidate.");
votesReceived[candidate] += 1;
}
function totalVotesFor(bytes32 candidate) public view returns (uint256) {
require(validCandidate(candidate), "Invalid candidate.");
return votesReceived[candidate];
}
function validCandidate(bytes32 candidate) public view returns (bool) {
for (uint256 i = 0; i < candidateList.length; i++) {
if (candidateList[i] == candidate) {
return true;
}
}
return false;
}
}
在此示例中,VotingSystem
合約允許用戶通過調用voteForCandidate
函數爲候選人投票。合約使用voteForCandidate
映射統計每個候選人收到的票數,統計基於候選人的名稱,值則是票數。CandateList
變量存儲有效候選人列錶。可以調用totalVotesFor
函數來查看特定候選人穫得的票數,併通過validCandidate
函數檢查候選人是否有效。通過這一示例,我們學習了如何使用Solidity構建具有覆雜邏輯的去中心化應用。
要點