當前位置:
首頁 > 最新 > 如何在以太坊上發行數字貨幣

如何在以太坊上發行數字貨幣

本文參考 ethereum token ,以發行數字貨幣為案例,介紹solidity語言和以太坊編程。


一、數字貨幣

在以太坊,Token可以用來表示各種可以交易的商品: 數字貨幣、積分、證書、IOU、遊戲虛擬物品等。這些Token在實現上有一些共性,可以提煉成通用介面,這樣以太坊錢包和其他的一些應用也可以兼容使用這些共性。


要實現一個標準的合約,會相當複雜。我們由淺入深,先實現一個非常簡單的合約。


我們從最簡單的合約代碼開始。

這裡定義了一個餘額Map,注意的要點:

address: 是指賬戶地址,16進位格式的。

uint256: 2^256 = 10^77 無符號整數,指賬戶餘額,基本能滿足各路壕的需求。

public: 所有賬戶餘額都是公開的。鏈上任何人都可以查詢其他人的賬戶餘額。

如果這個合約能夠正常發布出來,它就可以正常的工作,但是沒什麼用。 只是一個能夠查詢餘額的合約,其他什麼事都做不了,包括獲取一個數字貨幣。 所有賬戶餘額都返回0。 所以我們需要在啟動的時候,預置一些數字貨幣進來。 於是有這麼幾行代碼:

這是一個構造函數,方法名和類名是一樣的。 構造函數僅僅在這個合約被部署到網路上的時候運行一次。它將給msg.sender,即發布這個合約的人,設置餘額。 21000000是一個任意設定的數字。 當然,也可以將這個數字作為參數來傳進來。

這樣在部署的時候,比如使用Ethereum Wallet來部署,就他會讓你選擇這個初始參數的值。

現在至少已經有一個賬戶擁有初始數字貨幣餘額了。接下來就需要添加一個方法,讓這些數字貨幣能夠交易。

這是一個相當直觀的方法:

_to: 收款人的賬戶地址;

_value: 送出的金額。

實現也很簡單,就是增減收付款人的賬戶餘額。 但這個實現是有問題的,如果出款人賬戶餘額不足怎麼辦? 還有就是如果收款人是個土豪,再接收一筆巨款,就把賬戶打爆了,怎麼辦? 所以我們需要增加一個校驗。 校驗的代碼並不複雜,問題是,如果校驗發現參數確實有問題,那應該怎麼辦? 在以太坊上,終止程序執行有兩種方法:

直接通過return來返回某個錯誤信息。 這會節省一點gas,但也有個頭疼的問題, 已經執行的代碼產生的任何變更,都會被保存到鏈上。

通過throw 來拋出異常, 這會將本次產生的所有變更都回滾,但也會導致發送者的gas都被消耗。 不過Wallet能夠檢測出來可能拋的異常,他會顯示一個警告,避免以太幣被浪費掉。

這個合約本身還需要一些基本信息。 以後我們會通過Token註冊表來處理這些合約,現在我們先直接上代碼吧。

修正下構造函數,添加上述合約信息。

最後,我們需要設置一些「事件」。 這是以太坊特有的,它可以讓以太坊錢包這樣的應用來跟蹤合約上發生的活動。 所有事件的第一個字元必須是大寫的,並且放在合約代碼的起始部分。

這裡我們設置了一個轉賬的事件。然後在轉賬代碼實現的最後,發出這個事件。

And then you just need to add these two lines inside the 「transfer」 function:

這樣,一個合約就開發完成了。


和java一樣,solidity也支持注釋標籤,比如@notice和@param。這些注釋可以讓以太坊錢包等應用可以將注釋的內容顯示給用戶。 這裡有關於注釋的詳細說明。


現在這個加密貨幣可以上線了。可我們總要折騰,把這個貨幣做的更有意思一點。


在基礎功能上,我們還有很多事情要做,比如approve, sendFrom等功能。

考慮這麼一個場景: 把數字貨幣賣給交易所,不可能就把數字貨幣發送到交易所給的賬號就完事了, 他們還得知道是誰發的數字貨幣,也不會去訂閱這些事件。 所以,我們需要增加如下支持:

增加批准approve功能,批准交易所從你的賬戶裡面扣款。

或者更進一步,提供approveAndCall功能,在approve之後,通知交易所做後續的事情。

在這些待實現的功能裡面, 轉賬是最基本的公用功能。 我們把它修改為內部函數,供其他方法實現時調用。

這是一個非常危險的方法,一不小心錢就沒了。 所以調用這個transfer方法需要非常謹慎,確保要經過許可才可以。


所有的Dapps默認是非集中式管理。 這並非意味著不能做集中管理。 如果需要控制能夠獲取數字貨幣的人, 控制數字貨幣的使用,這就得需要集中式的管理。 我們可以用一個賬戶,或者一個合約來控制, 使用的策略,可以是民主的投票,也可以採用限制數字貨幣所有者的權力的方式。 針對這些場景,我們需要使用到合約的一個非常有用的屬性:inheritance。 合約的繼承屬性使得它可以得到父合約的所有特性,而且不需要重新定義。

這裡創建一個非常簡單的,申明數字貨幣owner的合約。 然後就把自己發行的數字貨幣關聯過來:

這意味著在MyToken裡面所有的方法都可以使用owner這個屬性和可以繼承的方法onlyOwner。 並且可以調用transferOwnership這個方法來修改所有者。 注意一下onlyOwner的實現,有一個「-」標識,子類需要覆蓋實現這個方法時,子類的函數體將放在這裡。 可以在MyToken的構造函數裡面增加這個參數來設置owner:


