主页 > imtoken钱包劫持 > 以太坊代币ERC20代币发行实战教程

以太坊代币ERC20代币发行实战教程

imtoken钱包劫持 2023-01-18 16:27:59

从2017年到2018年,币圈可谓无限。很多初创公司利用区块链噱头通过ICO筹集了大量资金,主要以ETH作为筹资来源。但2018年下半年以来,政府监管力度加大,币价大幅下跌,跳水幅度超过90%。 80-90%的区块链公司已经倒闭,幸存的公司也在勒紧裤腰带过日子。

以太坊代币ERC20通证发行实战教程

现在给大家分享一个发币的源码教程,供大家学习学习。完整示例可以在 Github 上找到。

示例图如下所示。

以太坊代币ERC20通证发行实战教程

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

以太坊代币ERC20通证发行实战教程

此时合约地址为0x0e9c86de934ab71375d52d25f4534aa75c915c46,与web3交互时需要用到。

接下来我们编写web3交互测试代码,通过HttpProvider进行交互。

通过设置“开始私募”,打开成功后,刷新页面,会自动显示“结束私募”字样,表示已经成功。

这里需要注意的是,合约中的ethFundDeposit应该设置为metamask的第一个账户地址,以免混淆。

切换第二个账号,我会买10个eth。

以太坊代币ERC20通证发行实战教程

再买1eth,如下

以太坊代币ERC20通证发行实战教程

刷新当前页面,已正确显示合约当前的eth余额。

以太坊代币ERC20通证发行实战教程

我们的账户里有多少MYI代币erc20代币是什么意思,我们来看看,在地址栏输入我的账号就知道了

以太坊代币ERC20通证发行实战教程

可见,正确解法显示我的MYI代币数量。

这个例子只展示了最简单的核心操作,其他功能可以在此基础上扩展。完整代码可在 Github 上获得。