主页 > imtoken钱包劫持 > 以太坊代币ERC20代币发行实战教程
以太坊代币ERC20代币发行实战教程
从2017年到2018年,币圈可谓无限。很多初创公司利用区块链噱头通过ICO筹集了大量资金,主要以ETH作为筹资来源。但2018年下半年以来,政府监管力度加大,币价大幅下跌,跳水幅度超过90%。 80-90%的区块链公司已经倒闭,幸存的公司也在勒紧裤腰带过日子。
现在给大家分享一个发币的源码教程,供大家学习学习。完整示例可以在 Github 上找到。
示例图如下所示。
ERC20 代币
ERC20 与代币一起出现erc20代币是什么意思,ERC20 是以太坊定义的代币标准。这是发行代币合约必须遵守的协议。协议规定了几个参数——发行币种名称、简称、发行数量、支持的功能等,只有协议支持才会被以太坊识别。
ERC20标准代码如下
contract Token { uint256 public totalSupply;//总供应量 function balanceOf(address _owner) internal returns (uint256 balance); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom(address _from, address _to, uint256 _value) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external returns (uint256 remaining); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); }
我们定义了一个合约MyToken用于外部调用,主要是和web3交互。继承SafeMath、StandardToken、合约,防止整数溢出等可能导致的合约安全
string public name;//代币名称 string public symbol;//代币符号 uint256 public decimals;//小数点后位数 uint256 public constant total = 1024000000;//总供应量,eg. 1024W,10亿2千4百万 string public version = "1.0"; // contracts address public ethFundDeposit = 0x76B7d9f1d76f60dB46345C4DFcD57FfB45C59e0c; // ETH存放地址 address public newContractAddr; // token更新地址 // crowdsale parameters bool public isFunding; // 状态切换到true uint256 public fundingStartBlock; uint256 public fundingStopBlock; uint256 public currentSupply; // 正在售卖中的tokens数量 uint256 public tokenRaised = 0; // 总的售卖数量token uint256 public tokenMigrated = 0; // 总的已经交易的 token uint256 public tokenExchangeRate = 10000; // 1 ETH = (n)个代币,兑换率
我们默认的合约提现地址是0x76B7d9f1d76f60dB46345C4DFcD57FfB45C59e0c。如果以后地址变了,可以通过交互来修改。发行总量为total=1024000000。这个总金额不变,合同(合同)上写得很清楚。
部署合约时可以填写代币名称和代币符号以及准确的小数位。 isFunding、fundingStartBlock、fundingStopBlock 控制了本次代币私募的开始和结束,由区块号控制。
由于tokens的组成,精度一般由小数点后的位数决定,会有0.000001个tokens。因此,初始代币的发行和流通必须先转化为精准。
function formatDecimals(uint256 _value) internal view returns (uint256 ) { return _value * 10 ** decimals; }
调用方法如
currentSupply = formatDecimals(_supply);
totalSupply = formatDecimals(total);
你无法想象币圈的疯狂。如果流通中的币提前卖出或私募需要暂停或销毁,我们会使用2个函数来处理:
/// @dev 超发token处理 function increaseSupply (uint256 _value) isOwner external { uint256 value = formatDecimals(_value); require (value + currentSupply <= totalSupply); currentSupply = safeAdd(currentSupply, value); /// emit event log emit IncreaseSupply(value); } /// @dev 被盗token处理 function decreaseSupply (uint256 _value) isOwner external { uint256 value = formatDecimals(_value); require (value + tokenRaised <= currentSupply); currentSupply = safeSubtract(currentSupply, value); emit DecreaseSupply(value); }
概述,本合约创建的代币,有“交易”、“转账”、“异常检测”、“更改代币持有者”、“设置汇率”、“被盗处理”、“过度发行代币”和其他功能。
通过truffle将合约部署到测试网络
> truffle compile --all > truffle migrate --reset
此时合约地址为0x0e9c86de934ab71375d52d25f4534aa75c915c46,与web3交互时需要用到。
接下来我们编写web3交互测试代码,通过HttpProvider进行交互。
通过设置“开始私募”,打开成功后,刷新页面,会自动显示“结束私募”字样,表示已经成功。
这里需要注意的是,合约中的ethFundDeposit应该设置为metamask的第一个账户地址,以免混淆。
切换第二个账号,我会买10个eth。
再买1eth,如下
刷新当前页面,已正确显示合约当前的eth余额。
我们的账户里有多少MYI代币erc20代币是什么意思,我们来看看,在地址栏输入我的账号就知道了
可见,正确解法显示我的MYI代币数量。
这个例子只展示了最简单的核心操作,其他功能可以在此基础上扩展。完整代码可在 Github 上获得。