区块链DAPP开发实战——在安卓下调用本地节点发行的代币和智能合约

区块链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:\Users\liuqikang\.atom\packages到目标目录下,输入指令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安装成功后会自动配置到系统环境变量中

我们来分析一下工程目录:

Build:构建目录

Contracts:智能合约.sol 文件夹

Migrations:智能合约部署文件夹

Node_modules:第三方库文件夹

Src:相关js内容,因为这个是一个web工程

Test:测试文件夹

package.json:每一个nodejs工程必备,里面调用了truffle.js

truffle.js:truffle框架入口文件

继续阅读官方教程后可以发现一个官方的提示

官方提示说我们这个工程不是一个完整的dapp工程,我们需要依赖于OpenZepplin第三方库自己补全这个工程,点开Open Zeepelin的链接,从第三部开始(前两部我们已经做过了),在当前工程目录下安装open zeppelin

安装成功后,继续按照open zeppelin教程,在Atom的contracts文件夹下创建一个合约TutorialToken.sol,并填入初始内容

pragma solidity ^0.4.24;

import“openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol”;

contract TutorialTokenisStandardToken{

}

第一行为指定了当前solidity所用的版本,第二行为solidity导入外部合约,第三行为当前合约继承了导入的外部合约,contract代表这是一个合约。

我们来看一下StandardToken这个文件,进入

node_modules/openzeppelinsolidity/contracts/token/ERC20/StandardToken.sol

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

部署的合约地址为0x345ca3e014aaf5dca488057592ee47305d9b3e10

到此我们的代币和智能合约已经编译并部署成功了。

注意:我们进行编译和部署的这个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

命令模板:web3j truffle generate javaTypes 合约的地址.json o 合约生成地址p 包名

我的命令:web3j truffle generate javaTypes C:\truffle\tokentest\build\contracts\TutorialToken.json o D:\web3j p com.web3jtest

com.web3jtest是我即将拷入AS的package路径,执行之后会生成java可识别的合约类

将这个文件拷贝进我们的工程中,我们就可以通过web3j来部署这个合约了。

c、访问TutorialToken合约,完成转账和查询余额操作

我们直接看代码:

User1:账户1

User1PrivateKey:user1的私钥

Credentials:通过私钥创建的凭证,通过凭证我们检索出用户的账户名公钥等信息

通过deploy部署这个合约,注意一定要调用.send()函数才会使合约生效

第一个LOG是通过用户私钥分析出的用户账户名,第二个就是我们加载成功的合约地址。

我们来查询下当前账户的余额

试下转账:

结果:

Android端访问本地节点基本功能完成。

>>>>  四、总结

到此,我们完成代币从底层部署到上层访问的全套流程。

文中没有涉及到solidity开发的语法相关内容,不过对于从事开发行业的朋友来讲,solidity语法比较简单,我们掌握了本地节点的搭建和开发流程后,可以随意创建自己的合约方便测试。

目前我们的节点只是部署在本地上,之后在合约开发完成后,就可以在公链上发布捞金了。Truffle、solidity及web3j各自都有很多需要深入研究的功能,感兴趣的同学可以研究下。

感谢您的时间~,辛苦您顺手点赞^_^

———————END———————

下面的内容同样精彩

点击图片即可阅读

京东技术关注技术的公众号

长按,识别二维码,加关注

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Proudly powered by WordPress | Theme: HoneyWaves by SpiceThemes