一步一步学区块链-深研未来

1.概念了解

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的 新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法
  • 含义
比特币(BitCoin)的概念最初由中本聪在2009年提出,根据中本聪的思路设计发布的开源软件以及建构其上的P2P网络,其支持这一应用的底层技术叫做区块链(Blockchain)本质上是一个去中心化的数据库,区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。
狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一 种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账 本。广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数 据的一种全新的分布式基础架构与计算范式。
  • 简介
区块链技术包含一下特征:去中心化、开放性、自治性、信息不可篡改、匿名性
区块链技术发展过程(目前处于2.0后文中所讲技术基于此版本,3.0为设想阶段):区块链1.0——数字货币 、区块链2.0——数字资产与智能合约、区块链3.0——DAO、DAC(区块链自洽组织、区块链自洽公司)?
区块链分类:公有区块链(PublicBlockChains)、联盟区块链(ConsortiumBlockChains)、私有区块链(privateBlockChains)
区块链主要解决的交易的信任和安全问题,因此它针对这个问题提出了四个技术创新:分布式账本、对称加密和授权技术、共识机制、智能合约
  • 技术详情
区块的结构,区块头和内部交易数据组成,区块头包含:区块编号、上一区块哈希值、本区块哈希值、挖矿随机数、难度、时间戳。
区块链2.0技术架构分五层由上至下分别为:智能合约层(EVM和solidity脚本)、激励层(发行机制、分配机制)、共识层(POW、POS、DPOS、PBFT)、网络层(P2P网络、传播机制、验证机制)、数据层(区块数据、链式结构、数字签名、哈希函数、Merkle树、非对称加密)。

2.工具和技术的介绍

通过前面对区块链概念的大致了解,我们可以开始真正的学习区块链之旅。

要说区块链技术那么必须说以太坊,区块链技术通过上一篇的了解可以知道,它是支撑比特币的一个底层技术架构,随后被提取和抽象。以太坊将区块链技术带入到了2.0时代,所以我们现在学区块链技术就从以太坊开始就好了。

以太坊官方地址:https://ethereum.org/
以太坊帮助文档地址:http://www.ethdocs.org/en/latest/index.html

  • 客户端
以太坊有不同语言实现的客户端,分别为go、c++、java、python等,并实现夸平台使用(linux、windows、OSX)。这里推荐使用go语言实现的客户端,它是使用最广泛的以太坊客户端,大部分节点都是运行的该客户端,教程和例子也最多,推荐使用,可用于挖矿,组建私有链,管理账号,部署智能合约等常用功能。安装完之后在命令行进行操作管理,其命令行参数和方法也非常简洁
  • 钱包
如果你不是想做技术研究又或者觉得在命令行中进行账户管理、交易、部署智能合约比较麻烦,可使用以太坊钱包。mist项目下有两个图形界面的客户端分别为:Ethereum-Wallet和mist,Ethereum-Wallet是纯gui界面的客户端,mist是嵌了一个gui的壳,打开页面是html页面。另外一个钱包是parity推荐使用的,他在同步区块数据上有技术上的创新,比前面两个都快。将来钱包会逐步发展成智能合约的应用市场,类似现在移动客户端的APP市场,在这里可以搜索下载、发布以太坊的智能合约应用,目前处于初级阶段。
  • 开发语言
区块链技术2.0的最主要的特色就是智能合约,可针对各行各业根据自己的业务需求来编写智能合约。那么编写智能合约就会涉及到具体的开发语言,目前以太坊智能合约支持的开发语言有:solidity、serpent、lll。其中solidity为最主要的开发语言,强烈推荐。其类似javascript编写效率、可读性都比较高。
智能合约说明地址:http://www.ethdocs.org/en/latest/contracts-and-transactions/contracts.html
  • 开发工具
如果你只是调试一段简单的智能合约,推荐使用browser-solidity项目该项目是智能合约浏览器版本的开发环境,可以支持在浏览器中直接开发、调试和编译,对于初学者来说,可以快速上手,不需要安装,非常方便。
项目地址:https://ethereum.github.io/browser-solidity/
Remix是以太坊官方推荐的智能合约开发IDE,项目地址:https://github.com/ethereum/remix
另外还有一个第三方的IDE,项目地址:https://live.ether.camp/
顺便提一下微软visual studio 也集成了以太坊智能合约的编写功能,足矣证明以太坊在区块链技术上的影响力
本节介绍了推荐的客户端、编程语言、开发环境,下面我们就开始动手了。

3.客户端使用

通过学习本节,你可以在脑海中建立区块链大致的“模样”,加深理解。本文中所有的相关演示都是基于以太坊技术在OS X系统环境下进行操作。本节分两部分:一、安装geth客户端,通过命令行进行相关操作;二、安装parity钱包客户端,通过图形界面加深了解。

3.1 安装geth客户端

通过学习上一篇文章我们知道,以太坊项目中有几种语言实现的客户端,那么geth则是通过go语言实现的客户端,接下来我们需要安装并了解geth客户的使用了,特别注意:本文以OS X为例。

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文件

  1. {
  2. “coinbase”: “0x0000000000000000000000000000000000000000”,
  3. “config”: {
  4. “homesteadBlock”: 5
  5. },
  6. “difficulty”: “0x20000”,
  7. “extraData”: “0x”,
  8. “gasLimit”: “0x2FEFD8”,
  9. “mixhash”: “0x00000000000000000000000000000000000000647572616c65787365646c6578”,
  10. “nonce”: “0x0”,
  11. “parentHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
  12. “timestamp”: “0x00”,
  13. “alloc”: {
  14. “dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6”:{
  15. “balance”:“100000000000000000000000000000”
  16. }
  17. }
  18. }

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