发ERC20代币如此简单,你还敢乱买吗?
说来,楼主进入币圈也快一年了。
身为程序员的我,在年初学习了智能合约编程,同时也知道当下绝大部分代币都是基于以太坊的ERC20代币。
按理说我早该研究下发币的合约,更别提自己有些数字货币的投资,买的币种就是ERC20的代币。
原因没别的,就一个字,懒!
但从本质上来说是出于认知上的懒惰而跳跃性假设,总以这事不“重要”,++投资最重要的是看人++来推脱?
而最近接二连三爆出的大佬们的录音和撕逼过程,让我大跌眼镜的同时,也在重新建立对数字货币投资的底层认知。
这不,在看了发ERC20代币合约后,我重新建立的认知就是其实一切ERC20代币都是空气币,你所相信的只是项目方背书。
为什么这么说呢?
那实在是因为写个发币合约,实在是太简单了。
不信,那直接上代码吧。
pragma solidity ^0.4.11;
contract XXToken {
string public name = "xx"; // token name
string public symbol = "xxx"; // token symbol
uint256 public decimals = 6; // token digit
mapping (address => uint256) public balanceOf; //balance of each address
mapping (address => mapping (address => uint256)) public allowance;
uint256 public totalSupply = 0;
bool public stopped = false;
uint256 constant valueFounder = 100000000000000000; // token amount
address owner = 0x0;
modifier isOwner {
assert(owner == msg.sender);
_;
}
modifier validAddress {
assert(0x0 != msg.sender);
_;
}
function XXToken(address _addressFounder) {
owner = msg.sender;
totalSupply = valueFounder;
balanceOf[_addressFounder] = valueFounder;
Transfer(0x0, _addressFounder, valueFounder);
}
function transfer(address _to, uint256 _value) validAddress returns (bool success) {
require(balanceOf[msg.sender] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) validAddress returns (bool success) {
require(balanceOf[_from] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);
require(allowance[_from][msg.sender] >= _value);
balanceOf[_to] += _value;
balanceOf[_from] -= _value;
allowance[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) validAddress returns (bool success) {
require(_value == 0 || allowance[msg.sender][_spender] == 0);
allowance[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
区区60多行的代码,可以发出价值数亿美元的代币,这真的是含金量最高的代码了,泪感以前写的那些代码都太廉价了。
我知道对于非程序员来说,还是一脸蒙逼,甚至觉得写代码的真是高深莫测。
但是楼主想和你说,其实真没有。一切的核心就在于这行代码:
mapping (address => uint256) public balanceOf; //balance of each address
大家可以把address理解为账户,uint256理解为账户余额,所有持有这个代币账户的数量都存在这个balanceOf里,它和我们理解的银行的储蓄账户从功能上来说是一样的。
持币数量的数据共识则是由以太坊这个通用状态机来保证的。
从这点来看以太坊是很牛逼,以太坊上的ERC20代币合约本质上就是一个应用。
纯粹从代码上来说,你持有的ERC20代币和积分其实区别不大,无非是数字是不可篡改而已。
我们相信这个代币,一方面是相信以太坊保证数据不可篡改;另一方面相信的就是项目方的信用背书了,但这个背书是很骨感的。
即使项目方是真的想做事,但是事情也不一定做成呀?
即使事情做成了,但这件事是否真的能带来愿景里许诺的价值、获得市场的认可,充满了很多的不确定性?
是投资还是投机?请仔细思考,不要自欺欺人。
有些匆忙,先写到这里。
最后,如果你想查看一个项目的发币合约,可以访问https://etherscan.io/tokens,然后按照如下步骤就可以看到代码了。


