首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

教你创建自己的数字货币

好 看 的 皮 囊 千 篇 一 律 有 趣 的 灵 魂 万 里 挑 一

从技术角度详细介绍如何基于以太坊ERC20创建代币流程

前 言

ICO是一种区块链行业术语,是一种为加密数字货币/区块链项目筹措资金的常用方式,早期参与者可以从中获得初始产生的加密数字货币作为回报。由于代币 具有市场价值,可以兑换成法币,从而支持项目的开发成本。ICO所发行的代币,可以基于不同的区块链。常见的是基于以太坊(ETH)和比特股(BTS)区块链发行,由区块链提供记账服务和价值共识,实现全球发行和流通。

ICO参与者对于一个项目的成功非常重要,他们会在社区里为该区块链项目进行宣传,使它产生的代币在开始交易前就获得流动性。但ICO的参与者最看重的依然是由项目发展或代币发行后价格升值带来的潜在收益。

本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊、智能合约有所了解,如果你还不了解,建议你先看以太坊是什么

代币 Token

代币是个神奇的名词,是区块链里最重要也是币民最关心也最迷糊的名词!代币对应的英文是token coin,或者trade token,常常简略为token。不过反过来token就不仅仅是代币,而且它并没有准确的唯一的中文名称,于是还常被错误或者无奈地翻译成了代币(为了交差总得翻译啊)——源自古英格兰的盎格鲁撒克逊语的token是个概念和功用都很大的单词:它可以是代币、代金券、赠券、令牌、奖牌或者标识物、纪念物……总的来说,token是以一样东西代表或者象征另一样东西,后者可以是物质的也可以是精神的,或者说可以是实实在在的也可以是虚拟的。

如果不那么追求精确的定义,代币就是数字货币,比特币、以太币就是一个代币。

利用以太坊的智能合约可以轻松编写出属于自己的代币,代币可以代表任何可以交易的东西,如:积分、财产、证书等等。

因此不管是出于商业,还是学习很多人想创建一个自己的代币,先贴一个图看看创建的代币是什么样子。

今天我们来详细讲一下怎样基于以太坊创建一个这样的代币

以太坊:

因为以太坊为开源社区,虽然东西很优秀,但是组件十分的杂乱,因此首先简单介绍下以太坊的一些常用组件:

1. Geth:

Geth是由以太坊基金会提供的官方客户端软件,用Go编程语言编写的。

2. Parity:

Parity 是对以太坊协议的另一个很好的实现,并且是用Rust编程语言编写的。 这是一个由一家名为Parity Inc的公司来维护的非官方客户端。任何人都可以实现这个客户端软件,并加入以太坊网络。

3. Solidity:

Solidity是用于编写在以太坊区块链上运行的智能合约的最流行的编程语言。 它是一种高级语言,当编译转换为 EVM 字节码。 这与 Java 非常相似,其中有诸如 Scala,Groovy,Clojure,JRuby等JVM语言。所有这些编译都生成在JVM(Java虚拟机)中运行的字节码。

4.Truffle:

Truffle 和 Embark 是用于开发以太坊 DApps的两个最常用的框架。 它们抽象出在区块链上编译和部署合同的许多复杂的东西。

5. Web3.js:

javascript库,可以用来与一个节点进行交互。 由于它是一个 JavaScript 库,您可以使用它来构建基于Web的dapps。

6 Mix:

以太坊早期IDE,用于合约的编写测试等,现已经停止更新,项目组也合并入Remix。

7. Remix:

以太坊官方推荐的智能合约开发IDE,适合新手,可以在浏览器中快速部署测试智能合约。

ERC20 Token

也许你经常看到ERC20和代币一同出现, ERC20是以太坊定义的一个代币标准。

要求我们在实现代币的时候必须要遵守的协议,如指定代币名称、总量、实现代币交易函数等,只有支持了协议才能被以太坊钱包支持。

其接口如下:

