>
>
>
>
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安装成功后会自动配置到系统环境变量中
)
我们来分析一下工程目录:
继续阅读官方教程后可以发现一个官方的提示
官方提示说我们这个工程不是一个完整的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 TutorialToken is StandardToken {
}
第一行为指定了当前solidity所用的版本,第二行为solidity导入外部合约,第三行为当前合约继承了导入的外部合约,contract代表这是一个合约。
我们来看一下StandardToken这个文件,进入
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开发者模式,进入成功后如下图所示:
留意几个点:
编译此工程,compile
TutorialToken.sol为我们刚刚创建的代币合约
部署合约,deploy
Truffle调用了我们刚才创建的合约部署文件2_initial_contracts.js部署了合约TutorialToken
部署的合约地址为0x345ca3e014aaf5dca488057592ee47305d9b3e10
到此我们的代币和智能合约已经编译并部署成功了。
注意:
我们进行编译和部署的这个PowerShell不能关闭,因为后续启动需要。
让我们来启动下这个节点,让我们重新再打开一个PowerShell,依次执行
启动成功后,浏览器会自动弹出当前web工程的网页。如果显示有问题,请查看外网JS源是否已经切换(
上一小节最后
)。
到此为止,web端的工程已经搭建完毕,我们可以测试一下这个TT币。
还记得truffle develop启动时候的账户吗
我们当前登录的是第一个默认账户,现在我们给第二个账户转1000TT币:
并且可以在浏览器的控制台中看到转账记录。
>
>
>
>
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。
首先,我们要连接上我们部署的节点