
前言:
對(duì)于一個(gè)新手來說,想開發(fā)DApp,最頭痛是不知道怎么去學(xué)?怎么入手?應(yīng)該去學(xué)點(diǎn)什么?好,作為一個(gè)踩過坑的我,接下來給大家聊聊我目前知道的吧,這篇文章理論偏重,下篇文章開始會(huì)給大家寫點(diǎn)實(shí)戰(zhàn)點(diǎn)的。
文:謙益
能看到這篇文章的應(yīng)該對(duì)區(qū)塊鏈的一些基礎(chǔ)知識(shí)有一定了解了,比如:
- 區(qū)塊鏈?zhǔn)巧叮?/li>
- 以太坊是啥?
- 公鏈和私鏈的區(qū)別
- Truffle是啥?
- solidity是啥?
我就當(dāng)做你們對(duì)上面的已經(jīng)了解了,不了解的可以看我以前寫過的筆記或者網(wǎng)上查找相應(yīng)的資料。
一、web3.js是啥?
如果你想開發(fā)一個(gè)DApp,可能網(wǎng)上看到最多的是web3.js之類的,有人就開始疑問了,他是做什么的?其實(shí)他就是一個(gè)js庫,和jQuery庫類似。
好了,回到DApp開發(fā)上,先來說說DApp的運(yùn)作流程,DApp我個(gè)人的理解,他的本質(zhì)其實(shí)是一個(gè)H5 網(wǎng)頁,也可以說是一個(gè)H5 App。
當(dāng)你操作這個(gè)網(wǎng)頁時(shí),比如轉(zhuǎn)賬呀,這時(shí)網(wǎng)頁的js會(huì)去調(diào)取對(duì)應(yīng)的方法,這個(gè)方法會(huì)去調(diào)web3.js里面對(duì)應(yīng)的方法。
二、這個(gè)web3.js里面做了什么呢?
要想知道web3.js里面做了什么,就得先知道下面的幾個(gè)點(diǎn)
- 1、如果想在區(qū)塊鏈里轉(zhuǎn)賬,我們正常邏輯是怎么做的?如果沒有DApp我們得,先下載一個(gè)以太坊官方提供的錢包,再登錄我們的賬號(hào),再選擇轉(zhuǎn)賬輸入要轉(zhuǎn)賬的用戶點(diǎn)擊發(fā)送。
- 2、以太坊賬號(hào)與賬號(hào)之間轉(zhuǎn)賬數(shù)據(jù)傳輸是怎么發(fā)送的?如果是采用的HTTP服務(wù),我們是否可以像傳統(tǒng)API那樣,發(fā)個(gè)POST請(qǐng)求就轉(zhuǎn)賬了。答案當(dāng)然不是了,以太坊區(qū)之間的傳輸采用的是RPC服務(wù),關(guān)于RPC服務(wù)如果不懂的,可以自行網(wǎng)上找資料,你可以理解他是一個(gè)類似HTTP服務(wù)那樣,起了一個(gè)固定的端口監(jiān)聽別人的請(qǐng)求,而傳輸過來的數(shù)據(jù)格式則是固定的json格式,可能像這樣的:
curl --data
{
"jsonrpc":“2.0”,
"method":“eth_sendtransaction”,
"params"[{
"from":"0xeb85a5",
"to":"0x6ff93",
"data":"0xcddddd"
}]
"id":8}
localhost:8123
這里你先不管,里面這些參數(shù)是什么意思,當(dāng)以太坊的節(jié)點(diǎn)拿到拿到這樣的json數(shù)據(jù)請(qǐng)求就會(huì)處理轉(zhuǎn)賬了,然后再廣播給所有節(jié)點(diǎn)。至于為啥要采用RPC服務(wù)這里不展開討論。
好了,知道上面兩點(diǎn)再回到DApp 的web3.js做了什么的問題上。
其實(shí)web3.js里面就是對(duì)這些固定的操作,比如獲取賬號(hào)信息,轉(zhuǎn)賬,還有調(diào)取合約等功能做了封裝,而怎么調(diào)取這些功能,就是通過調(diào)用以太坊的 JSON RPC API 完成的。
看到這里是不是就有點(diǎn)DApp的開發(fā)思路了,對(duì)沒錯(cuò)。如果你的DApp所有數(shù)據(jù)存在以太坊里面,你可以不用再寫后臺(tái),就一個(gè)純H5網(wǎng)頁就能做出一個(gè)DApp,但是實(shí)際開發(fā)中并不是這樣,繼續(xù)往下看。
三、需要學(xué)習(xí)go語言么?nodejs呢?
我們現(xiàn)在需要做一個(gè)養(yǎng)寵物的DApp,我們不同基因的寵物他有不同的的特性,這些特性,我們?cè)撛趺刺幚恚?/p>
寫在js代碼里面 ,那后期如果想加些特性,就得更新代碼,那隨著特性越來越多代碼會(huì)越來越多,不利于維護(hù),往往做法是把某種基因的特性存到我們自己的服務(wù)器里面,通過請(qǐng)求我們提供的API去拿到這些特性。有人會(huì)說,這又變成中心化了,沒錯(cuò),目前由于一些技術(shù)瓶頸,還不能做到100%去中心化。
上面說的是把寵物的特性單獨(dú)存起來了,而一些寵物的交易,或者交配等這些操作,是需要調(diào)取合約的,web3.js里面又封裝好了調(diào)合約的方法,是不是這些操作有讓網(wǎng)頁的js自己處理呢?也可以,不過有部分人覺得這樣不利于維護(hù),有了另一種做法,把DApp和傳統(tǒng)H5 APP一樣,DApp只負(fù)責(zé)展示,所有數(shù)據(jù)像后臺(tái)去拿。于是便有了nodejs,go,java版本的SDK,而這些SDK里面其實(shí)做的事應(yīng)該也是和web3.js類似。
寫在后面的話
我也是才開始學(xué)習(xí)以太坊才2周左右,可能對(duì)一些理論,一些概念理解不是很準(zhǔn)確,或者是有誤的。發(fā)文只是想分享下我最近的學(xué)習(xí)心得,讓一些比我晚起步的少踩一些坑,如果你發(fā)現(xiàn)有哪里不對(duì)的,歡迎留言我會(huì)積極修正和接納。
謝謝你耐心的看完了。
參考文檔
- RPC服務(wù)和HTTP服務(wù)對(duì)比
http://blog.csdn.net/wangyunpeng0319/article/details/78651998 - 以太坊與節(jié)點(diǎn)的交互 JSON RPC API 和Web3.js
http://blog.csdn.net/DDFFR/article/details/74639418 - web3.js與合約交互
http://blog.csdn.net/ddffr/article/details/73771940