以太坊ERC20標準代幣(token)發(fā)行實戰(zhàn)

前言

這是2022年寫的文章,用ERC777標準實現(xiàn)的,后來官方聲明ERC777難用且不安全被棄用了:https://github.com/ethereum/ethereum-org-website/pull/7340。就連最新的openzeppelin也刪除ERC777標準的合約,所以本文改為ERC20標準來實現(xiàn)https://eips.ethereum.org/EIPS/eip-20,但是文件名明還是保持不變。

一、前期準備

發(fā)布智能合約(開發(fā)的程序)是需要交易費的,所以我們一般在測試鏈進行。以太坊升級到2.0后,有些測試網(wǎng)絡(luò)就不能使用了,goerli、sepolia這兩個測試網(wǎng)可以用。當然你也可以去Infura上(https://infura.io/)注冊一個賬號,這樣就可以在網(wǎng)站提供的多種網(wǎng)絡(luò)上測試。

我個人推薦sepolia上測試,因為https://etherscan.io/區(qū)塊鏈瀏覽器(可查詢主鏈和測試區(qū)塊鏈上所有交易、賬戶余額,代幣等)國內(nèi)不能直接訪問。但https://sepolia.otterscan.io/ 這個網(wǎng)站國內(nèi)直接可以訪問,查詢sepolia測試鏈上的信息,更方便;相當于前者的簡化版。

二、開發(fā)環(huán)境搭建

2.1 vscode及Truffle 插件安裝

vscode對前端開發(fā)人員來說一定不陌生,尤其是Vue3開發(fā)使用vscode很方便。下載地址:https://code.visualstudio.com/ ,安裝過程就不介紹了。

安裝好vscode之后,點擊頂部菜單“查看”-“擴展”,在左上角文本框中輸入“truffle”并回車,點擊truffle for vscode插件,然后再點擊“安裝”按鈕即可。我已經(jīng)安裝了,所以顯示的是“卸載”按鈕。

Truffle 插件安裝

當然你也可以用官方的remix在線開發(fā)工具:https://remix.ethereum.org/,我用起來感覺不是很方便。

2.2 安裝MetaMask錢包

因為發(fā)布智能合約(代幣程序)需要交易費的,所以就需要用到錢包和測試幣。MetaMask輕錢包就很適合,它以瀏覽器插件的形式運行,主流瀏覽器都支持,看你喜歡下載哪一個https://metamask.io/download/ ,我用的是chrome插件。具體安裝過程不介紹了,網(wǎng)上很多教程。如果第一次創(chuàng)建錢包賬戶的話,會生成12個助記單詞,你要把這些記下來(順序不能錯)并妥善保管,后面要用到。助記詞或私鑰就相當于你的銀行卡密碼,一旦泄露別人就能轉(zhuǎn)走你的虛擬資產(chǎn),如果只有測試幣那倒沒關(guān)系。

Metamask打開測試網(wǎng)絡(luò)

點擊MetaMask錢包右上角的圖標(見上圖),在彈出菜單中點擊“設(shè)置”,再點擊“高級”,然后把“顯示測試網(wǎng)絡(luò)”這個選項打工,默認是關(guān)閉的。

然后回到錢包主頁(如下圖),點擊 1的位置就可以切換到測試網(wǎng)絡(luò)了。點擊紅框內(nèi)的地址,將你的錢包地址復(fù)制到剪貼板,然后去弄一些測試幣回來。


2.3 獲取sepolia鏈測試幣

直接點擊上圖中的“購買”按鈕,在彈框中點擊“購買測試幣”,在彈出的頁面中(如下圖),1的位置輸入你的錢包地址,點擊 2處的復(fù)選框進行驗證(防止機器人),驗證通過后點擊3處的的綠色按鈕,等待一會兒就能得到0.5個測試幣。


也可以去這個頁面獲取一下(https://sepolia-faucet.pk910.de/ ),這個用你的CPU模擬挖礦,需要時間久一點,最多能獲取2個測試幣,基本夠用了。獲取成功后,在錢包中就能看到你的余額發(fā)生變化了。

2.4 nodejs和npm安裝

前端的類庫一般是用npm工具來管理,就像后端的maven一樣。
http://nodejs.cn/download/ 這里下載一個安裝,安裝過程這里不介紹了。安裝后,在命令行或終端中輸入 npm -v 命令查看到版本號即為安裝成功。

三、開發(fā)實戰(zhàn)

想必你一定急于開發(fā)了,其實有開源的代碼,繼承修改一下就好了,不需要寫多少代碼。關(guān)于Solidity的學習,可以看我的上一篇文章:http://www.itdecent.cn/p/1e688582ef44

3.1 新建項目

先新建一個空的目錄作為項目的根目錄,打開vscode開發(fā)工具,然后點擊菜單“查看”-“命令面板”,在輸入框中輸入“truffle”,點擊“Truffle: New Solidity Project” 命令,再點擊“Create empty project”創(chuàng)建一個空的項目,會彈出對話框選擇一個目錄來存儲代碼。


vscode中新建Truffle項目

3.2 安裝類庫

項目創(chuàng)建完成之后,再點擊菜單“查看”-“終端”,打開終端面板(如下圖1)。當然你也可以在windows運行cmd“命令提示符”或“終端”程序,切換到項目目錄下,執(zhí)行下面的命令:

# 設(shè)置國內(nèi)鏡像,提高下載速度
npm config set registry https://registry.npm.taobao.org 
npm install -g truffle
npm i -g  ganache
npm i @openzeppelin/contracts
npm i @truffle/hdwallet-provider

第一個npm config命令是配置下載鏡像,提高下載速度,如果已經(jīng)執(zhí)行過可以忽略。

@openzeppelin/contracts是開源的solidity代幣或NFT代碼庫,在node_modules\@openzeppelin\contracts\token\ERC20 目錄下,可以看到等下要用到的代碼。

@truffle/hdwallet-provider是一個錢包工具類,類似前面安裝的MetaMask錢包。

點擊4處資源管理器圖標,可以看到代碼的目錄結(jié)構(gòu)。


3.3 代碼編寫

3.3.1 contacts/Elwin777.sol

右擊contacts目錄,新建文件,輸入:Elwin777.sol并回車,你也可以用別的文件名。輸入文件內(nèi)容如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Elwin777 is ERC20 {
    constructor(uint256 initialSupply) ERC20("Elwin777", "EZ7") {
        _mint(msg.sender, initialSupply * (10 ** 18));
    }
}

只有幾行代碼,之前學solidity語言用了很久,現(xiàn)在覺得有點浪費時間了。合約名稱也是Elwin777和文件名保持一致。導(dǎo)入了openzeppelin/contracts類庫中的ERC20.sol文件,并繼承了這個合約。

合約只有一個構(gòu)造函數(shù),initialSupply參數(shù)是初始發(fā)行代幣數(shù)量;其中ERC20("Elwin777", "EZ7")這一行調(diào)用父合約中的構(gòu)造函數(shù),第一個參數(shù)為代幣名稱,第二參數(shù)是代幣的符號(縮寫),這兩個參數(shù)很重要,自己修改成你喜歡的名稱。

3.3.2 migrations/777_deploy.js

然后在migrations目錄下新建777_deploy.js文件,這是一個部署js文件,文件名中下劃線前面一定要為數(shù)字才能在部署時被執(zhí)行,如果migrations目錄下有多個文件,按前面數(shù)字從小到大的順序依次執(zhí)行。文件內(nèi)容如下:

const myToken =  artifacts.require("./contracts/Elwin777.sol");
module.exports = async function (deployer, network, accounts) {
  await deployer.deploy(myToken, 1000000, []);
};

代碼也很少,第一行是導(dǎo)入Elwin777.sol合約文件,deployer.deploy(myToken, 1000000);為部署導(dǎo)入的文件。后面兩個參數(shù)即為Elwin777.sol文件的構(gòu)造函數(shù)參數(shù),這里的初始發(fā)行量設(shè)為100萬。

3.3.3 truffle-config.js

修改項目根目錄下的truffle-config.js文件,文件內(nèi)容如下:

var HDWalletProvider = require("@truffle/hdwallet-provider");
var MnemonicPhrase = "hello cat shed ……";  //填入你的MetaMask錢包助記詞
var ProviderUrl ="https://rpc.sepolia.org";   //測試網(wǎng)絡(luò)RPC接口地址,也可以填入infura項目地址
var AddressIndex=0;  //錢包中的第幾個地址,從0開始;如果錢包中只有一個地址,可以去掉這個參數(shù)

module.exports = {
  networks: {
    sepoliaTestNet:{
      network_id:"*",
      provider: function() {
        return new HDWalletProvider(MnemonicPhrase, ProviderUrl, AddressIndex);//使用助記詞
      },
    network_id: "*",  // 匹配任意網(wǎng)絡(luò)
    gas: 3012388,
    gasPrice: 2000000000 //根據(jù)網(wǎng)絡(luò)行情設(shè)定燃料價格
    }
  },
  mocha: {},
  compilers: {
    solc: {
      version: "0.8.17"
    }
  }
};

這個文件是項目的一些配置信息,MnemonicPhrase為MetaMask錢包助記詞(填寫你自己的,12個單詞用半角空格分隔),錢包中的地址為合約的發(fā)布者地址,所以這個地址要保證有余額;ProviderUrl 為網(wǎng)絡(luò)接口地址;gas為最大使用燃氣量,如果不夠會報錯,如果超出會退回;gasPrice為燃氣價格,每個網(wǎng)絡(luò)不同的,可以使用postman等工具查詢各網(wǎng)絡(luò)提供的JSON-RPC接口獲取,如下圖:


我這里也是用了一個chrome的插件來查詢的,返回的結(jié)果是十六制的??梢园俣纫幌略诰€轉(zhuǎn)換網(wǎng)站或科學計算轉(zhuǎn)換一下。你需要把燃料價格設(shè)得比當前價格高一點才能優(yōu)先被執(zhí)行,如果設(shè)置的低于當前價格,部署時會報錯。

3.4 部署合約

保存上面的代碼后,在資源管理器中鼠標右擊合約文件(如下圖),在彈出菜單的最下面有Build ContractsDeploy Contracts兩個菜單,Build Contracts為執(zhí)行編譯合約命令,Deploy Contracts為部署合約命令。因為執(zhí)行部署命令時會先編譯,所以可以直接點擊Deploy Contracts菜單。

編譯或部署以太坊智能合約

然后在彈框中選擇剛才在truffle-config.js配置文件中配置的sepoliaTestNet網(wǎng)絡(luò)開始部署,如下圖:



有時右下角會提示再次提示安裝@truffle/hdwallet-provider錢包,點擊“安裝”即可。如果部署不成功,再次重復(fù)上面的操作來部署即可。

出現(xiàn)類似下面的結(jié)果即為部署成功,如果出現(xiàn)其他錯誤提示,按提示內(nèi)容來處理。

777_deploy.js
=============
[Truffle: Execute command] 
   Deploying 'Elwin777'
   --------------------
[Truffle: Execute command]    > transaction hash:    0x0c29f0d31160c280fe063f5ffdf6242f6a487149058b201dc422fc3a669bb3df
[Truffle: Execute command] - Blocks: 0            Seconds: 0
[Truffle: Execute command] - Blocks: 1            Seconds: 5
[Truffle: Execute command] - Blocks: 1            Seconds: 9
[Truffle: Execute command] - Blocks: 2            Seconds: 13
[Truffle: Execute command]    > Blocks: 2            Seconds: 13
   > contract address:    0xD1687a78902d2894647f393f12ceA83A89499F0e
   > block number:        2354753
   > block timestamp:     1669363932
   > account:             0x310cEC42257cdD929D3fe1b72CC6f1e0B333D3CD
   > balance:             2.112295162499165901
   > gas used:            2629372 (0x281efc)
   > gas price:           2 gwei
   > value sent:          0 ETH
   > total cost:          0.005258744 ETH
[Truffle: Execute command]    > Saving artifacts
   -------------------------------------
   > Total cost:         0.005258744 ETH
Summary
=======
> Total deployments:   1
> Final cost:          0.005258744 ETH
[Truffle: Execute command] 
[Truffle: Execute command] Finished running command
[Truffle for VSCode] Deploy succeeded

0xD1687a78902d2894647f393f12ceA83A89499F0e 為成功部署的合約地址,可以去https://sepolia.otterscan.io/查詢一下。0x310cEC42257cdD929D3fe1b72CC6f1e0B333D3CD為錢包賬戶地址,你會發(fā)現(xiàn)余額減少了,上面用了2629372個燃氣,花費0.005258744個測試幣。

發(fā)行一個ERC777以太坊代幣這樣就完成了,其實也不難的。同理,通過openzeppelin類庫發(fā)一個NFT數(shù)字藏品也不難的,自己可以嘗試下。

四、錢包中查看和管理代幣

打開MetaMask錢包,點擊最下面的“添加資產(chǎn)”鏈接,彈出如下界面:



輸入代幣合約地址,再點擊下一個輸入框,發(fā)現(xiàn)自動識別了代幣符號和小數(shù)(小數(shù)位在ERC777標準中是18,不建議修改,即一個幣可以拆分為更小的單位來交易,最多精確到小數(shù)點后18位),然后點擊“添加自定義代幣”按鈕,然后再次確認點擊“添加代幣”按鈕,就可以看到剛發(fā)行的代幣了,如下圖。



然后你還可以點擊“發(fā)送”按鈕,把代幣發(fā)送給其他錢包地址。

五、代幣驗證

我們部署的合約,其實是部署了編譯后的字節(jié)碼;為了讓你的合約更可信,可以上傳合約源代碼到etherscan.io網(wǎng)驗證一下,這樣顯得你的代幣合約更可信。
驗證成功之后,etherscan.io網(wǎng)上查看合約地址時,可以看到合約的頁簽后面是有綠色的圖標,點擊可以看到合約的源碼。


智能合約代碼驗證

注意:etherscan.io這個網(wǎng)站目前國內(nèi)是打不開的,所以我就不多介紹了??梢詤⒖歼@篇文章:https://learnblockchain.cn/article/1314

感謝閱讀,原創(chuàng)內(nèi)容,轉(zhuǎn)載請注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容