成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

18年給自己做個Token吧

Ku_Andrew / 2724人閱讀

摘要:第二處箭頭表示新建一個賬戶合約,作為以太坊網(wǎng)絡(luò)上的一個合法用戶。合約以太坊官方網(wǎng)站上有一份標準的合約供學習者參考,而且也有很詳細的教程教大家如何去部署自己的。

注:一般大家都普遍喜歡把 Token 叫成 代幣,但是這樣講很不準確,如果非要叫成中文,我更認同 通證 這種理解。但為了保持原汁原味,不必非得翻譯過來叫,所以本文統(tǒng)一保持英文的形式。

一般 Token 制作的門檻其實沒有多高,所以大家完全都有能力可以去制作出自己命名的 Token。

不過你也別指望啥也不學就能做出一些擁有額外邏輯的 Token,比如眾籌合約等,所以想要做的與眾不同,那么就需要花些成本。

下面就直奔主題,我們不需要了解如何編寫智能合約,因為以太坊提供的 ERC20 協(xié)議已經(jīng)足夠傻瓜式了,做一個簡單的 Token 官方就有一個標準的智能合約代碼作為示例,那么我們只需要知道制作的流程就行了。

啰嗦一句,其實學習其他的技術(shù)知識也是如此,我們不要急于追求很內(nèi)在的東西,我們需要 正反饋 式學習法,先做出一些簡單的 Demo,逐步在建立自信心和激發(fā)熱情的同時不斷深入學習。
安裝 MetaMask

我們首先需要安裝一個瀏覽器的插件 MetaMask,該插件作者非常 nice,主流的三大瀏覽器(Google、FireFox、Opera)上都可以安裝這款實用的插件。安裝這款插件的過程就不贅述了,現(xiàn)在假定我們已經(jīng)裝好了,點開該插件,經(jīng)過兩次 Accept 同意條款的操作后,進入創(chuàng)建賬戶的頁面。

注意圖上的三處箭頭

第一處箭頭表示我們目前是處于 Ropsten Test Net 測試網(wǎng)絡(luò),與平常大家在用的以太坊主網(wǎng)絡(luò)的主要區(qū)別就僅僅是大家只承認主網(wǎng)絡(luò)上的以太幣價值,而該測試網(wǎng)絡(luò)主要用來進行開發(fā)測試。

第二處箭頭表示新建一個賬戶合約,作為以太坊網(wǎng)絡(luò)上的一個合法用戶。

第三處箭頭表示導入一個賬戶合約,假如你在該網(wǎng)絡(luò)上有賬戶合約的話。

新建合約賬戶

在創(chuàng)建賬戶頁面上輸入自己的大于八位字符的密碼后,進入 助記詞 頁面,這些助記詞是唯一能幫助你保存自己賬戶合約的密鑰,妥善保管。

購買以太幣

不要慌,不是讓你真的花錢去買,只需要在 MetaMask 提供的網(wǎng)站上點幾下按鈕就能獲取到以太幣(畢竟這些測試網(wǎng)絡(luò)上的以太幣沒有實際價值)。

保存完助記詞后我們就會進入到賬戶主頁面,

我們可以看到我們的賬戶上余額是零,點擊箭頭1的購買按鈕,進入確認頁面

再點擊上圖中的箭頭1按鈕,進入購買頁面,網(wǎng)址是 Test Ether Faucet

點擊箭頭1按鈕,既可以獲取到一個以太幣(按一次獲取一個),我獲取了6個以太幣,箭頭2處即是轉(zhuǎn)賬交易記錄。

OK,我們先暫時放一放 MetaMask,接下來讓我們?nèi)ネ嫱?Remix!

認識 Remix IDE

Remix 是一個基于瀏覽器的 Solidity IDE,基本的智能合約代碼的開發(fā)調(diào)試在這上面進行是相當舒服的。Remix - Solidity IDE

第一處箭頭是項目目錄欄,可以在這里創(chuàng)建文件目錄

第二處箭頭是代碼欄,我們的合約代碼就在這里編寫

第三處箭頭是日志欄,部署調(diào)試的日志輸出都在這里顯示

第四處箭頭是調(diào)試欄,對合約的部署、調(diào)試等操作都在這里進行

需要熟悉這個工具嗎?當然,而且越熟悉越好,但不是現(xiàn)在,別忘了我們現(xiàn)在的目標是制作自己的 Token。

Token 合約

以太坊官方網(wǎng)站上有一份標準的 Token 合約供學習者參考,而且也有很詳細的教程教大家如何去部署自己的 Token。Create a cryptocurrency contract in Ethereum

