當前位置:
首頁 > 最新 > 區塊鏈DAPP開發實戰——在安卓下調用本地節點發行的代幣和智能合約

區塊鏈DAPP開發實戰——在安卓下調用本地節點發行的代幣和智能合約

來這裡找志同道合的小夥伴!

作 者 簡 介

劉其康——Android系統工程師

5年以上開發經驗,在多領域跨平台開發的經驗豐富,負責京東直播的開發和設計工作,熱衷於探索新技術新方向,並實際應用。

引言

目前,有關區塊鏈相關技術和方向持續升溫,但是,基於區塊鏈技術的DAPP(去中心化應用)尚處於早期探索狀態,還沒有大規模實際應用價值的DAPP出現。但不可否認的是區塊鏈技術帶給了我們巨大的想像空間,從現在的情形來看打造完全去中心化的App至少還需要幾年時間。DAPP能否打敗APP還是一個未知數,但DApp的發展是個必然趨勢。所以我們要緊跟時代的步伐,勇敢的去探索新技術新方向,成為下一個時代的先驅者。

本文在區塊鏈火爆的今天,給想學習這方面知識但又無從下手的同學提供了一個方向,文中涉及多種不同技術進行整合,信息量較大,基本已經將開發過程中可能會遇到的問題解決或者繞開,以方便您的順暢學習。


通過本文的學習,你將收穫以下幾點:

區塊鏈常用開發環境部署與搭建

基於truffle框架開發與部署Solidity智能合約

在安卓中通過web3j來訪問本地節點部署的代幣與合約


powerShell是一款比cmd許可權更高的命令提示工具,cmd.exe微軟已明確不在維護,通過開始搜索powerShell可以打開。


