1.概念了解
- 含义
- 简介
- 技术详情
2.工具和技术的介绍
通过前面对区块链概念的大致了解,我们可以开始真正的学习区块链之旅。
要说区块链技术那么必须说以太坊,区块链技术通过上一篇的了解可以知道,它是支撑比特币的一个底层技术架构,随后被提取和抽象。以太坊将区块链技术带入到了2.0时代,所以我们现在学区块链技术就从以太坊开始就好了。
以太坊官方地址:https://ethereum.org/
以太坊帮助文档地址:http://www.ethdocs.org/en/latest/index.html
- 客户端
- 钱包
- 开发语言
智能合约说明地址:http://www.ethdocs.org/en/latest/contracts-and-transactions/contracts.html
- 开发工具
项目地址:https://ethereum.github.io/browser-solidity/
另外还有一个第三方的IDE,项目地址:https://live.ether.camp/
顺便提一下微软visual studio 也集成了以太坊智能合约的编写功能,足矣证明以太坊在区块链技术上的影响力
3.客户端使用
通过学习本节,你可以在脑海中建立区块链大致的“模样”,加深理解。本文中所有的相关演示都是基于以太坊技术在OS X系统环境下进行操作。本节分两部分:一、安装geth客户端,通过命令行进行相关操作;二、安装parity钱包客户端,通过图形界面加深了解。
3.1 安装geth客户端
3.1.1 打开项目地址:https://github.com/ethereum/go-ethereum

3.1.2 选择wiki,并选择 Installation Instructions for Mac OS

3.1.3 安装(如果没有安装homebrew则自行安装):
brew tap ethereum/ethereum
brew install ethereum
3.1.4 使用
如果以上安装正常,则可进入命令行管理geth节点,在命令行输入geth -h 可以查看节点的使用方法,
如想要更详细的说明请参考:https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options
下面将演示进入geth控制台进行,获取用户列表、新增用户、查询用户余额、查看节点信息等操作。
注意:通过geth console 默认进入的是公链的网络

3.2 安装parity钱包客户端
Parity钱包是由以太坊前CTO Gavin Wood组建的团队开发的,区块链技术是分布式的,所有数据都在本地有一份,目前公链上的数据大概有20多G,故我们使用时需要将区块数据同步到本地。此客户端最新版本中有几大创新的功能,最重要的功能则是加速了区块同步的速度。
项目地址:https://github.com/ethcore/parity/releases
其包含账户管理(币种转换)、地址便签、应用市场、合约部署和监控以及安全签安装完毕后会在浏览器自动打开parity,默认会提示创建一个新账户,如图:

3.2.1 默认主页打开账户管理,各个模块区域如图

3.2.2 选择用户账户名称进入账户,可对该账户进行交易、币种转换、编辑,注意交易需要花费gas。交易如图


3.2.3 地址薄可对常用地址进行保存,方便下次使用。地址即账户下面显示的一串字符串,例上图中的:0x0049e478d1df14F218c7f9579DD5224106a52873

3.2.4 应用市场,之前文章提到过钱包客户端不仅仅定位于“钱包”更趋向于应用市场,类似AppStore。
未来智能合约构建的基础模块都将发布在这个市场里面,方便面向业务的应用创建,这里不再细说。
默认打开也可以看到parity项目发布的应用。如图

3.2.5 智能合约,钱包中提供了智能合约的监控和部署的功能,智能合约监控是方便你保存智能合约的地址、abi,因为一个智能合约部署上区块链上去之后将无法修改,如果你忘记了智能合约的地址、abi将再也没法办法找到或者使用该合约。智能合约部署即将实现的智能合约发布到公链上,供其他人调用。监控和部署如下图


