天天看點

以太坊智能合約項目-Token合約開發與部署

修訂日期

姓名

郵箱

2018-09-05

brucefeng

[email protected]

以太坊智能合約項目-Token合約開發與部署

以太坊錢包顧名思義,就是管理以太坊位址,存儲以太坊Token的工具,再簡單點說,任何區塊鍊網絡都需要我們有自己的賬戶,管理賬戶的軟體可稱之為錢包,無論是炒币的還是研究以太坊開發的,錢包都是必不可少的。

說到以太坊錢包,第一個要說的當然就是Ethereum官方錢包+浏覽器 Mist。Mist是一個全節點錢包(全節點錢包通俗的來說就是同步了全部的以太坊區塊資訊的錢包)。也就是說打開錢包後,電腦會自動同步全部的以太坊區塊資訊,如果裝置和網絡的條件過關的情況下,大概需要半天左右的時間。

以太坊智能合約項目-Token合約開發與部署
最新版下載下傳位址:https://github.com/ethereum/mist/releases/tag/v0.11.1
以太坊智能合約項目-Token合約開發與部署

MyEtherWallet 是一個輕錢包,無需下載下傳,在直接在網頁上就可以完成所有的操作。

https://www.myetherwallet.com/

MetMask是一個以太坊錢包插件,目前支援Google跟FireFox浏覽器,能夠幫助使用者友善地管理以太坊數字資産,支援所有的測試網絡和私有鍊網絡,是我們開發人員的必備錢包工具,下文将會講解如何安裝。

以太坊智能合約項目-Token合約開發與部署

原以太坊基金會部分成員開發的錢包,也是一個全節點錢包。

下載下傳位址: https://github.com/paritytech/parity-ethereum/releases

以太坊網絡中的賬戶和典型的區塊鍊賬戶沒有太大差別,都由位址、公鑰、私鑰 3 部分構成,不論使用何種錢包建立的以太坊賬戶,在不同的以太網網絡之間都是可以通用的,比如我在主網上建立了錢包賬戶,而切換到 任意 測試網絡,如Kovan時仍然可以使用同樣的賬戶,這種跨網絡通用的賬号機制實際上是内置在以太坊用戶端之内的。

以太坊智能合約項目-Token合約開發與部署

建立以太坊賬戶的方式有很多種,上文就提到了多種以太坊錢包,但我們要開發跑在浏覽器中的 DApp,錢包內建在浏覽器中就非常友善了,是以我們選擇MetaMask作為我們的開發環境的錢包工具。

以太坊智能合約項目-Token合約開發與部署
官方位址:https://metamask.io/ 點選GET CHROME EXTENSOIN跳轉至安裝界面
以太坊智能合約項目-Token合約開發與部署
點選右上角ADD TO CHROME
以太坊智能合約項目-Token合約開發與部署
點選添加擴充程式按鈕,等待安裝即可,安裝成功後,在浏覽器右上角可以有該圖示顯示!
以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署
打開MetaMask圖示,點選TRY IT NOW按鈕開始建立賬戶
以太坊智能合約項目-Token合約開發與部署
點選CONTINUE繼續
以太坊智能合約項目-Token合約開發與部署
建立密碼
以太坊智能合約項目-Token合約開發與部署
點選NEXT繼續
以太坊智能合約項目-Token合約開發與部署
将協定文字拖到最後,點選ACCEPT繼續
以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署
點選ACCEPT繼續
以太坊智能合約項目-Token合約開發與部署
重要: 點選
以太坊智能合約項目-Token合約開發與部署
擷取助記詞,将這12個英文字母抄寫在紙上,妥善儲存!
以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署
按照順序選擇助記詞進行确認,确認完畢
以太坊智能合約項目-Token合約開發與部署
點選VIEW ACCOUNT檢視賬戶位址與二維碼資訊
以太坊智能合約項目-Token合約開發與部署
可以根據需要,對賬戶名進行修改
以太坊智能合約項目-Token合約開發與部署

此時,錢包建立完畢,接下來,為了開發需要,我們需要為幾套測試環境申請測試ETH進行開發使用。

