基于以太坊发行代币TOKEN

一、背景说明

在2015年11月份,以太坊推出了目前通行的ERC20token标准,按照这个标准,每个团队都可以开发出自己的基于以太坊的代币,然后通过公开发售这些代币,筹集资金,这就是我们所说的ICO。

具体来说,其实每一种代币本身就是一个智能合约,像其它智能合约一样运作,只是限定了合约内容:这个合约维护着相关的数据库,当外部账户或者合约账户发送消息要求从A转账到B,它就执行相应的操作。或者说,它就是一个账本。同时,它是兼容以太坊钱包的。所以团队只要照着ERC20写好程序,就能拥有自己的基于以太坊的代币。

ERC20协议

ERC20和代币一同出现, ERC20是以太坊定义的一个代币标准。是一种发行代币合约必须要遵守的协议,该协议规定了几个参数——发行货币的名称,简称,发行量,要支持的函数等,只有支持了该协议才会被以太坊所认同。

ERC20标准代码如下:

1
2
3
4
5
6
7
8
9
10
11
// https://github.com/ethereum/EIPs/issues/20
contract ERC20 {
function totalSupply() constant returns (uint totalSupply);
function balanceOf(address _owner) constant returns (uint balance);
function transfer(address _to, uint _value) returns (bool success);
function transferFrom(address _from, address _to, uint _value) returns (bool success);
function approve(address _spender, uint _value) returns (bool success);
function allowance(address _owner, address _spender) constant returns (uint remaining);
event Transfer(address indexed _from, address indexed _to, uint _value);
event Approval(address indexed _owner, address indexed _spender, uint _value);
}

其中

1
function totalSupply() constant returns (uint totalSupply);

以上方法表示获取总的发行量

1
function balanceOf(address _owner) constant returns (uint balance);

以上方法表示获取_owner的账户余额

1
function transfer(address _to, uint _value) returns (bool success);

以上方法表示当前账户转_value数量的代币至_to

1
function transferFrom(address _from, address _to, uint _value) returns (bool success);

以上方法表示从_from账户转_value数量的代币至_to

1
function approve(address _spender, uint _value) returns (bool success);

以上方法表示允许_spender从你的账户转_value数量的代币

1
function allowance(address _owner, address _spender) constant returns (uint remaining);

以上方法表示_spender被允许从_owner提取的金额数量,是一个查询函数

1
event Transfer(address indexed _from, address indexed _to, uint _value);

以上事件在转账的时候被触发

1
event Approval(address indexed _owner, address indexed _spender, uint _value);

以上事件表示在调用approve方法时被触发

二、环境准备

前提:科学上网工具

1、下载以太坊钱包

进入ethereum下载钱包
image

2、选择测试网络

由于在以太坊上部署执行智能合约是需要真实的ETH作为gas燃料费的,所以我们选择在测试环境进行,测试环境的ETH可以通过其他手段获取到

打卡钱包主页面是长这样的,我们可以在开发——网络中选择Rinkeby - Test network测试网络
image

3、创建账户

点击上图中的ADD ACCOUNT,设置密码即可完成账户的创建
image

4、获取测试ETH

我们可以在https://www.rinkeby.io/#faucet中获取测试的以太币
image
获取的方式有三种,我选择的是Google Plus,操作步骤如下:

进入https://plus.google.com/,没有账户的创建一个账号即可,新鲜事分享
image
在发布页面,将自已以太坊账户的地址复制到文本中发布
image
发布完成之后,在首页点击转发,进入转发详情页,复制详情页的URL
image
image

https://www.rinkeby.io/#faucet的输入框中填入上个步骤获取到的URL,再选择送币的类型,我们选择3 Ethers/8 hours,表示此次领取3ETH,8个小时之后可再次领取。

image
领取完之后,回到我们的钱包界面就可以看到3ETH已经到账了
image

此次交易转账在etherscan中也是能查询到的
image

三、编写&&部署智能合约

在智能合约的界面中,我们选择部署一个新的智能合约
image
https://www.ethereum.org/token复制THE CODE下方的那段完整代码,粘贴到SOLIDITY CONTRACT SOURCE CODE栏目
image
粘贴过去之后,它会自动编译,可以看到是有报错的,可能是语法和版本有冲突,我们按照提示把function TokenERC20改为constructor即可。

image

在编译完成之后,我们填写好token的相关信息,再把下面的手续费拉到FASTER,这样做的原因是能更快的被打包,然后再点击DEPLOY,在弹出的界面中输入密码即可。

接下来要做就是稍等几分钟等待合约部署完成
image

四、基于发行的代币在账户之间的转账

我们可以在钱包中再创建一个账户,基于这两个账户之间做转账,当然,也可以转给你的同事朋友的账户地址
image
点击左上方的SEND,在页面中选择填写好相关信息即可开始转账,在TO的输入框中输入收款方的账户地址,AMOUNT为此次转账的金额,在ETHER的一栏,我们选择自已发行的代币,同样的,手续费越高转账越快,点击SEND完成转账
image
image
可以看到,我们转入的1000MTK币已经到account2的账户中。

五、思考

通过上述步骤,我们可以发现基于以太坊发行代币是一件多么简单的事情,但是代币发行之后可以用来干嘛,怎么与我们的实际应用相结合,这才是我们需要思考的问题。

如果您觉得有帮助到您,不妨考虑请作者喝杯咖啡鼓励一下。