成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

18年給自己做個Token吧

Ku_Andrew / 2679人閱讀

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

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

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

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

下面就直奔主題,我們不需要了解如何編寫智能合約,因?yàn)橐蕴惶峁┑?ERC20 協(xié)議已經(jīng)足夠傻瓜式了,做一個簡單的 Token 官方就有一個標(biāo)準(zhǔn)的智能合約代碼作為示例,那么我們只需要知道制作的流程就行了。

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

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

注意圖上的三處箭頭

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

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

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

新建合約賬戶

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

購買以太幣

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

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

我們可以看到我們的賬戶上余額是零,點(diǎn)擊箭頭1的購買按鈕,進(jìn)入確認(rèn)頁面

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

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

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

認(rèn)識 Remix IDE

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

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

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

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

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

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

Token 合約

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

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

我們將官方的 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;
    }
}
部署合約

接下來我們先選擇好我們的編譯器的版本,對應(yīng)合約代碼首行的版本號 pragma solidity ^0.4.16

點(diǎn)擊箭頭1的標(biāo)簽頁,進(jìn)入設(shè)置界面,然后點(diǎn)擊箭頭2選擇相應(yīng)的編譯器版本,這里即選擇 0.4.16。

然后點(diǎn)擊編譯標(biāo)簽(Compile),會看到已經(jīng)編譯成功

然后點(diǎn)擊運(yùn)行標(biāo)簽(Run),進(jìn)行部署操作

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

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

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

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

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

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

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

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

此時打開 MetaMask 頁面

上圖為發(fā)布中狀態(tài),下圖為發(fā)布結(jié)束的狀態(tài),此時會發(fā)現(xiàn)我們的賬戶余額減少了一些,因?yàn)楸挥糜谥Ц栋l(fā)布合約的礦工費(fèi)了。

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

點(diǎn)擊箭頭2處的合約地址鏈接,進(jìn)入合約詳情頁

點(diǎn)擊箭頭處的 Token 地址鏈接,進(jìn)入 Token 詳情頁

至此我們的 Token 就做完啦!

錢包中顯示 Token

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

先切換到 Token 標(biāo)簽頁

點(diǎn)擊添加 Token,輸入剛才的 Token 合約地址

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

小結(jié)

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

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

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

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

相關(guān)文章

  • Vue2學(xué)習(xí)小記-給Vue2路由導(dǎo)航鉤子和axios攔截器做個封裝

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

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

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

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

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

    StonePanda 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<