首页 » Network » Network-else » 正文

浅析比特币运行原理

0x01 前言

前段时间wannacry把比特币推向了一个高潮,本人决定稍微深入了解一下比特币,得出此文,适合于比特币零基础或不甚了解的读者。

//本文图片皆来源于网络

0x02 什么是比特币(bitcoin)

虚拟电子加密货币的一种,使用P2P技术,去中心化,高度匿名,无需信任,分布式账本,实体相当于账本,交易记录相当于货币。

0x03 相关术语解释

1.比特币地址:这是别人付给你比特币时你唯一需要提供的信息,形如1EXspSdXa9BQ6znxrU23eUBHjfuHiNJWso(开头是1),和公钥要极强的相关性,可认为地址就是公钥,建议比特币持有者为每项交易设立一个独立的地址,以保护账户的隐私和安全性。

2.区块:一个区块就是若干交易数据的集合,它会被标记上时间戳和之前一个区块的独特标记(hash值)。区块经过哈希运算后会生成一份工作量证明,从而验证区块中的交易。有效的区块经过全网络的共识后会被追加到区块链中。平均约每10分钟就有一个包含交易的新区块通过挖矿的方式添加到区块链中。

3.区块链:是一串通过验证的区块,当中的每一个区块都与上一个相连,一直连到第一个区块,由所有比特币用户共享。它被用来验证比特币交易的永久性并防止双重消费。

4.工作量证明:指通过有效计算得到的一小块数据。具体到比特币,矿工必须要在满足全网目标难度的情况下求解SHA-256算法,算出下文提到的幸运数字,使得区块SHA-256后的值开头有规定的N个零,这个N有变化机制,以维持10分钟产生一个新区块,难度随矿工的增加而增大。

5.挖矿:将待确认的交易数据包含到块链中,从而完成对这些交易的确认,矿工可以得到他们所确认的交易中包含的手续费,以及新创建的奖励的比特币(目前2017年08月是5BTC奖励)。简而言之就是接受交易信息,建造区块。

6.矿工:通过不断重复哈希(SHA-256)运算来产生工作量证明的各网络节点。

7.确认:当一项交易被区块收录时,我们可以说它有一次确认(约10分钟)。矿工们在此区块之后每再产生一个区块,此项交易的确认数就再加一。当确认数达到六及以上时,通常认为这笔交易比较安全并难以逆转。

8.双重消费:如果一个不怀好意的用户试图将比特币同时支付给两个不同的收款人,就被称为双重消费。

9.P2P:P2P网络(peer-to-peer,简称为P2P),又称为对等式网络,也叫说点对点网络。这是一种无中心服务器、完全由客户端交换信息的互联网体系。一个用户端即是一个客户节点,又具有服务器的功能。P2P网络的一个重要的目标就是让所有的客户端都能提供资源,包括带宽,存储空间和计算能力。

0x04 浅析原理

看了网上有些文章以一种比喻和故事的形式来说明比特币的原理,本人认为虽然这样较为通俗易懂,但是不可避免的与真正的原理有所偏差,并且会掩盖一些细节,所以接下来将以一次完整的比特币交易流程来分析比特币运行原理。

//建议先了解公钥加密,哈希,数字签名等相关前置知识

以密码学的两位主角 Alice 给 Bob 5BTC为例。

Alice和Bob首先用客户端(比特币钱包)生成密钥对(公钥和私钥,椭圆曲线),这个客户端会先下载比特币所有的交易记录,用来验证余额。公钥经过单向加密哈希函数(SHA256和RIPEMD160)和编码(Base58Check)形成比特币地址,这里不考虑转换,那么公钥就是比特币地址(收款地址),私钥由比特币钱包随机生成,用来做数字签名,由于私钥数量异常巨大,可以认为不会重复,要自己保密藏好不能泄漏,一旦泄漏就相当于现实中的钱包丢了,别人有了你的私钥,可以推出公钥,也就可以用你比特币钱包里的比特币了。

Alice在付款地址输入Bob的公钥,付款金额输入5BTC,这5BTC就用Bob的公钥加密了,只有Bob用私钥才能解密,接着这就形成了一条交易记录,交易数据结构大概如下:

####################################

input:

txn: 这笔交易转出的金额的来源

scriptSig: Alice的数字签名

output:

Amount: 转出金额

scriptPubSig: 用Bob公钥生成的锁定脚本

####################################

比特币系统要通过txn找到Alice上一个交易中的公钥,再和scriptSig中Alice的私钥验证,验证成功Alice才有权使用这5BTC。Alice的数字签名证明了这条交易是由Alice发出,并且和交易信息的某种独有ID关联,这就避免了伪造和篡改。

