程序員如何切入?yún)^(qū)塊鏈去中心化應(yīng)用開(kāi)發(fā)
前段時(shí)間一個(gè)以太坊游戲應(yīng)用: Fomo3D 異?;鸨诙潭痰膸滋靸?nèi)就吸引了幾萬(wàn)的以太幣投入游戲,***輪游戲一個(gè)“黑客”用了一個(gè)非常巧妙的利用以太坊規(guī)則成為了最終贏家,拿走了1萬(wàn)多以太幣獎(jiǎng)金。
區(qū)塊鏈應(yīng)用的價(jià)值由這個(gè)游戲反映的***,F(xiàn)omo3D游戲能夠成功核心所依賴的是以太坊提供的一個(gè)可信、不可篡改平臺(tái)。當(dāng)游戲的規(guī)則確定之后,一切都按規(guī)則運(yùn)行,無(wú)人可干預(yù)。今天這篇就來(lái)介紹一下程序員如何切入去中心化應(yīng)用開(kāi)發(fā)。
中心化應(yīng)用
作為對(duì)比,先來(lái)看看中心化應(yīng)用,其實(shí)就是現(xiàn)有的互聯(lián)網(wǎng)應(yīng)用,為什么它是中心化應(yīng)用,看看它的架構(gòu)圖:
平時(shí)我們接觸的是應(yīng)用的前端(或稱客戶端),前端可以是HTML5的web頁(yè)面、 小程序、APP, 在前端展現(xiàn)的內(nèi)容通常發(fā)送一個(gè)請(qǐng)求到服務(wù)器,服務(wù)器返回相應(yīng)的內(nèi)容給前端。在前端的動(dòng)作同樣也會(huì)轉(zhuǎn)化請(qǐng)求發(fā)送到服務(wù)器,服務(wù)器處理之后返回?cái)?shù)據(jù)到前端。也就是說(shuō)我們所有看到的內(nèi)容或者操作都是中心化的服務(wù)器控制,因此說(shuō)是中心化應(yīng)用。
去中心化應(yīng)用DAPP
而去中心化應(yīng)用有什么不同呢? 看看它的架構(gòu)圖:
前端的表現(xiàn)上是一樣的, 還是H5頁(yè)面、 小程序、APP,DAPP和傳統(tǒng)App關(guān)鍵是后端部分不同,是后端不再是一個(gè)中心化的服務(wù)器,而是分布式網(wǎng)絡(luò)上任意節(jié)點(diǎn),注意可以是 任意一個(gè)節(jié)點(diǎn),在應(yīng)用中給節(jié)點(diǎn)發(fā)送的請(qǐng)求通常稱為 交易 ,交易和中心化下的請(qǐng)求有幾個(gè)很大的不同是:交易的數(shù)據(jù)經(jīng)過(guò)用戶個(gè)人簽名之后發(fā)送到節(jié)點(diǎn),節(jié)點(diǎn)收到交易請(qǐng)求之后,會(huì)把 請(qǐng)求廣播到整個(gè)網(wǎng)絡(luò) ,交易在網(wǎng)絡(luò)達(dá)成共識(shí)之后,才算是真正的執(zhí)行(真正其作用的執(zhí)行不一是連接的后端節(jié)點(diǎn),盡管后端也會(huì)執(zhí)行)。以及中心化下的請(qǐng)求大多數(shù)都是同步的(及時(shí)拿到結(jié)果), 而交易大多數(shù)是異步的,這也是在開(kāi)發(fā)去中心應(yīng)用時(shí)需要注意的地方,
從節(jié)點(diǎn)上獲得數(shù)據(jù)狀態(tài)(比如交易的結(jié)果),一般是通過(guò)事件回調(diào)來(lái)獲得。
如何開(kāi)發(fā)
在開(kāi)發(fā)中心化應(yīng)用最重要兩部分是 客戶端UI表現(xiàn) 和 后端服務(wù)程序 , UI表現(xiàn)通過(guò)HTTP請(qǐng)求連接到后端服務(wù)程序,后端服務(wù)程序運(yùn)行在服務(wù)器上,比如Nginx Apached等等。
開(kāi)發(fā)一個(gè)去中心化應(yīng)用最重要也是兩部分: 客戶端UI表現(xiàn) 及 智能合約 ,智能合約的作用就像后端服務(wù)程序,智能合約是運(yùn)行在節(jié)點(diǎn)的EVM上, 客戶端調(diào)用智能合約,是通過(guò)向節(jié)點(diǎn)發(fā)起RPC請(qǐng)求完成。
下面是一個(gè)對(duì)比:
客戶端UI <=> 客戶端UI HTTP <=> RPC 后端服務(wù)程序 <=> 智能合約 Nginx/Apache <=> 節(jié)點(diǎn)
因此對(duì)于去中心化應(yīng)用來(lái)說(shuō),程序員可以從兩個(gè)方面切入:
一個(gè)是 去中心化應(yīng)用的客戶端開(kāi)發(fā) , 熟悉已經(jīng)熟悉客戶端軟件(如Web\APP等)開(kāi)發(fā)的同學(xué),只需要了解一下客戶端跟區(qū)塊鏈節(jié)點(diǎn)通信的API接口,如果是在當(dāng)前應(yīng)用最廣泛的區(qū)塊鏈平臺(tái)以太坊上開(kāi)發(fā)去中心化應(yīng)用,那么需要了解Web3
這個(gè)庫(kù),Web3對(duì)節(jié)點(diǎn)暴露出來(lái)的JSON-RPC接口進(jìn)行了封裝,比如Web3提供的功能有:獲取節(jié)點(diǎn)狀態(tài),獲取賬號(hào)信息,調(diào)用合約、監(jiān)聽(tīng)合約事件等等。
目前的主流語(yǔ)言都有Web3的實(shí)現(xiàn),列舉一些實(shí)現(xiàn)給大家參考:
- JavaScript Web3.js
- Python Web3.py
- Haskell hs-web3
- Java web3j
- Scala web3j-scala
- Purescript purescript-web3
- PHP web3.php
- PHP ethereum-php
另一個(gè)切入點(diǎn)是 智能合約的開(kāi)發(fā) ,在以太坊現(xiàn)在推薦的語(yǔ)言是Solidity,有一些同學(xué)對(duì)新學(xué)一門(mén)語(yǔ)言有一些畏懼,Solidity的語(yǔ)法其實(shí)很簡(jiǎn)潔,有過(guò)一兩門(mén)其他語(yǔ)言基礎(chǔ)(開(kāi)發(fā)經(jīng)驗(yàn))的同學(xué)三五天就可以學(xué)會(huì)。
下面用一個(gè)Hello合約,體會(huì)下Solidity的語(yǔ)法:
contract Hello { function hello() public returns(string) { return "Hello World"; } }
如果把上面的contract關(guān)鍵字更改為class,就和其他語(yǔ)言定義一個(gè)類一樣。
有興趣的同學(xué)可以進(jìn)一步學(xué)習(xí)一下這個(gè)DApp開(kāi)發(fā)案例 Web3與智能合約交互實(shí)戰(zhàn) ,
在DAPP的開(kāi)發(fā)過(guò)程中,一些開(kāi)發(fā)工具可以幫助我們事半功倍,如:Truffle開(kāi)發(fā)框架以及Ganache工具來(lái)模擬節(jié)點(diǎn)等,這篇文章 一步步教你開(kāi)發(fā)、部署***個(gè)去中心化應(yīng)用
補(bǔ)充
對(duì)于想切入到去中心化應(yīng)用開(kāi)發(fā)的同學(xué),對(duì)區(qū)塊鏈運(yùn)行的原理了解肯定會(huì)是加分項(xiàng),尤其是各類共識(shí)機(jī)制(POW,POS,DPOS等)的理解,P2P網(wǎng)絡(luò)的理解,以及各類加密和Hash算法的運(yùn)用。有一些同學(xué)想做區(qū)塊鏈底層開(kāi)發(fā),對(duì)區(qū)塊鏈運(yùn)行的原理則是必須項(xiàng)。