提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
伴随着区块链概念的普及,衍生了大量的区块链项目,很多都没有什么太大的技术含量,我们一起来探究一下“发币”是如何进行的,了解原理学习知识,防止盲目被“割”。
提示:以下是本篇文章正文内容,下面案例可供参考
绝大部分其实就是erc20。
ERC-20是以太坊网络的一种代币合约标准。
那么什么是erc20呢?
ERC-20是一种标准。
在ERC-20标准里规定了Token需要有它的名字、符号、总供应量以及包含转账、汇款等其他功能。这个标准带来的好处是:只要Token符合ERC-20标准,那么它将兼容以太坊钱包。也就是说,你可以在你的以太坊钱包里加入这个Token,还可以通过钱包把它发送给别人。
正因为ERC-20标准的存在,使得发行Token变得很简单。目前,以太坊上ERC-20 Token的数量超过了180000种。
二、探究技术含量
1.工具? ?
?MetaMask俗称“小狐狸”,它是一个钱包也是交互的工具。我们可以在360浏览器,或者是谷歌,用插件的方式简便安装。
?Remix,是一种在线编程工具,使用的是solidity语言。
http://remix.ethereum.org/
当然可以自己搜索,有中文版
2.实现方法
小狐狸准备好,打开Remxi,这里注意一下,打开小狐狸有网络的选择,想在什么地方发,就在对应的网上部署,但是必须有网络认可的代币(作为矿工费),例如以太坊就用eth,火币生态就用ht。
好,接下来打开Remix实现部署。
起一个名字
旁边代码粘贴上去
?
pragma solidity ^0.4.26;
//kql yc
interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }
contract TokenERC20 {
string public name; // ERC20标准
string public symbol; // ERC20标准
uint8 public decimals = 2; // ERC20标准,decimals 可以有的小数点个数,最小的代币单位。18 是建议的默认值
uint256 public totalSupply; // ERC20标准 总供应量
// 用mapping保存每个地址对应的余额 ERC20标准
mapping (address => uint256) public balanceOf;
// 存储对账号的控制 ERC20标准
mapping (address => mapping (address => uint256)) public allowance;
// 事件,用来通知客户端交易发生 ERC20标准
event Transfer(address indexed from, address indexed to, uint256 value);
// 事件,用来通知客户端代币被消费 ERC20标准
event Burn(address indexed from, uint256 value);
/**
* 初始化构造
*/
function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {
totalSupply = initialSupply * 10 ** uint256(decimals); // 供应的份额,份额跟最小的代币单位有关,份额 = 币数 * 10 ** decimals。
balanceOf[msg.sender] = totalSupply; // 创建者拥有所有的代币
name = tokenName; // 代币名称
symbol = tokenSymbol; // 代币符号
}
/**
* 代币交易转移的内部实现
*/
function _transfer(address _from, address _to, uint _value) internal {
// 确保目标地址不为0x0,因为0x0地址代表销毁
require(_to != 0x0);
// 检查发送者余额
require(balanceOf[_from] >= _value);
// 确保转移为正数个
require(balanceOf[_to] + _value > balanceOf[_to]);
// 以下用来检查交易,
uint previousBalances = balanceOf[_from] + balanceOf[_to];
// Subtract from the sender
balanceOf[_from] -= _value;
// Add the same to the recipient
balanceOf[_to] += _value;
Transfer(_from, _to, _value);
// 用assert来检查代码逻辑。
assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
}
/**
* 代币交易转移
* 从自己(创建交易者)账号发送`_value`个代币到 `_to`账号
* ERC20标准
* @param _to 接收者地址
* @param _value 转移数额
*/
function transfer(address _to, uint256 _value) public {
_transfer(msg.sender, _to, _value);
}
/**
* 账号之间代币交易转移
* ERC20标准
* @param _from 发送者地址
* @param _to 接收者地址
* @param _value 转移数额
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(_value <= allowance[_from][msg.sender]); // Check allowance
allowance[_from][msg.sender] -= _value;
_transfer(_from, _to, _value);
return true;
}
/**
* 设置某个地址(合约)可以创建交易者名义花费的代币数。
*
* 允许发送者`_spender` 花费不多于 `_value` 个代币
* ERC20标准
* @param _spender The address authorized to spend
* @param _value the max amount they can spend
*/
function approve(address _spender, uint256 _value) public
returns (bool success) {
allowance[msg.sender][_spender] = _value;
return true;
}
/**
* 设置允许一个地址(合约)以我(创建交易者)的名义可最多花费的代币数。
*-非ERC20标准
* @param _spender 被授权的地址(合约)
* @param _value 最大可花费代币数
* @param _extraData 发送给合约的附加数据
*/
function approveAndCall(address _spender, uint256 _value, bytes _extraData)
public
returns (bool success) {
tokenRecipient spender = tokenRecipient(_spender);
if (approve(_spender, _value)) {
// 通知合约
spender.receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}
/**
* 销毁我(创建交易者)账户中指定个代币
*-非ERC20标准
*/
function burn(uint256 _value) public returns (bool success) {
require(balanceOf[msg.sender] >= _value); // Check if the sender has enough
balanceOf[msg.sender] -= _value; // Subtract from the sender
totalSupply -= _value; // Updates totalSupply
Burn(msg.sender, _value);
return true;
}
/**
* 销毁用户账户中指定个代币
*-非ERC20标准
* Remove `_value` tokens from the system irreversibly on behalf of `_from`.
*
* @param _from the address of the sender
* @param _value the amount of money to burn
*/
function burnFrom(address _from, uint256 _value) public returns (bool success) {
require(balanceOf[_from] >= _value); // Check if the targeted balance is enough
require(_value <= allowance[_from][msg.sender]); // Check allowance
balanceOf[_from] -= _value; // Subtract from the targeted balance
allowance[_from][msg.sender] -= _value; // Subtract from the sender's allowance
totalSupply -= _value; // Update totalSupply
Burn(_from, _value);
return true;
}
}
//qkl yc
?然后,左侧第2个编译,然后点击Compile
?3.编译成功就运行
当然要配置参数,有3个,
INITIALSUPPLY是数量
TOKENNAME是名字
TOKENSYMBOL是代币的符号
?
?然后,添加就好了。
总结
本期从技术层面科普了市场上空气币的实现原理,技术是用来改变生活的,应该是区块链赋予实体经济,改变生活,而不是扰乱生活。希望理性对待。
另外注意国内禁止ICO
2017年9月4日下午3点,中国人民银行领衔网信办、工信部、工商总局、银监会、证监会和保监会等七部委发布《关于防范代币发行融资风险的公告》(以下简称公告),《公告》指出代币发行融资本质上是一种未经批准非法公开融资的行为,要求自公告发布之日起,各类代币发行融资活动立即停止,同时,已完成代币发行融资的组织和个人做出清退等安排。
|