交易发生后,将广播全网,一个节点通知附近的其他节点,很短的时间内,全网所有的节点会接到这笔交易。接到这笔交易后,每个节点会先先把交易放入内存,然后对交易进行合法性检验,检验通过后,就形成未确认的交易,这笔交易进入有效交易池,等待被装入区块。比特币网络中矿工节点会从内存的有效交易池中抽取近千笔未确认交易,然后进行打包(区块)。开始不断的计算着幸运数字(关键点1:如何计算?)。当某个节点计算出了这个幸运数字,将计算Hash值所使用的信息组装成一个新区块,记录在自己的硬盘上,并发起一次全网记账。周围的节点在收到广播的消息后,也都记录下这个新区块。由于矿工节点每次都会使用含有上一个区块Hash值的文本来计算当前区块的Hash值,这使得区块链难以被伪造篡改。

矿工需要收听每一笔的交易,普通用户只需要收听计算好的新区块即可(关键点2:如果自己的区块链出现分叉怎么办?)。这时Alice给Bob 5BTC的交易记录所在区块正好被一个矿工节点计算出了幸运数字并广播全网接着加入了节点各自的区块链中,但是要经过约60分钟(6次确认)才能确定这笔交易是真实合理的并且这条交易所在区块的区块链是比特币网络中大家公认的全局区块链。这样,就完成了一次比特币交易。

关键点1:如何计算幸运数字

将有效交易池里的近千笔交易(包括自己获得奖励的交易记录),上一个区块被计算出的Hash值,幸运数字参数组合成一个文本,然后计算这个文本的Hash值。这里使用的哈希算法是SHA-256,通过不断暴力猜解去猜幸运数字,使得这个文本的hash值前有N个零,这就是工作量证明。这个N有变化机制,要维持整个比特币网络在10分钟左右才猜出这个幸运数字。这也就是挖矿的过程,成功计算出幸运数字的矿工将获得凭空的比特币奖励。

关键点2:如果自己的区块链出现分叉怎么办?

相信最大工作量,也就是分叉较长的那一条区块链。所以不必立刻相信收听到的区块,可以再收听大概6个区块,如果没有更长的分叉,说明这条链就是比特币网络大家公认的链。

0x05 如何避免双重消费

首先回顾一下区块的构成,上一个区块的hash+一堆交易记录+幸运数字。

假设Alice在付款5BTC给Bob的同时也给自己另一个钱包付款5BTC(假设Alice只有5BTC),这时,第一条合理交易的区块被计算出幸运数字加入区块链,Alice也不甘示弱,用自己的计算力计算出了第二条欺诈交易的区块的幸运数字(Alice此时运气超好),这样就形成了两个不同的分叉区块,它们的上一个区块的hash都一样。

接着全场矿工继续计算幸运数字生产新区块加入到区块链中,由于比特币规则相信最长的即最大工作量的那条链,所以为了自己的欺诈交易是公认的,Alice也要不断计算幸运数字生产新区块。除非Alice有超级强大的计算力,能以一节点之力战胜全部矿工节点的计算力,也就是51%攻击,否则在经过多个确认之后,Alice苦心计算的欺诈分叉将被否认。

0x06 比特币安全保护

  • 物理防护:存放私钥的设备要做好抗震防雷之类。
  • 环境安全:确保私钥所在环境是无病毒,后门的。
  • 备份:私钥分开存放,如U盘,移动硬盘或一些网络仓库,最好定期备份。
  • 加密:私钥加密存放,一些加密软件可以做到这一点。
  • 冷钱包:最安全,一些比特币钱包带有冷存储的功能。

总之,要全方面防护私钥。

0x07 其他

1.每 210000 个 block ,生产新 block 的人被认可凭空获得的 BTC 数量比之前的少一半,现在(201708)是5BTC。

2.由1可只,矿工最终将不能凭空获得奖励,那矿工收入怎么来?答案是交易税,交易方为了使自己的交易能尽快被加入区块,尽快被比特币网络最终确认,会在交易记录里加上给矿工的税,鼓励矿工尽快把自己的交易记录加入区块。

3.比特币最终会达到总量约2100万。

4.如果因为电脑崩溃或损坏导致私钥(无备份)丢失,那所拥有的比特币就没人能转走,不能流通,相当于永远消失了。

5.一个区块交易记录上限约2400笔

6.推荐大家去看看比特币原始论文

7.再附上两张网上找的脑图,挺好的

0x08 结语

其实还有很多,如比特币洗钱,投资,赌博之类的就不介绍了,至于比特币的使用和挖矿,我可能会单独写一篇文章来介绍,本人才疏学浅,文章可能会有错漏之处,欢迎指正!一起交流学习!

如果觉得文章不错或者有帮助,点个赞吧。

您的支持就是我前进的动力!

0x09 参考资料

https://bitcoin.org/bitcoin.pdf

https://bitcoin.org

https://www.zhihu.com/question/20941124

https://www.bilibili.com/video/av12465079/?from=search&seid=6907804228267930743

http://zhibimo.com/read/wang-miao/mastering-bitcoin/Chapter02.html

https://blog.codingnow.com/2011/05/bitcoin.html

https://zh-cn.bitcoin.it/wiki/保护你的钱包

Comment