基于以太坊发行自己的数字货币(代币)
imToken 是一款全球领先的区块链数字资产管理工具[ZB],帮助你安全管理BTC, ETH, ATOM, EOS, TRX, CKB, BCH, LTC, DOT, KSM, FIL, XTZ 资产,同时支持去中心化币币兑换功能 ...
基于以太坊发行自己的数字货币(代币)
(参考来自网络以及各种探索,包括各种坑)
本文从纯技术角度详细介绍了基于以太坊ERC20创建代币的流程(本案例为已部署的eth主网,并非测试案例)
写在前面
本文讨论的代币是使用以太坊智能合约创建的。在阅读本文之前,你应该对以太坊和智能合约有一定的了解。如果你还不了解,建议你先阅读什么是以太坊。
代币
如果我们不太在意确切的定义,代币就是一种数字货币,比特币和以太坊都是代币。
利用以太坊的智能合约,你可以很容易地编写自己的代币,这些代币可以代表任何可以交易的东西,比如积分、财产、证书等。
因此不管是商业用途还是学习用途,很多人都想创建自己的token,我们先贴个图,看看创建出来的token长什么样子。
以我自己发布的货币Bcoin为例
访问网址:
今天我们将详细讨论如何创建这样的代币。
ERC20 代币
ERC20和代币一起出现。ERC20是以太坊定义的代币标准,是发行代币的合约必须遵循的协议,协议规定了几个参数——要发行的货币名称、缩写、发行数量、支持的功能等,只有支持这个协议才能被以太坊认可。
erc20标准代码如下
//
ERC20 {
()(单位);
()(单位);
(_to,uint)(布尔值);
(_from,_to,uint)(布尔值);
(,uint)(布尔值);
(,)(单位);
事件(_from,_to,uint);
事件(,,uint);
:表示发行的代币总量():该方法可以返回代币总数
name:发行token的名称:token发行后,token交易的最小单位
():该方法输入钱包地址后返回钱包的token余额。
() :将余额从一个地址发送到另一个地址
():允许您从您的账户转移余额
():允许从您的账户余额中转账。多次调用将覆盖可用金额。某些 DEX 函数需要此函数
event():token转移完成后触发
event():( , )调用后触发
编写代币合约:
^0.4.12;
{
(地址,nas)(布尔值);
/* 受 NAS 币启发 */
{
(x,y)(){
z=x+y;
((z >= x) && (z >= y));
顆;
(x,y)(){
(x >= y);
z=x-y;
顆;
(x,y)(){
z=x*y;
((x == 0)||(z / x == y));
顆;
令牌 {
;
()();
(_to,)(布尔值);
(_from,_to,)(布尔值);
(,)(布尔值);
(,)();
事件(_from,_to,);
事件 (imToken, , );
/* ERC 20 代币 */
是令牌{
(_to,)(布尔值){
如果([消息]> = &&> 0){
[消息]-=;
[_到] += ;
(消息, _to, );
真的;
} 别的 {
错误的;
(_来自,_到,)(布尔值){
如果([_from] >= && [_from][msg.] >= && > 0){
[_到] += ;
[_来自] -= ;
[_来自][消息] -= ;
(_来自,_到,);
真的;
} 别的 {
错误的;
()(){
[];
(,)(布尔){
[消息][] = ;
(消息,,);
真的;
(,)(){
[][];
( => );
( => ( => ));
是 , {
//
名称 = “”;
=“BCoin”;
= 18;
=“1.0”;
//
; //ETH存储地址
; // 代币更新地址
//
bool; // 状态切换为 true
;
;
; // 当前销售数量
= 0; //售出的代币总数
= 0; // 交易的代币总数
= 625; // 625 兑换 1 ETH
//
事件(_to,);//分配的私人交易令牌;
事件(_to,);//公开出售的代币;
事件 ( );
事件 ( );
事件(_to,);
//转换
()(){
*10**;
//
(
,
)
=;
= false; //控制预啤酒状态
= 0;
= 0;
=();
=();
[消息] = ;
如果(>)则抛出;
(){(消息。==);_;}
/// 设置代币汇率
(){
如果(==0)抛出;
如果(==)则抛出;
=;
/// @dev 代币超额发行
(){
值 = ();
如果 (值 + > ) 则抛出;
=(,值);
(价值);
/// @dev 被盗令牌处理
(){
值 = ();
如果 (值 + > ) 则抛出;
=(,值);
(价值);
/// 开始块检测异常处理
(,){
如果()抛出;
如果 ( >= ) 则抛出;
如果(block. >= )抛出;
=;
=;
=真;
/// 关闭块异常处理
(){
如果(!)抛出;
=假;
/// 开发了新的合约来接收代币(或更新代币)
(){
如果(==)则抛出;
=;
/// 设置新主人地址
()(){
如果(==(0x0))抛出;
=;
///将代币转移到新合约
(){
如果()抛出;
如果(==(0x0))抛出;
= [消息];
如果(==0)抛出;
[消息] = 0;
=(,);
=();
如果(!。(msg。,))抛出;
(msg., ); // 记录它
/// 将 ETH 转给团队
(){
如果 (this. == 0) 抛出;
如果(!.send(this.))抛出;
/// 将令牌分配给预处理地址。
(_addr,_eth){
如果 (_eth == 0) 抛出;
如果 (_addr == (0x0)) 则抛出;
= ((_eth), );
如果 ( + > ) 则抛出;
=(,);
[_地址] += ;
(_addr, ); // 记录 token 日志
/// 购买代币
(){
如果(!)抛出;
如果 (msg.value == 0) 则抛出;
如果(块。<)抛出;
如果(块。>)抛出;
=(消息.值,);
如果 ( + > ) 则抛出;
=(,);
[消息] += ;
(msg., ); //记录日志
上述代币合约是基于已经ICO并产生价值的以太坊代币合约,功能齐全、功能强大,通过该合约创建的代币具备“交易”、“转账”、“异常检测”、“更改代币持有者”、“设置汇率”、“被盗处理”、“代币超发”等功能。
(解释:在以太坊的世界里,硬通货就是ETH,相当于现实世界的黄金,我们发行的代币就相当于各国发行的需要和黄金挂钩的货币,国家对货币有控制权,只要扩展合约功能,创建代币的人也就拥有了对代币的控制权。)
(关于挖矿的误区:很多小伙伴以为挖矿就是挖币,其实挖矿就是挖区块,区块有什么用呢?就是用来打包交易,存储数据的。代币是不需要挖的,你挖到一个区块,代币就是你的奖励,在一定发行量的情况下,代币会越来越少,所以挖一个区块的奖励也会越来越少,奖励少了为什么还要挖矿?因为你的任何一笔交易都需要记录,一个区块的大小只有几MB,不可能存储那么多的交易信息,所以你还要继续挖区块来记录你的交易,同时交易费也会奖励给挖出区块的人。)
部署合约:
部署合约有多种方式 1 geth 编译代码---部署合约
2 使用钱包部署合约
3 最简单直观的部署合约方式:使用Remix IDE部署合约
我们按照Remix IDE来部署合约。
1:创建钱包账户。它是一种钱包,在浏览器中,可以安装插件,安装完成后右上角会出现一个“狐狸头”的标志,点击标志即可打开钱包。第一步是创建账户。(创建账户只需要输入密码,创建后名字可以随意改,账户是一个哈希值,给创建的账户充值,可以去网站,按照提示购买以太坊,然后转到创建的账户上。)创建成功后以太坊和比特币区块链钱包,记住密码和生成的几个随机词(一定要记下来)。如下:
2:打开Remix IDE访问地址:#=false&=-v0.4.21+..js界面如下
3:将“编写Token合约”后面的代码复制到Remix IDE中,并进行编译,如下所示
4:发布如下
5 之后,生成哈希值,复制哈希值,并将代币添加到钱包
OK,如上图,第一个真正属于你的去中心化数字货币诞生了,正式网的部署方式和测试网一样,不需要购买ETH。
如果是测试网络,如何获取ETH?下面输入,直接发送你的账户地址(hash值),一般五分钟到账,获得五个测试网络的ETH币。
6(如果你部署的是eth主网,而不是测试网,请执行此步骤,忽略测试网)
代币发布后,如果以后想进行ICO,需要发布源代码,步骤如下
① 复制部署成功的合约地址(hash),在右上角搜索hash
② 按照以下方式进行AND