Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

12.2. MetaMask

MetaMask 是 Chrome 瀏覽器插件 https://metamask.io

12.2.1. 測試網絡

12.2.1.1. 獲取測試網絡上的以太幣

點擊 Buy 按鈕,然後再點擊 ROPSTEN TEST FAUCET 按鈕。

點擊 request 1 ether from faucet

12.2.2. mnemonic - Reveal seed words

點擊頭像進入 Settings 菜單

單機 Reveal seed words 按鈕

輸入賬號密碼解鎖

查看 mnemonic 字元串

12.2.3. 添加 Token 幣種

有時我們需要添加新幣種,還有一個目的是為了接收空投幣。

只需輸入合約地址即可,其他選項會自動填充。

顯示代幣數量

完成代幣添加

12.2.4. MetaMask Vault Decryptor

MetaMask 將錢包數據存儲在瀏覽中 Local Storage 中,這是Chrome 谷歌瀏覽器特有的 Key,Value資料庫。

Key 的名字是 metamask-config 將它複製到 https://metamask.github.io/vault-decryptor/ 中可以解密。

解密程序的 Github 地址 https://github.com/MetaMask/vault-decryptor

12.2.5. 部署合約

這裡假設你已經安裝 MetaMask 錢包,並且創建了賬號,賬號有足夠的 ETH 用來創建合約。

我們準備一個合約

			
pragma solidity ^0.4.24;

/******************************************/
/*       Netkiller ADVANCED TOKEN         */
/******************************************/
/* Author netkiller <netkiller@msn.com>   */
/* Home http://www.netkiller.cn           */
/* Version 2018-05-23                     */
/******************************************/

contract NetkillerMiniToken {
    address public owner;
    // Public variables of the token
    string public name;
    string public symbol;
    uint public decimals;
    // 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);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * Constrctor function
     *
     * Initializes contract with initial supply tokens to the creator of the contract
     */
    constructor(
        uint256 initialSupply,
        string tokenName,
        string tokenSymbol,
        uint decimalUnits
    ) public {
        owner = msg.sender;
        name = tokenName;                                   // Set the name for display purposes
        symbol = tokenSymbol; 
        decimals = decimalUnits;
        totalSupply = initialSupply * 10 ** uint256(decimals);  // Update total supply with the decimal amount
        balanceOf[msg.sender] = totalSupply;                // Give the creator all initial token
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address newOwner) onlyOwner public {
        if (newOwner != address(0)) {
            owner = newOwner;
        }
    }
 
    /* Internal transfer, only can be called by this contract */
    function _transfer(address _from, address _to, uint _value) internal {
        require (_to != 0x0);                               // Prevent transfer to 0x0 address. Use burn() instead
        require (balanceOf[_from] >= _value);               // Check if the sender has enough
        require (balanceOf[_to] + _value > balanceOf[_to]); // Check for overflows
        balanceOf[_from] -= _value;                         // Subtract from the sender
        balanceOf[_to] += _value;                           // Add the same to the recipient
        emit Transfer(_from, _to, _value);
    }

    /**
     * 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` in 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 in 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;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
}
			
			

現在打開 https://remix.ethereum.org/

點擊“+”加號創建合約,合約名稱NetkillerToken, 編譯合約。進入 “Run” 選項卡運行合約

Environment 設置為 Injected Web3 這時可以看到 MetaMask 中的賬號以及餘額, 然後設置構造方法,最後點擊“transact”按鈕開始部署合約。

確認手續費

remix 顯示出TX Hash 表示完成。