发ERC20代币如此简单,你还敢乱买吗?

2018-07-14  本文已影响51人  海之方

说来,楼主进入币圈也快一年了。

身为程序员的我,在年初学习了智能合约编程,同时也知道当下绝大部分代币都是基于以太坊的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,然后按照如下步骤就可以看到代码了。

1.png
2.png 3.png
上一篇 下一篇

猜你喜欢

热点阅读