使用remix与MetaMask进行发布智能合约(代币)最全教程

一直接触区块链中的以太坊,但是一直没实践过发布智能合约,百度查询到remix教程都是老版本的,而且介绍不全

编写合约

  • 在线编辑器地址
    编辑器地址
    请注意如果编辑器无法与MetaMask连接的时候用http协议打开,不要用https,我也不知道为什么,有时候会发生这种事情,换个协议就可以进行连接。
    https其实也可以进行连接,不要觉得只有http可以连接
  • 前期准备工作

    1.remix与MetaMask进行连接

在这里插入图片描述
点击查看当前地址是否已经连接
如果未连接按照以下操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出现下图证明开始连接
在这里插入图片描述
最后连接成功
在这里插入图片描述

2.打开编辑添加插件

添加编译插件
在这里插入图片描述
添加发布插件
在这里插入图片描述

部署智能合约

部署智能合约的方式其实很简单,就是进行一次交易

  • 智能合约代码
pragma solidity ^0.4.18;

/**
 * Math operations with safety checks
 */
contract SafeMath {
    
    
  function safeMul(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
    if (a == 0) {
    
    
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
    assert(b > 0);
    uint256 c = a / b;
    assert(a == b * c + a % b);
    return c;
  }

  function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
    assert(b <= a);
    return a - b;
  }

  function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
    uint256 c = a + b;
    assert(c>=a && c>=b);
    return c;
  }

}
contract AC is SafeMath{
    
    
    string public name;
    string public symbol;
    uint8 public decimals = 18;
    uint256 public totalSupply;
    address public owner;

    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;
    mapping (address => uint256) public freezeOf;
    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);

    /* This notifies clients about the amount frozen */
    event Freeze(address indexed from, uint256 value);

    /* This notifies clients about the amount unfrozen */
    event Unfreeze(address indexed from, uint256 value);

    /* Initializes contract with initial supply tokens to the creator of the contract */
    function AC(
        uint256 initialSupply,
        string tokenName,
        string tokenSymbol,
        address holder)  public{
    
    
        totalSupply = initialSupply * 10 ** uint256(decimals); // Update total supply
        balanceOf[holder] = totalSupply;                       // Give the creator all initial tokens
        name = tokenName;                                      // Set the name for display purposes
        symbol = tokenSymbol;                                  // Set the symbol for display purposes
        owner = holder;
    }

    /* Send coins */
    function transfer(address _to, uint256 _value) public{
    
    
        require(_to != 0x0);  // Prevent transfer to 0x0 address. Use burn() instead
        require(_value > 0);
        require(balanceOf[msg.sender] >= _value);           // Check if the sender has enough
        require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
        balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value);                     // Subtract from the sender
        balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value);                            // Add the same to the recipient
        Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place
    }

    /* Allow another contract to spend some tokens in your behalf */
    //function approve(address _spender, uint256 _value) public
        //returns (bool success) {
    
    
        //require(_value > 0);
        //allowance[msg.sender][_spender] = _value;
        //return true;
    //}

    /* A contract attempts to get the coins */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
    
    
        require(_to != 0x0);                                // Prevent transfer to 0x0 address. Use burn() instead
        require(_value > 0);
        require(balanceOf[_from] >= _value);                 // Check if the sender has enough
        require(balanceOf[_to] + _value >= balanceOf[_to]);  // Check for overflows
        require(_value <= allowance[_from][msg.sender]);     // Check allowance
        balanceOf[_from] = SafeMath.safeSub(balanceOf[_from], _value);                           // Subtract from the sender
        balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value);                             // Add the same to the recipient
        allowance[_from][msg.sender] = SafeMath.safeSub(allowance[_from][msg.sender], _value);
        Transfer(_from, _to, _value);
        return true;
    }

    function burn(uint256 _value) public returns (bool success) {
    
    
        require(balanceOf[msg.sender] >= _value);            // Check if the sender has enough
        require(_value > 0);
        balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value);                      // Subtract from the sender
        totalSupply = SafeMath.safeSub(totalSupply,_value);                                // Updates totalSupply
        Burn(msg.sender, _value);
        return true;
    }

    function freeze(uint256 _value) public returns (bool success) {
    
    
        require(balanceOf[msg.sender] >= _value);            // Check if the sender has enough
        require(_value > 0);
        balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value);                      // Subtract from the sender
        freezeOf[msg.sender] = SafeMath.safeAdd(freezeOf[msg.sender], _value);                                // Updates totalSupply
        Freeze(msg.sender, _value);
        return true;
    }

    function unfreeze(uint256 _value) public returns (bool success) {
    
    
        require(freezeOf[msg.sender] >= _value);            // Check if the sender has enough
        require(_value > 0);
        freezeOf[msg.sender] = SafeMath.safeSub(freezeOf[msg.sender], _value);                      // Subtract from the sender
        balanceOf[msg.sender] = SafeMath.safeAdd(balanceOf[msg.sender], _value);
        Unfreeze(msg.sender, _value);
        return true;
    }
}
  • 进行编译

在这里插入图片描述
选择对应的版本

在这里插入图片描述
编译中,可能会有点慢,耐心等待
在这里插入图片描述
出现如下绿色标识标识编译通过
在这里插入图片描述

部署智能合约
选项卡的含义

  1. JavaScript VM remix内置的虚拟机,默认提供了十个有100eth的账户,一般不用这个
  2. lnjected web3 使用这个选项链接MetaMask
  3. web3 provider 这个选项我没用过,不做描述

在这里插入图片描述
点击下方的红框的三角标识
在这里插入图片描述
在这里插入图片描述
点击 transact出现如下图片
在这里插入图片描述

发布成功,点击箭头所指示的标识复制合约地址进行添加代币
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
成功发布
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39998006/article/details/107149785