簡介專案
這是一個簡單版本的虛擬貨幣
功能:
- 只有作者 (owner) 才能發行新幣,其他人都不行
- 任何都可以銷毀自己錢包的虛擬貨幣
- 發行者可以把自己的虛擬貨幣轉給別人
完整程式碼
透過 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); } }
|