区块链技术与应用 (1)

前置声明

本文作为个人观看 肖臻博士 的区块链技术应用公开课的学习、记录以及备查所用。如需转载请邮件到我的邮箱 leor_cao@163.com。附上视频网易云课堂链接地址:—>传送门<—

区块链与比特币的概念

很多人会认为区块链就是比特币。其实不然,比特币只是区块链的一个附属产物,它的作用只是为了激励矿工进行挖矿。而区块链才是真正的核心内容,因为,所有涉及到比特币的交易、发行、记账等等所有的功能,都记录在这个链中。作为技术人,其实本身是不喜欢比特币的。但是对于区块链技术本身而言我觉得这个创造真的是非常伟大的。

什么是 比特币

比特币被称为加密货币(crypro-currency),但是比特币是不加密的,在区块链中,所有的交易信息、账户金额等等都是公开的。比特币中主要用到了密码学中的两个功能,一个是 HASH,一个是 签名用以保证其安全性,以及区块的不可逆性。

密码学中的 HASH

密码学中的 HASH 被称为 密码杂凑函数(cryptographic hash function),它具有一下几个特点:

抗碰撞性(collision resistance)

抗碰撞性的原理是,已知 xy 的值不相等,经过 Hash(x)Hash(y) 之后值相等,则称为 HASH 碰撞
然而,因为输入空间的值必然大于输出空间的值,所以,HASH碰撞则是不可避免的。假设一个 256 位的值,它的输出空间则只有 0 ~ 2^236 - 1 之间的值,而输入空间则远远大于这个值。
然而,如果需要找到两个输出相等的值,只有不断的遍历输入空间的值。
hash 的主要作用在于对输入值取一个摘要信息,用于验证对输入值正确性的验证。因为只要篡改了输入值,必然导致输出值的改变。

隐匿性 (hiding)

hash 函数的隐匿性保证了公布输出结果之后,依然无法判定输入值的内容。因为它具有不可逆性,无法通过结果计算得出输入值的信息。需要破解这个值也只能使用暴力破解的方法求解。

隐匿性与抗碰撞性两者组合效果

这两个特性组合的结果就是 密封信件数字等价物 在交易的时候只需要对外提供一个输入值经过 hash 函数之后的输出值。隐藏输入值,当需要验证时只需要对保存的输入值进行 hash 计算判定得出的结果与之前发布的输出值一致,则认为他们是同一个输入。
实际当中需要保证输入的足够随机性,例如,在输入值的后面绑定一个随机数 nonce 然后一起 hash 保证随机数的分布足够均匀。

不可预测性(puzzle friendly)

这一特性保证了 hash 函数的结果是无法被提前预知的。这个性质保证了,如果给定一个计算范围的值,你无法确定那一个输入值更有可能得出相匹配的结果,唯一的解决方法只有一个个尝试每一个有可能的输入值。得出相应的结果然后判断是不是在目标范围内的值。这个过程被称为 工作量证明(proof of work)
在比特币中将会给定一个 target 值,而挖矿的过程就是不断的生成新的 nonce,然后计算 hash(block header + nonce) <= target,则认为这个 nonce 为合法的。当别的节点验证的时候只需要计算这个 header 的 hash 值 <= target 即可。

比特币中的 hash 函数

比特币中使用的是 sha-256 全称为 Secure hash algorithm(安全散列算法),它完全满足以上的所有特性。

比特币中的账户

在比特币中需要创建一个账户只需要在本地生成一对 公私钥(public key and private key) 即可。公钥相当于你的银行账号,私钥则相当于你的账号密码。别人知道公钥则可以向你的账号转账,而一旦知道了你的私钥之后则可以将你的钱全部带走。所以,在比特币中,私钥死都不能给别人,除非你的账号里没有钱,或者你跟自己的钱有仇。

加密方式

对称加密

最初的加密体系中使用的一般是 对称加密 方式。这种方式下,通信双方通过约定的 密钥(encyption key)进行加密解密。
类似电视剧里的 密电码译本。其中一方辛辛苦苦,绞尽脑汁。终于编了一套新密码,不幸的是在传递译本的过程中被敌人获取了。敌人拿着这个译本,开开心心的破解着你的传输内容。
这跟网络世界很相似,网络也有可能被监听,一旦发现在传输密钥时,就地捕获你的密钥,然后就可以清清楚楚的看到你的传输内容。
所以,对称加密的密钥一旦泄露所有的加密信息在别人眼里都将变成明文传输。

非对称加密

而非对称加密体系中,引入了一对密钥,一个称为 私钥(private key)。主要用于解密信息,还有一个公钥(public key)主要用于加密信息。公钥不需要保密,理论上任何人都可以获取。但是私钥需要保证不能外泄。需要向别人发送信息时只要拿他的公钥加密信息,然后,他用自己的私钥解密信息。

签名

至于为什么在区块链中不能泄露自己的私钥,我们可以看一下比特币交易时公私钥都在干什么。
首先你要发起一个交易,需要你用自己的私钥进行签名,确定这个交易是由你本人发起的。
然后其他人对这笔交易进行验证时。用你的公钥验证是否是你的私钥签名的。
所以,可以看到,私钥主要就是用来签名,告诉别人,这事儿是我干的。
类似于你去银行转账,也要向银行提供本人签名。保证是你本人提出的转账。不过银行在确认时用的是你的笔迹或者指模。而比特币中使用的是你的公钥。