区块链之比特币
北大区块链公开课,B站有视频,文中图片有较多来自视频中的截图
比特币中的密码学原理
- 比特币只是区块链技术中的一种加密货币,并不和区块链代表同一个东西。
哈希
主要利用的性质:collision resistance,hiding(单向性),输出不可预测性(挖矿)。
此外,实际操作过程中现实情况下的输入空间可能不够大,这个时候可以通过在原始输入后面加上nonce来增大输入空间。
签名
比特币创建账户——在本地创建一个公钥私钥对。
比特币的数据结构
哈希指针
不仅保存了结构体在内存中的起始位置,还保存了结构体的hash值
Merkle tree
与普通树不同的是采用hash指针代替了普通指针
一个block包含了block header和block body。header里面存放了merkle tree的root hash。body中存放交易记录。
- 全节点:包含了block header(存放了hash值)和block body(存放了具体的交易信息)
- 轻节点:只保存了root hash
向轻节点证明黄色区块的内容的确已经写到区块链中了。
首先验证方会收到黄色区块的内容,之后会向全节点请求数据(红色的那部分),之后依次算出hash,直到算出根hash,在于自己保存的root hash进行比较。(自己也是一个节点——轻节点,保存的数据少)
比特币协议
-
怎么验证交易的有效性,防止double spending
如何防止B’ 伪造A进行交易(伪造的可能性存在是因为,用来验证区块签名的公钥是由转账人自己说的,也就是说B’ 可以使用自己的私钥对区块进行签名,然后将自己的公钥发布出来,之后又说是A的公钥,如果只是使用发布的公钥来对签名进行验证,结果是没有问题的),为了防止这种攻击,可以对币的来源进行验证,验证接收币的人的公钥和这个发布的公钥是否一致。
同样这种验证币的来源的方式也防止了double spending
- 还有些共识机制的问题(比如说应该记录那个账本,以谁计算的区块为准的问题)比较熟悉就没写了(如果忘了可以去bing一下)
比特币的实现(基于交易的模式)
-
比特币中的节点不会显示某个账户有多少钱,只能够通过计算交易记录来推算。所以在每次交易之前要说明自己用来交易的比特币是从哪个输出中来的。
-
UTXO(unspent Transaction Output)由全节点来维护。保存那些还没有被花掉的输出。这个输出需要提供的是他所在交易的hash值(定位交易的位置),以及它所在交易的第几个位置。
nonce已经不够用来制造难度了,因为nonce值是一个32无符号整数,遍历空间不够大。而每发布的区块当中有一个铸币交易,有一个coinbase域可以用作nonce(通过影响merkle tree的root值来实现对header hash值的影响,又不能直接就遍历merkle root,因为merkle root还得保证交易信息hash的准确)
mining保护区块链,如果一个恶意节点拿到了记账权,而他想要记录一个非法交易(A------>M(恶意者))由于他没有A的私钥,那么就算他将这条非法记录写入区块链中,由于这条记录是非法的,区块不会被其他节点所接受,其他节点就会沿着之前的那个节点继续记账,如图所示:
selfish mining
假设B抢先挖到了下一个区块,他可以选择暂时不发布出去,而是偷偷的计算下一个区块,当发现有人计算出上一个区块链之后马上将这两个区块一并发布出去从而成为最长链一下子就得到两个出块奖励。某种程度上减少了竞争压力。
比特币网络
- p2p网络:用户节点都是平等的,有一个种子节点,他知道一些网络上的其他节点,可以通过与他通信从而加入到网络中,想要退出的话可以直接退出。等到区块上的节点收不到消息之后,就会自动将退出的节点信息删除。
- 每个节点维护一个邻居节点的集合,一个节点收到消息之后会将消息转发给邻居节点并且标记这条消息已经接受过了。下次收到是就不会接收了
挖矿
- 出块时间如果太短会导致同时出现很多个分叉,这样就会使得总算力被分散,从而导致恶意节点不需要达到总算力的51%才有较大可能进行分叉攻击,因为它可以集中算力来扩展自己的那一条链。
挖矿矿池(挖矿的是全节点,毕竟要保存交易信息)
-
一个全节点下面带有多个轻节点(只计算hash值),计算hash的任务由全节点发布给轻节点,全节点同样需要轻节点的工作量证明(矿主将目标阈值调低,只要轻节点算出来一个符合矿主要求的nonce值(一个share)就将他交给矿主来证明自己的工作量,在大多数情况下这个nonce值仅仅用作miner的工作量证明。)
-
miner不可能将自己算出来的块hash自己发布然后自己独吞出块奖励:
- 矿主分配给miner的任务区块中的首款地址是矿主的地址,所以就算miner自己发布出去,钱也不会到他那
- 自己把收款地址改成自己的地址,这样算出来的区块share上交给manager,不会被接受,所以它就相当于一开始就是自己干,与是否加入矿池无关(矿池分发奖励是按照上交的share(工作量证明)来进行分配的)
boycott抵制某个交易(拥有51%算力为前提)
例如当包含A->B交易的区块发布之后,攻击者可以马上发动分叉攻击,这个时候并不需要等到6个区块沿着A->B的区块后面延申,因为攻击目的是不让A->B的交易上链。这样的话,其他节点也不会轻易包含这类交易,因为一但包含这样的交易就受到分叉攻击,从而可能导致不是最长合法链而失去出块奖励。
比特币脚本
https://www.bilibili.com/video/BV1Vt411X7JF?p=9&spm_id_from=pageDriver
比特币分叉
- 分叉攻击只是分叉的一种情况
- protocol fork,因为协议的升级,有些用户不同意协议的更改而导致部分用户不升级协议。
根据不同的情况可以分成hard fork 和soft fork
区分:旧节点是否认可新节点
hard fork:代表分叉会永远存在。
分叉原因:区块协议升级,将区块大小变大,也就是说对于升级后的节点来说,他还是会认可旧的区块,因为他并没有超过性的区块大小的限制,但是对于没有升级协议的节点来说,他会认为新节点产生的区块是非法的,所以区块链中会一直存在一条小区块所组成的链。
soft fork:代表分叉只是暂时的
分叉情况:
实际情况不会再区块大小减的比1M还要在小了。对于更新后的小结点而言,旧的是非法的,所以他不会沿着大的区块往下挖,而对于挖大区块的节点来说,因为小的区块对他而言也是合法的,所以当区块链网络中大多数节点更新之后,小区块所组成的链就会变成最长合法链,大的区块也会沿着小的那条挖,虽然之后还是会被抛弃
在BTC中如果密钥丢了,拿这个钱就永远拿不出来了。
BTC中的匿名性
- BTC中账户注册是不需要个人身份信息的,账户的产生只需要自己生成一对公私钥对即代表产生了一个用户。
隐私泄漏的可能性:
- 隐私不一定是要知道用户的姓名,比如说我知道有一个用户,这个账户他还有另外一个账户地址,这从某种程度上也是一种隐私泄露。也就是从区块链交易记录上是有可能把不同的账户联系起来的。
- 使用比特币与实际生活联系起来的时候,这样就会把区块链的账户和现实中的人相联系起来,比如说,我用比特币买了一台电脑,这样商家就会知道我的比特币地址,如果旁边还有人知道我在这个时间段买了一台电脑,那么它就可以在区块链交易上筛选掉很多不可能的选项,之后再来几次这样的筛查,就可以知道我的账户是哪个了。再结合1,那有可能我所有的账户就都泄漏了
匿名性的实现:
两个方面:
network layer:
就是区块链网络是p2p网络,他在转发消息的时候只知道上一个是谁转发给他的,并不知道这个消息的最初来源。
application layer:
coin mixing:将一个人的币和其他的币混合在一起
零知识证明
是指一方(证明者)向另一方(验证者)证明一个陈述是正确的,而无需透露出该陈述是正确的之外的任何信息
同态隐藏
-
同态隐藏的性质
- 如果x, y不同,那么他们的加密函数值E(x), E(y)也不相同,没有碰撞
- 给定E(x)的值,很难反推出x的值
- 同态加法(通过E(x), E(y)的值可以计算出E(x+y)的值)
- 同态乘法(通过E(x), E(y)的值可以计算出E(xy)的值)
- 3,4可以扩充到多项式
盲签算法,零币和零钞
https://www.bilibili.com/video/BV1Vt411X7JF?p=12&spm_id_from=pageDriver
BTC中的地址是由公钥取hash得到的
BTC交易中需要一次性将支付来源中的钱交易完,不然的话剩下的钱就会作为交易费转入发布区块的矿工手中
3,4可以扩充到多项式
盲签算法,零币和零钞
https://www.bilibili.com/video/BV1Vt411X7JF?p=12&spm_id_from=pageDriver
BTC中的地址是由公钥取hash得到的
BTC交易中需要一次性将支付来源中的钱交易完,不然的话剩下的钱就会作为交易费转入发布区块的矿工手中
更多推荐
所有评论(0)