专栏名称: 区块链技术学习
致力于区块链技术的学习和普及,对区块链技术和相关企业事件进行深度分析和研判,探索去中心化账本技术应用领域。
目录
相关文章推荐
51好读  ›  专栏  ›  区块链技术学习

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

区块链技术学习  · 公众号  ·  · 2018-08-01 17:15

正文

来自:京东技术(微信号:jingdongjishu)
作者:刘其康——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上下载源码安装的方式。


要安装的两个插件:

  1. language-ethereum(代码提示)

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

  2. 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,并填入初始内容

  1. pragma solidity ^0.4.24;

  2. import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

  3. contract TutorialToken is StandardToken {

  4. }


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

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

  1. node_modules/openzeppelin-solidity/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。


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







请到「今天看啥」查看全文