在現實中,貨幣的總量不是恆定的,往往會隨著經濟的發展而不斷地增加。 央行會不斷注入流動性, 印鈔廠開足馬力印刷鈔票… 就數字貨幣而言,我們也希望能夠像央行那樣進行管控,根據價格的增減而控制貨幣總量。 我們來看看這個怎麼做。

首先,我們需要有一個欄位來存儲總供應鏈:totalSupply, 並且在構造函數中初始化:

添加一個方法來印鈔造幣:

注意,這個方法後面的onlyOwner, 表示它將覆蓋實現父類中的modifier onlyOwner這個方法。 這是和其他語言不一樣的地方,可以對覆蓋的方法重新命名,甚至修改輸入輸出參數。 在編譯時,這個方法的實現會替換到onlyOwner的」_「位置。


在實踐中,有時候需要對數字貨幣做一些管控,凍結或者解凍賬戶就是常見的操作。

在這個實現中,我們假定所有賬戶剛開始都是未凍結狀態。 之後,可以通過freezeAccount指令來凍結賬戶,或者解凍賬戶。 此外,我們還需要修改下transfer方法,轉賬之前,需要確認賬戶是否沒有凍結。

這樣,凍結後, 賬戶的餘額是不變的,但無法執行轉賬操作。 這種方式是默認賬戶都是未凍結狀態,可以轉賬。 還有一個場景是默認賬戶都是凍結的,只有白名單中的賬戶才可以轉賬。這種情況下,我們只要把frozenAccount方法替換成approvedAccount,並將上述實現替換成驗證賬戶:


到目前為止,我們這個新幣種還是自己內部循環使用,體現不出價值來。 最簡單的給數字貨幣定價的方法,就是和以太幣掛鉤起來。 提供一個方法,可以在市場上以市場價自動買賣,就和本外幣交換一樣。

首先,我們需要定一個買賣的牌價:

對於幣值波動不大的貨幣,這種做法是可以接受的。畢竟每一次調整幣值都需要耗費一定的以太幣。 如果要設置固定的幣值, 可以考慮研究下 standard data feeds 然後實現下貨幣買賣的功能:

注意,這種方式並不會創建新的數字貨幣, 只是在原始賬戶和數字貨幣owner之間做了轉賬。 合約既可以持有自己的token,也可以持有以太幣。 但不管是設置幣值,還是投放新幣,都無法接觸真正的銀行發行的貨幣,或者以太幣。 合約能做的事情就是在自己的貨幣體系中轉移貨幣。

注意, 幣值並非以Ether為單位來設置,一般是使用wei單位,即以太幣的最小單位來設置。 一個ether等於10^18個wei,所以如果貨幣是以ether來定價,那需要加18個0轉成wei定價。 在創建合約的時候,注意要湊集足夠的以太幣作為準備金來應對可能的兌換,否則這個貨幣會由於無法兌換而沒人買了。 這個例子描述了一個簡單的中心化的交易中心來買賣數字貨幣。一個更有意思的市場應該是任何人都可以出不同的價格來買賣貨幣。


在以太坊體系中,每一次交易或者合約都需要支付一定的費用(Gas), 以後有可能會調整這個策略。 到目前為止,挖礦費用還只能通過以太幣來支付,這樣所有的數字貨幣用戶就需要使用以太幣來完成合約或者交易。 這樣的話,用戶體驗就不好了。我們希望數字貨幣用戶在交易時,也能夠直接使用數字貨幣,不需要去考慮以太幣、區塊鏈以及如何獲取以太幣。 一個可行的方法是需要自動監測賬戶餘額,如果餘額不足,就禁止交易。

這樣,需要首先創建一個閾值變數,並提供一個方法來修改這個變數。 這個變數初始值設置為5 finney (0.005 Ether),即約等於一筆交易用的Gas。

之後,修改transfer方法, 對售幣用戶做充值。

或者直接把費用支付給sender。

這就確保了這些賬戶不會由於餘額不足而導致交易失敗。


在工作量證明體系中(POW, Proof of Work), 一個簡單的方法是實現和以太幣一起「合併挖礦」,即礦工不僅獲得以太幣簡歷,也會同時得到新數字貨幣的獎勵。 參考這裡special keyword coinbase 來了解如何獲取某個入鏈區塊的礦工賬戶。

當然,也可以嘗試去設置一些數據難題,任何人解決這個問題就可以獲取數字貨幣獎勵。 在下一個例子中,你需要計算一個挑戰數據的立方根, 計算成功後,獲取獎勵,並設置下一個挑戰數據。

當然,計算立方根,對人來說可能比較難,但對計算機來說是很容易的事情。 由於最後一個贏家可以選擇下一個挑戰數據,他們可以選擇一個對自己有利的數據,這樣對其他礦工來說是不公平的。 這種POW的計算公式,最好是選擇對計算機來說,有計算難度,但是很容易驗證計算結果的公式。 比特幣和以太坊使用的計算哈希值的方式可以說是目前最好的數據難題了。 如果我們要在新的幣種中使用哈希計算作為數據難題, 可以參考如下代碼:

需要修改下構造函數, 添加初始值:

一旦這個合約開始上線運行, 需要選擇一個工作量證明公式, 並設置合適的nonce值。 如果收到「Data can』t be execute」, 則說明 nounce設置不合理,重新調整下。 直到賬戶能夠每分鐘收到1個數字貨幣為止,之後計算難度會每10分鐘自動調整一次。 這就是挖礦的過程。


最終版本的代碼如下:

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 鳳凰牌老熊 的精彩文章:

多元化金融業務體系建設實踐

TAG:鳳凰牌老熊 |