初识区块链——区块链到底是什么

一、区块链

1.1、概念概述

可以说,区块链是比特币概念的一个产物,在当时第一次提出比特币这一概念的论文中,其实已经存在了 “区块” 以及 “链” 这两个词,只不过并没有把这两个词联合起来而已。区块链这一概念的第一次提出是在2016年。区块链的英文名是Blockchain,从他的字面意思来理解的话,可以很轻松的知道这是块和链的结合。比特币也是区块链的一个应用,而且是目前为止规模最大、范围最广的一个应用。

目前为止,对区块链的定义并不是唯一的,不过结合区块链的特征,不难发现,区块链其实就是基于比特币区块链技术的一个公共数据库,不过这个数据库的特别之处在于,这个数据库是去中心化的。

1.2、核心算法概述

1.2.1、拜占庭协定

拜占庭协定来源于拜占庭问题:拜占庭帝国拥有巨大的财富,周围10个邻邦垂诞已久,但拜占庭高墙耸立,固若金汤,没有一个单独的邻邦能够成功入侵。任何单个邻邦入侵的都会失败,同时也有可能自身被其他9个邻邦入侵。

他的核心思想在于每个将军都有一份实时与其他将军同步的消息账本。账本里有每个将军的签名都是可以验证身份的。如果有哪些消息不一致,可以知道消息不一致的是哪些将军。尽管有消息不一致的,只要超过半数同意进攻,少数服从多数,共识达成。

而区块链也恰恰利用了这一核心思想,区块链提供一个分布式账本平台,区块链所提供的账本我们称作超级账本。一般地,多个交易被打包进区块中,多个区块构成一条区块链。区块链代表的是账本状态机发生变更的历史过程。

1.2.2、非对称加密

非对称加密,其实也就是说,使用一对公私钥来进行加密。使用私钥加密的密文,只能通过公钥来进行解密,这样的话,可以用来验证加密方的身份,可以作为一个数字签名。当然,使用公钥加密的密文,也只有私钥才能够解密出相应的明文。

一般来说,如果你保存好自己的私钥,不让别人知道的话,那你所拥有的与私钥有关的一切东西都是安全的。

非对称加密举例

非对称加密的算法有很多种,例如,由麻省理工学院的三位学者提出的RSA加密算法、由背包问题衍生出来的Knapsack算法、由离散对数难题衍生出来的Elgamal算法、以及基于椭圆曲线的椭圆曲线加密算法等。在本文中,我们采用的是以太坊的椭圆曲线加密算法。椭圆曲线加密算法是以太坊的核心,在以太坊上的所有通信,都需要发起者通过其私钥签发,而另外的通信者则需要使用发起者的公钥进行解密。假设区块链上的两个用户要进行通信,那么他们是怎么通信的呢?我们消息发起者为A,消息接收者为B。首先,A需要对他想要发送的消息使用私钥加密,加密的过程如下:

1) 首先生成一个随机数 r 0 r_0 r0,选取基点 P P P,然后求出随机数和基点的乘积点: r 0 P = ( X , Y ) r_0P=(X,Y) r0P=(X,Y)
2) 根据明文 m m m、明文 m m m的哈希值 h h h以及 A A A自己的私钥 S K C SK_C SKC生成 s s s: s = h + S K C X r 0 s=\frac {h+ SK_CX}{r_0} s=r0h+SKCX

3)在上述所有的工作完成之后,把 s s s、点 r 0 P r_0P r0P、以及消息 m m m发送给B,其中 s s s以及 r 0 P r_0P r0P起到的作用就是数字签名。

那么B接收到由A发来的信息后,是怎么处理数据的呢?数据处理过程如下:

1) 使用A所发送的消息 m m m计算 m m m的哈希值 h h h
2) 利用A的公钥 P K C PK_C PKC以及基点 P 、 s P、s Ps计算出 C C C C = h s P + X s ( P K C P ) C=\frac {h}{s}P +\frac{X}{s}(PK_CP) C=shP+sX(PKCP)
3) 如果签名是正确的,那么将会得到结果: C = r 0 P C=r_0P C=r0P

1.2.3、容错问题

在消息传输的过程中,可能会丢失、损坏、延迟、重复发送,并且接受的顺序与发送的顺序不一致。

而节点的行为也可以是多样的,可以随时加入、退出网络,可以丢弃消息、伪造消息、停止工作等,还可能发生各种人为或非人为的故障。

