聽說虛擬幣很火,我也想造一個(初級版)
配圖:自己造個幣玩玩,可能是瞭解虛擬貨幣架構的最好方法
最近關於ICO(首次代幣發售)的事情可謂火爆至極,什麼是ICO,什麼是區塊鏈(Blockchain),想必很多人已經瞭解。
當然,在虛擬貨幣火爆的同時,也有不少人渾水摸魚,濫用“區塊鏈”的概念。比方說市面上很多資金盤,既沒有真正應用區塊鏈的思想,有沒有真正的專案作為支撐,只憑一紙白皮書,就吸到幾千萬甚至幾億的資金。
說ICO有泡沫,這個沒錯,不僅有,而且泡沫大得很。但我們也可以換個角度想,為何會爆炒ICO?因為去中心化貨幣的內在價值有目共睹,這一點我們也不能否認。因此,渾水摸魚的終將一地雞毛,而真正有價值的虛擬貨幣則會因其稀缺性而越做越強。
那麼,如何在紛繁雜亂的虛擬幣中找到真正有價值的產品呢?隨便看兩個帖子並不是一個好辦法,甚至有可能誤導你的選擇。只有真正理解其中的思想和架構,從根本上明白區塊鏈的意義和作用,才能讓你在這個領域中游刃有餘。
配圖:關於虛擬貨幣的意義,個人意見,用一副米開朗基羅的《創世紀》概括了
此文章不敢妄稱教程,只是經過一段時間的研究,個人有一些心得,逐步寫成了幾篇文章,在此分享給大家。
這一篇講的是:
如何構造自己的虛擬幣?(初級版)
我們將要創造的虛擬幣是基於以太幣生態圈的一種可交易的等價物,由於各個虛擬幣的基本特徵與原則類似,所以我們創造的幣可以兼容於以太幣錢包以及相同標準下的其他合約。
本文工具:Ethereum Wallet
一,基礎架構
一個虛擬幣合約可能非常複雜,但想創造一個最簡單的幣並非難事。
Contract MyToken{
mapping (address => uint256) public balanceOf;
function MyToken(uint256 initialSupply){
balanceOf[msg。sender] = initialSupply;
}
function transfer(address _to, uint256 _value){
require(balanceOf[msg。sender] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);
balanceOf[msg。sender] -= _value;
balanceOf[_to] += _value;
}
}
這裡的mapping實質上是一個關聯陣列,包含了你的地址和財產。形式為{Tom的地址:100個幣,Bob的地址:50個幣}。
MyToken(uint256 initialSupply)則是一個建構函式,建立幣的時候需要輸入一個初始供應量的值。
transfer(address _to, uint256 _value)這個函式用於轉賬,輸入對方的地址和要轉賬的數量,系統會先用require確認傳送者是否有足夠的幣以及傳送的數額是正數。然後在傳送者的賬戶扣除相應數額的幣並新增到接收者的賬戶。
二,新增更多內容
接下來,我們可以嘗試著為這個貨幣新增更多的內容,首先把最基本的一段放在這裡。
contract MyToken{
mapping(address => uint256) public balanceOf;
}
如果只用上面這段程式碼,編譯器可以透過,但不會產生任何實際效果。目前這個幣只允許你調取任何一個地址的財產。因為你並沒有真正建立一個幣,所以調取任何地址都會返回0。
因此,我們首先要建立一個建構函式,用它來產生一些幣。
function MyToken(){
balanceOf[msg。sender] = 100,000,000;
}
建構函式只執行一次,用於初始化一個類。因此contract MyToken和function MyToken的名字一定要保持一致。執行完這個函式後,deploy此合約的使用者就會獲得自己的1億個幣。當然,為了方便後期調整,建構函式還可以寫成這樣:
function MyToken(uint256 initialSupply){
balanceOf[msg。sender] = initialSupply;
}
等執行的時候我們再傳值進去。接下來,加入transfer這個函式,具體內容剛剛我們提過了。
function transfer(address _to, uint256 _value){
require(balanceOf[msg。sender] >= _value);
require(balanceOf[_to] + _value >=balanceOf[_to]);
balanceOf[msg。sender] -= _value;
balanceOf[_to] += _value;
}
接下來,我們要開始完善這個Coin了。
一個contract就像java,python等語言中的類一樣,有一些自己的屬性值。比如名字、符號等等。我們也可以依據自己的喜好來給貨幣新增。
string public name;
string public symbol;
uint8 public decimals;
每次初始化contract的時候,要給這些屬性值賦值。
function MyToken(uint256 initialSupply, string tokenName, string tokenSymbol, uint8 decimalUnits){
balanceOf[msg。sender] = initialSupply;
name = tokenName;
symbol = tokenSymbol;
decimals = decimalUnits;
}
最後,我們要給我們的Coin加一些事件進去。事件是一個很有意思的設定,其本身不會對執行結果有任何影響,只是幫助使用者跟蹤自己的交易行為。
event Transfer(address indexed from, address indexed to, uint256 value);
把在執行相應函式的時候,同時呼叫一次事件,就會讓客戶得到相應的反饋。
function transfer(address _to, uint256 _value){
require(balanceOf[msg。sender] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);
balanceOf[msg。sender] -= _value;
balanceOf[_to] += _value;
Transfer(msg。sender, _to, _value);
}
現在,一個可以執行的Coin完成了,點選Deploy,你就擁有了自己的電子幣,像比特幣、萊特幣一樣公平買賣,永不增發。
1,下載以太幣錢包並登入
2,點選右側上方的CONTRACTS
3,複製貼上我們寫好的code
4,在右側給幣起個名字,設定好發多少
5,點選deploy
6,耐心等待一小會兒,你的幣就完成了
在剛建立好的時候,你擁有100%的幣。
想分享給朋友?同樣很簡單。
1,選擇send
2,選擇你傳送的幣種
3,貼上你朋友的地址
4,點擊發送
需要注意的是,你發給你的朋友之後,他不會立即看到。所有人都只能看到自己觀察列表中的幣,所以對方需要:
1,點選contract
2,選擇觀察列表
3,貼上你的合約地址
4,點選確定
這樣,他就可以看到你發給他的幣了。
到這裡,你已經擁有了自己的虛擬貨幣!
最後想提到的幾點:
1,完全版程式碼已經寫好,篇幅原因不方便貼在上面,需要的話可以回覆您的郵箱給我。
2,參考連結:
https://www。
ethereum。org/token
3,進階版有的,高階版有的,夢魘版也有的。
4,感興趣的朋友歡迎找我討論,互相切磋一起學習。一熊目前研究最多的是海外ICO領域。
5,喜歡的話,可以關注一下微訊號,上面有更多內容
aHR0cDovL3dlaXhpbi5xcS5jb20vci9xVXpVMEViRVVZNHRLUUt6YnhrdA== (二維碼自動識別)