如何设计一个加密货币?

in blockchain •  4 years ago 

发行数字货币的可行性


过去,全球范围内的货币发行都是由各国央行负责,而央行就是我们现实生活中典型的可信任的中心化机构。因为央行背后都有政府背书,而货币本身背后又是国家的经济实力,所以像人民币、美元这样的货币就不存在信任问题。而各国发行的货币上都有各种各样的防伪技术,印钞的模板更是只有国家机构才能持有,这就又保障了货币不容易被伪造,这才带来了我们现在使用上的安全和便利。

随着互联网技术的发展,移动支付在我们国家已经非常普遍了,欧美还在普及的进程之中。移动支付使得支付变得更加迅速了,金融业迎来了发展利好。事实上,中心化的法币数字化早已经被证明是高效和可行的了。

既然法币数字化已被实践证明是没问题的,那么,在数字世界发行货币就应该是可行的。

谁有权利发币?


你作为一个个体,在考虑这个问题的时候,应该给出什么样的解决方案。想象一下,如果由个人发行的货币在市场上流通,将会是怎样一番景象?实际上,这是不可行的。且不说能否通过监管,即便能通过监管,信任问题也是任何一个单独个体的能力没法解决的。

那就需要切换一下思路,如果每一个个体在遵循同一个所有人都认可的协议(共识机制)的话,那么由所有人发行货币就是有可能的。这样的运行机制实现就是所谓的去中心化,换句话说,去中心化的意义就在于让所有人去取代中心化的央行。

从这个角度也就能够说明一个问题,就是这样发行出来的货币的价值取决于有多少人加入了这个数字货币网络。这些年来,比特币价格一路走高的原因之一就是使用比特币的人越来越多了。在未来,如果有更多人在使用或持有比特币的话,那么比特币的价格还会继续走高。

去中心化的货币需要解决哪些问题?


我们先来看一下在中心化场景下的数字货币是如何完成一次交易的。

以数字人民币为例,事实上,数字钱包背后都是而且必须要有银行支撑的。如果张三通过数字钱包给李四转了100块钱,从用户的角度来看,这笔交易就视为已经完成了。而银行首先需要从张三的账户中扣除100元,然后在李四的账户中加上100元。同时转账的这100元是有唯一编号的,这就避免了张三转账完成后又再一次将这100元数字货币转给其他人,因为编号对不上了。并且毫无疑问的是,这笔交易经过了银行地最终确认的。这背后的实现是银行在它的数据库中维护了大量的表,这些表就是用来记录每个人的交易情况的。这样的方案在中心化场景下是没有问题的,但在去中心化的场景下就不完全适用了。

从这个简单的场景中,我们就能够看出来在去中心化场景下进行交易必须要解决的两个问题。

如何防止一份数字货币使用两次?

关于这个问题,大家需要了解的是,不论是去中心化的区块链世界的比特币,还是中心化的央行发布的数字人民币,本质上都是一种文件。既然是一种文件,那就可以复制。比特币和数字人民币之间的区别在于,理论上比特币是所有人都可以发行的,而数字人民币只能是央行发行。这也意味着说,比特币有可能被所有人复制使用,数字人民币的复制使用只有央行有这个能力。当然了,央行一方面是不会这么干的,另一方面也对数字人民币做了编号,保证不会串号,所以这就不是问题。但是比特币不一样,由于是去中心化的,即便有编号还是可能存在这个问题,它必须要在设计之初就规避掉这个问题。

实际上,一份数字货币能够使用两次以上,用术语来说就是“花两次攻击”,或者称“双花攻击”。

在比特币这个去中心化的网络中,解决双花攻击问题借鉴了中心化的方案,它同样也是选择通过维护一个数据结构去检测某个比特币之前是否被花过,只不过维护这个数据结构的主体从央行变成了所有人,这个数据结构就是区块链。

下面我们通过一张图展示一下比特币中的一个具体的交易案例:图片假设比特币的用户A通过挖矿获得了发行比特币的权利——铸币权,然后A把发行的10个比特币转给B5个,又转给C5个。首先,A把比特币转给B和C的交易是需要A签名的,以表示这些交易是经过A同意的。这些交易还需要说明B和C获得的比特币的来源,在这里币的来源就是A铸造的,所以这类交易也称为“铸币交易”;同时,A还要获得B和C的公钥的哈希。换句话说,比特币的交易是有输入和输出的,输入的部分要说明币的来源,输出的部分要给出自己公钥的哈希。

然后,B又把获得的比特币转给了C2个,转给了D3个,同样的,这两笔交易也需要B签名,同时说明币的来源和收款人公钥的哈希。这时候,C就有了7个比特币了,他决定将这7个比特币转给E。这笔交易就稍微复杂一些了,复杂在于币的来源,其中2个比特币来源于B转给C,另外5个来源于A转给C。

最后,通过这些交易,我们就构成了一个比较简单的区块链了。

这里需要说明的是,在这个小型的区块链中有两种哈希指针。一种是用来连接各个区块形成区块链的,另一种是用来指向前面的交易的,这是为了说明币的来源。在区块链中进行数字货币交易,需要说明币的来源这一点非常重要。因为这样不仅表明了这笔交易的币不是凭空捏造的,更为关键的是它防止了“双花攻击”。


这里需要说明的是,在这个小型的区块链中有两种哈希指针。一种是用来连接各个区块形成区块链的,另一种是用来指向前面的交易的,这是为了说明币的来源。在区块链中进行数字货币交易,需要说明币的来源这一点非常重要。因为这样不仅表明了这笔交易的币不是凭空捏造的,更为关键的是它防止了“双花攻击”。