区块链上的算法对由共识节点组成的共识系统,提供的容错能力,这种容错能力同时包含安全性和可用性,并适用于任何网络环境。

1.2.4、分布式一致性算法

想要了解这个种类的算法,必须要先知道两个定理:FLP不可能性以及CAP定理

FLP不可能性是指即使网络通信完全可靠,只要产生了拜占庭错误,就不存在一个确定性的共识算法能够为异步分布式系统提供一致性。

CAP定理是指在设计分布式系统的过程中,“一致性”“可用性”“分区容忍性”三者中,我们只能选择两个作为主要强化的点,另外一个必然会被弱化。

区块链为了保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。也就是说,每一个节点在相同状态下,执行相同的命令之后,最终的状态都是一致的。

1.2.5、共识机制

共识机制中,最重要的两个证明分别是:工作量证明以及权益证明的相关算法。

工作量证明是指为了选出一位参与者成为领导者并选择下一个加入区块链的区块,参与者必须解决一个特定的数学问题。

权益证明是指权益证明用权益替代了工作量证明在电力和算力方面的要求。权益指的是参与者在一段时间内愿意锁定的代币量。作为回报,他们成为下一个领导者并选择下一个区块的可能性是与他们所下的赌注成正比的。

总之,区块链的共识机制的核心思想就是让攻击的所能够得到的收益远远小于他成功攻击所需要的成本。

1.2.6、分布式存储

分布式存储的思想,如果通俗一点来说的话,其实他就是要把100个鸡蛋分别放在不同的篮子里。

分布式存储技术并不是每台电脑都存放完整的数据,而是把数据切片后加密存放在不同的电脑里。

而相应的信息存储在哪里呢?其实是存储在了矿工的电脑里。存储时,有关切片文件的存储信息会被记录到区块链上,以防止信息被篡改。

1.3、 零知识证明

1.3.1、概述

先看两个是零知识的证明的例子:

1) 证明你有习题的答案?

 谁也别想看到我的答案本,要是想知道我真的有答案,那你就出题,让我来给你结果。

2) 证明你有公司所有电脑的密码?

 你说想让我打开哪台电脑,我都能打开。

再看一下同样是解决方法,但并不是零知识证明的例子:

1) 证明你有习题的答案?

 把答案本直接拿给别人,让他们验证是不是正确的。

2) 证明你有公司所有电脑的密码?

 我把密码都告诉你,你去验证吧。

通过上面的例子,其实就很容易理解零知识证明的核心思想了,其实就是说,你有相应的数据,但是别人让你证明你有这个数据的时候,你不让他们看到你所拥有的数据。

1.3.2、举例

本来想使用DUBI车险数据的处理方法来举例的,算了,太多公式了,等到下一篇文章单独介绍一下吧。

二、区块链1.0-比特币

2.1、概述

比特币与纸币、黄金、白银等交易货币不同的是,它只是一串数字,每个比特币都是一串唯一的数字,在比特币网络中,决不可能存在两段不同的代码代表同一个比特币的情况,而比特币的拥有者则有自己的比特币账户地址。

2009年1月3日,提出比特币这一概念的匿名用户便开始了实现自己想法的实践之旅,他在Helsinki的一个服务器上创造了比特币世界的第一个区块,我们把这个区块叫做“创世区块”。顾名思义,这是众多连接起来的区块中的第一块。

2.2、区块信息

比特币的每个区块都包含了三个部分:区块的基本情况、哈希值、交易详细信息。区块的基本情况中,又包含了许多信息:交易的数量、交易所产生的费用、对矿工所给予的比特币数量、挖矿的难度、区块的创建时间等。而在哈希值中,则包含了区块的哈希值、矿工在区块上添加的哈希值、在这个区块之前的一个区块的哈希值以及下一个区块的哈希值等。这个区块记录的全部交易情况(每一次生成交易时的时间、输入地址、输出地址等)都被包含在交易详细信息之中。

如果大家觉得描述的太抽象了的话,可以找找创世区块,去看看具体结构是什么样子的。

三、区块链2.0-以太坊

3.1、概述

以太坊是一个公开链,可以在以太坊上处理金融以及非金融类型应用的状态。以太坊的计算机网络显得很创新且又吸引人心,它促成了一种真正的去中心化应用。使用以太坊进行应用的开发其实并不难,以太坊提供了许多能够用来开发应用的框架,其中不免密码学技术基础框架。因此,使用以太坊进行应用的开发,不仅能够降低开发的难度,更能对应用提供安全技术支持。从以太坊的发展来看,他带来的改变将影响全球经济的走向。

