在以太坊上发行自己的代币

简单代币开发

代币(Token):

代币单纯从其名字上理解的话,就是一种可以替代通用货币起到交换媒介作用的东西,可以是商场积分,可以是游戏币,也可以是筹码。但是在区块链中,就不完全是那么回事了,区块链中的代币或者说Token通常指的是具有流通性的加密数字权益证明,例如比特币、以太币等数字货币都属于代币

从以上定义可以得知代币的三个要素:

  • 权益证明:一种数字形式存在的权益凭证,代表一种权利,一种固有的内在价值和使用价值
  • 加密:为了防止篡改,保护隐私,不可以复制等
  • 较高的可流通性(去中心化):可以进行交易,兑换通用或法定货币等,之所以要去中心化是因为中心化的代币都存在平台限制及信任问题,所以其流通性就会受到局限

综上,简言之代币的概念大致上就是基于区块链发行的加密货币或者其他类似的东西。通常大多数人或团队在开发区块链项目时,都会考虑发行自己的代币。在最初的时候,我们要发行自己的加密货币得从比特币的源码上改造出来。不过现如今通过以太坊平台,我们能够很方便的开发并发行自己的代币,所以本文将介绍如何基于以太坊开发自己的代币。

首先我们使用solidity开发一个拥有最基本功能的“代币”demo,以便了解代币最基础的样子,代码如下:

pragma solidity ^0.4.20;

contract SimpleToken {

    // 保存每个地址所拥有的代币数量
    mapping (address => uint256) public balanceOf; 

    // 参数为代币的初始供应量或者说发行数量
    constructor (uint256 initSupply) public {
        // 创建者拥有所有的代币
        balanceOf[msg.sender] = initSupply;
    }

    /**
     * 转移代币
     *
     * @param _to     接收方的账户地址
     * @param _value  转移的代币数量
     */
    function transfer (address _to, uint256 _value) public {
        // 发送方的账户余额需大于等于转移的代币数量
        require(balanceOf[msg.sender] >= _value);
        // 检查有没有发生溢出,因为数量有可能超过uint256可存储的范围
        require(balanceOf[_to] + _value >= balanceOf[_to]);

        // 减少发送方账户的代币数量
        balanceOf[msg.sender] -= _value;
        // 增加接收方账户的代币数量
        balanceOf[_to] += _value;
    }
}

1.代码编写完成后,在remix上部署合约,首先初始化代币供应量:

2.查看指定账户所拥有的代币数量:

3.转移代币到另一个账户地址:

4.此时该账户地址的代币数量就只剩下100了:


ERC-20标准简述

在上一小节中,我们实现了一个简单的代币,但就因为简单,所以该代币是极其不完善的,例如没有代币名称、代币符号以及无法控制代币的交易等。

因此以太坊定义了ERC20,ERC20是以太坊定义的一个代币统一标准,该标准描述了我们在实现代币时必须要遵守的协议,如指定代币名称、总量、实现代币交易函数等,只有实现了该协议的代币才能被以太坊钱包支持。

下图是一个实现了ERC20协议的代币:

实际上ERC20协议是定义了一组标准接口,该协议使得在以太坊上开发的任何代币都能被其他应用程序重用,例如钱包到分散的交易所等,如下:

