簡介專案

這是一個簡單版本的虛擬貨幣

功能:

  1. 只有作者 (owner) 才能發行新幣,其他人都不行
  2. 任何都可以銷毀自己錢包的虛擬貨幣
  3. 發行者可以把自己的虛擬貨幣轉給別人

完整程式碼

透過 sodility 放置在 REMIX 做測試

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// 指定 Solidity 編譯器版本
pragma solidity ^0.8.18;

// 定義我們的合約,取名為 MyNewToken
contract MyNewToken {

// --- 狀態變數 (State Variables) ---

address public owner; // 紀錄合約的創建者 (擁有者)
uint256 public totalSupply; // 紀錄代幣的總供應量

// mapping 是一種鍵值對 (key-value pair) 的儲存方式
// 這裡用來儲存每個地址 (address) 所擁有的代幣數量 (uint256)
mapping(address => uint256) public balances;

// --- 事件 (Events) ---

// 當 TOKEN 被轉移時,觸發此事件,方便前端應用程式追蹤
event Transfer(address indexed from, address indexed to, uint256 amount);

// 當 TOKEN 被銷毀時,觸發此事件
event Burn(address indexed from, uint256 amount);


// --- 建構子 (Constructor) ---

// 合約部署時只會執行一次
constructor() {
// 將部署此合約的人設定為 owner
owner = msg.sender;
}


// --- 功能函式 (Functions) ---

/**
* @dev 發行新的代幣,只有 owner 可以執行此操作。
* @param _to 接收代幣的地址。
* @param _amount 要發行的代幣數量。
*/
function issue(address _to, uint256 _amount) public {
// 檢查呼叫此函式的人是不是 owner
require(msg.sender == owner, "Only the owner can issue new tokens.");

// 增加總供應量
totalSupply += _amount;
// 增加接收者地址的餘額
balances[_to] += _amount;

// 觸發 Transfer 事件,因為發行代幣也算是一種從「無」到「接收者」的轉移
// address(0) 通常被用來代表「零地址」,象徵代幣的來源是創建出來的
emit Transfer(address(0), _to, _amount);
}

/**
* @dev 從自己的帳戶轉移 TOKEN 給另一個人。
* @param _to 接收者的地址。
* @param _amount 要轉移的數量。
*/
function transfer(address _to, uint256 _amount) public {
// 檢查自己的餘額是否足夠
require(balances[msg.sender] >= _amount, "Insufficient balance to transfer.");

// 減少自己的餘額
balances[msg.sender] -= _amount;
// 增加接收者的餘額
balances[_to] += _amount;

// 觸發 Transfer 事件
emit Transfer(msg.sender, _to, _amount);
}

/**
* @dev 銷毀自己帳戶中的 TOKEN 。
* 銷毀後 TOKEN 會永久消失。
* @param _amount 要銷毀的數量。
*/
function burn(uint256 _amount) public {
// 檢查自己的餘額是否足夠銷毀
require(balances[msg.sender] >= _amount, "Insufficient balance to burn.");

// 減少總供應量
totalSupply -= _amount;
// 減少自己的餘額
balances[msg.sender] -= _amount;

// 觸發 Burn 事件
emit Burn(msg.sender, _amount);
}
}