以太坊包含了用来构建以及发布应用的以太脚本,也包含了自己的数字货币,叫做以太币。以太币与比特币非常相似,这两种数字货币都不能被伪造,都以去中心化的方式来确保货币不会被某一方控制。而以太脚本提供了一个完整的编程语言环境,有了以太脚本后,我们便可以制订不会产生二义性的合约了。

从以太坊设计的底层来看,以太坊其实是基于计算机密码学的一个开源技术协议。以太坊有很多模块,每个模块分别实现了不同的功能,之后再把各个模块整合起来,形成了以太坊这个整体。与此同时,以太坊可以被看作是智能合约以及区块链的完美结合体,我们可以把已经写好了的智能合约部署到以太坊上,通过以太坊虚拟机以及以太坊提供的RPC接口来访问智能合约和实现与区块链之间的交互。

以太坊虚拟机是以太坊中用来为智能合约提供执行环境的重要部分。其实他是以太坊项目之中众多创新的一部分。以太坊虚拟机是由众多相互连接着的计算机构建而成的,每个人都可以在以太坊上定义智能合约,这些程序会按照虚拟机所定义的方式执行。以太坊上的账户(其实也就是以太坊地址)可以分为两大类:外部账户、合约账户。外部账户的以太坊地址其实是由它的公钥来决定的,而合约账户的以太坊地址则是在创建这个合约的时候由这个合约的创建者的以太坊地址以及从这个地址中所产生的交易数量来决定的。这两类账户的区别是:外部账户在以太坊中是没有代码的,人们可以通过生成以及签名一笔交易而从一个外部账户发送信息。

3.2、以太坊钱包

比较常用的以太坊钱包有五种,分别是:Parity、MyEtherWallet、imToken、MetaMask、Legder。接下来,分别为几种以太坊钱包做个简洁的介绍:

•Parity: 这个以太坊钱包是由Ethereum Foundation的一部分成员提出以及开发出来的,是一个全节点以太坊钱包并且其功能非常完善。这个钱包的安全度很高,且发起交易时并不会有第三方的参与。不过,也存在一些缺点,对网络的要求比较高是它的缺点之一。
•MyEtherWallet: MyEtherWallet是一个轻钱包,如果想要使用这个钱包,并不需要下载,直接在网页上就可以完成所有的操作且支持很多硬件钱包。不过,MyEtherWallet并不会帮用户保存在MyEtherWallet上生成的密钥,用户需要自己保存密钥,且在进行交易时需要输入密钥。
•imToken: imToken是一个移动端钱包,操作也很简单,能够让用户很快上手,在这个钱包生成的密钥可以保存在手机本地上,平台上是没有备份的,另外,对于广大开发者来说的一大优点便是,这个软件现在已经开源了。imToken的缺点是只有手机客户端。
•MetaMask: MetaMask一开始的时候是作为chrome浏览器的插件被大多数人认识的,在本文中,也使用了MetaMask钱包,只不过是作为火狐浏览器的一部分来使用的,MetaMask支持各种硬件钱包,且操作简单。不过,MetaMask需要我们自己添加代币的智能合约地址。
•Legder: 这是一个硬件钱包,可以出色的保护用户的账户安全,可以配合上述提到的除了移动端钱包之外的以太坊钱包使用,不过这个钱包的价格并不便宜。

3.3、以太坊客户端

如果你还在为自己只会一种编程语言,而不能进行以太坊开发而发愁的话,这些考虑是多余的,以太坊官方正好为你解决了这一问题。

为了能够使用各种语言为以太坊的测试提供支持,以及为了能够让更多人加入到以太坊的开发行列之中,目前出现了使用8种语言编写的以太坊客户端。他们分别是使用c++语言编写的以太坊客户端cpp-ethereum,用Go语言编写的用于以太坊开发的客户端go-ethereum,也就是本文所使用的geth客户端。用javascript语言编写的以太坊客户端ethereumjs-lib,使用Java语言编写的以太坊客户端Ethereum(J),使用Ruby语言编写的以太坊客户端ruby-ethereum,使用Python语言编写的客户端pyethapp,使用Rust语言编写的客户端Parity,这个客户端是目前最轻便的用于以太坊开发的客户端,且在历次以太坊攻击中表现良好。使用Hashell语言编写的客户端,目前为止这个客户端的资料最少,因此不推荐使用该客户端。上述的几种客户端中,本文推荐使用geth客户端作为以太坊开发的客户端,因为geth客户端是目前为止以太坊官方没有停止维护且也是官方建议使用的客户端。

