830 large

建立自己的数字货币 (一)

flfq · 于 发布 · 最后由 jameswang回复 · 1792 次阅读

本文介绍如何利用以太坊智能合约建立自己的代币。
这篇文章来源于以太坊官网中的材料,本文是作者通过阅读材料,亲自试验后写的中文版材料,仅供初学者参考。
本文不是对原文进行完整的翻译,主要是作者消化后整理出来的文档,需要看原文的请直接访问原文地址https://ethereum.org/token

1、什么是代币?

代币是利用以太坊的智能合约编写的数字货币。程序员可以通过编写智能合约代码,创建一种新的数字货币。
你可以实现的功能:
-(基本功能)创建数字货币,设置货币的名称、货币总量、货币图标等基本参数。
-(基本功能)创建货币交易功能。实现货币在不同用户之间的转移。
(上面的是基本功能,已经可以实现基本的代表交换,下面是高级功能,可以实现更加复杂的应用)
-(高级功能)创建货币的管理者。虽然区块链是去中心化的,但是可以实现合约的管理者,这在许多应用中是有需求的。
-(高级功能)实现数字货币的黑白名单。通过设置黑白名单,可以冻结某些账户。资产仍在账户,但是不允许交易。
-(高级功能)实现货币增发。就如同美联储狂印钞票一样,你作为货币的创建者,也可以实现货币增发的功能,可以在原有货币总量以外,增加额外的钞票。(想想都是很激动了)
-(高级功能)实现挖矿。比特币、以太币的挖矿机制非常出名,矿工、矿机、矿池等概念大家都很熟悉。你可以在自己的货币中实现挖矿机制,奖励实现挖矿目的的用户一些代币。我目前还没有想到这个功能的用处,但是读这部分的内容有助于理解比特币、以太币的挖矿机制。
-(高级功能)实现代币和其他货币的自动兑换。你可以在自己的货币中实现代币与其他数字货币的兑换机制。这个很激动人心哦,你可以像银行一样收交易费啦。例如,买入代币的价格是1ETH,卖出代笔的价格是0.8ETH,这意味着每个代币的流入流出,你可以收取0.2ETH的交易费。是不是很激动,前提是你要忽悠大家用你的代币。
-(高级功能)实现gas的自动补充。以太坊中的交易时需要gas汽油(实际上就是eth)。为了解决某些用户没有ETH,只有代币的情况,可以设计自动补充gas的功能。这个功能将使你的代币更加好用。(用的人越多,收交易费越多,嘿嘿)
以上就是网页中提到的功能。实际上通过学习这些功能的写法,你能够设计出更多的功能。

本文主要介绍如何实现代币的基本功能,后续功能在下一篇文章中写。

2、实现步骤

从简单入手,首先实现一个包含基本功能的代币。只需实现代币定义和交易功能。
实现代币的过程是编写智能合约的代码。智能合约你可以理解为是一种程序,类似于C,C++。不要怕,这种语言很好懂,稍微看看就懂啦。
下面是完整的代码,可以直接部署。
-------------------------------------我是分割线,不要拷贝我-----------------------------------------

/* contract 类似于C++中的类 */
contract MyToken {
/* 设置一个数组存储每个账户的代币信息 */
mapping (address => uint256) public balanceOf;

/* 设置变量 */

/* name 代币名称 */
/* symbol 代币图标 */
/* decimals 代币小数点位数 */
string public name;
string public symbol;
uint8 public decimals;

/* event事件,它的作用是提醒客户端发生了这个事件,你会注意到钱包有时候会在右下角弹出信息 */
event Transfer(address indexed from, address indexed to, uint256 value);

/* 下面这个类似于C++的构造函数,接收用户输入,实现代币的初始化 */
function MyToken(uint256 initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) {
balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens
name = tokenName; // Set the name for display purposes
symbol = tokenSymbol; // Set the symbol for display purposes
decimals = decimalUnits; // Amount of decimals for display purposes
}

/* 代币交易的函数 */
function transfer(address _to, uint256 _value) {
/* 检查发送方有没有足够的代币 */
if (balanceOf[msg.sender] < _value || balanceOf[_to] + _value < balanceOf[_to])
throw;

/* 交易过程,发送方减去代币,接收方增加代币 */
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;

/* 提醒客户端发生了交易事件 */
Transfer(msg.sender, _to, _value);
}
}