從上圖可以看到我們錢包可以切換的環境,除了Main Ethereum Network之外的Network節點均為測試節點。

以太坊可以搭建私有的測試網絡,不過由于以太坊是一個去中心化的平台,需要較多節點共同運作才能得到理想的測試效果,是以并不推薦自行搭建測試網絡。

以太坊公開的測試網絡共有4個,目前仍在運作的有3個。每個網絡都有自己的創世區塊和名字,按開始運作時間的早晚,依次為:

Morden(已退役)

Morden是以太坊官方提供的測試網絡,自2015年7月開始運作。到2016年11月時,由于難度×××已經嚴重影響出塊速度,不得不退役,重新開啟一條新的區塊鍊。Morden的共識機制為PoW。

Ropsten

Ropsten也是以太坊官方提供的測試網絡,是為了解決Morden難度×××問題而重新啟動的一條區塊鍊,目前仍在運作,共識機制為PoW。測試網絡上的以太币并無實際價值,是以Ropsten的挖礦難度很低,目前在755M左右,僅僅隻有主網絡的0.07%。這樣低的難度一方面使一台普通筆記本電腦的CPU也可以挖出區塊,獲得測試網絡上的以太币,友善開發人員測試軟體,但是卻不能阻止×××。

PoW共識機制要求有足夠強大的算力保證沒有人可以随意生成區塊,這種共識機制隻有在具有實際價值的主網絡中才會有效。測試網絡上的以太币沒有價值,也就不會有強大的算力投入來維護測試網絡的安全,這就導緻了測試網絡的挖礦難度很低,即使幾塊普通的顯示卡,也足以進行一次51%×××,或者用垃圾交易阻塞區塊鍊,×××的成本及其低廉。

2017年2月,Ropsten便遭到了一次利用測試網絡的低難度進行的×××,×××者發送了千萬級的垃圾交易,并逐漸把區塊Gas上限從正常的4,700,000提高到了90,000,000,000,在一段時間内,影響了測試網絡的運作。×××者發動這些×××,并不能獲得利益。

Kovan

為了解決測試網絡中PoW共識機制的問題,以太坊錢包Parity的開發團隊發起了一個新的測試網絡Kovan。Kovan使用了權威證明(Proof-of-Authority)的共識機制,簡稱PoA。

PoW是用工作量來獲得生成區塊的權利,必須完成一定次數的計算後,發現一個滿足條件的謎題答案,才能夠生成有效的區塊。

PoA是由若幹個權威節點來生成區塊,其他節點無權生成,這樣也就不再需要挖礦。由于測試網絡上的以太币無價值,權威節點僅僅是用來防止區塊被随意生成,造成測試網絡擁堵,完全是義務勞動,不存在作惡的動機,是以這種機制在測試網絡上是可行的。

Kovan與主網絡使用不同的共識機制,影響的僅僅是誰有權來生成區塊,以及驗證區塊是否有效的方式,權威節點可以根據開發人員的申請生成以太币,并不影響開發者測試智能合約和其他功能。

Rinkeby

Rinkeby也是以太坊官方提供的測試網絡,使用PoA共識機制。與Kovan不同,以太坊團隊提供了Rinkeby的PoA共識機制說明文檔,理論上任何以太坊錢包都可以根據這個說明文檔,支援Rinkeby測試網絡,目前Rinkeby已經開始運作。

以太坊智能合約項目-Token合約開發與部署
切換測試環境,點選DEPOSIT
以太坊智能合約項目-Token合約開發與部署
點選GET ETHER
以太坊智能合約項目-Token合約開發與部署
點選擷取1個ETH測試币,可以點選多次
以太坊智能合約項目-Token合約開發與部署
目前共計是11個,超出後報錯“User is greedy”,比較直白:使用者太貪了:-),如果測試币花不掉,也不要浪費,可以繼續傳回給測試币發送方。
以太坊智能合約項目-Token合約開發與部署
可以根據實際數量選擇捐贈的數量
以太坊智能合約項目-Token合約開發與部署
成功擷取到11個ETH測試币

