當前位置:
首頁 > 知識 > 如何在 20 分鐘內發布一個正式的 ERC20 通證

如何在 20 分鐘內發布一個正式的 ERC20 通證

如何在 20 分鐘內發布一個正式的 ERC20 通證


編譯自: http://www.masonforest.com/blockchain/ethereum/2017/11/13/how-to-deploy-an-erc20-token-in-20-minutes.html

作者: Mason

譯者: Xingyu.Wang

這段時間以來,以太坊通證很流行。這些通證可以用來代表現實世界的各種價值單位: 黃金 、 謊言 、 貓咪 甚至是類似 公司股票 一樣的東西。迄今為止,人們已經募集了 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 中得到我們的私鑰:

  1. 點擊你的 Chrome 窗口右上角的狐狸圖標。
  2. 點擊 「Account 1」 右側的省略號。
  3. 點擊 「Export Private Key」。
  4. 輸入你的密碼。
  5. 點擊該文字以複製私鑰到剪貼板。

然後打開 .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:

  1. 訪問 http://etherface.io/ 。
  2. 確認你在 Metamask 中選擇了 「Ropsten」 網路。
  3. 點擊 「Tokens」。
  4. 點擊右上角的加號按鈕。
  5. 輸入上面的合約地址。

如果你有朋友想要一些漢堡幣,你現在就可以發送給他們了。如果沒有,你也可以在你的兩個賬號間測試轉賬:

  1. 在 Metamask 中點擊 「切換賬號」按鈕(在右上角),並改變你的賬號為 「Account 2」。
  2. 點擊 「Account 2」 右邊的省略號,然後選擇 「Copy Address to clipboard」。
  3. 切換回 「Account 1」,這很重要!否則交易會失敗。
  4. 在 Etherface 中你的餘額下點擊 「Send」。
  5. 黏貼 「Account 2」 的地址。
  6. 輸入你要發送的數量。
  7. Metamask 會彈出確認窗口,點擊 「Submit」。
  8. 等大約 15-30 秒。
  9. 你的 「Account 1」 的餘額應該會減少,「Account 2」 現在會有了一些漢堡幣!

最後,讓我們來部署到主網(LCTT 譯註:這會花費你真實的 ETH,你可以通過查看前面部署到 Ropsten 的合約信息中了解花費了多少 gas,以相應估計實際要花費多少 ETH):


$ truffle deploy --network mainnet

你可以如前面一樣加你的通證到 Etherface ,並發送你新打造的通證給你的朋友們了!


點擊「了解更多」可訪問文內鏈接

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux技術 的精彩文章:

為什麼 Python 開發人員應該使用 Pipenv
3 個 Python 命令行工具

TAG:Linux技術 |