contract ERC20Interface {
    // 代币名称
    string public constant name = "Token Name";
    // 代币符号或者说简写
    string public constant symbol = "SYM";
    // 代币小数点位数,代币的最小单位, 18表示我们可以拥有 0.0000000000000000001单位个代币
    uint8 public constant decimals = 18;  // 18 is the most common number of decimal places

    // 查询代币的发行总量
    function totalSupply() public constant returns (uint);
    // 查询地址的代币余额
    function balanceOf(address tokenOwner) public constant returns (uint balance);
    // 查询spender允许从tokenOwner上花费的代币数量
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    // 实现代币交易,用于从本账户给某个地址转移代币
    function transfer(address to, uint tokens) public returns (bool success);
    // 允许spender多次从你的账户取款,并且最多可取tokens个,主要用于某些场景下授权委托其他用户从你的账户上花费代币
    function approve(address spender, uint tokens) public returns (bool success);
    // 实现代币用户之间的交易,从一个地址转移代币到另一个地址
    function transferFrom(address from, address to, uint tokens) public returns (bool success);

    // 代币交易时触发的事件,即调用transfer方法时触发
    event Transfer(address indexed from, address indexed to, uint tokens);
    // 允许其他用户从你的账户上花费代币时触发的事件,即调用approve方法时触发
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

ERC-20标准代币的实现

代码如下:

pragma solidity ^0.4.20;

// 定义ERC-20标准接口
contract ERC20Interface {
    // 代币名称
    string public name;
    // 代币符号或者说简写
    string public symbol;
    // 代币小数点位数,代币的最小单位
    uint8 public decimals;
    // 代币的发行总量
    uint public totalSupply;

    // 实现代币交易,用于给某个地址转移代币
    function transfer(address to, uint tokens) public returns (bool success);
    // 实现代币用户之间的交易,从一个地址转移代币到另一个地址
    function transferFrom(address from, address to, uint tokens) public returns (bool success);
    // 允许spender多次从你的账户取款,并且最多可取tokens个,主要用于某些场景下授权委托其他用户从你的账户上花费代币
    function approve(address spender, uint tokens) public returns (bool success);
    // 查询spender允许从tokenOwner上花费的代币数量
    function allowance(address tokenOwner, address spender) public view returns (uint remaining);

    // 代币交易时触发的事件,即调用transfer方法时触发
    event Transfer(address indexed from, address indexed to, uint tokens);
    // 允许其他用户从你的账户上花费代币时触发的事件,即调用approve方法时触发
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

// 实现ERC-20标准接口
contract ERC20Impl is ERC20Interface {
    // 存储每个地址的余额(因为是public的所以会自动生成balanceOf方法)
    mapping (address => uint256) public balanceOf;
    // 存储每个地址可操作的地址及其可操作的金额
    mapping (address => mapping (address => uint256)) internal allowed;

    // 初始化属性
    constructor() public {
        name = "Test Token";
        symbol = "TEST";
        decimals = 18;
        totalSupply = 100000000;
        // 初始化该代币的账户会拥有所有的代币
        balanceOf[msg.sender] = totalSupply;
    }

    function transfer(address to, uint tokens) public returns (bool success) {
        // 检验接收者地址是否合法
        require(to != address(0));
        // 检验发送者账户余额是否足够
        require(balanceOf[msg.sender] >= tokens);
        // 检验是否会发生溢出
        require(balanceOf[to] + tokens >= balanceOf[to]);

        // 扣除发送者账户余额
        balanceOf[msg.sender] -= tokens;
        // 增加接收者账户余额
        balanceOf[to] += tokens;

        // 触发相应的事件
        emit Transfer(msg.sender, to, tokens);
    }

    function transferFrom(address from, address to, uint tokens) public returns (bool success) {
        // 检验地址是否合法
        require(to != address(0) && from != address(0));
        // 检验发送者账户余额是否足够
        require(balanceOf[from] >= tokens);
        // 检验操作的金额是否是被允许的
        require(allowed[from][msg.sender] <= tokens);
        // 检验是否会发生溢出
        require(balanceOf[to] + tokens >= balanceOf[to]);

        // 扣除发送者账户余额
        balanceOf[from] -= tokens;
        // 增加接收者账户余额
        balanceOf[to] += tokens;

        // 触发相应的事件
        emit Transfer(from, to, tokens);   

        success = true;
    }

    function approve(address spender, uint tokens) public returns (bool success) {
        allowed[msg.sender][spender] = tokens;
        // 触发相应的事件
        emit Approval(msg.sender, spender, tokens);

        success = true;
    }

    function allowance(address tokenOwner, address spender) public view returns (uint remaining) {
        return allowed[tokenOwner][spender];
    }
}

将以上代码复制到Remix上,编译合约代码:

部署合约:

部署成功:

测试balanceOf方法:

测试transfer方法:



在Remix上测试完基本的方法后,我们通过MetaMask在以太坊的测试网络上发行我们的代币。打开MetaMask选择Ropsten测试网络,如下:

注:如果你没有余额请点击DEPOSIT按钮,然后再点击GET ETHER按钮,会进入一个网站,在该网站中点击request 1 ether from faucet,可以送一些测试网络的以太币给你:

然后到Remix IDE上刷新一下,此时Remix会自动选择相应的测试网络,注意MetaMask和Remix需要在同一个浏览器上,并且Environment和Account和MetaMask保持一致,如下:

点击Deploy后,这时MetaMask会弹出一个交易确认框,点CONFIRM:

待合约部署交易确认之后,复制合约地址:

打开Metamask界面,打开菜单(Menu),点ADD TOKEN:

出现如下对话框,选择Custom Token,然后将合约地址粘贴进去:

点ADD TOKENS:

这时在MetaMask里就可以看到我们创建的代币了,如下:

接下来我们测试一下代币的转账功能,选择我们刚刚部署的代币,点击SEND:

填写转账的相关信息:

确认转账:

成功后会生成相应的交易记录:

如此一来我们就完成了代币的创建和部署(正式网络和测试网络部署方法一样),现在已经可以在Etherscan查询到我们刚刚发行的代币了:

点击合约地址可以查看到代币的详情

原文地址:https://blog.51cto.com/zero01/2365628

时间: 2024-08-30 14:58:26

在以太坊上发行自己的代币的相关文章

以太坊上发行ERC20代币

ERC20 代币生成 环境 虚拟主机: ubuntu 18虚拟机 宿主主机: win10; ip:192.168.0.160 1.部署以太坊 1.1 安装GO 安装go,并编译geth 将下载好的golang包上传到root目录. sudo apt-get install -y build-essential golang 1.2 下载源代码编译 git clone https://github.com/ethereum/go-ethereum cd go-ethereum make geth

程序员的自我救赎---12.2.1: 虚拟币交易平台(区块链) 上【发行区块链代币】

<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八)监控系统 (九)会员中心 (十) APP版本控制系统 (十一)Winner前端框架与RPC接口规范讲解 (十二)上层应用案例 (十三)总结 <虚拟币交易平台(区块链)> --上 [发行区块链代币] 关于对于区块链 或者 比特币还没有一个基础概念的就自行百度吧,什么"去中心化",

区块链-如何在以太坊上制作自己的数字货币

copy from https://www.ethereum.org/token Create your own CRYPTO-CURRENCY with Ethereum The Coin We are going to create a digital token. Tokens in the Ethereum ecosystem can represent any fungible tradable good: coins, loyalty points, gold certificate

【区块链】以太坊(Ethereum )高级进阶实战视频教程

[区块链]以太坊(Ethereum )高级进阶实战视频教程视频教程地址:http://edu.51cto.com/course/14785.html 课程大纲: 课程概要介绍使用bootnode搭建以太坊私有链web3j介绍及基本使用使用web3j管理账户default block parameter以太坊交易详解ERC20代币介绍使用web3j部署ERC20代币合约账户解锁web3j调用代币合约方法(一)web3j调用代币合约方法(二)web3j调用代币合约方法(三)深入sendTransac

以太坊代币合约详析

以太坊代币 在以太坊系统中,存在作为基础货币的 Ether(以太),以及同样可以作为货币使用的 Token(代币). 以太坊与其他加密货币的主要不同在于,以太坊不是单纯的货币,而是一个环境/平台.在这个平台上,任何人都可以利用区块链的技术,通过智能合约来构建自己的项目和DAPPS(去中心化应用). 如果把以太坊理解成互联网,DAPPS则是在上面运行的网页.DAPPS是去中心化的,意味着它不属于某个人,而是属于一群人.DAPPS发布的方式通常是采用被称为 ICO 的众筹方式.简单来说,你需要用你的

PHP调用以太坊接口

以太坊规定了每个节点需要实现的JSON RPC应用开发接口,如果希望使用PHP开发一个以太坊区块链上的去中心化应用(DApp),首先要解决的问题就是如何使用PHP调用以太坊JSON RPC接口: 如果你希望将网站快速接入以太坊,例如支持以太币支付,或者发行自己的代币,那么这个Php以太坊开发详解课程提供了最佳的学习路径. 虽然接口规范并没有对传输层进行约定,但大多数以太坊节点软件都实现了对HTTP协议的支持.因此我们可以使用Php的HTTP开发包来进行调用.例如,下面的代码使用guzzle这个h

以太坊是什么 - 以太坊开发入门指南

很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗的方式介绍以太坊开发中涉及的各晦涩的概念,轻松带大家入门. 以太坊是什么 以太坊(Ethereum)是一个建立在区块链技术之上, 去中心化应用平台.它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用. 对这句话不理解的同学,姑且可以理解为以太坊是区块链里的Android,它是一个开发平台,让我们就可以像基于Android Framework一样基于区块链技术写应用. 在没有以太坊之前,写区

以太坊开发完整去中心化应用 —— 区块链投票系统

第一节 课程概述 本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. ethereum logo 通过本课程的学习,你将掌握: 以太坊区块链的基本知识 开发和部署以太坊合约所需的软件环境 使用高级语言(solidity)编写以太坊合约 使用NodeJS编译.部署合约并与之交互 使用Truffle框架开发分布式应用 使用控制台或网页与合约进行交互 前序知识要求 为了顺利完成本课程,最好对以下技术已经有一些基本了解

爆炒区块链3.0概念,EOS想超ETH(以太坊),没那么简单!

2017年6月25日,EOS开始上线众筹,时间为一年!也就是说,EOS众筹结束时间要到2018年6月.自EOS众筹以来,炒得最多的就是区块链3.0概念,比如要超越以太坊,要做真正的区块链操作系统-- 那么,这个目前还在概念中的EOS,真的可以取代以太坊吗?我们一起来看看. 一.从以太坊说起 Ethereum(以太坊)是由俄罗斯人Vitalik Buterin于2014年创建的开源区块链平台,用户可以使用它来创建和发布去中心化的应用程序.Ethereum可以用来编程,分散,担保和交易任何事物:投票