引子:中心化的数字人民币
双花攻击 double spending attack
只依靠密码学进行数字货币的分发。
由于文件本身是可以复制的,数字货币本身就是一个文件,我没办法修改签名,但可以直接复制文件。
改进:中心化处理
中心化的数据库处理数字货币
每次进行交易都去请求中心机构。数字货币的发行和每次交易都需要中心机构去确认。
去中心化的货币
两个主要问题:
- 谁来发行货币
- 怎么验证交易的有效性
验证交易的有效性
比特币如何交易

假定A获得coinbase(铸币权),新发布了10个比特币(该交易称为铸币交易)。A将10个比特币转给了B(5个)和C(5个),A对该交易进行签名,同时该交易需要说明所花掉10个比特币来源(来自铸币交易)。
之后,B将自己的5个比特币转给C(2个)和D(3个),该交易需要B的签名,该交易需要说明所花掉的5个比特币来自于第二个交易中。
然后,C将自己所拥有的全部7个比特币都转给E,并对该交易签名,可以发现该交易中C的比特币来源于两个交易中。这样,就构成了一个简单的区块链。
两类hash pointer
指向前一区块:使得各个区块形成链
指向币的来源的:比特币的来源并非凭空捏造,可以防止double spending attack。
Q:交易中的身份识别
A:
A(支付人)需要知道B(收款人)的地址,这个地址是由B的公钥经过一定计算得到的。
B(收款人)需要知道A(支付人)的公钥,或者说所有节点都需要A的公钥,用于验证交易,同时可以验证签名
Q:如何防范恶意签名
有一个B‘恶意将区块签名,顶替A怎么办
A:币的来源的区块有输出,输出中包括A的公钥,通过看币的来源的输出公钥的哈希,与支付人的哈希是否一致。
Q:如何查看交易是否合法
A:在比特币系统中,通过执行脚本(BitCoin Script)实现验证过程。将当前交易输入脚本与前一个交易输出脚本(说明币的来源的交易)拼接执行,如果可以正确执行,说明交易合法。
区块的组成
每个区块分为block header 和 block body。
| block header | block body |
|---|---|
| version 比特币协议版本 | transaction list 交易列表 |
| hash of previous block header | |
| merkle root hash | |
| targer 挖矿难度目标阈值 | |
| nonce 随机数 |
block header的作用
挖矿相关(block header的作用)
整个块头的哈希,要小于目标阈值,才可以挖到矿。

block header中存放的是目标阈值的编码 nBits
区块的链接

通过头部链接即可,因为merkle root hash已经可以保证body中的transaction list没有被篡改。
方便轻节点保存
轻节点只保存block header的信息。
如何将交易写到区块中
账本的内容需要取得分布式共识(distributed consensus)
分布式共识
例子:分布式哈希表(distributed hash)
系统中很多机器共同维护一个哈希表,共识为表中存放哪些key-value
FLP不可能结论,在一个异步系统中,网络时延无上限,即使只有一个成员是有问题的,也不可能达成共识。
CAP Theorem(Consistency一致性、Availability可靠性、Partition tolerance容错性),任何一个分布式系统中,最多只能满足其中两个性质。分布式共识中协议Paxos 可以保证Consistency(若达成共识必然一致),但在某些情况下,可能会一直无法达成共识。
Paxos协议详解:https://my.oschina.net/u/150175/blog/2992187
比特币的共识机制
投票,但是是根据工作量证明投票。
传统的按人数投票的弊端 过半数同意,但是会有问题。
恶意节点的打包不合法区块,被困在投票中
网络延迟问题
无强迫投票手段
Sybil attack (女巫攻击),通俗的说是水军攻击,通过创建大量虚假身份去左右投票。
比特币系统中采用了很巧妙的方案解决这个问题。虽然仍然是投票,但并非简单的根据账户数目,而是依据计算力进行投票。
在比特币系统中,每个节点都可以自行组装一个候选区块,而后,尝试各种nonce值,这就是挖矿。

当某个节点找到符合要求的nonce,便获得了记账权,从而可以将区块发布到系统中。其他节点受到区块后,验证区块合法性,如果系统中绝大多数节点验证通过,则接收该区块为最新的区块并加入到区块链中。

forking attack 分叉攻击
如图所示,A用户对上面的A转账给B的记录回滚,从而非法获取利益。在两条链上,发现交易都合法。这是一个典型的双花攻击。A给B转账后,用分叉攻击将钱又转回来,覆盖掉原来的记录。在比特币系统中,这种情况实际上很难发生。因为大多数矿工认可的是最长的合法链,会沿着上面的链继续挖下去。而A这个攻击者要想回退记录,就必须使得下面的链变得比上面的链还长。理论上来说,攻击者需要达到整个系统中51%的计算力,才能使得这种攻击成功。
合法链竞争问题
区块链正常运行场景下,也可能会发生分叉。当两个节点同时获得记账权时,会有两个等长的合法链。在缺省情况下,节点接收最先听到的区块,该节点会沿着该区块继续延续。但随着时间延续,必然有一个链胜出,由此保证了区块链的一致性。(被扔掉的区块称为“孤儿区块”)
比特币激励机制
比特币通过设置出块奖励(block reward)来解决没人出块的问题。
一个获得合法区块的节点,可以在区块中加入一个特殊交易(铸币交易)。事实上,这种方式也是唯一一个产生新比特币的途径。
💡
挖矿就是通过本身的算力计算nonce并获得计算力,从而获得增加区块的能力。而增加区块就会获得block reward也就是拥有了比特币。挖矿挖的是block,收获的是bit coin
点击原文查看笔记原稿