以太坊官方还提供了一个特殊的客户端浏览器——Mist,利用这个浏览器,用户可以运行各式各样的以太坊应用。Mist这一浏览器,对新手非常友好,用户使用时并不需要太多的专业知识,因此用户可以轻松上手使用这一浏览器,再加上Mist由出色的安全机制、公私钥管理机制以及与区块链相关的组件组成,使得他成为了不懂编程或不精通区块链的用户用来运行去中心化应用以及管理区块链相关应用中非常重要的一部分,因为不懂编程或不精通区块链的用户并不需要去了解以太坊的底层设计。

3.4、智能合约

其实智能合约这一概念很早就被提出来了,智能合约这一概念是由Nick Szabo在90年代提出的,智能合约的历史几乎与互联网一样长。智能合约其实是一段可执行代码,不过这段代码实现的是传统意义上的合约,双方或多方可以通过智能合约来签订都认可的协议。由于在当时缺少值得信赖的执行环境,把智能合约用到实际生活中便显得天方夜谭。但是在比特币这一概念被提出了之后,人们便意识到比特币的核心技术——区块链技术正好能够作为执行智能合约的可信赖的运行环境,以太坊这一公开链则首先实施了智能合约与区块链完美结合的工作。

在以太坊的内部,配备了图灵完整性编程语言的区块链,我们可以通过这一特性构建抽象的应用基础层,以便所有想要通过以太坊构建合约的人构建合约以及基于以太坊的应用,并在以太坊中定义属于他们自己的规则。要是想编写智能合约,solidity语言将会是我们的首选编程语言,我们可以通过truffle框架轻松的编译由solidity编写的智能合约,并通过truffle进行智能合约的部署,整个过程并不需要开发者动手编程,只需要依靠truffle框架就可以很方便的编译和部署智能合约了。

3.5、怎么创建DAPP

我们可以结合以太坊来进行DAPP的开发,具体的开发步骤我留在以后讲吧。

四、区块链开发指导

4.1、以太坊环境搭建

在linux系统下配置以太坊开发环境:
输入以下命令安装solc:

sudo npm install -g solc

我们需要在geth控制台使用solc编译器,那么我们仍然需要安装solc二进制包。输入以下命令安装solc二进制包:

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
which solc可以用来验证一下环境是否安装成功

4.2、以太坊客户端安装

本文使用的是geth搭建的私有链,因此需要安装geth客户端:
输入以下命令安装geth客户端:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

4.3、truffle框架安装

安装NodeJs,想要使用truffle框架对智能合约进行操作,需要NodeJs环境,且NodeJs版本不能低于5.0
输入以下命令安装NodeJS:

sudo apt-get install curl
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash 
sudo apt-get install -y nodejs

为了更快捷的进行以太坊开发,我们需要安装truffle框架:
输入以下命令安装truffle框架:

sudo npm install -g truffle

4.4、以太坊客户端geth安装

本文使用的是geth搭建的私有链,因此需要安装geth客户端:
输入以下命令安装geth客户端:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

4.5、 私链搭建

本次文使用的是自己搭建的私链,当然,也可以使用Ganache本地私链,ganache的私链很简单,只需要安装ganache以后,开启他就会成为一个私链。

使用geth客户端搭建私链的方法就我所知道的有两种,在这里,我推荐一个链接:
私链搭建方法

如果有任何疑问,可以通过私信来联系我,也可以评论。

4.4、挖矿

使用以下命令来启动挖矿以及停止挖矿:
挖矿命令:

miner.start()

停止挖矿的命令:

miner.stop()

4.5、常用的truffle框架命令

初始化文件:

truffle init

进行智能合约的编译:

truffle compile

进行智能合约的部署:

truffle migrate

当然,truffle还有更多的高逼格命令,我不可能在这里一一列出的,想知道的同学可以去truufle官网看看。

五、区块链开发视频分享

想要区块链开发的学习文档以及区块链开发视频教程的同学可以评论也可以私聊我,我看到的话,会联系你的。

你可能感兴趣的:(区块链)