3.2.6 其他就是软件本身的一些设置、安全性的功能就不再叙述了。
通过以上客户端的使用,相信你已经对区块链技术有一个新的认识,作为分布式的系统,我们已经被纳入到区块链其中的一个节点。
4.创建自己的私链
本节主要结合之前文章提到的geth客户端,讲解如何构建自己的私链,以及在上面进行账户管理和转账交易。
4.1 创世块文件
区块链上第一个区块叫做创世块,创建我们私链的时候可通过创世块配置文件来声明和定义。把以下文件内容存储为genesis.json文件
-
{
-
“coinbase”: “0x0000000000000000000000000000000000000000”,
-
“config”: {
-
“homesteadBlock”: 5
-
},
-
“difficulty”: “0x20000”,
-
“extraData”: “0x”,
-
“gasLimit”: “0x2FEFD8”,
-
“mixhash”: “0x00000000000000000000000000000000000000647572616c65787365646c6578”,
-
“nonce”: “0x0”,
-
“parentHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
-
“timestamp”: “0x00”,
-
“alloc”: {
-
“dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6”:{
-
“balance”:“100000000000000000000000000000”
-
}
-
}
-
}
4.2 创建私链
打开命令行,定位到保存私链的文件地址路径,初始化私链,打开私链
如需通过初始化文件配置账户的默认以太币数量,可先在控制台新增用户,并将账户地址替换到genesis.json的alloc中
dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6,然后重新执行 geth –datadir “privateChain” init genesis.json ,
另外一种方式就是新增账户后,执行挖矿 miner.start() 开始挖矿,miner.stop() 停止挖矿,期间挖的以太币会自动存储到
第一个账户中。
操作命令如图

私链创建成功

进入控制台

新建一个用户并查看他的余额

将新建用户的地址修改到genesis.json文件中,并重新geth –datadir “privateChain” init genesis.json ,进入控制台查看用户余额
4.3 账户管理
在命令行中我们可以再创建一个账户,用于后面的交易。

4.4 交易
通过命令行将一个账户的余额转到第二个账户,并查看是否到账。首先解锁各个用户的状态,然后定义一个变量接受账户地址
(不定义也可以,定义看起来更简洁)
注意交易会花费gas,所以看到账户一加上账户二的余额是没有之前的总额够的。另外由于交易必须启动挖矿才能同步到到区块中,
顾交易完成后需要启动挖矿。由于私有链环境,挖矿难度很低,启动挖矿后会增加账号一的以太币。

然后执行
miner.start()
过一会之后停止挖矿,查看交易是否完成
miner.stop()
最后查看账户二的余额

