理论教育 比特币的原理:的解决

比特币的原理:的解决

时间:2023-10-28 理论教育 版权反馈
【摘要】:图10.2比特币交易示意图交易按照标准格式由付款方创建并广播,网络中的节点为了验证该交易的合法性,由该交易的输入找到指定的上一个交易,确定了对应的付款地址,由于发布到区块链上的交易都是被验证过的合法交易,一旦在区块链中找到指定的上一个交易,并从对应的输出中确定了地址,说明该付款地址是有效的。花费比特币时,花费的金额将来自之前收到并且目前存在于钱包中的资金。

比特币的原理:的解决

比特币系统用一个公共总账来记录交易,交易上记录有收款方、付款方以及交易额等信息。从总账上可以清楚地看到每一次交易的源头和去向,因此能避免二次消费。该公共总账就是区块链,区块链是一种只能在尾部添加而不能删除或修改的数据结构

1.交易

交易(Transaction)描述了比特币的收款双方及交易金额等支付细节,是证明比特币所有权的凭证,区块链记录的就是比特币的交易。交易上收款双方的账户地址是由密码算法生成的:调用ECDSA的密钥生成算法为用户生成公私钥对(pk,sk),计算比特币账户地址X=RIPEMD160(SHA256(pk)),私钥sk的拥有者可以使用X中的比特币。RIPEMD160()和SHA256()均为哈希函数。

交易由元数据、输入字符串和输出字符串构成。

(1)元数据:记录着输入地址的个数、输出地址的个数以及交易的哈希值等,哈希值是交易的ID号。

(2)输入字符串:输入字符串是一个数组,数组的每个元素都是一个“输入”。输入确定了付款方的公钥地址。输入指定上个交易的哈希值和所在输出数组的下标,该地址就是本次交易输入的公钥地址。由此可见,输入通过指定上个交易的某个输出来证明付款方拥有对应的比特币,交易的哈希值相当于一个指针。为了证明对该输入地址的所有权,每个输入还包含一个私钥生成的签名。签名是对当前交易的签名,包含上个交易的哈希值、本次交易的交易额和收款方的公钥地址。

(3)输出字符串:交易的输出字符串也是一个数组,该数组的每一个元素都是一个“输出”。每个输出由两部分组成,一是比特币的数量值,即交易额,最小单位为“中本聪”(Satoshi,1 BTC=108 Satoshi);二是收款方的公钥地址。所有输出的数量和必须小于或者等于所有输入确定的地址中的比特币数量和,即不能透支(原始交易除外,它是生成比特币的交易,输入对应的数量为0,输出数量为新生成比特币的数量)。当输入对应的数量和大于输出的数量和时,多出的部分作为交易费奖励给矿工,矿工会优先处理交易费高的交易。

每一笔交易可以有多个输出,比如Alice用10 BTC作为输入,要转给Bob的金额是6 BTC,就需要产生两个输出:一个是Bob的钱包里多出一个6 BTC,另一个是自己的钱包里多出一个4 BTC(不考虑交易费用)。之后,Alice再去用这个4 BTC,那么通过上个交易的哈希值就会找到这个10 BTC=6 BTC+4 BTC的交易,所在输出数组的下标对应第2个输出。

假设有三个交易,用户Joe给Alice支付钱款为交易1,Alice给Bob支付钱款为交易2,Bob给Carol支付钱款为交易3。比特币交易示意如图10.2所示。

图10.2 比特币交易示意图

交易按照标准格式由付款方创建并广播,网络中的节点为了验证该交易的合法性,由该交易的输入找到指定的上一个交易,确定了对应的付款地址,由于发布到区块链上的交易都是被验证过的合法交易,一旦在区块链中找到指定的上一个交易,并从对应的输出中确定了地址,说明该付款地址是有效的。上一个交易的输出指定了一个公钥,当前交易的输入包含对应私钥的签名。如果节点验证付款方的签名值是合法的,上一个交易被兑换成功,当前交易合法。

关于交易有如下四个公理:

