Skip to content

比特币

约 1389 个字 预计阅读时间 7 分钟

简介

比特币是基于密码学的一种电子货币,是一种去中心化的链式“记账方式”,起源于 2008 年中本聪的《白皮书》。

每个十分钟(左右)内的账单都会被打包成一个区块,并将其链接到以前的块上,形成链式结构。

一个区块大小大约在 1MB,可以存 4000 条左右记录,具体数目取决于记录大小

特殊的是,打包这一操作并不是由一个官方的机构来统一完成,而是任何接收到这一时间段所有账单记录的人都可以完成。打包这个区块的人不仅可以获得“打包奖励”,还会从该区块中的交易中获得一定手续费,这也是这么多人热衷于挖矿的原因。

打包奖励:工作量证明

打包奖励每四年减半,2009 年为 50 bitcoin,现在 2025 年是 3.125 bitcoin。总 bitcoin 量大约为:

\[50\times 6 \times 24 \times 365 \times 4 \times( 1 + \frac{1}{2}+ \frac{1}{4}...)=2100万\]

由于是去中心化的系统,一个人发起的账单会被广播到所有人手中,但是这也会导致不同的人接收到的账单顺序有先后区别,那么我们该以谁打包的区块为准呢?因此我们有一个工作量证明,要求打包者需要解决一个无法直接得到解答的密码学问题,谁先完成谁就有权利进行打包。

该密码学问题具体如下:

每一个区块都有各自的区块哈希,该哈希值通过对上一个区块的区块哈希、当前区块内所有账单的哈希、当前时间以及一个随机数这四个部分进行两次哈希散列算法得到,算出来的区块哈希必须要求前 \(n\) 位为 0。

这四个部分只有随机数是我们可以控制的,打包者需要找到一个满足条件的随机数才能进行打包。

由于每个人的账单信息、时间可能是不一样的,所以不同人的打包难度不同,即随机数不同

参数 \(n\) 是动态确定的,决定了该问题的难度。总体上,我们希望这个系统能以 10 分钟一次的打包速度运行,因此当总体算力更多时,参数 \(n\) 就越大。

block.png

信用问题

为了保证比特币交易记录是真实的,我们需要对其进行电子签名以进行身份认证。

一个比特币的用户在注册时会获得他的公私钥和地址,其中公钥和地址都是公开的。对于电子签名,我们使用私钥进行加密,使用公钥进行解密。

用户 A 在创建一条记录时,先对该记录进行摘要算法(通常也是哈希),然后使用私钥对该摘要加密得到一个密码,然后用户 A 会把该记录、自己的公钥、加密得到的密码这三个信息广播给所有人。

那么其它接收到该消息的人先对记录也做摘要算法,然后使用 A 的公钥解密密码,将两者进行比较以确认该广播的发起人是 A,否则则拒绝这条消息。

但是假定 A 账户中只有 10 btc,他同时发了两条消息,分别要给 B 和 C 都 10 btc,我们该如何处理?这个问题被称为双重支付

余额检查

比特币的用户会下载从创世纪开始的所有块的信息,因此他知道某个用户的账户中应该还有多少钱,也可以通过追溯的方式来查找用户的比特币获得记录,因此余额检查的功能是可以通过追溯的方式来实现的。

还是采用上面说的例子,用户 A 同时广播了“A 向 B 支付 10 btc”和“A 向 C 支付 10 btc”两条消息,但是不同人接收到这两条消息的先后顺序可能不同,但相同的是,接收到第一条广播消息后,第二条广播消息就会因为余额检查不通过而被拒绝。

也就是说,其他用户只会持有这两条支付消息的其中一条,当某个人成功打包成块并将其链接到主链上时,那条消息就会被确认,而另一条消息就会被拒绝。

虽然我们已经有了电子签名保证记录的内容不会被篡改,但这不能保证区块链上的区块中的某一条记录被直接删掉。

篡改者删除了某一区块上的一个交易记录,并将其重新打包为一个新块接入区块链,但是这个新块很可能是不被大众所认可的,因为我们默认坚持最长链原则,而该区块所分叉出来的新链增长速度往往慢于主链,因为主链是全世界一起算,而新链只有篡改者一个人在算,因此对区块链的篡改也是非常难以实现的。

随着链长度增加,对前面的区块的改动难度就越大,所以大额交易都需要等待几个块才认为真实

Comments: