首页 > 技术文章 > 区块链基础学习笔记

huigugu 2021-05-17 19:29 原文

一、简介

本人第二次尝试学习区块链。之前已经把肖臻老师的课看了一遍,杂七杂八的视频、博客也看了不少。不过在做完了一个IPFS-以太坊相关的项目后,发现之前很多没有用过的知识都已经忘掉了,而一些用过的知识也有了新的理解,固再次从基础学习区块链。笔记长时间更新,参考资料出处都会标注在文末。

二、笔记

1、比特币

1、密码学原理

比特币被称为加密货币,但是比特币的交易内容并不加密,所有交易被公开。

1.hash散列算法

定义

一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(通过散列算法变换成固定长度的输出,该输出就是散列值。

性质

  1. hash碰撞时,不同输入、相同输出的情况是存在的,但是暴力求解难度极大。 hash无法从理论上被验证,只能通过实践破解。(例子:MD5曾被认为很安全,现在已经可被人为碰撞)
  2. 不可逆。已知输出,只能通过暴力求解找输入
  3. 在比特币中用到的hash,无法通过改变输入,达到指定hash,只能通过随机。比特币中,通过 数据+随机数的内容,要求指定hash。没有得到答案的捷径。

虽然挖矿很难,但是验证十分容易,只需要求一次hash

比特币中使用的是SHA256

利用

  1. 通过对数据求hash,可以验证数据是否被篡改。
  2. 加密信封。一个人预测股市,为了不对股市进行影响,不能公布预测结果。这时如果对预测结果取hash,并进行公布,人们无法知道具体内容,但是在第二天,预测者公布预测内容,人们可以进行验证。

实际操作中会在预测内容后加一个随机数,以保证内容足够随机。

2.加密、签名

此章节本来为'签名',但是肖臻老师讲的不太详细,读了几篇博客文章,深有体会,连接放在下面。(参考资料2)

在比特币中创建账户,只需要一对公私钥。公私钥的概念来源于非对称加密。

对称加密:加密解密使用同一套密钥。在传输数据可能被窃听的条件下,必须保证密钥的安全分发。

非对称加密:用一对密钥。公钥公开,私钥保密。公钥加密后,私钥可以解密;私钥加密后,公钥可以解密。

在比特币中,公钥相当于账户,私钥相当于密码,而产生一对相同公私钥的几率极小,固比特币中公私钥既能代表账户。

一切问题的根本,就是无法保证网络中传输的信息不被窃听。若信息被窃听,一是会泄露信息,二是窃听者可以将信息篡改继续发送。由此,信息发送者和窃听者之间展开了一场军备竞赛。

还是引用这个经典例子,情侣Alice和Bob希望进行通信,Bob希望给Alice发消息,而第三者Eve希望干涉这个过程

Bob最先使用了「对称加密」。Bob和Alice事先了解了加密方式,在传输信息前将信息加密,密文传输后进行解密。这样Eve即使截获了信息,也不知道信息的具体内容。但是这只是小情侣之间的密语,我们伟大的互联网可无法提前商定好加密方式,固对称加密pass。

Bob转而使用了「非对称加密」。Alice将自己的公钥公开,Bob用Alice的公钥加密后,将密文传输给Alice,Alice用自己的私钥解密。通过非对称加密,我们解决了窃听的问题,不过,仍有问题存在。因为Alice的公钥是公开的,我们的Eve将自己的消息用公钥加密,发送给了Alice,Alice收到了两条消息,并没有办法判断哪条消息是Bob发送的。

Bob更进一步使用了「数字签名」。Bob在发送消息时,用自己的私钥对消息的hash计算一个签名,并同步发送。值得注意的是,我们是对消息的hash计算签名,而非消息本身。原因有二:1、hash更短,计算更快。2、任何人都可以用Bob的公钥将签名溯源,若是对消息本身计算签名,则可以计算出消息本身。Alice在收到消息后,首先用Bob的公钥解开签名,得到一个hash;再用自己的私钥解密密文,得到明文,对明文取hash。若这两个hash相同,则可以证明这是Bob发来的,没有被更改的信息。

这一段我懒得画图,主要是我自己理清思路,你如果没看懂建议去看我发的博客。

2、数据结构

1.hash指针

普通指针存储的是某结构体在内存中的起始位置。hash指针除了存储位置,同时存取hash值。这样可以保证结构体内容不被篡改。

区块链中,用hash指针代替了普通指针。

第一个区块,叫做创世区块。最后一个区块是最近产生的区块。每一个区块都包含一个指向上一个区块的指针。这个hash指针的hash是用整个区块的内容,包括指针内容算出来的。

只要检测最后一个hash值,就可以检测整个区块链内容是否变化。所以很多节点只需要保存部分区块,前面的保存hash即可。

2.Merkle tree

比特币区块中的交易被组织成了Merkletree的形式,根hash值被保存在区块头中。

区块链分为全节点和轻节点。全节点保存所有的交易信息,轻节点只保存根hash值。当我们需要验证一个交易时,从全节点请求一组hash,只用进行几次hash运算即可。

3、比特币协议

花两次攻击:

我们可以用签名的方式保证一张数字货币的内容不被更改,但是每张数字货币非常容易被复制,之后被花多次。

中心化解决方法:

给每张货币编号,中心化服务器记录每张货币的去向。

去中心化解决方法:

每个交易,指向货币来源的交易。

交易包括块头和块身。

块头:

  1. 版本
  2. 货币来源区块的地址hash
  3. Merkletree的hash
  4. 挖矿难度值
  5. 随机数

块身:

  1. 交易列表

节点分类:

  1. 全节点:拥有所有区块记录
  2. 轻节点:拥有部分区块记录

区块链中的共识机制:投票

女巫攻击:创建大量的账号进行投票,从而控制投票权

简单的直接投票不可行

比特币中并非用账号数量投票,而是使用算力进行投票

三、参考资料

内容 备注 链接 序号
北京大学肖臻老师《区块链技术与应用》公开课 区块链基础 https://www.bilibili.com/video/BV1Vt411X7JF 1
一文彻底搞懂加密、数字签名和数字证书! 加密、签名、证书 https://segmentfault.com/a/1190000024523772 2

推荐阅读