前言

区块链是一个信息技术领域的术语。从本质上讲,它是一个共享数据库,存储于其中的数据或信息,具有“不可伪造”“全程留痕”“可以追溯”“公开透明”“集体维护”等特征。基于这些特征,区块链技术奠定了坚实的“信任”基础,创造了可靠的“合作”机制,具有广阔的运用前景。-- 百度百科

区块链要素

两种结构:

  • P2P组网结构,点对点的灵活网络
  • 链式账本结构,验证和存储数据

两种算法:

  • 密码算法,保证数据传输和访问的安全
  • 共识算法,维护节点间的数据一致性

一个合约:

  • 智能合约,编程和操作数据

区块链记账原理

区块链(1.0)是一个基于密码学安全的分布式账本,是一个方便验证,不可篡改的账本。

区块链在记账时会把账页信息(包含序号、记账时间、交易记录)作为原始信息进行Hash, 得到一个Hash值,如:787635ACD, 用函数表示为:

Hash(序号0、记账时间、交易记录) = 787635ACD

账页信息和Hash值组合在一起就构成了第一个区块。在记第2个账页的时候,会把上一个块的Hash值和当前的账页信息一起作为原始信息进行Hash, 即:

Hash(上一个Hash值、序号1、记账时间、交易记录) = 456635BCD

这样第2个区块不仅包含了本账页信息,还间接的包含了第一个区块的信息。依次按照此方法继续记账,则最新的区块总是间接包含了所有之前的账页信息。
所有这些区块组合起来就形成了区块链,这样的区块链就构成了一个便于验证(只要验证最后一个区块的Hash值就相当于验证了整个账本),不可更改(任何一个交易信息的更改,会让所有之后的区块的Hash值发生变化,这样在验证时就无法通过)的总账本。

比特币所有权及隐私问题

比特币的账户是用地址来表示,账本上不显示个人信息,转账是把比特币从一个地址转移到另一个地址。转账记录如这样:

{    "付款地址""2A39CBa2390FDe"    "收款地址""AAC9CBa239aFcc"    "金额""0.2btc"}

接下来问题就变为了:谁有权用某个地址进行付款?

比特币的解决方案:谁拥有某个地址的私钥,谁就能用这个地址进行支付。(所以私钥一定保管好,如果私钥泄漏,比特币就可能丢失)。
比特币地址和私钥是一个非对称的关系,私钥经过两次Hash之后,可以得到地址, 但是无法从地址反推得到私钥。

地址: 2A39CBa2390FDe私钥: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgalHash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal)))  -> 2A39CBa2390FDe

如何证明你拥有某个地址的私钥?

对交易信息进行签名,流程如下:

  1. 对交易进行hash, 得到一个摘要信息(Hash值)
hash('    {"付款地址""2A39CBa2390FDe",    "收款地址""AAC9CBa239aFcc",    "金额""0.2btc"    }') -> 8aDB23CDEA6
  1. 用私钥对交易摘要进行签名(付款方在安全的环境下进行,以避免私钥泄密)
#参数1为交易摘要#参数2为私钥#返回签名信息sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
① 广播

在签名运算之后,付款节点就开始在全网进行广播:我支付了 0.2btc 到 AAC9CBa239aFcc ,签名信息是 3cdferdadgadg 。(发信息到相连的其它节点,其它节点在验证通过后再转发到与之相连的节点,这样的扩散过程)

② 验证

其它节点在收到广播信息之后,会验证签名信息是不是付款方用私钥对交易原始信息签名产生的。验证过程实际是签名过程的逆运算:

#参数1为签名信息#参数2为付款方地址#返回交易摘要verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"

如果验证输出的信息和原始交易信息的hash一致,则验证通过,记录账本

if(verify("3cdferdadgadg", "2A39CBa2390FDe")    == hash('{"付款地址""2A39CBa2390FDe",              "收款地址""AAC9CBa239aFcc",              "金额""0.2btc"}')) :    # 写入账本     # 广播else:   # donothing

补充

比特币系统使用了椭圆曲线签名算法,算法的私钥由32个字节随机数组成,通过私钥可以计算出公钥,公钥经过一序列哈希算法和编码算法得到比特币地址,地址也可以理解为公钥的摘要。

挖矿原理——工作量证明

前言

在中本聪(比特币之父)的设计里,完成记账的节点可以获得系统给与的一定数量的比特币奖励,这个奖励的过程也就是比特币的发行过程,因此大家形象的把记账称为“挖矿”。

记账工作

大家争相记账,大家一起记账就会引起问题:出现记账不一致的问题,比特币系统引入工作量证明来解决这个问题,规则如下:

  • 一段时间内(例如10分钟左右,具体时间会与密码学难题难度相互影响)只有一人可以记账成功
  • 通过解决密码学难题(即工作量证明)竞争获得唯一记账权
  • 其他节点复制记账结果

不过在进行工作量证明之前,记账节点会做进行如下准备工作:

  • 收集广播中还没有被记录账本的原始交易信息
  • 检查每个交易信息中付款地址有没有足够的余额
  • 验证交易是否有正确的签名
  • 把验证通过的交易信息进行打包记录
  • 添加一个奖励交易:给自己的地址增加12.5比特币(如果节点争夺记账权成功的话,就可以得到12.5比特币的奖励)

工作量证明

为了保证10分钟左右(比特币为例)只有一个人可以记账,就必须要提高记账的难度,使得Hash的结果必须以若干个0开头。同时为了满足这个条件,在进行Hash时引入一个随机数变量。

# 未加随机数Hash(上一个Hash值,交易记录集) = 456635BCD# 加入随机数使结果以40开头的情况Hash(上一个Hash值,交易记录集,随机数) = 0000aFD635BCD

率先找到随机数的节点就获得此次记账的唯一记账权。
目前没有单矿工独立参与挖矿,基本都是由矿工联合起来组成矿池进行挖矿(矿池里的矿工按算力百分比来分收益)。从经济的角度讲,只有挖矿还有收益(比特币价格不断上涨也让收益变大),就会有新的矿工加入,从而加剧竞争,提高算力难度,挖矿就需要耗费更多的运算和电力,相互作用引起最终成本会接近收益。

验证

  • 在节点成功找到满足的Hash值之后,会马上对全网进行广播打包区块,网络的节点收到广播打包区块,会立刻对其进行验证。
  • 如果验证通过,则表明已经有节点成功挖出区块,自己就不再竞争当前区块打包,而是选择接受这个区块,记录到自己的账本中,然后进行下一个区块的竞争。
  • 网络中只有最快解谜的区块,才会添加的账本中,其他的节点进行复制,这样就保证了整个账本的唯一性。
  • 假如节点有任何的作弊行为,都会导致网络的节点验证不通过,直接丢弃其打包的区块,这个区块就无法记录到总账本中,作弊的节点耗费的成本就白费了,因此在巨大的挖矿成本下,也使得矿工自觉自愿的遵守比特币系统的共识协议,也就确保了整个系统的安全。