-------------------------------------我是分割线,不要拷贝我---------------------------------------------
下面是部署方式,我使用以太坊钱包mist部署合约。
为了节省资金,我使用以太坊测试网络,测试网络是可以用以太坊钱包挖矿的,挖矿难度不大,我已经挖到20个了。做实验够用了。如果你实在挖不到币的话,请在下方留下你的地址,我可以资助你1个以太币做实验(是测试网络的以太币哦)。
其他方式有很多,这里不讲。我觉得初学者用mist最简单。下面是部署的界面。

这个页面是以太坊钱包“CONTRACTS”页面,点击"contract de"按钮就能看见。
图片的最上面是给合约输入以太币,目前不用设置,保持0即可。图中央的左侧是放置代码的地方,将拷贝的代码粘贴到这里即可。右侧的红圈位置可以选择合约,请点击下拉框选择“My Token”。选择以后,会出现图片上的样子,这里可以输入代币的总数(Initial supply),代币的名称(Token name),代币的小数点数目(Decimal units),代币的符号(Token symbol)。你可以按照图上的来填,也可以试着随便填,理解用途。
填写完成后,点击最下面的“DEPLOY”按钮,如果成功,则在钱包主页面可以看到合约正在等待验证,如果失败,会提示原因,请检查输入。

如果你的网络正常,通常1分钟内合约就验证通过,这是可以在以太坊钱包“CONTRACTS”页面看到我们建立的代币TESTCOIN.

上图标红的就是我建立的代币,点击进入代币的管理页面。

这个图就是我建立的代币的管理页面,这个页面可以查看合约持有的代币数量,每个用户持有的代币数量,执行代币交易等等。
图中左侧可以查看代币的基本信息,名称,小数点位数,符号。
图中左侧标红的位置可以查看指定用户代币的持有数量,只需将指定用户的地址填入红圈中的位置,即可自动显示。
图中右侧是代币的交易函数,可以进行代币交易。
“Select function”,这个选择transfer函数
“To-address”,这个是指接收代币用户的地址
"Value",发送代币数量
“Execute from”,这个地方可以选择发送方的地址。
点击“EXECUTE”按钮,就可以发送。

收到货币的人想要查看代币,只需要在“CONTRACTS”页面的"Watch token"输入对应的代币合约地址即可。

