比特币白皮书
比特币:一种点对点的电子现金系统
内容参考:
中本聪比特币paper
Abstract
比特币:一种纯粹的点对点peer2peer的无需金融机构介入的电子现金系统 electronic payments
本文提出一种使用p2p网络解决双重支出问题的解决方案,从而避免第三方机构的介入。
双重支付double spending:即一份钱花了两次甚至多次(这是数字货币存在的问题,因为数字货币就是一串数字,通常的避免方式是用第三方金融机构,比如银行来鉴定这个数字货币的真伪)
手段:使用p2p网络将事务hash散列在一个不断增长的以工作量证明proof-of-work的链上,工作量证明的最长的链一定在CPU算力高的区域,如果攻击者不能完全控制这片高算力池,那么原本的最长链会不断发展,超过攻击者。
Introduction
传统的解决双重支付的手段是让第三方机构进行校验,这样存在几个问题:
- 限制了小型的交易
- 无法对不可逆的服务提供完全不可逆的交易 Completely non-reversible transactions
(理解:仲裁机构有着绝对的话语权,如果买卖双方发生纠纷,一定会去寻找仲裁。仲裁调解本身也需要成本,也就导致小型的交易骗局只能让买卖有一方吃亏(限制了小型交易);对于较为大型的交易,也必须有一个双方都信任的机构,比如碰到老赖,我们只能去法院打官司,如果法官被收买,我们也只能吃亏)
即:原本的交易系统是依赖于信任的,现有的交易需要政府提供的公信力
比特币的解决措施:解决信任问题,即提供一种基于密码证明cryptographic proof而不是信任的电子支付系统(使用密码学替代信任)
Transactions
定义:将一枚电子硬币electronic coin定义为一个数字签名链 digital signatures
(图片来自)
当所有者1想把一枚货币转给所有者2时(交易),需要在数字签名链的末尾附加上数字签名(如图所示)
数字签名的构成:
- 上一笔交易的hash值
- 新的所有者的公钥
收款人可以验证签名去验证数字签名链的所有权
这种方式依然有double spending的问题,解决方式两种:
- 中心化:比如银行、铸币厂,拥有所有交易的记录,可以验证此交易是否存在过
- 去中心化:将所有的交易记录公开,维护一个可以让参与者认同唯一的一个交易历史的系统;若大多数节点可以认同这比交易,那么交易就是正常的
Timestamp server
这种解决方案起步于一种时间戳服务器
时间戳服务器的工作方式:为一组记录(一个block)的hash打上时间戳,然后将hash广播出去。每个hash包含着之前的时间戳,形成一个链,如图所示:
Proof of Work
区块如何避免双重支付?PoW
先了解一下散列函数:
散列函数
y=hash(x)
:对于相同的x返回相同的y,但是几乎无法从y反推x如果x1与x2差距很小,其y1与y2值差距会相当大(雪崩效应)
比如sha256:他可以指定前导0,前导0越多,计算量将指数级增加
工作量证明:不断的在区块增加随机数Nonce,直到一个满足条件的数值被找到(什么条件?我们指定前缀0的个数)CPU耗费算力得到的结果就是工作量证明,一旦得到工作量证明,这个区块将不能再被更改
(从图中我们可以看到,一个区块包含多个交易)
以CPU算力为基础的工作量证明解决了“谁能代表大多数”的问题:如果是基于IP的话,很容易被拥有IP多的人操纵
如果大多数的CPU算力是诚实honest的,那么这个诚实链就会发展的很快,如果想要篡改一个已经证明的区块:
- 重新完成那一个区块的证明
- 完成那个区块之后的所有区块链的证明、
- 追上并超过其他的诚实节点
这些条件是极其苛刻的,并且链越长越难以篡改
Network
网络中的工作步骤:
- 新的交易向所有node广播
- 每个node将新交易打包到一个区块block
- 每个node计算工作量证明PoW
- 当有一个node找到了PoW,它广播给其他nodes
- nodes接受这个block当且仅当:其中所有交易有效&&没有double spend
- nodes向网络中表达接受,在创建下一个block时,将把被接受区块的hash作为新区块的hash
当两个node同时完成了PoW时:
每一个node都始终认为最长的链是正确的
一部分node会接受A,一部分node会接受B(但他们同时会保存另外一个链,产生一个branch)
当下一个block加入后,更长的链会被认为是正确的,将分支取消掉
新的交易不一定要广播到所有node,只要广播到足够多的node,就可以打包一个block
如果广播的消息没有发送到某个node,这个node可能会少一个block,不过下一个区块他就会意识到缺失了,并且发出请求去补充区块
Incentive
奖励机制:为了保证我们有足够多的node的算力的支持,系统内需要提供一定的奖励机制
- 每个block的第一笔交易:每个block包含很多个交易,但第一个交易比较特殊,它会生成一个新币,被生成者所有。
- 交易费用的差值:如果一笔交易的输入小于它的输出,那么产生的差值奖励给将此交易打包到block的node
奖励机制也保证,有足够能力的攻击者(即拥有比honest node更多算力的用户)顺从规则比改变规则带来的收益要更多。
Reclaiming Disk Space
Merkle树(也称为哈希树):链接
树的特点:
- 叶子结点存储数据或hash值
- 非叶子节点是其两个子节点内容的hash值
Merkle树的性质:
- 底层数据的任何变动都会逐渐影响到根节点
Merkle树的主要使用场景:(详细内容check链接)
- 证明集合是否存在某个元素
- 快速比较大量数据
- 快速定位修改
- 零知识证明
区块链的存储如图所示:某笔交易之前的交易记录可以丢弃以节省空间,如图删除了Tx2节点(注意到hash2并没有删除!),之前的Tx0,Tx1都被删除
Simplified Payment Verification
上面介绍到了Merkle树的结构,就能知道快速的验证交易是否存在很简单。
Combining and Splitting Value
价值的组合与分割:意思是一个交易可能包含一个或多个输入和最多两个输出
输入:
- 情况1:单笔相对较大的输入
- 情况2:多个小金额的输入
输出:
- 输出到收款方
- 输出到找零方(可能没有这一个输出)
Privacy
交易使用公钥匿名。公众可以看到某某向某某转账,但是没有却不能知道交易双方是谁(像是股票,可以看到时间和交易的金额)
交易者每一笔交易都使用一对新的公司要,以便于他人无法追溯(如果公钥所有者被曝光,那么他的相关交易都会被曝光)