区块链系统基本概念介绍

2017-05-09 by guozhongxin

这篇文章主要是介绍一下区块链技术里基本的名词概念,并会对具体实现进行介绍,对于想深入理解区块链技术的人会有一定的帮助。这些概念大都是通用的,本文中涉及到具体实现的,以ethereum中的实现例进行介绍。

区块(Block):

区块是构成区块链的单位。一个区块中承载着一段时间内全网的新增信息。每段时间,都会产生一个新的区块被添加到区块链上。区块链上记录的信息不一定是虚拟货币的信息,可以是任何有共识的内容,例如知识产权、访问日志、广告点击日志等。

区块链(BlockChain):

区块链即是一个个“区块(Block)”组成的“链(Chain)”。每个区块会记录上个区块的hash值,由此产生一个逻辑上的链。

公有链,私有链,联盟链

  • 公有链,就是一个开放的区块链系统,任何人都可以加入,进行交易、“挖矿”。市面上几乎所有的虚拟货币都是公有链。
  • 私有链,这里指完全私有区块链(Fully private blockchains),指个人或组织自己搭建的区块链网络,外人一般无法自由地加入或者权限受限。私有链的控制权在少数个体手中。
  • 联盟链,也被称为共同体区块链(Consortium blockchains),介于公有链和私有链之间,一般是多个组织或个人提前达成某种共识,搭建起一个非公开的区块链,各个成员彼此权利对等,通过区块链的种种机制进行制约,共同监管区块链上的数据。

在公有链上,由于完全开放,任何人都可以参与进来,为了防止恶意破坏和攻击者,都会要求各个节点(“挖矿”的“矿机”)进行工作量证明(Proof证明)。这使得恶意破坏的代价很高,除非控制区块链网络中半数以上的计算能力,否则无法完成。而本身正常挖矿是能有一定的经济收益的(每个区块的创建者会得到虚拟货币奖励),所以在经济上也是不划算的。

而在私有链和联盟链中,创建区块的权利控制在少数人手中,联盟链中各个节点彼此的身份是已知的,一般是不需要进行工作力证明。另外,各个节点可能存在一定程度的彼此信任,每个节点可以免去对其他节点创建的区块的部分或者全部内容的验证。基于以上两点,即使在同样的网络规模下,私有链和联盟链性能会优于公有链。

不过也有人认为,只有公有链才是“血统纯正”的区块链,具备区块链系统的全部特征(去中心化,透明性,可追踪性,匿名性等等)。不过随着区块链技术的推广和应用,越来越多非公用链形式的区块链系统被实施部署。

钱包,矿机,地址

在区块链中,有各种各样的参与者,他们共同构建起一个区块链的社区。

在一般常见的虚拟货币区块链系统中,会有大量的用户在社区内发生交易(Transaction)。所谓的钱包,里面放的可不是钱,而是一个账户的秘钥。每个钱包都有一个ID,被称为这个钱包的地址,可以理解成这个账户的“账号”。一个人可以有多个钱包,每个钱包/账户里对应着数量不等的虚拟货币。通常一笔交易,就是指一个钱包或多个钱包里的虚拟货币,转移到一个或多个钱包中。实际声明这笔交易时,就是用钱包的地址来代表不同的钱包的。

这些互相交易的钱包只是区块链系统的一部分参与者,而真正构建起整个区块链系统的是,是一个个节点,各个节点互相联通,形成一个P2P网络。有些节点将网络上的源源不断交易进行验证,并将一段时间内的交易打包成一个区块(Block),随着时间推移,构成一条“区块链(BlockChain)”。一条交易时会被广播到全网节点的,这些节点同时在处理这些交易,他们各自会打包成区块,再次发送到全网。而同一段时间只有一个Block会最终被大家认同并接受。在公有链上,创建一个被大家都承认的Block,会得到一定的虚拟货币奖励。因此,这些工作就被称为“挖矿”,做这些工作的节点(机器)就被称为矿机。

需要注意的是,有一些节点只进行接收矿机发来的Block,并进行验证,而不自己去打包创建Block。所以并不一定是所有的节点都是“矿机”。

区块链系统中每个节点也会有一个地址作为标识。实际上,区块链系统中的每个实体(节点、钱包,智能合约),都会有一个地址。

公钥(PublicKey),私钥(PrivateKey)和地址(Address)

在区块链系统中,对于身份的验证都是利用秘钥加密验证的机制进行的,具体是采用的非对称加密算法来实现的。

公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。

前面提到的“钱包”,里面所存放的“密码”,就是对应的私钥。

简单理解,可以把地址当成公钥的表达形式。地址和公钥是任何人都可以互相转换的。

在区块链系统中,一个用户发出的交易信息,以及一个矿机创建的区块,都是用私钥对交易(或区块)信息进行加密,生成签名,附在交易(区块)之后。当别人收到这条信息时,首先验证这条信息是否真的是由这个用户发出的,就会用签名和信息本身进行decode,可以得到对应的公钥,验证这个公钥和发出这条信息的地址是否是对应的,就可以判断出真假。

Transaction:

Transaction就是一条交易记录,由于大部分区块链系统支持智能合约,所以Transaction分为三种:

  • 转账
  • 创建智能合约
  • 调用智能合约

以Ethereum中的实现为例,了解一下Transaction中的结构:

from: // 发送者的地址
to:  // 接受者的地址(当创建smart contract时此条为空)
value: // 这笔交易的转账金额
gas: // 汽油,用来衡量这条交易执行的复杂程度的度量,这里是用户指定的最多愿意付出的gas数量
gasUsed: // 实际消耗的gas
gasPrice: // 汽油价格,发送者愿意为gas付的价钱,gasPrice乘以gasUsed就等于给矿机的小费
nonce:// 用来标记一条Transaction的标记,在一笔交易tx_a没进链时,可以发出同样nonce的tx_b覆盖之前的tx_a。nonce主要是用来避免“双花”的问题:当你不小心将用一条交易发送两遍,或者由于网络原因矿机收到了两个tx_a,这时候依然只有一笔会生效。Ethereum的实现时将nonce设置为这个发送者之前总共发送过的tx数量
data: // 创建smart contract或者调用smart contract的代码(hash值)
txHash: // 由以上信息生成的hash值,作为tx的ID。由于nonce的原因,txHash不可能重复
r:
v:
s:  // 这三个实际上是签名(Signature)分成了三部分。签名是由发送者的私钥和txhash生成的。 接受者解密时,由签名和txHash可以得到发送者公钥,会检查公钥和发送者地址是否对应。

分叉

硬分叉hard fork

软分叉soft fork

ProofWork:

[1]https://blog.ethereum.org/2015/08/07/on-public-and-private-blockchains/


Comments

Fork me on GitHub