预先准备

* 以太坊钱包 <https://www.myetherwallet.com/>
* 一定数量的eth余额
* MetaMask <https://metamask.io/>
Token的参数

在发行之前首先要考虑Token的参数,譬如这篇教程准备发行如下Token

* Token的名称:Dylan Token
* Token的标识:DT
* 发行量:19940512
* Token的小数位:18
编写合约

想要基于以太坊拥有自己的Token,需要通过智能合约的形式去发行,编写如下基于ERC20的solidity代码:
pragma solidity ^0.4.18; library SafeMath { /** * @dev Multiplies two numbers,
throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns
(uint256) {if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b);
return c; } /** * @dev Integer division of two numbers, truncating the
quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256)
{// assert(b > 0); // Solidity automatically throws when dividing by 0 uint256
c = a / b;// assert(a == b * c + a % b); // There is no case in which this
doesn't hold return c; } /** * @dev Substracts two numbers, throws on overflow
(i.e. if subtrahend is greater than minuend). */ function sub(uint256 a,
uint256 b) internal pure returns (uint256) {assert(b <= a); return a - b; } /**
* @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256
b) internal pure returns (uint256) { uint256 c = a + b;assert(c >= a); return
c; } } contract ERC20Basic { function totalSupply()public view returns
(uint256); function balanceOf(address who)public view returns (uint256);
function transfer(address to, uint256 value)public returns (bool); event
Transfer(address indexed from, address indexed to, uint256 value); } contract
BasicToken is ERC20Basic { using SafeMathfor uint256; mapping(address =>
uint256) balances; uint256 totalSupply_;/** * @dev total number of tokens in
existence */ function totalSupply() public view returns (uint256) { return
totalSupply_; }/** * @dev transfer token for a specified address * @param _to
The address to transfer to. * @param _value The amount to be transferred. */
function transfer(address _to, uint256 _value)public returns (bool) {
require(_to != address(0)); require(_value <= balances[msg.sender]); //
SafeMath.sub will throw if there is not enough balance. balances[msg.sender] =
balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);return true; } /** * @dev Gets the balance of
the specified address. * @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address. */
function balanceOf(address _owner)public view returns (uint256 balance) { return
balances[_owner]; } } contract ERC20 is ERC20Basic { function
allowance(address owner, address spender)public view returns (uint256);
function transferFrom(address from, address to, uint256 value)public returns
(bool); function approve(address spender, uint256 value)public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
} contract StandardToken is ERC20, BasicToken { mapping (address => mapping
(address => uint256)) internal allowed;/** * @dev Transfer tokens from one
address to another * @param _from address The address which you want to send
tokens from * @param _to address The address which you want to transfer to *
@param _value uint256 the amount of tokens to be transferred */ function
transferFrom(address _from, address _to, uint256 _value)public returns (bool) {
require(_to != address(0)); require(_value <= balances[_from]); require(_value
<= allowed[_from][msg.sender]); balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] =
allowed[_from][msg.sender].sub(_value); Transfer(_from, _to, _value);return true
; }/** * @dev Approve the passed address to spend the specified amount of
tokens on behalf of msg.sender. * * Beware that changing an allowance with this
method brings the risk that someone may use both the old * and the new
allowance by unfortunate transaction ordering. One possible solution to
mitigate this * race condition is to first reduce the spender's allowance to 0
and set the desired value afterwards: *
https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param
_spender The address which will spend the funds. * @param _value The amount of
tokens to be spent. */ function approve(address _spender, uint256 _value) public
returns (bool) { allowed[msg.sender][_spender] = _value; Approval(msg.sender,
_spender, _value);return true; } /** * @dev Function to check the amount of
tokens that an owner allowed to a spender. * @param _owner address The address
which owns the funds. * @param _spender address The address which will spend
the funds. * @return A uint256 specifying the amount of tokens still available
for the spender. */ function allowance(address _owner, address _spender) public
viewreturns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase
the amount of tokens that an owner allowed to a spender. * * approve should be
called when allowed[_spender] == 0. To increment * allowed value is better to
use this function to avoid 2 calls (and wait until * the first transaction is
mined) * From MonolithDAO Token.sol * @param _spender The address which will
spend the funds. * @param _addedValue The amount of tokens to increase the
allowance by. */ function increaseApproval(address _spender, uint _addedValue)
public returns (bool) { allowed[msg.sender][_spender] =
allowed[msg.sender][_spender].add(_addedValue); Approval(msg.sender, _spender,
allowed[msg.sender][_spender]);return true; } /** * @dev Decrease the amount of
tokens that an owner allowed to a spender. * * approve should be called when
allowed[_spender] == 0. To decrement * allowed value is better to use this
function to avoid 2 calls (and wait until * the first transaction is mined) *
From MonolithDAO Token.sol * @param _spender The address which will spend the
funds. * @param _subtractedValue The amount of tokens to decrease the allowance
by. */ function decreaseApproval(address _spender, uint _subtractedValue) public
returns (bool) { uint oldValue = allowed[msg.sender][_spender]; if
(_subtractedValue > oldValue) { allowed[msg.sender][_spender] =0; } else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); }
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);return true; } }
contract Token is StandardToken { stringpublic name = "Dylan Token"; string
public symbol = "DT"; uint8 public decimals = 18; uint256 public constant
INITIAL_SUPPLY =19940512; function Token() public { totalSupply_ =
INITIAL_SUPPLY * (10 ** uint256(decimals)); balances[msg.sender] =
totalSupply_; } }
需要修改Token的名字name、标识symbol、发行量INITIAL_SUPPLY和小数位decimals的,直接在合约Token中修改相应的变量即可。

编译部署合约

打开Remix-Solidity IDE <https://remix.ethereum.org/>,一种在线的Solidity IDE。
将上述的三个合约代码导入至Remix中,点击start to compile进行编译。

编译完成后切换到Run,下拉框选择Token,点击Deploy进行部署

之后会弹出确认transaction的面板,拖到最下面点击confirm

MetaMask会弹出,确认交易,点击submit

稍等片刻,交易被确认,会出现下图红框所示的合约地址,复制到剪贴板
教程中Dylan Token合约地址为:0x89731a2ddcef82a268d8925327c4080229914f05

再进入MetaMask,点击Tokens——AddToken,粘贴复制的合约地址,点击Add

就可以在自己的钱包中看到刚刚发行的Token了

认证合约代码

注意:此步骤需科学上网,不然提交之前的验证码显示出不来。
在以太坊区块浏览器 <https://etherscan.io/>中找到自己的合约地址,点击Contract code——Verify and
Publish,如下图所示

在Contract name:的输入框输入部署的合约名称Token, Compiler 选择在remix的sttings 中Solidity version
显示的版本号。Optimization 选择 No。 然后在Enter the Solidity Contract Code below
下面的输入框中原样填入Remix中的代码

完成后点击提交,如果通过验证,跳转之后会显示如下图红框内所示的successfully的字样

至此Token发行教程完结。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信