比特币和区块链技术出现很久了,大家或多或少都有耳闻。不管是对比特币暴涨的羡慕,还是对背后技术的科普。笔者也是一样多少看过一些相关资料,但最近读区块链支付领域的顶会[1]论文[2]时还是发现自己对技术细节了解太少,甚至存在一些误解。
本文会介绍一些比特区块链的技术细节,同时尽力使其容易理解。
比特币 bitcoin
所谓的比特币其实是交易组成的链。每个交易中包含大概信息就是谁把这个比特币转账给了谁,并且由转出比特币的人签字画押(数字签名[3]),具体来说如图1,每个交易中包含
- 收到比特币的人的公钥
- 由上一个交易和收到比特币的人的公钥组成的数据的哈希
- 转出比特币的人的数字签名。
这样做的话,应该收到比特币的人就可以验证转出比特币的人是不是真的拥有这个比特币。方法就是用上一个交易中所有者的公钥去验证这次交易中的数字签名,这样就能知道这个比特币上一次被转账给了这次的转出者。
这里有个问题是转出比特币的人可能将同一个比特币转账给多个人,这样上面的交易链就会分叉。然而其实只有最早的那次转账是有效的,后面的转账都是非法的。为了验证交易是不是最早的一次转账,就需要一个公认的顺序。传统的方法是由中心节点指定一个顺序,大家被动接受。而比特币是通过多数人同意来认定一个顺序是不是公认的,这似乎也更符合公认这个词的含义。想要让(比特币系统所有参与者中的)多数人公认一个顺序,需要:
- 向所有参与者广播所有的交易
- 多数参与者同意一个顺序
在每次交易时,交易的接收者需要证明多数节点同意这次交易是最先收到的交易,这样接收者就能安心的完成交易了。
区块链的主要任务就是达成这样的一个公认的顺序。
区块链 blockchain
区块链的基础是时间戳服务器,如图2。
时间戳服务器
时间戳服务器计算包含多个需要被打时间戳的数据项的区块的哈希值并广泛地发布这个哈希值。时间戳能证明要得到这个哈希值,显然这些数据当时一定是存在的。每个时间戳的哈希值都纳入了上一个时间戳,形成一条链,后面的时间戳进一步增强前一个时间戳。
Bitcoin: A Peer-to-Peer Electronic Cash System[4]
系统参与者通过在某个时间戳之后计算哈希来表示对某个顺序的认同,这样最长的链就是最多人认同的链,也就是我们想要的公认的顺序。
如果某个恶意参与者想要修改链中某个区块的内容,那必须把这个区块之后的哈希全部重算一遍,并且快速计算使自己这条链成为最长的,在所有人之前将最新哈希广播出去。这看上去是个比较难的任务,但并非不可完成,只要有足够快的计算机就可能做到。解决方法就是为计算哈希增加难度。
工作量证明 Proof-of-Work
图3是区块链中区块的内容:
- 上一个区块的哈希
- 上面提到的比特币交易
- 一个随机数(这个随机数是用来调整计算哈希的难度的,也是工作量证明的关键)
工作量证明采取搜索一个随机数,使得被哈希时,如使用 SHA-256,得到的哈希值以数个 0 比特开始。平均所需工作 量将随所需 0 比特呈指数级增长而验证却只需执行一次哈希。
Bitcoin: A Peer-to-Peer Electronic Cash System[4]
比特币运行的步骤:
- 向所有节点广播新交易
- 区块链节点将收集的新交易组成一个区块(如图3)
- 计算满足要求(工作量证明)的哈希,既得到某个随机数
- 将这个区块(包含了满足要求的随机数)广播
- 其他节点确认区块中所有交易都没有被支付过,而且区块确实能够计算出满足要求的哈希
- 节点通过在这个区块之上继续计算表示对这个区块的接受
这样计算哈希的难度大大增加,恶意节点想要赶上并超过其他所有节点计算哈希的速度,就必须拥有巨量的计算力,而如果拥有这样的计算力,用作正常贡献获得的激励会超过作恶,这样就从动机上消除了作恶。
参考文献
[1]: SOSP
[2]: Lind, J., Naor, O., Eyal, I., Kelbert, F., Sirer, E. G., & Pietzuch, P. (2019, October). Teechain: a secure payment network with asynchronous blockchain access. In Proceedings of the 27th ACM Symposium on Operating Systems Principles (pp. 63-79). ACM.
[3]: 可以通过我另一片博客了解:《用一个例子解释RSA原理》
[4]: Bitcoin: A Peer-to-Peer Electronic Cash System. Satoshi Nakamoto.https://bitcoin.org/bitcoin.pdf