(1)发送的任何比特币金额总是发送到一个地址。

(2)收到的任何比特币金额都被锁定在接收地址,接收地址与钱包相关联。

(3)花费比特币时,花费的金额将来自之前收到并且目前存在于钱包中的资金。

(4)地址接收比特币,但不发送比特币,比特币是从钱包发送的。

2.共识协议

交易上的签名可以保证交易的合法性,但是不能保证比特币不被二次花费。二次花费是指如果用户直接用交易作为支付凭证,该凭证可能会被重复使用。比特币系统利用区块链来避免重复花费,交易只有被发布到区块链上才是有效的。区块链记录着所有交易,交易的输入地址一旦被兑换过,区块链上会有记录,从而有效地避免了重复花费。交易被发布到区块链的过程需要全网节点达成共识,这个过程就是共识协议执行的过程。下面介绍区块的构造及共识协议达成的过程。

(1)区块和区块链

区块是区块链的基本组成结构,存储着所有的比特币交易信息,用户生成交易后需要矿工打包到区块内才可能链接到区块链上,最终获得全网节点的认可。交易以Merkle-tree的形式聚集在一起被存储在区块上。假设某区块上的交易有n个,为了证明某个交易在该区块上,使用这种存储方式只需要查找log n次。

区块由区块头和区块体组成。区块头包含一些元数据,主要包括6个字段(如表10.1所示),其中下面三个字段与挖矿过程有关。区块体主要包含交易内容(如表10.2所示)。

表10.1 区块头结构表(www.daowen.com)

表10.2 区块体结构表

区块的链接是通过区块头的哈希指针来完成的。区块头中存储着父区块的哈希值,它指向了区块链中的唯一一个区块,每个区块通过该指针首尾相连,形成区块的链式结构(如图10.3所示)。

图10.3 区块链的结构

区块之间彼此链接,能够实现可追溯性,改变任何一个区块,意味着其后面的所有区块都需要改变,这在实际来说是非常困难的,这就是区块链的不可篡改性。

(2)共识机制

共识机制是分布式系统中众多节点达成某个一致目标或者状态所参照的规则。在比特币系统中,每一个节点都保存着一个公共账簿(区块链)的副本,包含着所有完成的交易,那么如何保证每一笔交易在所有记账节点的一致性呢?例如,Alice把同一个比特币发送给不同的接收者Bob和Charlie,Bob和Charlie分别独立验证并接受交易,区块链就会产生两种不一致的状态,Alice实现了双花(二次花费)。区块链副本哪一个能够被大多数节点所认可并达成一致,如何解决分布式下的一致性问题,此时就需要共识机制。比特币通过整个网络的所有节点验证交易的合法性来解决这一问题,双花交易将会被别的参与者识别。当且仅当大多数参与者接受这个交易时,Bob才应当接受。但是,可能产生假身份的问题,敌手可能发动Sybil攻击。Alice可能构造许多实体以确认某个交易以替代之前的交易以实现双花。Bob将会相信他们并接受这个交易。比特币利用工作量证明(Proof of Work,Po W)来预防Sybil攻击。

工作量证明机制的核心就是在分布式网络环境中,全网所有节点利用自己的计算能力竞争解决一个计算困难但验证容易的密码学难题,只有付出一定的计算量的节点才能在竞争中获胜并取得记账权,并将新的区块连接到链上,其他节点验证新区块并添加到自己的区块链副本上,开始新一轮的竞争记账权。这样通过共识算法筛选出记账节点,保证了区块只能有一个节点产生并广播,其他人只能充当验证和同步副本作用,而不能对其进行任何的更改,保证了全网的区块链账本一致性。

