圈钱跑路 发行自己的ERC20 Token
發行自己的ERC20 Token
這次主要實現 發行一個自己的ERC20 標準的 Token. (然后進行ICO, 圈錢跑路, 走上人生巔峰,XD)
其實把Token 叫做代幣, 容易讓人產生誤解.實際上是一種憑證, 只是被現在狂熱的人們攪渾了.
Token的持有人可以完全控制資產,遵守ERC20的token可以跟蹤任何人在任何時間擁有多少token.
前
現在幣圈的狂熱之勢四起, 昨天一個朋友, 發來一串神秘代碼, 說轉賬有 3000多的糖果.
這里偷偷的放一下地址, 可以去玩玩..
ENU: 0x275b69AA7c8C1d648A0557656bCe1C286e69a29d
這個轉賬記錄還真是來勢洶洶. 然后就好奇的 用瀏覽器 看了看合約代碼
string public constant name = "Enumivo"; string public constant symbol = "ENU"; uint public constant decimals = 8;uint256 public totalSupply = 1000000000e8; uint256 public totalDistributed = 100000000e8; uint256 public totalRemaining = totalSupply.sub(totalDistributed); uint256 public value;這個 totalSupply 是不是相當驚人… 這個估計是用來測試的合約, 不知道被誰發現了來.
所以, 這玩意這么火, 這次就自己實現一個!
ERC20 Token標準
實現這樣的一個token 實際上還是使用Solidity語言編寫的合約來實現, 只是合約的形式符合了ERC20 的標準. 這樣就可以被區塊瀏覽器識別成一個 Token.
官方標準 ERC-20 Token Standard
手冊里說明了代碼的應有的函數和成員 (看E文 還是難受, 找到了一篇譯文, 不過是機翻的, 看著玩吧)
以太坊ERC20 Token標準完整說明
合約的框架如下
// https://github.com/ethereum/EIPs/issues/20 // 接口標準contract ERC20 {function totalSupply() constant returns (uint totalSupply); // 總發行量function balanceOf(address _owner) constant returns (uint balance);function transfer(address _to, uint _value) returns (bool success); // 代幣分發(注意, 這個只有合約的Creator 可以調用)function transferFrom(address _from, address _to, uint _value) returns (bool success); // 這里是擁有者和擁有者之間的代幣轉移function approve(address _spender, uint _value) returns (bool success);function allowance(address _owner, address _spender) constant returns (uint remaining);event Transfer(address indexed _from, address indexed _to, uint _value);event Approval(address indexed _owner, address indexed _spender, uint _value);// Token信息string public constant name = "4FunCoin";string public constant symbol = "4FC";uint8 public constant decimals = 18; // token的精度, 大部分都是18 }Token實現代碼
下面就是自己的token的實現代碼, 其實我們根據官方的合約框架進行填充, 這里對代碼進行注解.
pragma solidity ^0.4.16;interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; } // token的 接受者 這里聲明接口, 將會在我們的ABI里contract TokenERC20 { /*********Token的屬性說明************/string public name = 4FunCoin;string public symbol = 4FC;uint8 public decimals = 18; // 18 是建議的默認值uint256 public totalSupply; // 發行量// 建立映射 地址對應了 uint' 便是他的余額mapping (address => uint256) public balanceOf; // 地址對應余額mapping (address => mapping (address => uint256)) public allowance;event Transfer(address indexed from, address indexed to, uint256 value);event Burn(address indexed from, uint256 value);// 這里是構造函數, 實例創建時候執行function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {totalSupply = initialSupply * 10 ** uint256(decimals); // 這里確定了總發行量balanceOf[msg.sender] = totalSupply; // 這里就比較重要, 這里相當于實現了, 把token 全部給合約的Creatorname = tokenName;symbol = tokenSymbol;}// token的發送函數function _transfer(address _from, address _to, uint _value) internal {require(_to != 0x0); // 不是零地址require(balanceOf[_from] >= _value); // 有足夠的余額來發送require(balanceOf[_to] + _value > balanceOf[_to]); // 這里也有意思, 不能發送負數的值(hhhh)uint previousBalances = balanceOf[_from] + balanceOf[_to]; // 這個是為了校驗, 避免過程出錯, 總量不變對吧?balanceOf[_from] -= _value; //發錢 不多說balanceOf[_to] += _value;Transfer(_from, _to, _value); // 這里觸發了轉賬的事件 , 見上eventassert(balanceOf[_from] + balanceOf[_to] == previousBalances); // 判斷總額是否一致, 避免過程出錯}function transfer(address _to, uint256 _value) public {_transfer(msg.sender, _to, _value); // 這里已經儲存了 合約創建者的信息, 這個函數是只能被合約創建者使用}function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {require(_value <= allowance[_from][msg.sender]); // 這句很重要, 地址對應的合約地址(也就是token余額)allowance[_from][msg.sender] -= _value;_transfer(_from, _to, _value);return true;}function approve(address _spender, uint256 _value) publicreturns (bool success) {allowance[msg.sender][_spender] = _value; // 這里是可花費總量return true;}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;}}// 正如其名, 這個是燒幣(SB)的.. ,用于后面把多token 燒掉function burn(uint256 _value) public returns (bool success) {require(balanceOf[msg.sender] >= _value); // 必須要有這么多balanceOf[msg.sender] -= _value;totalSupply -= _value;Burn(msg.sender, _value);return true;}// 這個是用戶自焚.....function burnFrom(address _from, uint256 _value) public returns (bool success) {require(balanceOf[_from] >= _value); // 一樣要有這么多require(_value <= allowance[_from][msg.sender]); // balanceOf[_from] -= _value;allowance[_from][msg.sender] -= _value;totalSupply -= _value;Burn(_from, _value);return true;} }通過以上代碼,就算是實現了一個符合ERC20 標準的Token, 通過讀代碼,也是學到了其具體實現, 代碼的總結,在后面實現吧.
這次主要是實現這個token的部署.
Token合約部署
上面實現了一個token的代碼, 現在需要的是把他部署到以太坊網絡上去.
這里我們使用官方的IDE REMIX
環境:
- firefox
- REMIX
- mateMask
由于實際上我們的合約部署是需要消耗ether的, 所以這里我們選擇以太坊的測試網絡, 這樣不會消耗主網資源, 利國利民
創建測試錢包
這里已經在ropsten網絡上創建了一個錢包, 注意左上角的網絡選擇是 Ropsten網絡就好, 然后我們創建自己的錢包, 這個很簡單, 就不多講
現在錢包是有了, 沒幣呀. 不慌! 沒幣,我們要去, 由于是測試網絡, 所以這些東西就很隨便了, 有水龍頭,給我們免費發放!
Ethereum Ropsten Faucet
直接在上面的地址直接領就好, (要是現在的行情, 點一下7000塊呢 嘿嘿嘿)
編譯合約代碼
打開我們的在線IDE, 貼上代碼
REMIX
上面會自動識別成 injected web3 (實際上這個js 是matemask在網頁進行注入了)
Create前面就是我們創建合約的構造函數的參數, 從左到右是發行量, 名字, 和 符號
1000, "AnFun", "AFC"之后點擊創建,會彈出mateMask的支付請求
畫外音:這里可見, 整個過程只用消耗GAS的費用, 可謂相當低 , 然而就這樣的東西, 堂而皇之的被各種利用, 成空氣幣!!!
點擊提交(submit), 我們會看到我們的支付記錄,
可見, 合約已經創建!
Token的添加和交易
打開我們的小狐貍, 在token的選項中, 點擊添加token, 把我們的合約地址(見上圖)填入, 自動的識別我們的信息, 再次刷新可見, 我的token 已經到手了!(圈錢跑路去 2333).
0xc67Cc41C6517d97df3DD1eCC7885c209fE04bFa8 這里給出地址, 想要的免費空投 2333
現在我們有了token了, 下面進行交易, 這里是使用
MY_WALLET 這個可不是錢包, 只是一個在線的接口
同樣的確認網絡一直, 找到Token 即可!
后面的話
也是通過這樣的一篇文章可見, 有些所謂的token是多么的黑暗.
參考出處
代碼參考
這里自己也是學習, 并且加上了注釋. 在下一篇, 詳細的寫寫上述代碼的 Solidity的知識
以后的博文將轉戰自己的博客 鏈接在此~ 也希望大家多多交流~
這里也是自己推的公眾號, 也可以關注一波~
總結
以上是生活随笔為你收集整理的圈钱跑路 发行自己的ERC20 Token的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宠物商店(pet-shop) 学习笔记
- 下一篇: 圈钱跑路 ERC20 Token 合约代