假设,图中还有一笔交易,是B将5个比特币转给F,那么这笔交易中的哈希指针就需要指向A->B(5)这笔交易。可是,在指向的过程中又发现了B->C(2)/B-->D(3)这两笔交易。这说明B的5个比特币已经花掉了,所以B->F(5)这笔交易就是非法的,其他节点在验证这笔交易的时候就不会通过。这也意味着B->F(5)这笔交易不会被写入区块中,从而也就解决了“双花攻击”问题。

另外,比特币交易的输入部分除了要说明币的来源之外,还需要给出自己(转账人)的公钥。这也是为了便于全节点验证而必须要做的一个动作,因为其他节点只有知道你给的公钥,才能根据这个公钥去和你获得这些比特币的交易的输出中已有的公钥的哈希值进行比较。如果是一致的,说明币的来源没有问题,否则这笔交易仍然不合法。

实际上,一个区块中包含了多笔交易,图中只写了一笔是为了方便说明。而一个区块,是包含块头(block header)和块身(block body)的,块头中包括了一些宏观信息,块身中就包括了具体的交易列表。

如图所示:

图片

解决了“双花攻击”问题之后,要使得在区块链网络中成功进行一笔交易还要让这笔交易取得分布式共识(distributed consencus),也就是下面这个问题。

决了“双花攻击”问题之后,要使得在区块链网络中成功进行一笔交易还要让这笔交易取得分布式共识(distributed consencus),也就是下面这个问题。

如何验证一笔交易的有效性?

要想取得共识,应该怎么做呢?

在现实生活中,大家遇到的最多的解决共识问题的机制应该就是民主式地投票了。比如,现在已接近尾声的美国大选,就是典型的民主式投票,所有有投票权的美国公民都可以自主选择要将选票投给特朗普或者是拜登。同样的,比特币网络实现共识也是通过投票的;不过,比特币中的投票机制和普通的民主式投票有些区别,因为比特币如果采用民主式的全民投票机制会产生很多问题。

  • 如果全民投票,有些恶意节点每天啥事儿不干就是不停地开辟公私钥对儿,一旦这个恶意节点的票数超过一半,那么这就意味着这个恶意节点就拥有了对整个比特币区块链网络的控制权,这样的后果是不可想象的。实际上,这种现象称为“女巫攻击”。

  • 如果大多数节点都犯懒,不愿意投票,那么投票结果很可能会被利用。只不过,这种可能性非常小。

  • 全民参与投票的效率会很低,一旦施行,大家看到的比特币验证记账就不是10分钟一次了,有可能需要几个小时。

因此,比特币官方设计了一个非常巧妙的方式规避了这些问题。

比特币采用算力投票。

实际上,我们所说的比特币网络中的投票权就是拥有在比特币这个分布式账本中记账的权利。那么,谁才能去记账呢?

这不是随随便便一个节点都可以去记账的,而是每个节点都需要通过大量的计算,最先计算出来上图中挖矿求值公式中的那个满足条件的nonce的节点才拥有记账权。换句话说,只有最先计算出那个合适阈值的节点才能将一个有效区块写入到比特币区块链网络中,然后还要经过其他超过至少半数的节点验证才能最终成功写入比特币网络中。相应的,拥有记账权的节点由于花费了大量的算力进行计算,它会获得一些比特币奖励(如果我没有记错的话,现在成功写入一个区块的奖励应该是12.5个比特币)。这整个过程类似于100多年前,很多人去美国旧金山淘金矿,所以,大家也把这个过程形象地称为“挖矿”。

在挖矿的过程中,有可能还会遇到一个问题。

上述挖矿都是建立在假设每个节点都是善意的基础上,如果是恶意的节点获得记账权,它刻意去修改比特币区块,那麻烦也很大。

图片比如,a这个节点获得了记账权,但是它并没有把下一个区块写到e这个区块的后面,而是写到了b后面。这就造成了麻烦,因为d那个区块已经把A->B这笔交易写入到区块中了,现在a又把A->A'这笔交易写到b后面,这就意味着说此前的A->B这笔交易发生了回滚,交易被覆盖了,不存在了。显然,这是不能被接受的。

好在,其他节点在验证交易时还可以通过b这笔交易的指针就知道a这笔交易是插在了b区块后面,可事实上b后面已经有了d区块。这说明a区块并没有插在最长合法链上(比特币协议中规定写入区块必须在已有最长的公链中的最后一个区块的后面,换句话说,写入区块只能扩展原有区块链的长度),a区块实际上变成了分叉链了。这就不能被验证通过,这个区块就会被抛弃。

我们再进一步考虑,如果有两个节点几乎同时获得记账权,而且都在e区块后面写入了合法区块f和g。

如图所示:图片那么,现在应该接受f还是g区块呢?

在比特币协议中,如果有两个节点同时获得记账权并都在最长合法链上写入了合法的后继区块,那么在这两个区块没有决出胜负之前会暂时同时挂在最长合法公链上。直到其中一个区块率先被大多数节点接受,才最终确定谁才能挂在扩展的最长合法链上。

好了,通过以上这些机制协议,比特币区块链网络就完美地解决了验证交易有效性的问题。

总结一下,这篇文章讲述了以下要点:

  • 每个节点都有比特币的发行权

  • 比特币的区块链结构解决了“双花攻击”问题

  • 比特币中的投票权也称为记账权,整个过程类似淘金矿,所以形象地称之为挖矿

  • 比特币采用算力投票

  • 比特币协议完美解决了验证交易有效性的问题

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!