在共识过程中,由于通信网络的延迟等因素,有可能会几乎同时生成两个合法的区块,这个时候会出现一个暂时的分叉:网络中有两个等长的链。然而,哈希难题的困难性使得下个时刻又同时生成两个合法区块的概率很低,因此暂时的分叉之后,最终会有一个最长的链被接受。由此可见,创建交易之后,用户需要等待当前区块之后又有新的区块生成才能确保当前区块所在的链是最长的链,即该区块是有效的。否则一旦发生分叉,某个分支将被淘汰掉,尽管两个链上的大多数交易都是相同的,但是总是存在一些有分歧的交易,而被抛弃的那些交易就会失效。恶意用户能够利用这种情况重新消费已经用过的比特币,这将导致重复花费。为了防止重复花费,需要等待确认区块的生成。当前区块之后的新生区块被称为确认区块,随着确认区块个数k的增加,出现深度分叉的概率将以k的指数级减少,一般k=6时就可以认为交易是有效的。

(3)挖矿机制

在比特币系统中,究竟哪一个区块会作为区块链的下一个区块被接受取决于工作量证明,工作量证明就是寻找某个数学难题的解。数学难题不容易被解出来但是却很容易验证,计算的过程被称为挖矿,每个挖矿的网络节点被称为矿工。矿工每生成一个新区块,就能在该区块上嵌入一个原始交易,也就是Coinbase交易,这种交易与普通交易格式一样,只不过由于该交易是为了生成新的比特币,它的输入指向的是一个空的哈希值,输出指向的是矿工的公钥地址,因此矿工会得到一定量的比特币作为奖励。此外每个交易的交易费也是给矿工的报酬,激励矿工生成合法的区块。每生成一个区块矿工能够获得50 BTC的报酬,报酬每四年减半一次,因此到2140年将不再有新的比特币生成。

工作量证明的过程如下。

①构建候选区块。当新区块广播后,新一轮的挖矿竞争开始。矿工从网络中接收新区块的区块头哈希值pre_hash;矿工生成一个Coinbase交易(用于获得比特币区块奖励),连同自己内存池中的交易一起组成Merkle树记入候选区块体,计算交易集合的merkle_root。将pre_hash、merkle_root记入候选区块的区块头,同时为区块头添加版本号version、时间戳(ntime)、难度值(nbits)、随机数(nonce)等字段。这里nonce初始值为0。

②寻找有效区块。矿工穷举nonce,寻找满足

SHA256(SHA256(version‖pre_hash‖merkle_root‖ntime‖nbits‖nonce))≤T的nonce值(计算区块头的双SHA256哈希值),这里T是某个目标值,即矿工竞相寻找能够使目标值满足前多少位为0的随机数。率先找到满足条件nonce值的矿工立刻广播自己的区块,相邻矿工节点接收并验证这个区块中交易的合法性和工作量证明的正确性,继续传播此区块。所有接收到新区块的节点都会验证并传播新区块,将它链接到自己的区块链副本最后,并在此区块后面开始新一轮的挖矿竞争。此时经过工作量证明,候选区块成为有效区块,发现区块的矿工获得区块奖励。哈希难题的困难性会随着整个网络计算能力的改变等变化做相应的调整,以保证平均每十分钟能够生成一个区块。工作量证明达到了去中心化的目的,但是却浪费了大量的算力,达成共识的时间较长。

随着越来越多的节点参与挖矿,比特币全网算力以指数级别上涨,单个矿工短时间内挖到区块的概率越来越低,许多矿工为了追求持续稳定的收益联合起来组成矿池挖矿,并根据自己的贡献分配挖矿收益。矿池的出现导致算力的集中,这与比特币去中心化的性质相违背,威胁着比特币系统的安全。

矿池挖矿过程如下。

①每个矿池有一个管理者,负责收集交易、分配挖矿任务和分配收益。

②矿工根据分配到的任务利用自己的算力挖矿,当找到满足矿池目标值的nonce时提交给管理者,这叫作部分工作量证明(PPo W)。当部分工作量证明满足全网难度目标时(即完整工作量证明FPoW),管理者向全网广播,矿池获得相应的挖矿收益。矿池基于奖励分配机制给矿工分配收益。

比特币系统的通信网络是一个无中心、点对点的广播式网络,它被用于广播新生成的交易和区块。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