截止到这里,一个具备基本功能的代币就实现了。这个代币可以用于积分管理,简单的交易。
等后续实现更多功能后,可以有更多用途。

  • 5 large
    shaoping

    赞。http://ethfans.org/topics/118 这里也有一个。能把另外两个后续教程也写成帖子吗?

  • 830 large
  • 128
    nescc

    hi 我正按你的方法做实验,挖矿中……能资助我1个以太币吗?谢谢!
    我的以太坊(测试)钱包: 0x28e0A4E7f3a7B9E03c7b012E922A924f4262177a

  • 128
    speex

    正在down区块数据,期望能被资助一个测试以太币,谢谢!
    以太坊(测试)钱包:0xA54236c83b49d866954c1E44298879Ce548cC5e0

  • 128
    nescc

    第一段代码,贴过去之后显示编译错误: Error: e.message.replace is not a function

  • 830 large
    flfq

    @nescc 已发送给你2个ETH,请查收。另外,谢谢指出问题,我已经重新修改了代码。现在没问题了。

  • 830 large
    flfq

    @speex 已转给你2个ETH,请查收

  • 128
    speex

    @flfq 已经收到,谢谢啦!赞...

  • 128
    ccster

    代码编译错误的问题也遇到了,是其中几行的注释格式有问题。能求一个ETH吗 0xbB6aB17B9073BBE6F5a06F30DeeAb2A1EBB67747

  • 830 large
    flfq

    @ccster 您好,代码编译错误的问题我已经修改。我开始的时候不太会用这个网站的编辑器,有些符号被过滤了。现在已经修改,测试可用。另外,已经给您的账号转账2ETH,请查收。有问题继续交流哈。

  • 128
    ccster

    @flfq 已经收到,非常感谢哈

  • 128
    nescc

    @flfq 嗨~我的测试账户里目前余额还是0.00,好像没有没有收到ETH,会是我还没有同步完blocks的原因么?我看了看有一百多万个就没有同步……

  • 128
    nescc

    WALLET CONTRACTS 需要创建么?

  • 830 large
    flfq

    @nescc 需要同步完才能看。不需要创建。发的是以太币,等你同步完直接能看到。只有智能合约写的代币才需要watch contracts

  • 128
    linble

    你好,能否赏赐1个以太币.
    我的以太坊(测试)钱包:0x51b44bFe0CFbAEc10804daF0f5C507134f54dDaE

  • 830 large
    flfq

    @linble 已经给您转账10个ETH(测试),请查收

  • 51 large
    rubyu2

    @flfq @linble
    可以到这里 http://faucet.ma.cx:3000/ ,免费生成测试链的ETH

  • 830 large
    flfq

    @rubyu2 谢谢,这个网站挺好

  • 128
    linble

    @flfq 已收到~万分感谢

  • 128
    2816207yhy

    mark!!!!!!!!!!!!!!!!!!!!!!!!

  • 128
    demon28

    大哥,有没有QQ交流群?

  • 128
    deng

    我需要测试的以太币,麻烦各位大师兄赏一两个,谢谢:0x16b2B27f07C64f2a797CDD1367Cb2Ea5E3230bA5

  • 128
    awq6699

    我需要测试的以太币,学习用,谢谢:0x57Af1A9fABF9A66B31CCF80922b974cdd00CC36C

  • 128
    lifeng

    我需要测试的以太币,学习用,谢谢!
    0xF5429Fd1Dac83D7CaE36778063182008AF62A07C

  • 128
    jinsheng

    我最近在使用mist钱包,请给我发个测试网络的以太币,多谢!
    0x2aB93f88C5b4De08039Ec0b6252989573814f6e0

  • 128
    eos1

    我在使用mist钱包,我需要测试网络的以太币,谢谢 ,
    0xED7cEB63A420d6c20143e771e2F828e65e6d9d40

  • 128
    zjc

    楼主您的代码不对啊!

    我修改之后的

    pragma solidity ^0.4.18;

    /* contract 类似于C++中的类 /
    contract MyToken {
    /
    设置一个数组存储每个账户的代币信息 */
    mapping (address => uint256) public balanceOf;

    /* 设置变量 */

    /* name 代币名称 /
    /
    symbol 代币图标 /
    /
    decimals 代币小数点位数 */
    string public name;
    string public symbol;
    uint8 public decimals;

    /* event事件,它的作用是提醒客户端发生了这个事件,你会注意到钱包有时候会在右下角弹出信息 */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /* 下面这个类似于C++的构造函数,接收用户输入,实现代币的初始化 */
    function MyToken (uint256 initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) public{
    balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens
    name = tokenName; // Set the name for display purposes
    symbol = tokenSymbol; // Set the symbol for display purposes
    decimals = decimalUnits; // Amount of decimals for display purposes
    }

    /* 代币交易的函数 /
    function transfer (address _to, uint256 _value) public{
    /
    检查发送方有没有足够的代币 */
    if (balanceOf[msg.sender] < value || balanceOf[_to] + _value < balanceOf[to])
    {return;}

    /* 交易过程,发送方减去代币,接收方增加代币 */
    balanceOf[msg.sender] -= value;
    balanceOf[
    to] += _value;

    /* 提醒客户端发生了交易事件 */
    Transfer(msg.sender, _to, _value);
    }
    }

  • 128
    allen2018

    我需要测试的以太币,麻烦兄弟赏一两个,谢谢:0xf7F9c31C501dfEfF3eDAF81D3644774B19f1E222

  • 830 large
    flfq

    @zjc 用以太坊官网的代码,这个帖子是16年发的,语法已经变了

  • 830 large
    flfq

    @allen2018 ,我这里没了,自行安装metamask,点击buy,可以免费领取ropsten测试网的币。

  • 128
  • 128
    jameswang

    楼主能不能送个测试的币 谢谢
    0xcE9d8372113DE921a65D8c0ba4D91E7dF0c65b77
    或者教我下怎么挖的