區塊鏈DAPP開發實戰——在安卓下調用本地節點發行的代幣和智能合約
來這裡找志同道合的小夥伴!
作 者 簡 介
劉其康——Android系統工程師
5年以上開發經驗,在多領域跨平台開發的經驗豐富,負責京東直播的開發和設計工作,熱衷於探索新技術新方向,並實際應用。
引言
目前,有關區塊鏈相關技術和方向持續升溫,但是,基於區塊鏈技術的DAPP(去中心化應用)尚處於早期探索狀態,還沒有大規模實際應用價值的DAPP出現。但不可否認的是區塊鏈技術帶給了我們巨大的想像空間,從現在的情形來看打造完全去中心化的App至少還需要幾年時間。DAPP能否打敗APP還是一個未知數,但DApp的發展是個必然趨勢。所以我們要緊跟時代的步伐,勇敢的去探索新技術新方向,成為下一個時代的先驅者。
>>>>一、背景與目的
>>>>1、背景
本文在區塊鏈火爆的今天,給想學習這方面知識但又無從下手的同學提供了一個方向,文中涉及多種不同技術進行整合,信息量較大,基本已經將開發過程中可能會遇到的問題解決或者繞開,以方便您的順暢學習。
>>>>2、目的
通過本文的學習,你將收穫以下幾點:
區塊鏈常用開發環境部署與搭建
基於truffle框架開發與部署Solidity智能合約
在安卓中通過web3j來訪問本地節點部署的代幣與合約
>>>>二、開發環境準備
>>>>1、PowerShell
powerShell是一款比cmd許可權更高的命令提示工具,cmd.exe微軟已明確不在維護,通過開始搜索powerShell可以打開。
>>>>2、Nodejs
使用nodejs命令行工具npm方便下載開發所需的相關庫,開發所用到的大部分第三方庫或者框架都是用過npm進行下載(http://nodejs.cn/download/)
注意:npm指令由於某種原因會導致連接不上外網的情況,可以修改npm下載源地址為淘寶地址,命令行執行npm config set registry(https://registry.npm.taobao.org)
>>>>3、Charles
Charles是一款抓包工具,我們需要用他來配置代理,以便手機/模擬器來訪問到本地https://127.0.0.1:9545埠。
>>>>4、Web3j.bat
Web3j.bai智能合約包裝器,可以把已編譯好的智能合約文件.json轉化成.java類文件,方便程序識別調用(https://github.com/web3j/web3j/releases/tag/v3.3.1)
>>>>5、Atom
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搜索插件會顯示已安裝,結果如下:
>>>>三、開發階段
>>>>1、本地節點搭建,開發智能合約並部署
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,會彈出轉賬成功彈窗,並更新餘額
並且可以在瀏覽器的控制台中看到轉賬記錄。
>>>>2、Android下訪問本地節點並測試合約的調用
我們驗證此時代幣合約已經可以正常的轉賬查詢餘額了,接下來我們看看如何用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:京東技術 |