通过以上操作我们能基本了解以太坊区块链技术的工作原理,下会我们将基于此做智能合约的编写。
5.智能合约
以太坊区块链技术2.0版本对于行业应用的开发最主要特性就是实现了智能合约,本质上讲智能合约是由事件驱动的、具有状态的、运行在一个复制的、分享的账本之上的、且能够保管账本上资产的程序。它是一个可以被信任,总是按照事先的规则执行的操作。但与此同时,智能合约部署完之后无法修改也会带来其他问题,这是另一个议题。下面直接上干货。本篇内容是基于go客户端通过命令行完成智能合约的编写、发布、调用。
可参考的项目地址:http://www.ethdocs.org/en/latest/contracts-and-transactions/contracts.html
1、安装solidity智能合约开发语言
brew tap ethereum/ethereum
brew install solidity
which solc
2、打开命令行,进入之前创建的私链,并设置日志输出文件
jwter-WIFI:csdnBlog jwter$ geth --datadir "privateChain" console 2>> log_output
Welcome to the Geth JavaScript console!
instance: Geth/v1.4.18-stable-c72f5459/darwin/go1.7.3
coinbase: 0x56a957bbde2b2dcb6321c9aceb11c21d6dfe68f9
at block: 164 (Sat, 03 Dec 2016 16:29:24 CST)
datadir: privateChain
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
3、设置编译环境
> web3.eth.getCompilers()
["Solidity"]
> admin.setSolc("/usr/local/bin/solc")
"solc, the solidity compiler commandline interface\nVersion: 0.4.2+commit.af6afb04.Darwin.appleclang
\n\npath: /usr/local/bin/solc"
4、编写智能合约并编译
> contractSource = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
"contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
> contract = eth.compile.solidity(contractSource).test
{
code: "0x606060405260308060106000396000f3606060405260e060020a6000350463c6888fa18114601c575b6002565b3
46002576007600435026060908152602090f3",
info: {
abiDefinition: [{
constant: false,
inputs: [...],
name: "multiply",
outputs: [...],
payable: false,
type: "function"
}],
compilerOptions: "--bin --abi --userdoc --devdoc --add-std --optimize -o /var/folders/c6/
1vhz7hcd7w9g883rwrn4vzvr0000gn/T/solc271136546",
compilerVersion: "0.4.2",
developerDoc: {
methods: {}
},
language: "Solidity",
languageVersion: "0.4.2",
source: "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }",
userDoc: {
methods: {}
}
}
}
5、定义智能合约abi并编译
> abi = [{constant:false , inputs:{name:'a',type:'uint256'}}]
[{
constant: false,
inputs: {
name: "a",
type: "uint256"
}
}]
> myabi = eth.contract(abi)
6、部署前准备:解锁账户、监控日志文件
> accountAddress = eth.accounts[0]
"0x56a957bbde2b2dcb6321c9aceb11c21d6dfe68f9"
> personal.unlockAccount(accountAddress)
Unlock account 0x56a957bbde2b2dcb6321c9aceb11c21d6dfe68f9
Passphrase:
true
>
监控日志文件需新开窗口,执行以下命令。用于查看部署完的智能合约是否被同步到区块链网路中
jwter-WIFI:csdnBlog jwter$ tail -f log_output
7、部署智能合约
> myContract = myabi.new({from:accountAddress,data:contract.code})
{
abi: [{
constant: false,
inputs: {
name: "a",
type: "uint256"
}
}],
address: undefined,
transactionHash: "0xf330f4affd3989d72a979410e3a53f3a4d2d4d832faaa6c1bb32f72998acbd4b"
}
8、查看部署状态,并同步到区块链中智能合约必须开始挖矿模式才是被同步到区块链中
可根据监控日志窗口可以看到交易是否执行,来决定何时执行miner.stop()
> txpool.status
{
pending: 1,
queued: 0
}
> miner.start()
true
> miner.stop()
true
> txpool.status
{
pending: 0,
queued: 0
}
9、调用智能合约
> contractABI = eth.contract(contract.info.abiDefinition)
>
> testContract = contractABI.at(myContract.address)
{
abi: [{
constant: false,
inputs: [{...}],
name: "multiply",
outputs: [{...}],
payable: false,
type: "function"
}],
address: "0xcb0895d4b3b35b2a45a31fab853614c14e7759a4",
transactionHash: null,
allEvents: function(),
multiply: function()
}
> testContract.multiply.call(3)
21
注意:记得保存智能合约部署完的地址,以及abi参数,因为部署完之后无法修改,
忘记地址则无法再次调用,同时部署智能合约会消耗gas,完成后可观察用户的余额是否变化。
6.truffle开发框架
上面我们实践过智能合约的编写,调试,发布。但是有没有发现,提到在区块链上部署合约一旦部署就无法修改,在公链上还需要花费gas.同时我们发现在命令行客户端编写智能合约也不方便调试。所以本节介绍一个智能合约开发框架truffle。
1、安装brew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2、安装NodeJS
brew install node
3、安装truffle
npm install -g truffle
最近有发现truffle安装不稳定,所以通过执行以下两条命令来安装truffle成功率会高一些
npm config set registry https://registry.npm.taobao.org
npm install -g truffle
4、安装testrpc
testrpc用于truffle的调试,开启服务后可模拟节点并自带用户
npm install -g ethereumjs-testrpc
testrpc
5、truffle使用
初始化项目,会生成一个模板工程
truffle init
编译工程、部署、启动服务
truffle compile
truffle migrate
truffle serve
打开 http://localhost:8080/ 即可对刚才的truffle工程调试了

并从启动的testrpc服务输出栏中选取一个用户进行转账操作,并注意账户余额

6、truffle项目结构解析
通过以上演示,你会明白truffle大致的工作流程和效果,如需根据自己的业务场景进行智能合约修改工程文件即可。
下面来看看工程结构

app主要为web页面相关的文件夹
buIld是执行truffle compile生成的
contracts是编写的智能合约存储位置
migrations是truffle部署后引用智能合约的映射
truffle.js则是整个工程的配置文件
刚才在web页面上使用的功能在智能合约中实现为contracts文件夹中的MetaCoin.sol:

以上是truffle框架的使用方式,想要了解多更可以参考项目官方地址:https://github.com/ConsenSys/truffle
帮助文档地址:http://truffle.readthedocs.io/en/latest/
Source: jwter – CSDN