打開了解跳轉至gitter聊天室中,可以通過github賬戶或者twitter賬戶進行登入,加入faucet聊天室後,發送自己的賬戶位址到聊天清單中,筆者申請的賬戶位址為<code>0x18850c9cE7B2274EbB0c78e6221844AC76715494</code>

效果如下

以太坊智能合約項目-Token合約開發與部署
筆者的github賬戶前幾天申請過,是以第一次申請的時候提示我最近剛剛申請過,更換了登入賬戶後成功。
以太坊智能合約項目-Token合約開發與部署
成功擷取到3個ETH測試币

這個環境的測試币申請稍微複雜一點,要求接受充值的賬戶持有人必須以太坊賬戶位址發送到自己的社交網絡中(如 Twitter、Facebook、Google Plus),同樣,該工具限制了充值的頻率;

複制MetaMask賬戶位址:<code>0x18850c9cE7B2274EbB0c78e6221844AC76715494</code>

打開google plus并登入:https://plus.google.com/

點選首頁-右下角按鈕

以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署
貼入賬戶位址,點選釋出
以太坊智能合約項目-Token合約開發與部署
點選按鈕公開分享
以太坊智能合約項目-Token合約開發與部署
複制連結位址

打開rinkeby的測試币擷取位址

以太坊智能合約項目-Token合約開發與部署
按需選擇
以太坊智能合約項目-Token合約開發與部署
網站已經擷取到請求,開始處理,等待片刻充值完畢
以太坊智能合約項目-Token合約開發與部署
擷取到18.75個ETH測試币

三套測試環境的測試币我們均已獲得,現在我們可以開始代碼設計工作了。

Token是區塊鍊實踐中的一個重要概念,有多重要呢?有觀點認為,Token可能是比區塊鍊更偉大的發明,是一個與“公司”比肩的偉大發明。區塊鍊是一個技術概念,Token是一個經濟概念;與“公司”一樣,Token帶來了全新的組織形式和協作形式。

Token早期的叫法為代币,但現在更适合的翻譯應該是“通證”。“通證”的概念超過了“代币”。通證是一種可流通的、加密的數字權益證明,這個權益,可以是财産、×××、學曆證書、鑰匙、門票、積分、榮譽、使用權等等任何事物。代币更像是資産的數字化,而通證則在此基礎上,同時包含了數字化的資産,将原本無法量化、無法記賬的東西,給量化、記賬。

Token目前有兩種,一種是在區塊鍊網絡中内置的,用于使用者之間的轉賬交易,并獎勵礦工,這種被了解為數字加密貨币,比特币就屬于這一種;另一種是在DApp或智能合約上自行鑄造的,用于内部交易,這種更接近“通證”這個含義。

看起來,Token跟股權有點類似,但其實這兩者的差别還是比較大的。Token比股權,最重要的就是多了流通憑證。股權隻是權益憑證,缺乏流動性,投資者如果對公司運作方式不認可,會通過董事會來施壓,而Token模式下,投資者如果對公司運作方式不認可,可以直接賣了token退出。這一點,對于傳統的投資模式,可能會有比較大的颠覆。VC行業也迅速做出了反應,市場上興起了一波數字币基金,與傳統VC在出資人、投資流程、項目管理和退出方面有明顯的差異。

綜上所述,Token作為一種權益證明,是數字的、加密的、可流通的。鑒于Token這麼多的優點和想象力,區塊鍊行業提出一個新概念,叫“通證經濟”,要把Token通證充分用起來,用通證來盤活人力、資本、項目、信用等生産要素,用新的利益機制,造就新的生産關系。這事兒如果能成,會激發指數級的創新,給我們的生産生活方式帶來巨大的改變。

Token的走紅,歸功于以太坊及其訂立的ERC20标準。基于這個标準,每一個人、每一家企業都可以在基于區塊鍊的平台上發Token,這個Token是自定義的,可以代表任何權益和價值。

ERC-20最初作為一種嘗試,旨在為以太坊(Ethereum)上的token合約提供一個特征與接口的共同标準,并且,它現在已經被證明是非常成功的了。ERC-20有很多好處,包括允許錢包顯示數以百計不同token的賬戶餘額;建立一個交易工具,隻需提供token合約的位址就可以将更多token列入表中。建立ERC-20相容token的好處很多,以至于在今天,很少有其他token合約用其他方式建立。

