摘要:第二處箭頭表示新建一個賬戶合約,作為以太坊網絡上的一個合法用戶。合約以太坊官方網站上有一份標準的合約供學習者參考,而且也有很詳細的教程教大家如何去部署自己的。
注:一般大家都普遍喜歡把 Token 叫成 代幣,但是這樣講很不準確,如果非要叫成中文,我更認同 通證 這種理解。但為了保持原汁原味,不必非得翻譯過來叫,所以本文統一保持英文的形式。
一般 Token 制作的門檻其實沒有多高,所以大家完全都有能力可以去制作出自己命名的 Token。
不過你也別指望啥也不學就能做出一些擁有額外邏輯的 Token,比如眾籌合約等,所以想要做的與眾不同,那么就需要花些成本。
下面就直奔主題,我們不需要了解如何編寫智能合約,因為以太坊提供的 ERC20 協議已經足夠傻瓜式了,做一個簡單的 Token 官方就有一個標準的智能合約代碼作為示例,那么我們只需要知道制作的流程就行了。
啰嗦一句,其實學習其他的技術知識也是如此,我們不要急于追求很內在的東西,我們需要 正反饋 式學習法,先做出一些簡單的 Demo,逐步在建立自信心和激發熱情的同時不斷深入學習。安裝 MetaMask
我們首先需要安裝一個瀏覽器的插件 MetaMask,該插件作者非常 nice,主流的三大瀏覽器(Google、FireFox、Opera)上都可以安裝這款實用的插件。安裝這款插件的過程就不贅述了,現在假定我們已經裝好了,點開該插件,經過兩次 Accept 同意條款的操作后,進入創建賬戶的頁面。
注意圖上的三處箭頭
第一處箭頭表示我們目前是處于 Ropsten Test Net 測試網絡,與平常大家在用的以太坊主網絡的主要區別就僅僅是大家只承認主網絡上的以太幣價值,而該測試網絡主要用來進行開發測試。
第二處箭頭表示新建一個賬戶合約,作為以太坊網絡上的一個合法用戶。
第三處箭頭表示導入一個賬戶合約,假如你在該網絡上有賬戶合約的話。
新建合約賬戶在創建賬戶頁面上輸入自己的大于八位字符的密碼后,進入 助記詞 頁面,這些助記詞是唯一能幫助你保存自己賬戶合約的密鑰,妥善保管。
不要慌,不是讓你真的花錢去買,只需要在 MetaMask 提供的網站上點幾下按鈕就能獲取到以太幣(畢竟這些測試網絡上的以太幣沒有實際價值)。
保存完助記詞后我們就會進入到賬戶主頁面,
我們可以看到我們的賬戶上余額是零,點擊箭頭1的購買按鈕,進入確認頁面
再點擊上圖中的箭頭1按鈕,進入購買頁面,網址是 Test Ether Faucet
點擊箭頭1按鈕,既可以獲取到一個以太幣(按一次獲取一個),我獲取了6個以太幣,箭頭2處即是轉賬交易記錄。
OK,我們先暫時放一放 MetaMask,接下來讓我們去玩玩 Remix!
認識 Remix IDERemix 是一個基于瀏覽器的 Solidity IDE,基本的智能合約代碼的開發調試在這上面進行是相當舒服的。Remix - Solidity IDE
第一處箭頭是項目目錄欄,可以在這里創建文件目錄
第二處箭頭是代碼欄,我們的合約代碼就在這里編寫
第三處箭頭是日志欄,部署調試的日志輸出都在這里顯示
第四處箭頭是調試欄,對合約的部署、調試等操作都在這里進行
需要熟悉這個工具嗎?當然,而且越熟悉越好,但不是現在,別忘了我們現在的目標是制作自己的 Token。
Token 合約以太坊官方網站上有一份標準的 Token 合約供學習者參考,而且也有很詳細的教程教大家如何去部署自己的 Token。Create a cryptocurrency contract in Ethereum
本文與官方不同的是我們使用 輕錢包 MetaMask 和在線開發環境 Remix 進行開發調試部署,官方的以太坊錢包對于初學者來說有個挺苦惱的地方,同步主網絡或者測試網絡的全節點數據很慢,而且占用磁盤空間較大。初次體驗盡量還是選擇輕松的方式,不要給自己留下壞心情 :)
我們將官方的 Token 合約代碼拷貝到 Remix 的代碼欄中,合約代碼這里也貼一下:
pragma solidity ^0.4.16; interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; } contract TokenERC20 { // Public variables of the token string public name; string public symbol; uint8 public decimals = 18; // 18 decimals is the strongly suggested default, avoid changing it uint256 public totalSupply; // This creates an array with all balances mapping (address => uint256) public balanceOf; mapping (address => mapping (address => uint256)) public allowance; // This generates a public event on the blockchain that will notify clients event Transfer(address indexed from, address indexed to, uint256 value); // This notifies clients about the amount burnt event Burn(address indexed from, uint256 value); /** * Constructor function * * Initializes contract with initial supply tokens to the creator of the contract */ function TokenERC20( uint256 initialSupply, string tokenName, string tokenSymbol ) public { totalSupply = initialSupply * 10 ** uint256(decimals); // Update total supply with the decimal amount balanceOf[msg.sender] = totalSupply; // Give the creator all initial tokens name = tokenName; // Set the name for display purposes symbol = tokenSymbol; // Set the symbol for display purposes } /** * Internal transfer, only can be called by this contract */ function _transfer(address _from, address _to, uint _value) internal { // Prevent transfer to 0x0 address. Use burn() instead require(_to != 0x0); // Check if the sender has enough require(balanceOf[_from] >= _value); // Check for overflows require(balanceOf[_to] + _value > balanceOf[_to]); // Save this for an assertion in the future uint previousBalances = balanceOf[_from] + balanceOf[_to]; // Subtract from the sender balanceOf[_from] -= _value; // Add the same to the recipient balanceOf[_to] += _value; Transfer(_from, _to, _value); // Asserts are used to use static analysis to find bugs in your code. They should never fail assert(balanceOf[_from] + balanceOf[_to] == previousBalances); } /** * Transfer tokens * * Send `_value` tokens to `_to` from your account * * @param _to The address of the recipient * @param _value the amount to send */ function transfer(address _to, uint256 _value) public { _transfer(msg.sender, _to, _value); } /** * Transfer tokens from other address * * Send `_value` tokens to `_to` on behalf of `_from` * * @param _from The address of the sender * @param _to The address of the recipient * @param _value the amount to send */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require(_value <= allowance[_from][msg.sender]); // Check allowance allowance[_from][msg.sender] -= _value; _transfer(_from, _to, _value); return true; } /** * Set allowance for other address * * Allows `_spender` to spend no more than `_value` tokens on your behalf * * @param _spender The address authorized to spend * @param _value the max amount they can spend */ function approve(address _spender, uint256 _value) public returns (bool success) { allowance[msg.sender][_spender] = _value; return true; } /** * Set allowance for other address and notify * * Allows `_spender` to spend no more than `_value` tokens on your behalf, and then ping the contract about it * * @param _spender The address authorized to spend * @param _value the max amount they can spend * @param _extraData some extra information to send to the approved contract */ function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) { tokenRecipient spender = tokenRecipient(_spender); if (approve(_spender, _value)) { spender.receiveApproval(msg.sender, _value, this, _extraData); return true; } } /** * Destroy tokens * * Remove `_value` tokens from the system irreversibly * * @param _value the amount of money to burn */ function burn(uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value); // Check if the sender has enough balanceOf[msg.sender] -= _value; // Subtract from the sender totalSupply -= _value; // Updates totalSupply Burn(msg.sender, _value); return true; } /** * Destroy tokens from other account * * Remove `_value` tokens from the system irreversibly on behalf of `_from`. * * @param _from the address of the sender * @param _value the amount of money to burn */ function burnFrom(address _from, uint256 _value) public returns (bool success) { require(balanceOf[_from] >= _value); // Check if the targeted balance is enough require(_value <= allowance[_from][msg.sender]); // Check allowance balanceOf[_from] -= _value; // Subtract from the targeted balance allowance[_from][msg.sender] -= _value; // Subtract from the sender"s allowance totalSupply -= _value; // Update totalSupply Burn(_from, _value); return true; } }部署合約
接下來我們先選擇好我們的編譯器的版本,對應合約代碼首行的版本號 pragma solidity ^0.4.16
點擊箭頭1的標簽頁,進入設置界面,然后點擊箭頭2選擇相應的編譯器版本,這里即選擇 0.4.16。
然后點擊編譯標簽(Compile),會看到已經編譯成功
然后點擊運行標簽(Run),進行部署操作
第一處箭頭選擇部署環境,這邊會自動檢測到我們的 MetaMask 當前所處的網絡(Ropsten Test Net)。
第二處箭頭輸入我們 Token 的一些基本信息
第一個參數表示 Token 總發行量,我這里隨便填了一千萬個
第二個參數表示 Token 名稱
第三個參數表示 Token 符號,一般在流通過程中均以該符號作為 Token 的標識
第三處箭頭點擊即創建部署交易單,開始最終的部署
這里唯一可以改的是 Gas Limit 和 Gas Price,一般來講這兩個數據會自動根據當前合約的復雜度和市場平均水準生成。所以一般不需要去改這兩個值,如果是囊中羞澀,改低一點也是可以的,但是可能會出現 Gas 被消耗完的情況(Gas 一旦被消耗完而合約仍未部署到網絡上,那么所有操作都會進行回滾,除了你支付的礦工費)。
點擊發布按鈕(SUBMIT),靜靜等待發布成功吧!
此時打開 MetaMask 頁面
上圖為發布中狀態,下圖為發布結束的狀態,此時會發現我們的賬戶余額減少了一些,因為被用于支付發布合約的礦工費了。
到這里還不清楚是否成功發布了,點擊交易單進入交易詳情頁面,當你看到箭頭1處的 Success 時就表示我們的 Token 發布成功啦!
點擊箭頭2處的合約地址鏈接,進入合約詳情頁
點擊箭頭處的 Token 地址鏈接,進入 Token 詳情頁
至此我們的 Token 就做完啦!
錢包中顯示 Token我們以 MetaMask 為例演示一下,其他錢包比如 ImToken 同樣的只需要將 Token 地址復制過去就能看到了。
先切換到 Token 標簽頁
點擊添加 Token,輸入剛才的 Token 合約地址
點擊添加按鈕,就能在 MetaMask 上看到我們自己的 Token 了。
小結在制作 Token 的整個過程中,并沒有難點,只是大多數人不清楚流程,當自己實操一遍后立馬就能上手。后面我們會去玩一些復雜一點的智能合約,但同樣的,需要一些基本的 Solidity 編程語言的知識以及區塊鏈相關的知識。Solidity 這門以太坊的標準編程語言之后的文章也會詳細講解,大家盡請期待~
歡迎關注公眾號:『比特扣』,與我一起探索區塊鏈的世界。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/24065.html
摘要:寫在前面最近在學習,遇到有些頁面請求數據需要用戶登錄權限服務器響應不符預期的問題,但是總不能每個頁面都做單獨處理吧,于是想到提供了攔截器這個好東西,再于是就出現了本文。 1.寫在前面 最近在學習Vue2,遇到有些頁面請求數據需要用戶登錄權限、服務器響應不符預期的問題,但是總不能每個頁面都做單獨處理吧,于是想到axios提供了攔截器這個好東西,再于是就出現了本文。 2.具體需求 用戶鑒...
摘要:前期準備原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。框架,是我最喜歡的框架了,沒有之一。 前期準備 原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。這不,最近又開始折騰APP了,話說現在開...
摘要:前期準備原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。框架,是我最喜歡的框架了,沒有之一。 前期準備 原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。這不,最近又開始折騰APP了,話說現在開...
閱讀 3153·2021-09-28 09:36
閱讀 3692·2021-09-08 09:45
閱讀 1807·2021-09-01 10:43
閱讀 3481·2019-08-30 12:44
閱讀 3350·2019-08-29 17:25
閱讀 1376·2019-08-29 11:03
閱讀 1997·2019-08-26 13:36
閱讀 698·2019-08-23 18:24