在 Solidity 中,代幣發行 (Token Issuance) 指的是創建新代幣並增加總供應量的過程。這是一個非常基礎且重要的概念,因為它直接決定了代幣的經濟模型。
要用 Solidity 發行代幣,你通常需要兩個步驟:
- 定義代幣標準:使用公認的代幣標準,其中 ERC-20 是最常用的可替換代幣標準。OpenZeppelin 的函式庫是業界標準,因為它提供了經過嚴格測試的、安全的合約。
- 實施發行機制:你需要編寫一個函數來呼叫底層的鑄幣函數 (
_mint
)。你添加的邏輯將決定誰可以發行新代幣以及在什麼條件下發行。
以下用Sepolia 測試網上模擬 USDT做範例。
步驟一:編寫代幣合約
可以使用一個基礎的 ERC-20 合約範本。這是最簡單、最安全的做法。Solidity代碼如下
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract USDTR is ERC20, Ownable {
constructor() ERC20("Tether USD", "rUSDT") Ownable(msg.sender) {
_mint(msg.sender, 1000000 * 10 ** 18);
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}
- 程式碼說明:
- 這段程式碼繼承了 OpenZeppelin 提供的安全 ERC-20 標準。
constructor
:合約部署時,會自動鑄造 1,000,000 個代幣到部署者的錢包。代幣符號是mUSDT
(代表 Mock USDT),小數點位數設定為 18,這與真實的 USDT 一致。mint
:這個函數只允許合約的部署者呼叫,可以自由地為任何地址鑄造代幣。
步驟二:部署合約到 Sepolia 測試網
你可以使用 Remix IDE 來部署這個合約。
- 打開 Remix。
- 在左側的文件瀏覽器中,創建一個新檔案,例如
MockUSDT.sol
。將上面的程式碼複製貼上到這個檔案中。 - 在左側導航欄,點擊編譯,選擇 Solidity 版本為
0.8.20
或更高,然後點擊「CompileMockUSDT.sol
」。 - 在左側導航欄,點擊部署和運行交易圖標。
- 在「Environment」下拉選單中,選擇「Injected Provider – MetaMask」。這會讓你連接到 MetaMask 錢包。
- 確保你的 MetaMask 已經切換到 Sepolia 測試網。
- 在「Contract」下拉選單中,選擇「
MockUSDT
」。 - 點擊「Deploy」。你的 MetaMask 會彈出一個視窗,讓你確認交易。確認後,合約就會被部署到 Sepolia。
部署完成後,你可以在 Remix 的「Deployed Contracts」區域或 Sepolia Etherscan 上看到你部署的 MockUSDT
合約地址。這個地址就是你自己的測試用 USDT。
假設地址為 0xbd7ba6764f2b0a5cf4e3e1f74a0e925e4dd05e4b,可以在sepolia瀏覽器在token區塊看到相關記錄 https://sepolia.etherscan.io/token/0xbd7ba6764f2b0a5cf4e3e1f74a0e925e4dd05e4b
步驟三:在 MetaMask 中添加代幣
就像之前所說,你需要手動將這個新代幣添加到 MetaMask 中。
- 複製你剛剛部署的
MockUSDT
合約地址。例如上一步的 0xbd7ba6764f2b0a5cf4e3e1f74a0e925e4dd05e4b - 打開 MetaMask,切換到 Sepolia 網路。
- 在資產列表底部,點擊「Import tokens」。
- 將合約地址貼到「Token Contract Address」欄位。MetaMask 會自動識別
rUSDT
和 18 位小數點。 - 點擊「Import」。
完成這些步驟後,你將在錢包中看到 1,000,000 個 rUSDT
代幣。這就是你自己的測試 USDT
步驟四:設定測試用的收款帳號
收款帳號唯一需要做的,是在他們的 MetaMask 裡手動添加 rUSDT 這個代幣。就像你當初在錢包裡添加這個代幣一樣,他們需要輸入你部署的 rUSDT 合約地址。這樣,他們才能在錢包介面裡看到你轉給他們的代幣。
如果他們沒有添加,你轉給他們的 rUSDT 仍然會安全地存在他們的錢包裡,只是他們看不到餘額,就像銀行帳戶裡有一筆錢,但你沒有開啟顯示這筆錢的頁面一樣。
接著就可以開始測試轉帳,例如在Metamask轉帳1000到收款帳號
- 主帳號:少了1000 rUSDT
- 收款帳號:多了1000 rUSDT
- 可查看交易記錄如下https://sepolia.etherscan.io/tx/0xd07d472921b25e1416662351291c40a9f8dead7dd0ab735edf3206be32d0d905