部署智能合约

准备

首先发布一个虚拟币得确定要发布到什么平台,主流的就是以太坊、币安链、火币等等,各个平台都提供了专属的测试链,可以在测试链上进行一个发布,可以领取对应的测试币用来支付矿工费等。

这里选择在以太坊的Ropsten测试网络发布发布那么就对应也需要一个钱包地址,钱包里需要准备一定数量的ETH用来支付部署合约的矿工费,以及后续的转账,可以前往对应的测试水龙头进行一个测试的ETH获取->水龙头

因为有钱包地址,那么就需要对应的一个钱包来进行管理,这里可以在谷歌浏览器安装一个插件MetaMask来进行钱包的一个管理,可以前往官网进行下载

钱包

安装好之后选择到Ropsten测试网络就可以查看到当前的钱包里的余额了,这样就可以进行下一步了

合约

这里要使用的智能合约是由以太坊在其区块链上实施了一种近乎图灵完备的语言,这是一个突出的智能合约框架。 这里涉及到了一个编写智能合约的语言Solidity,Solidity 是 Ethereum 的一种契约型编程语言,其语法与 JavaScript 类似,并且旨在定位到以太坊虚拟机。可以前往文档看看一些基本的语法 Solidity文档

部署合约有提供一个网页的编辑器Remix,可以在上面进行合约的编写、调试以及发布。

一个合约需要具备查询余额、代币名称、小数位数、转账、释放、燃烧等功能。首先打开编辑器 Remix编辑器 在左边的文件栏中创建一个contract.sol文件,讲以下代码粘贴进去

pragma solidity ^0.4.16;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }

contract NHTTokenERC20 {
    string public name;
    string public symbol;
    uint8 public decimals = 18;  // 18 是建议的默认值
    uint256 public totalSupply;

    mapping (address => uint256) public balanceOf;  //
    mapping (address => mapping (address => uint256)) public allowance;
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Burn(address indexed from, uint256 value);

    function NHTTokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {
        totalSupply = initialSupply * 10 ** uint256(decimals);
        balanceOf[msg.sender] = totalSupply;
        name = tokenName;
        symbol = tokenSymbol;
    }

    function _transfer(address _from, address _to, uint _value) internal {
        require(_to != 0x0);
        require(balanceOf[_from] >= _value);
        require(balanceOf[_to] + _value > balanceOf[_to]);
        uint previousBalances = balanceOf[_from] + balanceOf[_to];
        balanceOf[_from] -= _value;
        balanceOf[_to] += _value;
        Transfer(_from, _to, _value);
        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
    }

    function transfer(address _to, uint256 _value) public returns (bool) {
        _transfer(msg.sender, _to, _value);
        return true;
    }
    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;
    }

    function approve(address _spender, uint256 _value) public
        returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        return true;
    }

    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;
        }
    }

    function burn(uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value);
        balanceOf[msg.sender] -= _value;
        totalSupply -= _value;
        Burn(msg.sender, _value);
        return true;
    }

    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value);
        require(_value <= allowance[_from][msg.sender]);
        balanceOf[_from] -= _value;
        allowance[_from][msg.sender] -= _value;
        totalSupply -= _value;
        Burn(_from, _value);
        return true;
    }
}

部署

这个合约中定义了代币名称,代币代码,小数位数,查询余额,转账等功能。再下一步 点击菜单栏第二个按钮,选择编译版本,选择到与文件一致的0.4.16版本,然后点击Compile contract.sol 进行编译,编译成功会按钮会出现勾那么就说明文件是编译通过,没有报错的。在点击左边菜单栏第三个按钮,来部署合约,并设置合约的一些配置。

点击按钮后在ENVIRONMENT下拉框中选择Injected Web3这里是选择部署的方式,通过web3的方式来进行一个部署,下面点击Deploy旁边的小箭头,这里来设置我们要发行代币的数量、名称、简称

这里发行代币数量1000万,叫做开心币,代币简称happy,然后点击transact,浏览器装了matemask插件会在右上角弹出窗口支付矿工费来进行一个合约的部署。

点击确认后等待一分钟左右链上进行确认就可以收到结果了,也可以打开钱包查看这个部署的情况 在编辑器中也会有提示,这样就发了一个简单的代币了。代币的合约地址是0xce8072ce538BdDDe77E22126866A35C394578Db2

在钱包中添加代币,可以看到自动填充的代币名称happy以及18位小数位,

开心币总额是1000w这样一个简单的代币就部署完成了,可以使用开心币进行转账等操作了