央行是怎么发行有法币备书的纸质货币的?
那么数字货币用防伪标记行不行呢?比如央行发行的数字货币都有央行的私钥签名,公钥是公开的,用了密码学的非对称加密体系。你买东西的时候把数字货币给别人,别人用央行的公钥验证一下证明这确实是央行发行的。那么面临什么问题呢?
面临双发问题。如果不用到区块链技术,则数字货币可以无限复制。这就是花两次攻击double spending attack(双发攻击),这是数字货币跟纸质货币的根本区别。
现在改进一下,还是央行发行数字货币,每个货币上给个编号,央行来维护数据库,就是一个大的表,上面记录下每个编号的数字货币在谁手里。每次交易都必须向央行报备。这个方案是中心化的方案。每一次交易必须要央行确认才能证明其合法性。
那么我们能不能把央行的职能转移到大众这里,去中心化?
一个去中心化的货币,要解决两个问题:
谁能发行,由挖矿决定。
现在先讲如何防范双发问题。
数据库由所有用户共同维护,这个技术就是区块链。
比如说有一个用户A有了发行货币的权利,这个叫铸币权CreateCoin, 挖矿的来的称为铸币交易。
这个地方用了两种哈希指针,第一种是把两个链表窜起来的说明交易走向,另一种是用来说明货币来源,用来防范double spending attack。验证货币来源的哈希指针如果未被证实,则该交易不合法,不会把这个交易接收到区块链中。
我们再仔细看看这个转账交易。A把钱转给B这个交易里面,需要有A的签名,和B的地址。比特币里面B的收款地址是通过B的公钥推算出来的。比如说这个B的地址,就是B的公钥取哈希再通过一些转换得来的。
比特币系统内部没有查询地址的功能。比如说某一个比特币交易网站,别人的地址就公布出来,你扫一下就可以进行支付。
A要给B转账需要知道B的信息,并且证明自己比特币的来源。
那么B需要知道A的什么信息吗?
不光是B,旁观者也需要知道A的公钥才能验证。
所以A不但要表明比特币的来源,还要公布自己的公钥。
输出里面有A的公钥的哈希,所以下面这个交易中验证货币来源的哈希指针里面要有A公钥的哈希,如果这个哈希对不上不是A的公钥哈希,验证就无法通过。
比特币系统当中的验证过程是通过验证脚本来实现的。每个交易的输入是一段脚本,包括给出的公钥也是再输入的脚本里面指定的。每个交易tx的输出也是一段脚本。
验证交易是否合法,就是要把这个交易的输入脚本和前面验证货币来源的输出脚本拼在一起,然后看看能不能顺利执行,能执行才是合法的。
两段脚本(BitCoin Script) 拼接在一起运行,没问题才能通过。
实际系统中每个区块可以包含很多交易。每个交易分为块头和块身两部分。
Block header 里包含宏观信息,比如说:
块头里存的就是目标域值的编码 nBits.
有的书上指针是画在上面的,因为只有头部才由哈希指针串联起来。
阴影代表取哈希。把块头的所有部分取哈希,块身不管。
Block body里面有什么呢?
Full node
Light node
每个节点,每个账户都能够发布交易。有些交易是合法的,有些交易是非法的,那么谁来决定哪些交易写进区块链,如何决定先后顺序?
每个节点独立决定行不行?
显然是不行的。
账本的内容要取得分布式的共识。
distributed consensus
分布式共识一个比较简单的例子就是分布式哈希表
distributed hash table
比方说key-value pair
有很多的不可能结论 impossibilty result
其中最著名的一个就是 FLP impossibility result
还有一个结论比较著名 CAP Theorem
CAP中
这三个性质中最多只能满足两个。
分布式中的一个比较重要的协议是Paxos
某些情况下Paxos协议可能无法达成共识consistency
Consensus in BitCoin
有哪些形式的共识协议?
本地产生一个公私钥对,别人是不知道的,只有转账的时候才知道有这个账户的存在。
sybil attack
女巫攻击
恶意节点不断的产生大量账号,直到比例超过51%
简单的直接投票是不行的,那怎么办呢?
比特币系统当中用了一个很巧妙的机制,也是投票,但是不是按照账户数目投票,而是是按照账户计算力来投票。
每个本地节点都可以在本地建立一个候选区块,把他认为正确的区块放在这个候选区块里面。然后就开始尝试各种nonce值。
如果某个节点找到了符合要求的nonce,我们就说这个节点获得了记账权。
记账权就是往比特币这个去中心化的账本里写入下一个区块的权力。
只有掌握的记账权的节点才能写入下一个区块。
比如说bBits 域的设置是不是符合比特币协议中的要求。
我们怎么知道目前的区块插在整个区块链的哪里?
我们看有没有double spending,我们看这个交易所在的支线中这个币是否被花过。
看交易是否在最长合法链上。
比特币中规定,接受的区块应该是接在最长合法链后面。
上面这个例子也叫做forking attack,通过在中间插入区块来回滚已发生的区块。
那么如果有两个节点同时获得记账权,那么两个和节点在差不多时间找到了差不多的nonce,这个时候回出现两个等长的分叉,那么这两个都是最长合法链,那么该接受哪一个呢?
比特币协议中,缺省情况下,不同节点根据它所处的位置,会接受不同的区块。如果它继续沿着你这个区块继续扩展,就说明它认可你的这个区块。
如果系统中出现两个矿工同时找到nonce,假设上面一个分叉抢先找到了下一个区块,那么上面的就变成了最长合法链,下面的那个都被丢弃掉,称为orphar block
下一个问题,为什么我们会去竞争记账权,有什么好处?
首先获得记账权的节点有一定权力,他能决定哪些节点能够写入后面的区块链。
在比特币中我们用了这样的机制:
那么能造多少币呢?
每一个发币的区块可以产生50 BTC
但是协议规定,21万个区块之后,这个奖励就会减半,变成25个比特币,再过21万个区块,又要减半,变成12.5个BTC,这就是现在的情况。
比特币中,看每秒钟能试多少个nonce,你的算力是别人的十倍,你获得记账权的几率也就是被人的十倍,hash rate。
那么我们如何防范sybil attack呢?因为是用运算力来进行投票的,所以哪怕建立无数的账户在本地,只要运算力没有增加,你投票的权重也没有增加。
争夺记账权就是挖矿mining。比特币有人把它叫做数字黄金digital gold。
求解nonce的过程就是挖金子的过程。
所以争夺记账权的人就被成为矿工miner。区块链中的每个区块都是挖出来的。