如何在 20 分鐘內釋出一個正式的 ERC20 通證
這段時間以來,以太坊通證很流行。這些通證可以用來代表現實世界的各種價值單位:黃金、 謊言、 貓咪 甚至是類似 公司股票 一樣的東西。迄今為止,人們已經募集了 20 億美元的通證。那些通證是以 ERC20 為標準的,人們可以輕鬆地在錢包之間進行交易。在這篇教程中,我準備指導你部署你自己的 ERC20 通證到真實的以太坊網路上去。
事先準備:
- 一個文字編輯器(Atom 不錯,不過我喜歡 Vim)
- 對命令列和終端(模擬器)有起碼的瞭解。Mac 內建的應用“終端”就很好,不過我喜歡 iTerm2
- Chrome 瀏覽器
- Node.js 8(或更高版本)
- 你的通證的名字。我的準備叫做 HamburgerCoin(漢堡幣)
你需要做的第一件事是安裝 MetaMask。訪問 Metamask 網站 並點選“Get Chrome Extention”。
Metamask 可以讓你透過 Chrome 在以太坊上進行交易。它依靠執行著公開以太坊節點的 Infura ,所以你不用自己執行以太坊全節點。如果你頗具探索精神,你也可以下載和安裝 Mist 以替代它。執行 Mist 就可以讓你執行你自己的以太坊節點。執行自己的節點你就需要將你的計算機與該網路進行同步,這需要不短的時間。從技術上講這更安全,因為這樣你不必信任 Infura 來處理你的交易。Infura 可以忽略你的交易而干預你,但是它並不能偷走你的錢。因為安裝 Metamask 比 Mist 更快也更簡單,所以我假設你在下面的教程中使用 Metamask。
接著你需要安裝 truffle:
$ npm install -g truffle
現在為你自己的新通證建立一個新目錄,cd 到其中並初始化你的 truffle 專案。
$ mkdir hamburger-coin
$ cd hamburger-coin
$ truffle init
很好,你的 truffle 專案已經設定好了!
現在來建立我們的通證。首先我們需要安裝 OpenZepplin 框架。OpenZepplin 框架包括了大量預先構建好的合約,包括我們要部署的 ERC20 通證合約。
(只需要按下回車接受預設值即可)
$ npm init
package name: (hamburger-coin)
version: (1.0.0)
description:
entry point: (truffle.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/masonf/src/hamburger-coin/package.json:
{
"name": "hamburger-coin",
"version": "1.0.0",
"description": "",
"main": "truffle.js",
"directories": {
"test": "test"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this ok? (yes) yes
$ npm install zeppelin-solidity
現在我們可以建立我們的通證合約了。建立一個 contracts/HamburgerCoin.sol
檔案並加入如下內容:
pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/StandardToken.sol";
contract HamburgerCoin is StandardToken {
string public name = "HamburgerCoin";
string public symbol = "HBC";
uint public decimals = 2;
uint public INITIAL_SUPPLY = 10000 * (10 ** decimals);
function HamburgerCoin() public {
totalSupply_ = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
}
}
(LCTT 譯註:上述合約內容中指定了合約的名稱、符號和供應量。在 ERC20 當中,通證的供應量其實是整數,上述合約中通證的實際供應量是 10000 * 100 個,出於顯示 2 位小數的需求,你在合約瀏覽器、錢包軟體中看到和操作的 1 個通證,實際上在交易中是以 100 個進行的。)
OpenZepplin 的 StandardToken
是一個標準的 ERC20 通證。如果你感興趣,你可以看看它的 原始碼 以瞭解是如何工作的。
實際上並不太複雜。該合約有一個 地址到餘額 的對映(LCTT 譯註:你可以理解為雜湊、關聯陣列),它也有一個 允許轉賬 的列表。你可以看做是支票。你可以寫張支票,但是直到它被兌付前,錢並不會被轉賬。
如果有人要轉走一些資金,你可以在合約上呼叫 approve 方法,設定你要傳送的通證數量。這就像是寫支票一樣。
然後呼叫 transferFrom 會實際進行轉賬。
我們可以從頭寫這些合約,但是最好採用經過完備的社群測試的合約。從頭寫一個 ERC20 通證那就是另外一篇文章了。
試著執行 compile
來編譯我們的合約:
$ truffle compile
Compiling ./contracts/HamburgerCoin.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/ownership/Ownable.sol...
Compiling zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/MintableToken.sol...
Compiling zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts Next you'll need to add a migration file which will tell truffle how to deploy your contract.
接下來我們需要增加一個 truffle 遷移。
建立 migrations/2_deploy_hamburgercoin.js
檔案並新增如下內容:
var HamburgerCoin = artifacts.require("./HamburgerCoin.sol");
module.exports = function(deployer) {
deployer.deploy(HamburgerCoin);
};
現在讓我們配置 truffle 以能夠使用 Infura 公共節點。如果我們要部署到公共節點,那就需要錢包的私鑰。我們可以將該私鑰包含在我們的原始碼當中,但是如果任何人可以訪問你的原始碼(和版本庫),他就能夠偷走我們所有的漢堡幣!要避免這種情況,我們會使用 dotenv node.js 模組。(LCTT 譯註:dotenv 用於儲存機密資訊的檔案 .env 是以 “.” 開頭的,預設不會進入版本庫,當然,如果有人能檢視你全部的專案檔案,你的私鑰還是會被洩露。)
讓我們安裝部署到 Infura 所需的所有模組。
npm install --save-dev dotenv truffle-wallet-provider ethereumjs-wallet
(LCTT 譯註:可能安裝過程中會有很多警告,大多應該是屬於定義了未使用的變數和方法的編譯警告,可以忽略。)
現在編輯 truffle.js
並(原樣)加入如下內容:
require('dotenv').config();
const Web3 = require("web3");
const web3 = new Web3();
const WalletProvider = require("truffle-wallet-provider");
const Wallet = require('ethereumjs-wallet');
var mainNetPrivateKey = Buffer.from(process.env["MAINNET_PRIVATE_KEY"], "hex")
var mainNetWallet = Wallet.fromPrivateKey(mainNetPrivateKey);
var mainNetProvider = new WalletProvider(mainNetWallet, "https://mainnet.infura.io/");
var ropstenPrivateKey = Buffer.from(process.env["ROPSTEN_PRIVATE_KEY"], "hex")
var ropstenWallet = Wallet.fromPrivateKey(ropstenPrivateKey);
var ropstenProvider = new WalletProvider(ropstenWallet, "https://ropsten.infura.io/");
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // Match any network id
},
ropsten: {
provider: ropstenProvider,
// You can get the current gasLimit by running
// truffle deploy --network rinkeby
// truffle(rinkeby)> web3.eth.getBlock("pending", (error, result) =>
// console.log(result.gasLimit))
gas: 4600000,
gasPrice: web3.toWei("20", "gwei"),
network_id: "3",
},
mainnet: {
provider: mainNetProvider,
gas: 4600000,
gasPrice: web3.toWei("20", "gwei"),
network_id: "1",
}
}
};
(LCTT 譯註:原文采用 new Buffer
來獲取私鑰設定,但 node.js 升級後,廢棄了 new Buffer
這種用法,執行時會發出警告,所以上面我修改為使用 Buffer.from
。)
接下來我們從 Metamask 中得到我們的私鑰:
- 點選你的 Chrome 視窗右上角的狐狸圖示。
- 點選 “Account 1” 右側的省略號。
- 點選 “Export Private Key”。
- 輸入你的密碼。
- 點選該文字以複製私鑰到剪貼簿。
然後開啟 .env
檔案,並像下面這樣貼入你的私鑰(對於 Ropsten 測試網和 Mainnet 主網,你的私鑰是一樣的):
ROPSTEN_PRIVATE_KEY="123YourPrivateKeyHere"
MAINNET_PRIVATE_KEY="123YourPrivateKeyHere"
接下來,讓我們部署到 Ropsten 以太坊測試網。
以太坊測試網是一個你可以測試合約的地方。此外還有 Kovan 和 Rinkeby 測試網。我在這個教程中選擇 Ropsten 是因為現在很容易得到 Ropsten 的測試 ETH。這些測試網都類似,你可以使用任何一個你喜歡的,但是在此教程當中我假設你在使用 Ropsten。訪問 https://faucet.metamask.io/ 以得到一些測試 ETH。從 faucet 得到一些 ETH 後,你就可以部署了。
$ truffle deploy --network ropsten
Compiling ./contracts/HamburgerCoin.sol...
Compiling ./contracts/Migrations.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts
Using network 'ropsten'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0xc2bbe6bf5a7c7c7312c43d65de4c18c51c4d620d5bf51481ea530411dcebc499
Migrations: 0xd827b6f93fcb50631edc4cf8e293159f0c056538
Saving successful migration to network...
... 0xe6f92402e6ca0b1d615a310751568219f66b9d78b80a37c6d92ca59af26cf475
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying HamburgerCoin...
... 0x02c4d47526772dc524851fc2180b338a6b037500ab298fa2f405f01abdee21c4
HamburgerCoin: 0x973b1a5c753a2d5d3924dfb66028b975e7ccca51
Saving artifacts...
在 “Saving aritfacts” 上面的這行即是你的合約的新地址。
複製並黏貼該地址到 Ropsten Etherscan 搜尋框,你就能看到你新部署的合約。
現在你可以在任何 ERC20 相容的錢包,如 Mist 、MyEtherWallet(LCTT 譯註:或 ImToken 這樣的手機應用)裡面使用你的通證了。
為了這篇教程,我構建了一個名為 Etherface 的錢包來做演示。
首先你需要新增你的通證到 Etherface:
- 訪問 http://etherface.io/ 。
- 確認你在 Metamask 中選擇了 “Ropsten” 網路。
- 點選 “Tokens”。
- 點選右上角的加號按鈕。
- 輸入上面的合約地址。
如果你有朋友想要一些漢堡幣,你現在就可以傳送給他們了。如果沒有,你也可以在你的兩個賬號間測試轉賬:
- 在 Metamask 中點選 “切換賬號”按鈕(在右上角),並改變你的賬號為 “Account 2”。
- 點選 “Account 2” 右邊的省略號,然後選擇 “Copy Address to clipboard”。
- 切換回 “Account 1”,這很重要!否則交易會失敗。
- 在 Etherface 中你的餘額下點選 “Send”。
- 黏貼 “Account 2” 的地址。
- 輸入你要傳送的數量。
- Metamask 會彈出確認視窗,點選 “Submit”。
- 等大約 15-30 秒。
- 你的 “Account 1” 的餘額應該會減少,“Account 2” 現在會有了一些漢堡幣!
最後,讓我們來部署到主網(LCTT 譯註:這會花費你真實的 ETH,你可以透過檢視前面部署到 Ropsten 的合約資訊中瞭解花費了多少 gas,以相應估計實際要花費多少 ETH):
$ truffle deploy --network mainnet
你可以如前面一樣加你的通證到 Etherface ,併傳送你新打造的通證給你的朋友們了!
相關文章
- [譯] 如何在 5 分鐘之內寫出一個不錯的 loading 介面
- 如何在 20 分鐘內給你的 K8s PaaS 上線一個新功能?K8S
- 如何在十分鐘內建立一個Chrome 外掛Chrome
- 一分鐘釋出一個屬於自己的npm包NPM
- CrowdStrike釋出2019網路安全威脅報告 黑客最快20分鐘內得逞黑客
- 如約而至,.NET 5.0 正式釋出
- 第八課 技術小白如何在45分鐘內發行通證(TOKEN)並上線交易
- 5分鐘通過一個例子理解觀察者模式和釋出訂閱模式的區別模式
- [爬蟲手記] 我是如何在3分鐘內開發完一個爬蟲的爬蟲
- 一分鐘理解 JavaScript 釋出訂閱模式JavaScript模式
- 如何在國內釋出Flutter PluginFlutterPlugin
- 自媒體一鍵釋出平臺,3分鐘釋出全平臺
- 萬物根源-一分鐘教你釋出npm包NPM
- ERC20介紹
- 看黑客如何在5分鐘內在筆記本上安裝一個韌體後門黑客筆記
- 20分鐘上手 webAssemblyWeb
- 自媒體釋出工具,3-5分鐘把內容釋出全平臺
- 博途V20正式釋出!(支援下載)
- Flutter 如何在10分鐘內快速的建立圖片編輯器Flutter
- 十分鐘通過 npm 建立一個命令列工具NPM命令列
- 一分鐘教你批次匯出申通快遞到表格
- 新一期HarmonyOS認證正式釋出,速來圍觀!
- 周杰倫專輯《最偉大的作品》先行曲MV釋出 20分鐘點選超千萬
- Westore 1.0 正式釋出 - 小程式框架一個就夠框架
- 如何在一分鐘內實現微服務系統下的架構視覺化微服務架構視覺化
- 騰訊遊戲主播認證計劃正式釋出:創造每一個直播夢遊戲
- 國內首個面向建築行業的混合雲解決方案正式釋出行業
- 花了20分鐘,給女朋友們寫了一個web版群聊程式Web
- OpenAI正式釋出第一個官方.NET版本庫的測試版OpenAI
- Spring Cloud 2021.0.0 正式釋出,第一個支援Spring Boot 2.6的版本!CloudSpring Boot
- 軟通動力參編報告正式釋出
- Laravel Wink: 一個簡潔的內容釋出平臺Laravel
- 業內首個 React Native轉微信小程式引擎 Alita 正式釋出React Native微信小程式
- 3分鐘教會你如何釋出Qt程式QT
- 20分鐘gulp快速入門
- OceanBase社群版4.0正式上線,2分鐘內可完成快速部署
- Flask一分鐘Mock一個APIFlaskMockAPI
- 1002 寫出這個數 (20 分)javaJava