比特币入门

比特币入门

今天主要是先给大家讲解一下比特币中使用的一些加密算法的概念和数据结构的使用,我强烈建议你先看完这篇文章,再去深入了解比特币的运行机制。我们都知道,比特币是以其加密算法和系统中各部分的互相牵制而保证其安全性的,那这个加密算法为啥能保证其安全性,看完这篇文章,或许,你就会明白。

一、加密哈希函数

哈希函数其实就是一个数学函数,它有以下三个特点:

a. 输入值可以是任意大小的字符串

b. 它的输出值的大小是固定的,由于比特币中使用的哈希加密算法(SHA256 算法)产生的输出是256比特,所以我们后面假设输出就是256比特。

c. 它很容易计算,不耗时。

而要让哈希函数能够符合安全的规范,它还需要以下三个性质:

(1)抗冲突性

什么是冲突?冲突就是,当你输入两个不同的值的时候,却产生了同样的输出值,如下图。

而抗冲突性,就是为了要避免这种情况发现。记住,这种情况不是不存在,只不过,是按照当前人类所拥有的技术和计算能力,无法在既定的时间内找出来。为什么这么说呢?记住上面哈希函数的特点,它的输入是任意长度大小的字符串,而它的输出确实固定长度的字符串,那从这两个范围的大小来说,是肯定无法一一对应的。

所以,这里不是要找到这么一个函数,它不存在这种冲突性,而是要找到这么一个哈希函数,你按当前人类所拥有的计算水平,你找不出它的冲突性。

这个特性有什么用呢?其实,它就代表着这个输入值,你可以认为是一一对应。大家不知道有没有印象,其实你们很多时候在网上下载软件或其他东西的时候,还会附加一串数字,那个数字其实就是这个软件的哈希值,很多时候是MD5值(虽然它已经被人证明不安全)。它代表着这个软件,如果它没被修改,那么它的输出是不会改变的,如果改变了,那你可以认为这个软件其实不法分子被修改过了,可能有病毒。

(2)隐藏性

这个比较好理解,就是无法根据输出值来推断输入值是多少。

(3)Puzzle-friendly

抱歉,这个我不会翻译。这个特性的意思就是说呢,假设有两个值,k和x,把他们俩串联起来,这里用 “k||x” 来表示他们串联的结果。他们的哈希值是H(k||x)=y,如果k是选的很随机的一个数,那么通过y,k来找出x的时间,是不会比2的n次方小的(这里我们假设哈希值的结果是n bit)这个特性跟比特币的一致性算法——工作量证明的细节有关,我后面再为大家讲解这个特性的好处。

二、哈希指针及数据结构

学过C语言的都知道指针的意义,指针其实就是存的数据的地址,我们通过指针,就能找到数据存放在哪里。那哈希指针呢?其实它也有指针的作用,同时呢,它还存储着指向它的数据的哈希值。结合上面所讲的,你就能发现,这个哈希指针不止能找到它指向的数据,同时还能发现,这个数据有没有被修改过。

记得我上篇文章讲的吗,其实区块链就是用哈希指针串联起来的一个个块,就是一个哈希指针链表(当然我这么说肯定是简化了,后面再详细讲)如下图:

所以,如果你想要修改其中的一个data,那么必须把后面的data都修改了。而从此图的实现方式来看,即使你都修改过了,只要把右上角的哈希指针保存着,那即使别人把后面的都修改过了,你也可以发现。当然,比特币它没有按上述的方式实现,它是让你要付出很大的代价才能修改数据,后面文章细说。

三、数据签名

有两个概念,公钥(Public key)和私钥(Private Key)。一般是一对,一个公钥配一个私钥。这个有啥特性呢,就是说,你用你的私钥对一个文件(或数据)签名,别人能通过你的公钥进行验证,看这个签名是不是你写的。一般私钥是自己保管,公钥可以通过给信任的第三方保管,或者你直接寄给对方。

还是上一篇文章,我们介绍了比特币是用公钥的哈希值来作为身份验证的。也就是说,别人要付钱给你,你就把自己的公钥的哈希值寄给他就行了。那怎么用呢,就是你在用的时候,要签名,证明这是你本人用的,别人可以通过你的公钥来验证说,对,这笔钱确实是该比特币的主人用的。

(注:这里的签名跟现实生活中的签名不一样,一个签名只对应一个文件,无法复制然后用在别的文件的)

好了,讲完了。虽然看完之后你可能云里雾里,但是我保证,等你看完这文章后,理解我后面写的技术细节,你会更加容易!如果觉得写的不错,请给个赞并关注我后续的文章,谢谢了!


PS:本系列文章只介绍比特币背后的技术细节,对于想要深入了解比特币,区块链技术的人员来说,我保证是很好的资源!但是,请不要跟我讲比特币有泡沫啊之类的,我不管它能不能成为法币,我不管它涨还是跌,想要讨论这些问题的,请前往别的问题,不想撕逼,谢谢。

本文章参考普里斯顿大学在Coursera上讲的Bitcoin and Cryptocurrency Technologies的第一章,有兴趣可看一下对应的书籍。Bitcoin and Cryptocurrency Technologies

编辑于 2017-05-28 17:05