ERC是 Ethereum Request for Comment 的縮寫,Request for Comment 是征求大家意見的意思,大家都希望 Ethereum 網絡的未來技術走向不要集中在幾個硏發人員的手裡, 是以才開放給大家提出 Proposals (建議), 用來改進 Ethereum, 決定未來開發方向. 這就是每個人每件跟 Ethereum 未來發展有關的事情, 都能用 EIP 建議格式 (EIP template) 提出來. 隻要被大家選上, 就會正式列入 EIPs 清單。

而且, 你會看到 EIP 定義或讨論 issues 裡, 常常會看到它相關的 ERC, 也就是, 讨論過程中, 有一些要征求更多人意見時, 就會把它細節定義放在 ERC 裡. 而且他們會用同一個号碼, 比如 ERC-20就是對應到 EIP-20.

簡單講, 讨論項目, 一開始會用 EIP 提出建議, 結果與細節會定義在 ERC, 最後會 final (拍闆定案), 放在 EIP 清單裡 Finalized EIPs 區.

關于EIP-20(ERC-20 Token Standard)的标準說明可以直接參考官方文檔,英文能力強的直接看原文即可。

為了節約讀者時間,本文直接在代碼設計這部分對該标準進行解讀,便于讀者更好地了解如何使用标準去設計開發自己的Token合約。

首先,我們看簡單看一下現在主流的一些Token的項目介紹,我個人比較關注也比較看好火币Pro,是以姑且用HT給大家進行直覺化的了解。

此處僅為學習交流,不代表任何炒币觀點,如果讀者有火币的人脈資源,倒是可以幫筆者引薦引薦。
以太坊智能合約項目-Token合約開發與部署

以上資訊中,我們姑且先關注一下總量: 500,000,000 HT,其他資訊均為交易所資訊,暫時不關注,現在,我們開始通過ERC20标準實作我們自己的Token合約。

首先定義一個合約EIP20Interface,将ERC20标準中需要實作的所有方法與事件全部進行引用,作為Token合約的父合約,用于被其他合約內建使用。

請嚴格參照3.規範解讀中的英文網頁進行對比檢視,我們此處将網頁中需要實作的方法全部貼入代碼中,在下面會依次實作。
建立一個新合約名為BFCToken作為子類內建EIP20Interface合約中的所有方法。

在合約标準中,通過<code>function name() view returns (string name);</code>實作,由于這些變量是存儲固定資訊的變量,不參與任何運算,隻為顯示所需,是以,通過public類型進行聲明即可自動提供變量值的擷取方法,這是行業内的正常做法,大家可以先參考實作,是以,我們将擷取這四個參數的函數都先注釋掉。

這兩個變量非常重要,請仔細思考

balances 存儲賬戶餘額

如balance["0xca35b7d915458ef540ade6068dfe2f44e8fa733c"]=10000

allowances 允許轉出的金額

請仔細參考以上講解說明,此處均為被動轉賬模式。

通過該函數定義部署Token合約時的傳入參數
查詢指定位址擁有該Token的數量
轉賬:從自己賬戶向位址<code>_to</code>位址轉入<code>_value</code>個Token

實作轉賬準許:approve

允許<code>_spender</code>從自己(合約調用方msg.sender)賬戶轉走<code>_value</code>個Token

實作準許金額檢視:allowance

查詢目前位址<code>_owner</code>(msg.sender)可以被<code>_spender</code>位址多少個Token

建立被動轉賬函數:transferFrom

調試環境: JavaScript VM

在将代碼正式部署到以太坊測試網絡前,我們先在JavaScript VM環境進行部署并進行調試

以太坊智能合約項目-Token合約開發與部署
填寫Token初始化參數,需要注意,發行總量=<code>_TotalSupply/_decimals</code>,此處發行了100000個BFC
以太坊智能合約項目-Token合約開發與部署
直接擷取參數值
以太坊智能合約項目-Token合約開發與部署
部署成功

為了讀者能夠理順後面的位址之間的關系,此處先進行說明

