之所以站的更远,是因为站在了巨人的肩膀上
image.png比特币是区块链目前为止最成功的应用,自2009年上线以来,在无人管理的情况下,已经在全球7*24小时运行9年时间,成功处理几百万笔交易,支持单笔超过1.5亿美元的交易而为出现重大系统故障。
从正真意义上的安全可靠的去中心化的数字货币
截止发文位置,比特币价格为: $8,547.0
比特币的特点
- 去中心化 没有一个中心组织来管理维护比特币,也没有任何一个个人和组织可以对交易破坏,交易请求需要得到网络中大多数参与者的共识
- 匿名性 网络中的账户是匿名的,无法从交易信息关联到具体的个体,保护了参与者的隐私安全,但同时很难进行审查
- 通胀预防 比特币通过挖矿来发币,发行量每四年减半,总量为 2100万枚,无法超发
如图展示了比特币自诞生依赖的汇率(以美元为单位)
最高峰达到了近两万美元一枚
image.png
数据来自 https://cn.investing.com/crypto/bitcoin/btc-usd
数字货币分类
数字货币是电子货币形式的替代货币。数字金币和密码货币都属于数字货币。数字货币基本可分为三大类:
1、大家非常熟悉的游戏币。最初是单机游戏中玩家所获得的游戏币,仅能在游戏中自己使用。随着互联网建立起门户和社区、实现游戏联网以来,这些数字货币便有了“金融市场”,玩家直接能够自由交易,还能进行线上线下的买卖。
2、门户网站或者即时通讯工具服务商发行的专用货币,用于购买本网站内的服务。主要代表的就是Q币,可用于QQ自己的商城内使用。
3、最具代表性的数字货币则是现在互联网上的加密数字货币,如比特币、莱特币、狗狗币等,以比特币为代表,它是一种由开源的P2P软体产生的电子货币,运用区块链技术可查询来源和流通,是一种开源加密,可流通和交易的数字货币。主要用于互联网金融投资,也可以作为新式货币直接用于生活中使用
比特币原理和设计
基本交易过程
每次发生交易,用户需要将新交易记录写入到比特币区块链网络 中,等网络确认后课认为交易完成。每个交易包含输入和输出,未经使用的交易的输出(Unspent Transaction Outputs, UTXO)可以用来作为下次交易的合法输入。被使用过的交易的输出(Spant Transaction Outputs,STO)不可以作为交易的输入。
在交易过程中,转账方需要通过签名来证明自己是UTXO的合法使用者,并且通过指定输出脚本来限制未来本交易的使用者,也就是收款方。对每笔交易,转账方需要进行签名确认。并且对于名一笔交易,总输入不能小于总输出。总输入比总输出多余的部分称为交易费用(Transaction Fee),由生成本次交易区块的矿工获得。现在交易费用不能小于 0.0001BTC,交易费用越高,也就会越快会被矿工记录。同时交易费用用还能避免网络收到大量攻击。
交易金额最小单位是 “聪”,即一亿分之一比特币。
六次确认
需要注意的是,刚放进网络中的交易并非是实时得到确认的。交易存在被推翻的可能性
在手续费相同的情况下,矿工们在挖矿时候并不会主动地去确认某一个特定的交易。因为矿工们并不知道这笔交易是谁转给谁的,他们只负责优先确认奖励(手续费)高的区块交易。你所说的等长的blockchain分叉情况,是因为有时候两个挖矿者几乎同时验证出来一个区块的交易。他们同时公布到网络里,有些人用一个方法更新他们的blockchain,另一些人用另外一个方法更新他们的blockchain。 如果出现这种情况,交易的顺序就会不清楚。在比特币POW算法网络中的共识规则是这样的:如果分支情况出现,那么网络上的人们继续保持两个分支,任何情况下,挖矿者只在最长的那个blockchain上工作。举个例子,有一些挖矿者先收到block A,另一些挖矿者先收到的是block B。那些收到block A的挖矿者将要继续沿着他们的分支挖矿,而其他人沿着Block B的分支挖矿。我们假设在B分支上的挖矿者先成功挖到下一个block,当他们收到这个消息后,在A分支的人会注意到现在B分支是最长的,于是就会转换到B的分支。在A分支上的工作就会迅速的停止,这样每个人就会都在同一个顺序的blockchain上工作了。所有在block A里面的待定交易将会继续保持待定状态,随后会在B分支上被放到新的block里,这样,所有的交易最终还是会被验证的。所以在比特币中,一个交易不能算作确认直到 (1)它存在于最长的分支中的block里,(2)至少有5个验证过的block在其后面得到验证。这种情况,我们说这个交易有了“6个确认”。关于6个确认来验证比特币交易的真实性,6这个数字并不是硬性规定的,只是在比特币网络中,6个确认的时间充分的给了整个网络去统一block顺序的时间。 如果支出方想要进行双重支付,他必须控制了非常大的算力,不然其他的挖矿者不会帮助它,因为他们都需要在最长的分支上工作才能得到奖赏。六个区块是根据该人拥有百分之一的算力刚好确认一个区块,但要进行6个区块确认的概率是100的六次平方分之一。这种情况可以说是相当于零。
账户和地址
比特币采用非对称加密算法,用户自己保留私钥,对自己发出的交易进行签名确认,并公开公钥。
比特币账户地址并非就是公钥,而是公钥经过一系列(HASH160,或先进行HASH256然后RIPEMD160)及编码运算后产生的160位(20字节)的字符串。
交易
一次交易包含的信息
- 付款人地址
- 付款人对交易的签名
- 付款人资金来源交易的ID,哪个交易的输出作为本次交易的输入
- 交易金额,与输入的差额作为交易费用
- 收款人地址
- 收款人公钥
- 时间戳
网络中的节点收到交易信息后进行检查:
- 交易是否已经处理过
- 交易是否合法,包括地址是否合法,发起交易者是否是输入地址的和发拥有者,是否是UTXO
- 交易的输入之和是否大于输出之和
检查通过后,则讲交易标记为合法未确认交易信息,并在网络中广播
交易脚本
脚本是保障交易完成的核心机制,每个交易包含输出脚本和认领脚本。
输出脚本用来限制谁可以花费这笔钱,输入脚本则用来证明自己可以满足条件。
比特币区块包含的内容
- 4字节的区块大小信息
- 80字节的区块头信息
- 版本号,4字节
- 上一个区块头的HASH256 Hash值:链接到一个合法的块上,32字节
- 包含所有签证过的交易的Merkle树根的哈希值,32字节
- 时间戳,4字节
- 难度指标,4字节
- Nonce 4字节,PoW问题的答案
- 交易个数计数器: 1~9字节
- 所有交易的具体内容,可变长
验证区块头信息,就可以验证区块的完整性,而无需获取具体的交易内容( SPV simple payement verification 简答交易验证)的原理
区块整体结构
区块头结构
说明:
- 版本、父区块头哈希值和Merkle根采用的是小端格式编码,即低有效位放在前面。
- 时间戳表示的是自1970年1月1日0时0分0秒以来的秒数,1231731025秒转为十六进制值为0x496AB951,然后采用小端格式编码表示为0x51b96a49。
- 难度目标486604799转化为十六进制值为0x1d00ffff,该值采用小端格式编码。而当前区块的难度值0x1d00ffff需要采用一种特殊的编码方式才能正确转化为目标哈希值。
- 随机数nonce表示的随机数值转化为十六进制为0x709E3E28,然后采用小端格式编码表示为0x283e9e70。
区块结构详细解析参看https://www.jianshu.com/p/5c09f7d708e2
挖矿
挖矿的基本原理
最初的时候,我们用电脑CPU就可以挖到比特币,比特币的创始人中本聪就是用他的电脑CPU挖出了世界上第一个创世区块。然而,CPU挖矿的时代早已过去,现在的比特币挖矿是ASIC挖矿和大规模集群挖矿的时代。
回顾挖矿历史,比特币挖矿总共经历了以下五个时代:
CPU挖矿→GPU挖矿→FPGA挖矿→ASIC挖矿→大规模集群挖矿 挖矿芯片更新换代的同时,带来的挖矿速度的变化是:CPU(20MHash/s)→GPU(400MHash/s)→FPGA(25GHash/s)→ASIC(3.5THash/s)→大规模集群挖矿(3.5THash/s*X)
挖矿速度,专业的说法叫算力,就是计算机每秒产生hash碰撞的能力。也就是说,我们手里的矿机每秒能做多少次hash碰撞,就是算力。算力就是挖比特币的能力,算力越高,挖得比特币越多,回报越高。在比特币的世界里,大约每10分钟会记录一个数据块。所有的挖矿计算机都在尝试打包这个数据块提交,而最终成功生成这个数据块的人,就可以得到一笔比特币报酬。最初,大约每10分钟就可以产生50个比特币的比特币报酬。但是该报酬每4年减半,现在每10分钟比特币网络就可以产生25个比特币。而要成功生成数据块,就需要矿工需要找到那个有效的哈希值,而要得到正确的哈希值,没有捷径可以走,只能靠猜,猜的过程就是计算机随机hash碰撞的过程,猜中了,你就得到了比特币。
挖矿的过程
挖矿过程就是求出一个能够填充本区块头的随机值,让区块头的哈希散列值符合某一个标准。
image.png我们通过一个故事来理解挖矿
-
我手上现在有一张面值100元的人名币。(比特币)
-
谁关注公众号我就给谁。
-
但是需要在评论里面猜出这张钱的编号才行。(挖矿,随机填充数值求解)
自己想尽办法猜,猜中得100元全款——个人挖矿
出钱召集一些人来一起猜——矿场
召集认识不认识的人一起来猜,通过猜测的次数,按比例分配这100元——矿池
PoW挖矿算法原理及其在比特币、以太坊中的实现
http://blog.51cto.com/11821908/2059711
共识机制
PoW 与 PoS
POW的方法最直观——哈希函数是密码学上计算难度经过反复验证的东西,所以用它来做证明是最有效不过的。每发一条消息(上传一个区块)的时候,你要证明你付出了一定的算力,你的证据就是某串你加在区块里的无意义字符串,而加上这个字符串之后,你的区块的哈希值正好小于某个数。哈希函数的特性告诉我们,你没有任何取巧的方法可以做到这一点——唯一的可能是,你真的一个一个字符串地去试了。所以,我们知道你确实付出了很多的代价才能给出这么一个字符串。
然而,POW不是没有缺陷,除了大量消耗能源之外,POW的另外一个问题是它的价值回路必须要通过外部输入。也就是说,采用POW的数字货币仍旧不是理想状态的数字货币,因为它们的安全性不直接与使用者相关,而是要通过矿工这个媒介(这个请见我的专栏)。
于是POS就被提出来了。POS的设想是非常好的——采用POS的货币的安全性直接与使用者相关,省去了矿工这个媒介。POS简单说就是,每当发表一条消息的时候,不用证明你付出了什么代价,而要证明你拥有一定数量的钱。而拥有钱代表着,如果你作弊损害了这个系统的安全性,你的钱会贬值,这变相地让你付出了代价。这东西更好的一点是,如果采用POS,实际上连挖矿奖励都不需要,因为POS实际上不需要付出任何代价。
需要注意的是,POW基本上原理都类似,而且,说到POW基本上就指的是比特币那种。可是POS是一类共识算法,或者说是一类共识算法的设计思想,而不是一个,最早采用POS的是peercoin,于是几乎所有的科普文章都把Peercoin的POS当做是POS的定义。这是不对的——因为Peercoin的POS是有漏洞的,漏洞简单说就是——越有钱的人,作弊付出的代价就越大,所以51%攻击在POS里面更不可行。
然而,对于没钱的人而言,他们没代价可付,所以一些恶意行为对于他们是有益的,这就会导致著名的公地悲剧。这种叫Nothing-at-stake attack(无利益攻击),所有POS算法,必须有对付这种攻击的机制,否则就不能用。目前,还没有一个区块链真正采用了POS,所以POS仍旧是一个缺乏足够实践检验的机制。但是从理论上来看,Ethereum的casper,ALGORAND和Ouroboros是几个比较成熟的POS算法。至于POS的一个变种DPOS,实际上是解决Nothing-at-stake attack(无利益攻击)的另一种方式——没钱的滚蛋,只有有钱才能参加共识。所以,DPOS的本质实际上是一个中心化的共识机制。
闪电网络
参看:https://www.zhihu.com/question/46515457/answer/111101523
侧链
参看:
https://zhuanlan.zhihu.com/p/26713463
https://www.zhihu.com/question/27256432/answer/309072431
https://www.zhihu.com/question/20792042
http://www.8btc.com/bitcoin_block_chain
网友评论
由于hash算法是一个不可以逆的算法,没法通过具体的hash值,倒推出原文;这样每个节点只能采用穷举的方法,也就是从1开始,2 3 4 5...不断的往后试;在这个过程就开始考验各个节点的CPU计算速度了,算的快的,很快就能得到Nonce值,然后他就把这个Nonce值放在结构体里,通过P2P网络广播出去;每个系统节点收到后,发现这个Nonce值是合法的,能满足要求,就认为挖矿成功;对于那些算到半截的节点,发现有人已经算出来了,就放弃本次穷举了;然后开始通过穷举的办法,去寻找下一个区块头的Nonce值;
这样大家是不是就明白了,所谓挖矿,就是计算机通过穷举的办法,不断去找Nonce值、算Hash值的过程;谁先找到,谁就挖成功了;