比特币(Bitcoin)是一种加密货币,是一种分布式数字资产。中本聪发布比特币[^1]至今已有10多年,部分读者可能接触过区块链技术,甚至投资过数字货币资产。今天区块链的总市值已经达到2700亿美元,比特币的市值也达到了1700亿[^2]。然而,比特币使用的底层技术其实非常简单。它只是巧妙地结合了这些技术。图1——比特币如果我们对比特币等区块链技术稍有了解,就会发现它是一个设计巧妙的分布式数据库。比特币等区块链网络作为运行在公网上的分布式数据库,会面临网络中恶意节点的攻击。因为比特币需要面对复杂的网络环境和不可靠的节点,所以在设计和实现上也做出了应对。我们可以看到它是如何结合现有技术来防止恶意节点访问交易和账户数据的。篡改。比特币网络主要使用以下两种技术来保证用户发出的交易和历史上的交易不会被攻击者篡改:非对称加密可以保证攻击者无法伪造账户所有者的签名;历史交易不会被攻击者取代;非对称加密非对称加密算法[^3]是目前广泛使用的加密技术,TLS证书、电子签名等场景使用非对称加密算法来保证安全。非对称加密算法同时包含公钥(PublicKey)和私钥(SecretKey)。用私钥加密的数据只能用公钥解密,用公钥解密的数据只能用私钥解密。asymmetric-cryptography图2——非对称加密特性比特币采用非对称加密算法来保证每笔交易的安全。网络中的每个账户(地址)都是一对私钥的公钥,而账户的所有者将持有私钥,下面是刚刚生成的一对比特币地址和私钥[^4]:地址:13RTT8MsbAj7o4zL7w4DNNuuwhgGgHqLnKPrivateKey:469d998dd4db3dfdd411fa56574e52b6be318f993ca696cc5c683c45e8e147eb需要注意的地址和使用方法bitcoin私钥生成方式不清楚,网站推荐使用bitcoin-private来存储私钥密钥对。任何人都可以通过上述地址13RTT8MsbAj7o4zL7w4DNNuuwhgGgHqLnK向该账户转账;账户持有人也可以使用私钥签署交易以将资金转移到其他地址。WhenwewanttosubmitanewtransactiontotheBitcoinnetwork,weneedtofirst构建一个如下所示的交易结构:{"txid":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f","hash":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f","version":1,"size":224,"vsize":224,"locktime":0,"vin":[...],"vout":[...],"hex":"0100000001a90b4101e6cbb75e1ff885b6358264627581e9f96db9ae609acec98d72422067000000006b483045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e0121025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4ffffffff02a037a0000000000017a91477df4f8c95e3d35a414d7946362460d3844c2c3187e6f6030b000000001976a914aba7915d5964406e8a02c3202f1f8a4a63e95c1388ac00000000","blockhash":"0000000000000000000c23ca00756364067ce5e815deb5982969df476bfc0b5c","confirmations":5,"time":1521981077,"blocktime":1521981077}接下来,我们可以使用我们持有的私钥对整个交易中的所有字段进行签名,然后将签名与交易打包发送它进入网络,等待比特币网络的确认,在比特币的所有地址中,地址35hK24tcLEWcgNA4JxpvbkNkoAcDGqQPsP目前持有超过25万个比特币[^5],目前市值约为20亿美元。只知道地址的情况接下来我们计算一下需要多长时间才能得到地址对应的私钥,比特币的私钥一共有256位,也就是2256种可能,目前我们没有更快的破解方法,所以我们只能使用暴力计算私钥。假设我们使用Summit[^6],IBM于2018年推出的超级计算机,每秒可以进行1.4*107次浮点计算,假设计算机每秒可以计算出相同数量的公私钥对(计算公私钥对远比计算浮点数复杂),找到存储地址对应的私钥需要以下时间20亿美元的资产:我们整个宇宙的存在时间只有破解私钥时间的十亿分之一,所以在目前算力没有革命性突破的前提下,只是理论上可以获得通过暴力破解得到公钥对应的私钥,但在实践中是完全不可能的[^7]。共识算法MySQL等数据库以行为为单位存储数据,而比特币这种分布式数据库存储的基本单位是区块。块通过哈希指针连接起来形成一棵树,如下图所示。图中绿色最长的链是网络的主链。Blockchain-and-blocks图3——如何让网络中的所有节点对下一个区块的内容达成共识,是比特币需要解决的关键问题。只有节点对数据达成共识才能保证过去的交易不被篡改,但是作为运行在公网上的分布式数据库,它面临的场景非常复杂,需要解决拜占庭将军下的分布式一致性问题问题。ByzantineGenerals问题是LeslieLamport在TheByzantineGeneralsProblem论文中提出的分布式领域的容错问题,是分布式领域中最复杂、最严格的容错模型[^8]。在这种模型下,系统不对集群中的节点做任何限制。它们可以向其他节点发送随机数据、错误数据,或者选择不响应来自其他节点的请求。这些不可预测的行为使得容错问题变得更加复杂。拜占庭将军问题描述了如下场景。有一群将军,分别指挥一部分军队。每个将军都不知道其他将军是否可靠,或者其他将军传递的信息是否可靠,但他们需要选择是否投票。Attackorretreat:byzantine-generals-problem图4-拜占庭将军问题区块链技术使用共识算法和激励机制,让多个节点在拜占庭将军场景下实现分布式共识。比特币使用如下规则让多个节点达成分布式共识:引入工作量证明——让节点在提交新区块前先计算满足一定条件的哈希值,取代传统的分布式共识算法,一人一票(或一节点一票)投票)设置;引入最长链为主链的设定——只有主链上的交易才算合法交易;引入激励——提交区块的节点可以获得比特币奖励;通过以上规则,每个节点会计算最长链上的哈希值,争取提交一个合法的区块。但是,一旦节点中有人拥有超过51%的算力,就可以通过强大的算力改变区块链的历史。因为区块是连续的,前一个区块的改变会使后一个区块计算出的哈希失效,如图5所示,如果攻击者需要改变主链倒数第三个黄色区块,则需要连续四个区块构建完成历史篡改,其他节点会在这条较长的链上继续计算:51-percent-attack图5-51%attack可以使用如下代码计算在无限的时间段内,当攻击者持有51%算力,重写历史0到9个区块的概率[^10]:#include