部署合約的賬戶位址(下文簡稱為位址A): <code>0xca35b7d915458ef540ade6068dfe2f44e8fa733c</code>

以太坊智能合約項目-Token合約開發與部署

生成的Token合約位址(下文簡稱為位址B): <code>0xdc04977a2078c8ffdf086d618d1f961b6c546222</code>

以太坊智能合約項目-Token合約開發與部署

用于轉入Token的賬戶位址(下文簡稱為位址C):<code>0x14723a09acff6d2a60dcdf7aa4aff308fddc160c</code>

(可以從JavaScript VM環境的賬戶中選擇一個即可)

以太坊智能合約項目-Token合約開發與部署
在代碼測試過程中,這幾個位址千萬不要混淆,位址B目前不需要使用,但部署到以太坊網絡後需要使用,此處先作個鋪墊。
以太坊智能合約項目-Token合約開發與部署
查詢位址A的Token餘額
以太坊智能合約項目-Token合約開發與部署
查詢位址B的Token餘額

注意點: 務必保證轉賬賬戶需要選擇正确

以太坊智能合約項目-Token合約開發與部署
從位址A給位址B轉賬1888個Token
以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署
位址B給位址A轉賬88個Token
以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署

其實被動轉賬這個概念是筆者自己定義的,讓别人從自己這邊取走東西,可以簡單了解為被動,如此定義隻是為了講解的友善。

建立準許規則

以太坊智能合約項目-Token合約開發與部署
位址A允許位址B轉走800個Token

檢視準許金額數量

以太坊智能合約項目-Token合約開發與部署

<code>allowance中填寫: "0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"</code>

檢視位址B能從位址A中轉出多少Token

此時位址A與位址B的餘額分别為

執行轉賬操作

以太坊智能合約項目-Token合約開發與部署
位址B從位址A中轉出230個Token,注意執行合約的Account是位址B
以太坊智能合約項目-Token合約開發與部署
此時,位址B能從位址A中轉出的Token餘額為570,位址B的Token餘額增加了230

此時,Token合約代碼測試基本完畢,可以部署到以太坊網絡中。

測試環境:本文選擇使用Rinkeby環境進行合約部署
以太坊智能合約項目-Token合約開發與部署
選擇對應的測試環境跟賬戶,填寫對應的Token合約參數,總量為10萬
以太坊智能合約項目-Token合約開發與部署
确認部署
以太坊智能合約項目-Token合約開發與部署
部署确認
以太坊智能合約項目-Token合約開發與部署
合約部署成功
以太坊智能合約項目-Token合約開發與部署
擷取合約配置參數,複制合約位址:<code>0x79334c31893ca7c59dd0bcf2a69189dd0db609c9</code>
以太坊智能合約項目-Token合約開發與部署
點選ADD Token
以太坊智能合約項目-Token合約開發與部署
将合約位址粘貼進去,Token合約的簡稱跟位數都會直接顯示
以太坊智能合約項目-Token合約開發與部署
添加即可
以太坊智能合約項目-Token合約開發與部署
添加成功

以上部署合約的賬戶位址(位址1)為: <code>0x18850c9cE7B2274EbB0c78e6221844AC76715494</code>

要轉入Token的賬戶位址(位址2)為:<code>0x139f46dCb8DAE14dE0aE3F98B298A73393b7Cc43</code>

位址2的賬戶資訊
以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署
點選SEND執行轉賬操作
以太坊智能合約項目-Token合約開發與部署
填寫轉入位址為位址2
以太坊智能合約項目-Token合約開發與部署
資訊确認
以太坊智能合約項目-Token合約開發與部署
交易送出成功
以太坊智能合約項目-Token合約開發與部署
交易确認成功
進入到位址2中進行Token添加
以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署
以太坊智能合約項目-Token合約開發與部署
轉賬成功
以太坊智能合約項目-Token合約開發與部署
讀者可以繼續執行轉賬測試工作,如從位址2轉入位址1中。

本文所有内容均為學習交流使用,各位技術人在進行技術研究以及業務落地的過程中切記以遵守國家法律為前提,合法開展相關技術支撐的業務與市場活動。

最後,祝大家學習愉快!

繼續閱讀