42

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

 5 years ago
source link: https://mp.weixin.qq.com/s/9Top46nkb_eqSbeOGU2Nyg?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

来这里找志同道合的小伙伴!

作 者 简 介

刘其康——Android系统工程师

5 年以上开发经验,在多领域跨平台开发的经验丰富,负责京东直播的开发和设计工作,热衷于探索新技术新方向,并实际应用。

引言

目前,有关区块链相关技术和方向持续升温,但是,基于区块链技术的DAPP(去中心化应用)尚处于早期探索状态,还没有大规模实际应用价值的DAPP出现。但不可否认的是区块链技术带给了我们巨大的想象空间,从现在的情形来看打造完全去中心化的App至少还需要几年时间。DAPP能否打败APP还是一个未知数,但DApp的发展是个必然趋势。所以我们要紧跟时代的步伐,勇敢的去探索新技术新方向,成为下一个时代的先驱者。

> > > >   一、背景与目的

> > > >   1、 背景

本文在区块链火爆的今天,给想学习这方面知识但又无从下手的同学提供了一个方向,文中涉及多种不同技术进行整合,信息量较大,基本已经将开发过程中可能会遇到的问题解决或者绕开,以方便您的顺畅学习。

> > > >   2、 目的

通过本文的学习,你将收获以下几点:

  1. 区块链常用开发环境部署与搭建

  2. 基于truffle框架开发与部署Solidity智能合约

  3. 在安卓中通过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上下载源码安装的方式。

UNRRRzU.jpg!web

要安装的两个插件:

  1. language-ethereum(代码提示)

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

  2. autocomplete-solidity(智能补全)

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

下载的压缩包解压到安装地址,每个人不同

6BVn6nj.png!web

打开windows PowerShell,cd C:\Users\liuqikang\.atom\packages到目标目录下,输入指令apm install language-ethereum( language-ethereum是解压后的文件夹名 ),也可以到解压后文件夹下通过npm install安装,安装成功后再次回到Atom中Setting搜索插件会显示已安装,结果如下:

fMBnIzn.png!web

> > > >   三、 开发阶段

> > > >   1、 本地节点搭建,开发智能合约并部署

