比特币
一、比特币
????????比特币:一种点对点的电子现金系统,一个完全的点对点版本的电子现金将允许一方不通过金融机构直接在线支付给另一方。
二、比特币的密码学原理
1、哈希算法
????????哈希算法就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。哈希算法具有以下的两种特征:
(1)、collision resistance(哈希碰撞) ????????所谓哈希碰撞就是给出两个不同的输入,通过哈希计算得出相同的散列值。但是目前还没有在数学上证明哈希碰撞的性质,只是实践经验。在比特币中使用的是哈希算法是Hash(SHA—256)。 目前找到两个不同的输入使得二者的哈希值相等的一种方法是蛮力求解,但是现实生活中由于工作量太大,基本是不可行的。 (2)、hiding ????????加密过程不可逆,也就是可以通过x—>H(x),但是不能通过H(x)计算得到x。由此可以看出这个性质可以进行数据隐藏。
比特币还需要第三种性质 (3)、puzzle friendly ????????哈希算法中通过输入值很难预测出哈希值。 ????????在比特币挖矿中,挖矿也就是寻找一个随机数nonce,然后将随机数nonce和区块头中的其他信息作为输出,得到一个符合条件的哈希值H(blockheader)≤target(target为阈值)。所以只能通过输入不同的nonce值测试,使得整个blockheader取哈希小于阈值。 2、签名 ????????比特币是一个去中心的系统,用户想要创建一个账户,只需要创建一个公钥—私钥对。 ????????公钥不需要进行保密,而私钥则保存在本地,需要保密。假设甲要给乙发送消息,甲用乙的公钥对消息进行加密,发送给乙,乙接收到消息之后用自己的私钥进行解密。 (1)、数字签名 ????????如果使用签名,甲首先对消息进行哈希得到“摘要”(digest),然后用自己的私钥对摘要加密生成“数字签名”(signature),将数字签名和消息一起发送给乙,乙得到消息,使用甲的公钥解密被加密的摘要,确定这个消息是由甲发送的,然后对消息进行哈希,得到摘要,与发送过来的摘要比较,如果相同则说明消息没有被修改。
三、比特币的数据结构
1、区块链 ????????比特币中最基本的数据结构就是区块链。区块链就是由一个一个区块组成的链表,区块链和普通的链表的区别就是hash指针代替了普通的指针。
????????每个区块包含一个前一个区块的hash指针,这个指针是对前一个区块整个信息进行hash出来的,包括前一个区块的hash指针,通过这种数据结构可以实现防篡改。因为,一旦改了某个区块的信息,那么它后面的区块的hash指针就要变化,后面的区块的hash指针一变,后面的后面的hash指针也要跟着变,所以这个数据结构的好处是,只要我们保存最后一个hash指针,那么区块链上任意一个区块发生改变,我们都可以知道 2、Merkle Tree ? ?????????区块链利用Merkle树的数据结构存放所有的叶子结点的值,Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。
?
?
?
Merkle Proof ? ? ? ?比特币中的节点分为两类,一类是全节点,一类是轻节点,全节点保存整个区块的内容(即有block header和block body),轻节点只保存block header。轻节点不包含block body,但是交易信息是在block body里面的,轻节点想要查询一个交易消息是否存在,则需要Merkle Proof。?
? ? ? ?上图可以看出想要证明这个交易存在,轻节点向全节点发送一Merkle Proof请求,全节点受到请求后会把三个红色H()发送给轻节点,轻节点则通过哈希依次计算绿色H(),最后得到一个根哈希值,将此哈希值与block header里保存的根哈希值比较一下就可以确定黄色的交易是否存在这颗Merkle Tree里。
?
?
?
|