本文與官方不同的是我們使用 輕錢包 MetaMask 和在線開發(fā)環(huán)境 Remix 進行開發(fā)調(diào)試部署,官方的以太坊錢包對于初學者來說有個挺苦惱的地方,同步主網(wǎng)絡(luò)或者測試網(wǎng)絡(luò)的全節(jié)點數(shù)據(jù)很慢,而且占用磁盤空間較大。初次體驗盡量還是選擇輕松的方式,不要給自己留下壞心情 :)

我們將官方的 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的標簽頁,進入設(shè)置界面,然后點擊箭頭2選擇相應的編譯器版本,這里即選擇 0.4.16。

然后點擊編譯標簽(Compile),會看到已經(jīng)編譯成功

然后點擊運行標簽(Run),進行部署操作

第一處箭頭選擇部署環(huán)境,這邊會自動檢測到我們的 MetaMask 當前所處的網(wǎng)絡(luò)(Ropsten Test Net)。

第二處箭頭輸入我們 Token 的一些基本信息

第一個參數(shù)表示 Token 總發(fā)行量,我這里隨便填了一千萬個

第二個參數(shù)表示 Token 名稱

第三個參數(shù)表示 Token 符號,一般在流通過程中均以該符號作為 Token 的標識

第三處箭頭點擊即創(chuàng)建部署交易單,開始最終的部署

這里唯一可以改的是 Gas Limit 和 Gas Price,一般來講這兩個數(shù)據(jù)會自動根據(jù)當前合約的復雜度和市場平均水準生成。所以一般不需要去改這兩個值,如果是囊中羞澀,改低一點也是可以的,但是可能會出現(xiàn) Gas 被消耗完的情況(Gas 一旦被消耗完而合約仍未部署到網(wǎng)絡(luò)上,那么所有操作都會進行回滾,除了你支付的礦工費)。

點擊發(fā)布按鈕(SUBMIT),靜靜等待發(fā)布成功吧!

此時打開 MetaMask 頁面

上圖為發(fā)布中狀態(tài),下圖為發(fā)布結(jié)束的狀態(tài),此時會發(fā)現(xiàn)我們的賬戶余額減少了一些,因為被用于支付發(fā)布合約的礦工費了。

到這里還不清楚是否成功發(fā)布了,點擊交易單進入交易詳情頁面,當你看到箭頭1處的 Success 時就表示我們的 Token 發(fā)布成功啦!

點擊箭頭2處的合約地址鏈接,進入合約詳情頁

點擊箭頭處的 Token 地址鏈接,進入 Token 詳情頁

至此我們的 Token 就做完啦!

錢包中顯示 Token

我們以 MetaMask 為例演示一下,其他錢包比如 ImToken 同樣的只需要將 Token 地址復制過去就能看到了。

先切換到 Token 標簽頁

點擊添加 Token,輸入剛才的 Token 合約地址

點擊添加按鈕,就能在 MetaMask 上看到我們自己的 Token 了。

小結(jié)

在制作 Token 的整個過程中,并沒有難點,只是大多數(shù)人不清楚流程,當自己實操一遍后立馬就能上手。后面我們會去玩一些復雜一點的智能合約,但同樣的,需要一些基本的 Solidity 編程語言的知識以及區(qū)塊鏈相關(guān)的知識。Solidity 這門以太坊的標準編程語言之后的文章也會詳細講解,大家盡請期待~

歡迎關(guān)注公眾號:『比特扣』,與我一起探索區(qū)塊鏈的世界。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/24065.html

相關(guān)文章

  • Vue2學習小記-給Vue2路由導航鉤子和axios攔截器做個封裝

    摘要:寫在前面最近在學習,遇到有些頁面請求數(shù)據(jù)需要用戶登錄權(quán)限服務器響應不符預期的問題,但是總不能每個頁面都做單獨處理吧,于是想到提供了攔截器這個好東西,再于是就出現(xiàn)了本文。 1.寫在前面 最近在學習Vue2,遇到有些頁面請求數(shù)據(jù)需要用戶登錄權(quán)限、服務器響應不符預期的問題,但是總不能每個頁面都做單獨處理吧,于是想到axios提供了攔截器這個好東西,再于是就出現(xiàn)了本文。 2.具體需求 用戶鑒...

    Tikitoo 評論0 收藏0
  • 小白的邊學邊寫,一個基于laravel的APP接口【API】(一)

    摘要:前期準備原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界??蚣?,是我最喜歡的框架了,沒有之一。 前期準備 原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。這不,最近又開始折騰APP了,話說現(xiàn)在開...

    Nosee 評論0 收藏0
  • 小白的邊學邊寫,一個基于laravel的APP接口【API】(一)

    摘要:前期準備原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界??蚣埽俏易钕矚g的框架了,沒有之一。 前期準備 原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。這不,最近又開始折騰APP了,話說現(xiàn)在開...

    StonePanda 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<