分类: 区块链开发

区块链原理简介

引言

区块链出现也有几年时间了,随着前几天比特币单价过十万又火了一把,有人认为区块链继蒸汽机、电、互联网之后,又一个具有颠覆性的核心技术。

马云说过,对待新生事件,人们的普遍反应就是看不见、看不起、看不懂以至来不及,区块链可能也如此。

互联网出现以来,盗版问题层出不穷,这是由于它本身的性质决定的,你有一张图片,我拷贝一份后并不会对你原本的数据造成更改,这跟一个苹果不一样。

区块链要解决的实际就是这个问题,它是一个构造信任的机器,可以彻底改变互联网以至人类价值传递的方式,今天我们就来简单了解一下区块链的基本原理。

密码学基础

区块链的实现主要基于以下两点:

1. 非对称加密

非对称加密需要两个(一对)密钥:公开密钥(publickey)和私有密钥(privatekey),用公钥对数据进行加密后,只有对应的私钥才能解密;反之如果私钥用于加密,则只有对应的公钥才能解密。

2. 安全散列算法

安全散列算法(英语:Secure Hash Algorithm)是一种能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高;而SHA是FIPS所认证的五种安全散列算法。这些算法之所以称作“安全”是基于以下两点(根据官方标准的描述):

  1. 由消息摘要反推原输入消息,从计算理论上来说是很困难的。
  2. 想要找到两组不同的消息对应到相同的消息摘要,从计算理论上来说也是很困难的。任何对输入消息的变动,都有很高的机率导致其产生的消息摘要迥异。

什么是区块链

什么是区块链呢?实际上区块链就是一系列区块组成的链,下一个块记录了上一个块的地址信息,同时最长的链作为合法链,从数学结构上看类似一个单向链表。

一个区块简单来讲包括以下内容:

  • 上一块的哈希值指纹,证明本块是在上一块包好之后生成的,而不是提前算好的
  • 账单签名,生成块过程中的所有账单通过 Merkle Root Hash 计算得出的签名
  • 矿工的收款地址,存放区块奖励(目前每块25BTC)还有交易中包含的手续费
  • 矿工自己写的一点东西
  • 当前时间戳

它的实际报文可能是这样的:

什么是挖矿

简单说生成合法区块的过程就是挖矿,矿工将区块内容打包之后,得到新块哈希值指纹,如果前面有足够多的0,那么就表示我们包好了一个新块,否则扔掉结果重来。

前面说过安全散列算法的基本信息,它比较特殊,不经过复杂计算是得不到结果值的,或者说结果值是不可预期的,我们的目标就是找一个签名值前面包括足够多个 0 的。

这个 0 的数量就是区块链里常说的难度,例如我要随机生成一个长度为10的由数字组成的字符串,那么生成的结果由 0 打头的概率就只有 1/10 ,如果有两个 0 打头的概率就只有 1/100,0 的数量越多难度越大,需要次数越多。

所以挖矿的实际做法就是试错,把1带进公式看行不行,1不行就2,2不行就3,每次你都有那么一点点概率试对。这个算法的特殊性在于,你不能通过以前的计算结果来简化计算,当你知道1234567都不行时,你不敢保证8一定不行,必须一个一个去试。所以就像上文说过的,在计算过程中改变一些值不会影响计算进度,因为概率几乎是相等的。

是否将新交易打包进区块,几乎不会影响到计算的进度,所以如果在计算过程中矿工收到了新的交易,矿工为了额外的手续费,通常会将新交易打包,以便获得更多手续费奖励。

怎么证明有钱呢

由于区块链是保存的是一系列交易,所以把所有记录运算一遍就得到了每个账户中的钱数了,然后就是怎么花呢?

一开始提到了非对称加密算法,实际在这就用到了,怎么花的问题实际就是怎么证明交易有效的问题,只要交易有效,自然有矿工打包广播。

区块链中的每个人都有自己的钱包,简单来讲钱包就是私钥,而地址就是公钥。

由于只有钱包的拥有者知道私钥,所以只有他能对这个交易签名,而其它人只要通过公钥进行签名验证就可以知道是不是账户拥有者发出的了。

Done !

本文只是简单说了一下基本过程,概念也有所简化,有兴趣的欢迎留言讨论。

Recent Posts

Docker 容器非 root 用户监听 80 端口

起因是基于 CentOS 的 …

2 年 之前

基于 Docker 定时打印文件

先说背景,喷墨打印机有个很大的…

3 年 之前

Java 运行时反射获取来自继承的泛型

背景 正常情况下 Java 的…

3 年 之前

Java 基于 ByteBuddy 重写系统当前时间

背景 一般单元测试时总会有些代…

3 年 之前

华硕 B450F-Gaming 主板 I211-AT 网卡驱动安装

事情起因是买了块华硕的 ROG…

3 年 之前

PHP 安装 Memcached 扩展

登录服务器挨步执行: # su…

4 年 之前