使用nodejs命令行工具npm方便下載開發所需的相關庫,開發所用到的大部分第三方庫或者框架都是用過npm進行下載(http://nodejs.cn/download/)

注意:npm指令由於某種原因會導致連接不上外網的情況,可以修改npm下載源地址為淘寶地址,命令行執行npm config set registry(https://registry.npm.taobao.org)


Charles是一款抓包工具,我們需要用他來配置代理,以便手機/模擬器來訪問到本地https://127.0.0.1:9545埠。

Web3j.bai智能合約包裝器,可以把已編譯好的智能合約文件.json轉化成.java類文件,方便程序識別調用(https://github.com/web3j/web3j/releases/tag/v3.3.1)


Atom是一款好用的開發solidity的IDE,有多個支持Solidity開發的插件方便使用,包括代碼提示工具等(https://atom.io)

Atom開發Solidity插件安裝:

打開Atom,File-Setting-Install 搜索要安裝的插件名,如果網路好的話可下載,不過因為某種原因,我們是下不了這個插件的,所以採用從git上下載源碼安裝的方式。

要安裝的兩個插件:

language-ethereum(代碼提示)

git:https://github.com/caktux/language-ethereum

autocomplete-solidity(智能補全)

git: https://github.com/AustP/autocomplete-solidity

下載的壓縮包解壓到安裝地址,每個人不同

打開windows PowerShell,cd C:Usersliuqikang.atompackages到目標目錄下,輸入指令apm install language-ethereum(language-ethereum是解壓後的文件夾名),也可以到解壓後文件夾下通過npm install安裝,安裝成功後再次回到Atom中Setting搜索插件會顯示已安裝,結果如下:


Truffle是一款以太坊Solidity編程語言開發框架(官方樣例網址:https://truffleframework.com/boxes),我們要使用truffle的基礎工程tutorialtoken來開發自己的代幣(https://truffleframework.com/boxes/tutorialtoken)

a、構建tutorialtoken工程

打開PowerShell建立一個文件夾tokentest,並進入

通過根據官網教程部署tutorialtoken工程,truffle unbox tutorialtoken(如果失敗或者報錯,請確保上面npm的源已切換),Tutorialtoken工程部署成功後,如下圖所示:

此時官方工程已經下載成功了。

b、工程分析,開發智能合約

使用atom .命令打開這個工程(atom安裝成功後會自動配置到系統環境變數中)

我們來分析一下工程目錄:

繼續閱讀官方教程後可以發現一個官方的提示

官方提示說我們這個工程不是一個完整的dapp工程,我們需要依賴於OpenZepplin第三方庫自己補全這個工程,點開Open Zeepelin的鏈接,從第三部開始(前兩部我們已經做過了),在當前工程目錄下安裝open zeppelin

安裝成功後,繼續按照open zeppelin教程,在Atom的contracts文件夾下創建一個合約TutorialToken.sol,並填入初始內容

第一行為指定了當前solidity所用的版本,第二行為solidity導入外部合約,第三行為當前合約繼承了導入的外部合約,contract代表這是一個合約。

我們來看一下StandardToken這個文件,進入

ERC20通用代幣標準,感興趣的同學可以自己了解下,相關的還有ERC721(以太貓)。

BasicToken 通用代幣基類:

這個balances代表定義的「賬戶餘額」信息,Mapping相當於「鍵值」數據。mapping(address =>uint256),address為solidity語法中的用戶地址,uint256為當前這個address(用戶)所擁的餘額。totalSupply_代表代幣總數。

繼續按照open zeppelin教程,在合約TutorialToken中添加四個變數:

Name為當前代幣的名稱

Symbol為當前代幣的單位

Decimals為代幣的小數位數

INITIAL_SUPPLY為發行的代幣數量

這四個變數都是可以自己定義的。

繼續定義一個合約的構造函數:

第一行,設置代幣的總幣數;

第二行,把所有的錢分配給當前初始賬戶,msg.sender代表當前賬戶,類型為address

繼續在migrations/下創建合約部署文件2_initial_contracts.js

內容為

到此代幣合約的編碼工作基本已經完成。

注意:由於該web工程需要訪問外網js的地址,國內訪問不了,所以我們要切換為可訪問的源,修改tokentest/src/js/index.html文件尾部js訪問地址為國內源。

c、啟動節點部署合約並完成web端訪問

繼續看教程,它使用了Ganache來創建的節點,而我們使用的是truffle,後面的教程就不需要看了。回到我們的truffle教程,輸入truffle develop進入truffle開發者模式,進入成功後如下圖所示:

留意幾個點:

http://127.0.0.1:9545為當前節點地址

Accounts為默認初始化的10個賬戶地址

Private Keys為上面10個賬戶對應的私鑰

編譯此工程,compile

TutorialToken.sol為我們剛剛創建的代幣合約

部署合約,deploy

Truffle調用了我們剛才創建的合約部署文件2_initial_contracts.js部署了合約TutorialToken

到此我們的代幣和智能合約已經編譯並部署成功了。

注意:我們進行編譯和部署的這個PowerShell不能關閉,因為後續啟動需要。

讓我們來啟動下這個節點,讓我們重新再打開一個PowerShell,依次執行

啟動成功後,瀏覽器會自動彈出當前web工程的網頁。如果顯示有問題,請查看外網JS源是否已經切換(上一小節最後)。

到此為止,web端的工程已經搭建完畢,我們可以測試一下這個TT幣。

還記得truffle develop啟動時候的賬戶嗎

我們當前登錄的是第一個默認賬戶,現在我們給第二個賬戶轉1000TT幣:

在address中填入目標賬戶:

0xf17f52151ebef6c7334fad080c5704d77216b732

Amount填入轉賬金額:1000

點擊Transfer,會彈出轉賬成功彈窗,並更新餘額

並且可以在瀏覽器的控制台中看到轉賬記錄。


我們驗證此時代幣合約已經可以正常的轉賬查詢餘額了,接下來我們看看如何用Android來接入這個節點,此時需要訪問本地節點,需要打開Charles。

a、使用web3j連接節點獲取賬戶信息

我們需要用到web3j:以太坊推出的java端調用庫,和web3.js類似,可以參考web3j中文文檔進行開發。

打開AndroidStudio創建一個空工程,引入maven倉庫

compile("org.web3j:core:3.3.1-android")

在Manifest.xml中添加一些會用到的許可權

5.0系統以上需要動態許可權驗證

在MainActivity的onCreate中來訪問一下這個節點,由於需要訪問網路我們需要在線程中來調用web3j。

首先,我們要連接上我們部署的節點

解釋下這段代碼:

Web3j是我們使用的第三方庫

Web3jFactory是android中與節點建立關聯的方式

Web3ClientVersion()是我們用來查看版本的函數

.send()很重要,在web3j中我們調用任何函數或者合約,都需要最後調用send()來發起請求通知節點執行

上面的函數執行完成後得到返回我們可以確認android通過web3j已成功和節點建立了關聯,我們來獲取一下賬戶信息

通過log可以看到,用戶列表

賬戶都是和truffle幫我們創建的賬戶是相同的。

b、在android中部署合約

接下來我們來訪問下我們的TutorialToken合約來完成轉賬和查詢餘額。

這裡web3j有一個相比web3.js不太方便的地方,不支持直接由合約地址來創建合約,所以我們只能通過他所提供的智能合約包裝器(其實就是轉換成java類),因為在java中合約需要一個明確的類型和內部聲明。我們需要將我們之前編譯好的TutorialToken合約,包裝成Java可識別的類。

打開之前的tokentest工程

到build路徑下找到我們的TutorialToken.json,這個就是我們.sol文件編譯生成的合約。找到我們下載的web3j工具包,到bin目錄下找web3j.bat批處理工具

使用命令行進入到此路徑下,鍵入指令web3jtruffle generate –javaTypes

com.web3jtest是我即將拷入AS的package路徑,執行之後會生成java可識別的合約類

將這個文件拷貝進我們的工程中,我們就可以通過web3j來部署這個合約了。

c、訪問TutorialToken合約,完成轉賬和查詢餘額操作

我們直接看代碼:

User1:賬戶1

User1PrivateKey:user1的私鑰

Credentials:通過私鑰創建的憑證,通過憑證我們檢索出用戶的賬戶名公鑰等信息

通過deploy部署這個合約,注意一定要調用.send()函數才會使合約生效

第一個LOG是通過用戶私鑰分析出的用戶賬戶名,第二個就是我們載入成功的合約地址。

我們來查詢下當前賬戶的餘額

試下轉賬:

結果:

Android端訪問本地節點基本功能完成。


到此,我們完成代幣從底層部署到上層訪問的全套流程。

文中沒有涉及到solidity開發的語法相關內容,不過對於從事開發行業的朋友來講,solidity語法比較簡單,我們掌握了本地節點的搭建和開發流程後,可以隨意創建自己的合約方便測試。

目前我們的節點只是部署在本地上,之後在合約開發完成後,就可以在公鏈上發布撈金了。Truffle、solidity及web3j各自都有很多需要深入研究的功能,感興趣的同學可以研究下。

感謝您的時間~,辛苦您順手點贊^_^

京東技術∣關注技術的公眾號


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

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


請您繼續閱讀更多來自 京東技術 的精彩文章:

Flutter圖片緩存 Image.network源碼分析
Google I/O大會上的最新發布

TAG:京東技術 |