简单说明一下:

代币合约代码:

pragma solidity ^0.4.16;

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

contractTokenERC20{

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 indexedfrom, address indexed to, uint256 value);

event Burn(address indexedfrom, uint256 value);

functionTokenERC20(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);

}

functiontransfer(address _to, uint256 _value)public{

_transfer(msg.sender, _to, _value);

}

functiontransferFrom(address _from, address _to, uint256 _value)publicreturns(bool success){

require(_value

allowance[_from][msg.sender] -= _value;

_transfer(_from, _to, _value);

returntrue;

}

functionapprove(address _spender, uint256 _value)public

returns(bool success){

allowance[msg.sender][_spender] = _value;

returntrue;

}

functionapproveAndCall(address _spender, uint256 _value, bytes _extraData)publicreturns(bool success){

tokenRecipient spender = tokenRecipient(_spender);

if(approve(_spender, _value)) {

spender.receiveApproval(msg.sender, _value,this, _extraData);

returntrue;

}

}

functionburn(uint256 _value)publicreturns(bool success){

require(balanceOf[msg.sender] >= _value);

balanceOf[msg.sender] -= _value;

totalSupply -= _value;

Burn(msg.sender, _value);

returntrue;

}

functionburnFrom(address _from, uint256 _value)publicreturns(bool success){

require(balanceOf[_from] >= _value);

require(_value

balanceOf[_from] -= _value;

allowance[_from][msg.sender] -= _value;

totalSupply -= _value;

Burn(_from, _value);

returntrue;

}

}代码的详细解读,请联系公众号小编

部 署

在开发测试智能合约时,MetaMask(MetaMask 是一款浏览器插件钱包,不需下载安装客户端,只需添加至浏览器扩展程序即可使用,非常方便。它是很多支持 ETH 参投的 ICO 项目推荐使用的钱包之一。官网;https://metamask.io/ 安装:使用chrome浏览器打开 MetaMask 官网,点击“安装插件”。也可直接在chrome浏览器的应用商店搜索 MetaMask ,直接安装。(大陆用户需使用V-P-N)即可使用。)和Remix Solidity IDE(安装Remix:官方地址: https://github.com/ethereum/browser-solidity)是两个非常好用的工具,今天就用他们来完成部署。

1、安装和配置MetaMask请参考开发、部署第一个去中心化应用,本文选择了以太坊的测试网络Ropsten,配置好之后,界面应该如下:

2、浏览器打开Remix Solidity IDE,复制以上源码粘贴,在右侧选项参考如图的设置

注意Environment和Account和MetaMask保持一致,然后选择合约TokenERC20,填入你想要的发行量,名称及代号,就可以创建合约了。

这时MetaMask会弹出一个交易确认框,点SUBMIT。待合约部署交易确认之后,复制合约地址。

3、打开Metamask界面,切换到TOKENS,点添加合约,出现如下对话框:

填入刚刚复制的地址,点ADD,这时你就可以看到你创建的代币了,如图:

哈,你已经完成了代币的创建和部署(正式网络和测试网络部署方法一样),可以在Etherscan查询到我们刚刚部署的代币。

代币交易

由于MetaMask插件没有提供代币交易功能,同时考虑到很多人并没有以太坊钱包或是被以太坊钱包网络同步问题折磨,今天用网页钱包来讲下代币交易。

1、进入网页钱包地址, 第一次进入有一些安全提示需要用户确认。

2、进入之后,按照下图进行设置:

3、连接上之后,如图

需要添加代币,填入代币合约地址。

4、进行代币转账交易

在接下来的交易确认也,点击确认即可。

5、交易完成后,可以看到MetaMask中代币余额减少了,如图:

代币交易是不是很简单,只要明白了交易流程,使用其他的钱包也是一样的道理。

如果你在创建代币的过程中遇到问题,关注本公众号可为大家解答。

逻 吉

Logi-market加拿大

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180130B16JCV00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券