比特币交易系统工作原理详解

        最近对比特币感兴趣,看了一些相关资料,本文做个总结,阐述一下我对比特币工作原理的理解。

比特币的设计目的

       中本聪在白皮书中对比特币的定义——A Peer-to-Peer Electronic Cash System,一个点对点的电子记账系统。

        首先,点对点(P2P——没有权威机构作为第三方见证交易的真实性。这是为了实现交易的去中心化。传统的金融系统是建立在具有公信力的交易中心之上的,然而当中心权力过大,货币的流通发行与交易方的隐私都掌握在它手中,会引发许多问题。

        其次,电子记账系统——不同于实际生活中货币是真实存在的物品,在网络上,货币只是一串数字,并且必须是一串非常具有可信度的数字。不管是开采黄金还是印钞作为货币,最终目的都是实现交易的公信力。因此,对于数字货币来说,重要的是可信性。那么怎么实现可信性呢?怎么知道一个人所持有的货币数量是可信的?最好的办法就是追溯。从ta的第一笔交易开始查起,必然可以算出ta的货币数量。而要实现追溯,就要实现可信的记账

        因此,在我看来,比特币的设计是为了同时实现去中心化可信性。

       了解了BTC的设计目的,接下来讲下比特币系统的工作原理。就像传统货币一样,这个系统最核心的功能是实现比特币的发行流通,只是货币从实物变成了电脑上的bit。

比特币的发行原理

        设计者在2009年1月3日亲手创建了第一个区块——比特币的创世区块(Genesis Block),并获得了系统自动产生的第一笔50枚比特币的奖励,第一个比特币就此问世。接下来的比特币就是在这个50个BTC的流通中产生的。

        比特币是电子记账系统,那么由谁来记账呢?用户,这是一个去中心化的系统。那ta为什么要记账呢?这要花费一定的时间与内存,那就需要奖励——当一笔交易产生时,成功记账的人获得一定的手续费作为奖励;在一定数量的交易产生时,将这些交易成功打包成块并接入区块链的人获得一定的比特币奖励,这就是比特币的发行

        货币的发行当然不能无限进行,为了限制比特币的数量,设计者首先根据全球算力设计出合适的打包难度,让全球大概每10min成功打包一个区块;其次,将打包的比特币奖励从最50BTC开始,每四年减少 ,这样就可以算出比特币总共有 枚。

比特币的流通原理

        假如有一个 的交易,那么这个交易包含四个部分: 1. A,B双方建立账号 ;2. A发起交易,“第三方”确认信息真实性;3. “第三方”将确认的交易信息写入账单;4. “第三方”将账单编号粘进账本。

        交易的第一步是要用户建立账户,设置密码。这是一个随机数->私钥->公钥->钱包地址的过程。注册成为比特币用户时,系统会根据随机数生成一个私钥,私钥会生成一个公钥,公钥又会生成一个地址。其中私钥必须保密,可以保存到硬盘里或者记到脑子里,因为这个私钥是使用相应地址上存放的比特币的唯一标识,一旦丢失,所有的比特币将无法使用。公钥是公开的,所有用户都可以知道。钱包地址便是账户,私钥是密码。具体转换过程就不讲了,有兴趣可以去了解。下面解释什么是私钥和公钥:

        比特币采用非对称加密算法,利用一对不同的私钥和公钥完成交易信息的加密,比传统的密码更为可靠。私钥是保密的,公钥是公开的。它们配合可以实现加密传输数字签名。下面简述其原理:

        加密传输:假设A要将加密信息传给B。首先A用私钥加密文本,将加密后的文本传给B,B利用公开的公钥解密文本得到原文。

        数字签名:A将信息用私钥加密,并将加密信息与原始信息传给B,B用公钥解秘加密信息并与原始信息对比,若相同则证明该信息是A发送的。

        非对称加密算法主要是利用数学上的不可逆过程,如RSA算法就是利用大素数相乘容易,分解困难的特点。举个简单例子:13× 11=143 ,则143为公钥,13、11和× 为私钥。(详细可见:https://blog.csdn.net/resilient/article/details/73000977)        

        交易的第二步,A发出交易信息,“第三方”确认信息真实性。不同于传统金融系统,比特币没有权威机构见证交易,它把权力交给群众,因此这个“第三方”是所有比特币用户。每个用户都是交易的见证人,只要50%以上的人确认交易就可以证明交易的真实性了,这就是设计者说的one-CPU-one-vote(一个CPU一票)。很难出现全世界50%以上的人一起伪造交易的情况,因此经过“第三方”确认的交易可信度是很高的。

        确认过程如下图所示:

https://img-blog.csdnimg.cn/20191029122702814.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pjZ183NDE0NTQ4OTc=,size_16,color_FFFFFF,t_70

(图片摘自:https://blog.csdn.net/zcg_741454897/article/details/102796022)

        这其实就是一个数字签名的过程——当A发起交易后,对消息进行hash,生成数字摘要,用私钥对数字摘要加密,生成一个密文。接下来A会广播这条交易消息、公钥以及密文。“第三方”首先对交易信息进行哈希生成摘要1,再通过公钥对密文进行解密,生成摘要2。如果两个摘要相同,说明这个消息确实是A发出的。这样就确认了交易信息,接下来就可以记账了。

        交易的第三步,“第三方”将确认的交易信息写入账单。就像开头强调的,比特币是一个电子记账系统,账单与账本的设计是核心。不像传统金融系统中有银行保证用户的余额不可篡改,比特币作为一个去中心化的金融系统,怎么保证用户持有的货币数额不可篡改?余额只是一串数字,这个数字本身并不可信,它的可信度来自于交易历史记录,只有通过核实交易历史记录,计算得出的余额才是可信的。因此比特币舍弃了余额的概念,通过溯源的方式保存用户所持有的货币数额。历史记录保存在账单中,账单的可信度来自于交易的真实性与历史交易的不可篡改。比特币通过数字签名的方式来保证交易的真实性,通过分布式记账与区块链技术来保证历史记录不可篡改。

        确认了 的交易信息后,各个节点将这条信息记入“账单”,也就是区块中。区块由区块头区块体构成,如下图所示:

        区块体中存放了一段时间的交易记录,交易记录与它们的哈希值构成默克尔树结构,默克尔树根(Root)的哈希值作为本区块里所有交易记录的数字指纹被放入区块头。这个结构牵一发而动全身,有一个交易改变树根值就会改变,可以很好的防止篡改。

        区块头中还包含时间戳,上一个区块的哈希,高度,随机数(nonce)和其他信息。这些信息共同连接成一个数字,而这个数字的哈希值就是这个区块的身份标识。

        这样交易记录就被记入了“账单”,并且这个“账单”经过了密码学严格的加密,具有可信度。        

        交易的第四步,幸运用户成功将包含此交易的账单整理打包,“粘到”账本上,交易落定。B通过“账本”确认交易信息,交易完成,幸运用户获得一定数额的比特币奖励。

        “账本”就是区块链。就像按照时间记账,把这些账单按时间编号粘贴,构成了账本,一个区块的头部编号的哈希值(身份标识)存入下一个区块,它们按照时间顺序排列构成区块链,通过下一个区块头部的上一个身份标识可以寻址上一个区块,这样就达到了溯源的目的。

        接下来就有一个问题了,打包账单包含奖励,许多用户都会竞相打包账单,那么以谁记得账为准呢?设计者设计了一个比赛——解一个数学难题,最快解决的人获得记账权。这个比赛这就是“工作量证明”(proof of work)。

        区块头部的随机数(nonce)是头部唯一可以变动的部分,它决定了这个区块的头部编码究竟是什么样。用户需要改变这个随机数,让区块头部编码的哈希值满足某个特性,比如前32位为0。

https://img-blog.csdn.net/20170316171004425?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzk3MDk5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

        哈希算法是一种理论不可逆的加密算法,它将输入键值映射成输出散列: ,我们可以通过键值获得散列,但几乎不可能通过散列计算键值。由于它的不可逆性,我们无法通过输出反推输入,因此这个数学题只能靠试出来。于是用户们竞相改变随机数以获取满足条件的散列值。用户的计算机算力越强,每秒钟试的次数越多,就越可能解决这个难题。这个过程就是“挖矿”,是算力的竞争。工作量证明就是证明你所试的次数最多,你所花费的内存与电费最多。

        某个用户成功解决难题后,区块成功接入区块链,这个满足某个特性的哈希值将作为这个区块的身份标识记入下一个区块。这样所有账单都编好号“粘”进了账本,同样牵一发而动全身,可以防止篡改。

数字货币的几个重要问题:

        讲完了比特币的工作原理之后,接下来集中解释一下几个数字货币比较重要的问题——双重支付,篡改和用户信息保密。

        第一点,如何防止双重支付:当A只有10BTC,ta却同时给B、C支付了10BTC,该怎么办呢?我们知道比特币系统没有余额的概念,只能通过追溯来确定用户拥有的BTC数量,因此我们不知道ta是否透支。

        假设D节点先收到了转给B 10BTC的消息,通过上面第二步的方法确认信息后,自然会拒绝第二个消息。与此同时,E节点可能先收到了转给C 10BTC的消息,自然会拒绝给B的消息。至于哪一笔交易最终会上链,就要看D和E哪个先解决难题,成功挖矿。假设D先挖矿成功,那么ta将支付给B的消息接入了区块链,根据最长链原则,其他人也都自动站队到D,在D记录的区块之上继续挖矿。

 

        最长链原则就是说,同一时间有两个矿工同时挖到了矿,或者由于网络延迟等原因产生了分歧,各个节点先随意根据自己认为对的区块挖矿,直到下一个区块产生,这时会有两条链,但是有一条是长的,此时以最长链为准。

https://img-blog.csdnimg.cn/20191029123105101.png

        第二点,如何防止篡改:比特币的记账为分布式记账系统,所有用户人手一个账本,因此不同于中心化金融系统,作假几乎不可能。并且,由上述可知,交易记录根据时间顺序层层递进,相互关联,牵一发而动全身,修改账本几乎不可能。

        唯一可能的就是当一个人支付后,立刻抹去这个交易。例如A支付给B一笔BTC,ta试图赖账,就重新打包一个不包含这笔交易块接入区块链,并且让这个链比原有链还长,如下图所示。这时其他人已经在上一条链上继续挖矿了,也就是说A要拥有比其他人加起来还大的算力,而这几乎不可能。就算A有这样的算力,那ta为什么不继续在长链上挖掘以获得更多利益,而去做小偷呢?

https://img-blog.csdnimg.cn/20191029123254376.jpg

        第三点,如何实现用户信息保密:在比特币这种分布式记账系统中,交易信息人手一份,怎么实现用户信息保密呢?根据下图可知,传统交易系统是将用户身份与交易信息都加密,只有交易双方与第三方机构拥有信息。而比特币系统的保密模型是——用户身份保密,交易信息公之于众。这样大家虽然知道存在什么交易,但不知道是谁进行了交易。

         同时设计者建议大家不要使用同一个私钥完成所有交易,避免公众了解一个人的所有交易情况。

        就像设计者说,比特币的可行度是建立在密码学基础上,而密码学则是建立在目前算力无法解决某些数学难题的基础上。随着算力的提升,例如现在量子计算机的发展,也许密码学会被颠覆,那时候人们就需要另外一种数字货币系统了。

おすすめ

転載: blog.csdn.net/qq_53019232/article/details/122452636
おすすめ