Truffle是一款以太坊Solidity编程语言开发框架( 官方样例网址:https://truffleframework.com/boxes ),我们要使用truffle的基础工程tutorialtoken来开发自己的代币( https://truffleframework.com/boxes/tutorialtoken

a、构建tutorialtoken工程

打开PowerShell建立一个文件夹tokentest,并进入

aq6rqav.png!web

通过根据官网教程部署tutorialtoken工程,truffle unbox tutorialtoken(如果失败或者报错,请确保上面npm的源已切换),Tutorialtoken工程部署成功后,如下图所示:

QbENRfZ.png!web

此时官方工程已经下载成功了。

b、工程分析,开发智能合约

使用atom .命令打开这个工程(atom安装成功后会自动配置到系统环境变量中

nEfA3qB.png!web

7VbEBjy.png!web

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

  • Build:构建目录

  • Contracts:智能合约.sol 文件夹

  • Migrations:智能合约部署文件夹

  • Node_modules:第三方库文件夹

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

  • Test:测试文件夹

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

  • truffle.js:truffle框架入口文件

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

JbYRJnY.png!web

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

aQJfeeF.png!web

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

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

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

qQjqaua.png!web

ERC20通用代币标准,感兴趣的同学可以自己了解下,相关的还有ERC721( 以太猫 )。

BasicToken 通用代币基类:

AZRRZfE.png!web

这个balances代表定义的“ 账户 余额 ”信息,Mapping相当于“ ”数据。mapping(address =>uint256),address为solidity语法中的用户地址,uint256为当前这个address(用户)所拥的余额。totalSupply_代表代币总数。

继续按照open zeppelin教程,在合约TutorialToken中添加四个变量:

vaE3M3n.png!web

  • Name为当前代币的名称

  • Symbol为当前代币的单位

  • Decimals为代币的小数位数

  • INITIAL_SUPPLY为发行的代币数量

这四个变量都是可以自己定义的。

继续定义一个合约的构造函数:

eamUruM.png!web

第一行,设置代币的总币数;

第二行,把所有的钱分配给当前初始账户,msg.sender代表当前账户,类型为address

继续在migrations/下创建合约部署文件2_initial_contracts.js

faumQja.png!web

内容为

yEBnMfM.png!web

到此代币合约的编码工作基本已经完成。

注意:由于该web工程需要访问外网js的地址,国内访问不了,所以我们要切换为可访问的源,修改tokentest/src/js/index.html文件尾部js访问地址为国内源。

naeENfz.png!web

c、启动节点部署合约并完成web端访问

继续看教程,它使用了Ganache来创建的节点,而我们使用的是truffle,后面的教程就不需要看了。回到我们的truffle教程,输入truffle develop进入truffle开发者模式,进入成功后如下图所示:

67Z3Ubj.jpg!web

留意几个点:

  • http://127.0.0.1:9545为当前节点地址

  • Accounts为默认初始化的10个账户地址

  • Private Keys为上面10个账户对应的私钥

编译此工程,compile

ZZFZZjb.png!web

TutorialToken.sol为我们刚刚创建的代币合约

部署合约,deploy

jmuiyqr.png!web

Truffle调用了我们刚才创建的合约部署文件2_initial_contracts.js部署了合约TutorialToken

部署的合约地址为0x345ca3e014aaf5dca488057592ee47305d9b3e10

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

注意:我们进行编译和部署的这个PowerShell不能关闭,因为后续启动需要。

让我们来启动下这个节点,让我们重新再打开一个PowerShell,依次执行

Vfamuy3.png!web

启动成功后,浏览器会自动弹出当前web工程的网页。如果显示有问题,请查看外网JS源是否已经切换( 上一小节最后 )。

IVfeqea.png!web

到此为止,web端的工程已经搭建完毕,我们可以测试一下这个TT币。

还记得truffle develop启动时候的账户吗

fymIVzv.png!web

我们当前登录的是第一个默认账户,现在我们给第二个账户转1000TT币:

  • 在address中填入目标账户:

    0xf17f52151ebef6c7334fad080c5704d77216b732

  • Amount填入转账金额:1000

  • 点击Transfer,会弹出转账成功弹窗,并更新余额

YjimU3F.jpg!web

并且可以在浏览器的控制台中看到转账记录。

> > > >   2、Android下访问本地节点并测试合约的调用

我们验证此时代币合约已经可以正常的转账查询余额了,接下来我们看看如何用Android来接入这个节点,此时需要访问本地节点,需要打开Charles。

a、使用web3j连接节点获取账户信息

我们需要用到web3j:以太坊推出的java端调用库,和web3.js类似,可以参考web3j中文文档进行开发。

打开AndroidStudio创建一个空工程,引入maven仓库

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

在Manifest.xml中添加一些会用到的权限

mEVbemu.png!web

5.0系统以上需要动态权限验证

在MainActivity的onCreate中来访问一下这个节点,由于需要访问网络我们需要在线程中来调用web3j。

首先,我们要连接上我们部署的节点

AryERbq.png!web

Z7vummz.jpg!web

解释下这段代码:

  • Web3j是我们使用的第三方库

  • Web3jFactory是android中与节点建立关联的方式

  • Web3ClientVersion()是我们用来查看版本的函数

  • .send()很重要,在web3j中我们调用任何函数或者合约,都需要最后调用send()来发起请求通知节点执行

上面的函数执行完成后得到返回我们可以确认android通过web3j已成功和节点建立了关联,我们来获取一下账户信息

uuEjQzA.png!web

通过log可以看到,用户列表

JRRZryQ.jpg!web

账户都是和truffle帮我们创建的账户是相同的。

b、在android中部署合约

接下来我们来访问下我们的TutorialToken合约来完成转账和查询余额。

这里web3j有一个相比web3.js不太方便的地方,不支持直接由合约地址来创建合约,所以我们只能通过他所提供的智能合约包装器(其实就是转换成java类),因为在java中合约需要一个明确的类型和内部声明。我们需要将我们之前编译好的TutorialToken合约,包装成Java可识别的类。

打开之前的tokentest工程

7NBrIbj.jpg!web

到build路径下找到我们的TutorialToken.json,这个就是我们.sol文件编译生成的合约。找到我们下载的web3j工具包,到bin目录下找web3j.bat批处理工具

F3i2Ijy.png!web

使用命令行进入到此路径下,键入指令web3jtruffle generate –javaTypes

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

RjIJ7rz.png!web

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

zqAb6jv.png!web

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

我们直接看代码:

qYzqUjf.jpg!web

  • User1:账户1

  • User1PrivateKey:user1的私钥

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

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

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

uIfqaqy.png!web

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

eqaqaeb.png!web

试下转账:

nq6nemN.jpg!web

结果:

Mjqmee2.png!web

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

> > > >   四、 总结

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

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

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

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

---------------------END ---------------------

下面的内容同样精彩

点击图片即可阅读

NVFrUfI.jpg!web

M7NzE3r.jpg!web

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

fYNjmqZ.jpg!webFvQRfim.jpg!web

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK