区块链技术的理解程度如何?
第四次工业革命的底层技术
信用中介这个概念听起来很高大上,实际上大家都很熟悉。它是指在借贷关系中为双方提供担保的人或机构。例如,当小松向你借钱时,而你没有足够的钱,于是你去找了小梅借钱。这个时候,你需要向小梅担保小松一定会还钱,所以信用中介必须具备足够的信用度才能成为信用中介。然而,在实际的借贷关系中,信用中介都需要承担成本。谁会愿意在不赚钱的事情上投入资金呢?因此,在现代经济中,与借贷关系密切相关的所有人最终都为这种成本买单。这也是为什么华尔街如此富有的原因。
于是,有人开始思考如何降低这种成本。答案是去中心化。冷知识:P2P借贷实际上也是基于去中心化的思想,只是缺少了最关键的一步——担保。因此,P2P借贷平台经常出现问题的原因很大程度上要归咎于不守信用的借款人。没错,让每个人都为所有交易担保,这就是区块链技术的核心思想。第一个实践这种思想的人叫中本聪(Satoshi Nakamoto),也就是发明比特币的那个人。热知识:区块链实际上是作为比特币的底层技术被提出的。
现在我们假设小C和小H都有一个比特币地址(地址是如何实现的呢?后面再详细说明,你现在可以把它当作银行卡号码之类的东西)。假设小H要向小C支付一笔比特币,交易流程如下:
矿工
矿工验证了这笔交易后,将其记录在分布式数据库(一种运行在所有节点上的数据库,专门用于记录交易)中。一旦记录就不可更改和销毁(为什么呢?后面再说)。
假设现在有三个矿工(小X、小Z和小Y),他们收到了小H向小C的交易申请广播以及其他交易广播。他们的比特币挖掘程序会自动将过去约10分钟的交易打包成一个新的交易区块,并计算基于该区块、上一个区块的某个数据和随机数的一个数据(计算了什么呢?后面再说)。最早计算出数据的矿工会获得系统规定的某个数量的比特币作为奖励。然后矿工会将这个区块加上时间戳并向全网广播,其他矿工再进行验证。
综上所述,比特币系统具有以下几个优点:
无需第三方信用中介,每个人都是信用中介;
由于每个区块都基于上一个区块,因此不可销毁、不可更改和不可伪造;
供应有限(众所周知,比特币上限数量为2100万个),防止通货膨胀(这也是为什么比特币被称为数字黄金);
但是...
比特币交易确认时间过长,一般认为每等待六个区块后可以确认交易不可逆。然而,每10分钟产生一个区块,这样等待一笔交易确认就需要1小时的时间。此外,工作量证明机制过于单一,理论上对比特币发动51%算力攻击也是可行的(参见后文)。区块容量也是一个问题。完全节点有硬性的物理尺寸限制(每个区块最大1MB),所以每10分钟产生1MB的区块。通过计算可以得出限制大约是每秒7笔交易,每天600000笔交易。当达到这个阈值时,未确认的交易会延长确认时间。
矿工们在打包区块时,到底计算了什么?他们计算了本区块加上上一个区块的SHA256值加上随机数的SHA256值。这是什么?让我们先来看看密码学上的经典——散列算法。Hash Algorithm(摘要算法)具有相同输入输出一定相同,不同输入输出极大概率不同的特点。哈希算法的目的就是为了验证原始数据是否被篡改。所以当你拿到一组数据和它的摘要的时候,通过相同的摘要算法就可验证数据是否经过改动。
创世区块是通过计算散列值得到的。计算散列对于现代计算机来说很容易,但是比特币系统要求新的散列值拥有特定格式——以特定数量的0开始。由于SHA256算法极难预测,矿工必须用不同的随机数计算出许多摘要,直到获得正确的那个。以上过程统称为挖矿。
钱包是一种文件,可以让用户访问多个比特币地址。比特币地址是类似银行卡号码的东西,是一串由字母和数字组成的字符串。热知识:比特币和银行卡的工作机制非常不同,比特币用户可以任意创建地址,这样做是被鼓励的——用于增强匿名性和隐私性。每一个地址都有自己的比特币余额(也就UTXO,参见下文)。当小H创建一个新地址时,小H实际上是在生成一个密钥对。这对密钥由一个公钥和一个私钥组成。私钥只有小H知道且与小H的钱包文件绑定,而对应的公钥每个矿工都了解。当小H用私钥对一个消息进行签名,所有持有公钥的人都能验证它。
当小H申请交易时,他的客户端用此地址的私钥签名这一交易申请,而所有矿工都会验证这一申请——用公钥。大家都在电脑上用过复制的功能吧?因为数据是可以复制的,所以同一笔数字资产可能被交易两次。在一般的中心化交易网络(就是你和银行和其他人)中,一般通过实时修改账户余额来实现。
Unspent Transaction Outputs(未花费交易输出,简称UTXO)是比特币系统中的一个重要概念。假设小H有8个比特币,这意味着之前有一个交易将这些比特币转入了小H的地址,这个交易的输出(即8个比特币)未被使用,小H拥有了这8个比特币。现在,小H要发起一个转账交易,这个交易中的输入是让小H拥有这些比特币的上一个交易。
为了实现这一目标,小H需要对让他拥有这些8个比特币的上一个交易进行签名,并将这一新转账交易的输出地址设为小C的钱包地址。这样,小H就发起了一个转账支付交易。银行卡的支付方式通常是:确认小H的余额并在小H的余额中减100,在小C的余额中加100;而UTXO的机制则是不管怎样必须消耗完UTXO,即从UTXO中转出7个比特币支付给小C并转出一个给小H(这一个会成为新的UTXO)。
当矿工将这一交易打包进新的区块时,转账交易完成,这8个比特币就属于你了。小C拥有的是他们两个这次交易的未使用的交易输出(UTXO)。UTXO与帐本系统深度耦合,不需要向上追溯每一笔交易,只需要确认上一笔交易可信。这样一个好处就是,如果从第一个区块开始逐步计算所有比特币地址中的余额,就可以计算出不同时间的各个比特币账户的余额了。
双花问题是指一笔资产被两次使用。在一般的中心化交易网络中,一般通过实施更改账户余额来避免双重支付。但是在比特币系统中,我们使用时间戳、工作量证明机制和UTXO模型来解决问题。
最长链是区块链系统中的一个重要概念。当有50%的算力都归攻击节点时,两条链的生成速度是相同的。这是因为攻击节点试图使自己的链成为最长链,从而获得更多的奖励。然而,由于区块链系统的分布式特性,这种攻击很难成功。因此,最长链通常是区块链系统中的真实链,也就是大多数人认为正确的链。
为了确保数据的一致性,我们需要实现一个分布式协议,使得每个节点都能知道其他所有节点的状态和决策。然而,仅仅让每个人知道X是不够的。正如James A. Donald所说:我们还需要让每个人都知道所有人都知道X,以及每个人都知道所有人都知道所有人都知道X。这种现象在分布式数据处理中被称为拜占庭将军问题(Byzantine Generals Problem),它是一个经典的困难问题。
拜占庭将军问题可以用一个简化的非正式描述来概括:假设有10支军队(代表拜占庭帝国的将军)想要同时进攻一个强大的敌国。由于某些原因,这10支军队必须分开同时进攻,他们任何一支单独进攻都毫无胜算,除非至少6支军队同时进攻。这些军队依靠通信兵相互通信来协商进攻意向和进攻时间。困扰这些将军的问题是,他们不确定他们当中是否有叛徒,因为叛徒可能擅自变更进攻意向或者进攻时间。他们能否找到一种分布式的协议让他们能够远程协商从而赢取战斗?
在这个简化的问题中,我们只考虑将军总数n=3,叛徒数m=1的情况。我们希望实现以下规则:
1. 如果指挥官是诚实的,那么诚实的将军必须听从指挥官的命令。
2. 如果指挥官是叛徒,那么两个诚实的将军必须做出一致的决定。
然而,这个问题实际上是无解的。这是因为当将军收到“进攻”的指令时,他不能直接做出“进攻”的判定,因为指挥官可能是叛徒。于是,将军收到指令之后,它必须向另一名将军询问指挥官给另一名将军的指令。这样一来,信息的传递链条就会变得非常长,而且容易受到中间环节的影响。因此,在这个简化的场景下,我们无法保证每个节点都能得到正确的信息和一致的决策。
假设这个时候将军从指挥官那收到了“进攻”的指令,而另一名将军却告诉他“指挥官跟我说的是撤退”。这时,这位将军就会陷入一个困境:第一种可能是,指挥官是诚实的并且向两个将军都下达了“进攻”的指令,但是另一名将军是叛徒并且篡改了指挥官的命令;而另一种可能是,指挥官是叛徒并且向两个将军各下达了不同的指令。作为这位可怜的将军,他无法分别这两种情况。
这里来到了问题的重点:我们并不关心他的决定究竟是“进攻”还是“撤退”,我们关心的是,如果我们预设任何一种战术,例如:遇到上述情况时选择“进攻”(“撤退”),它能在某一种可能的时候达成目标,但是在另一种可能的时候失效。
这只是对口头协议下拜占庭将军问题的一个简单分析。关于区块链的共识问题我打算单独用一篇文章来介绍一下。算是抛砖引玉,有错误的地方还劳驾赐教。
Ethereum是以太坊网络中运行在一个个计算机网络中的软件。它确保数据以及被称为智能合约的小程序可以在没有中心协调者的情况下被所有网络中的计算机复制和处理。以太坊的愿景是创建一个无法停止、抗审查和自我维持的去中心化世界计算机。它借鉴了比特币的区块链概念:在全球范围的多个计算机上验证、储存和复制交易数据(分布式账本)。然而,以太坊在这个概念上更进一步,是在全球范围内的多个计算机上运行代码成为现实。
以太坊的目的是对脚本、竞争币和链上元协议进行整合和提高,使开发者能够创建任意基于共识可扩展、标准化、图灵完备、易于开发和协同应用(即DApp) 。从架构角度而言,DApp非常类似于传统的Web应用。在一个DApp中,它的智能逻辑运行在区块链上,客户端代码运行在特殊浏览器Mist里面。因此,以太坊技术同时分为平台(以太坊)、数字货币(以太币)和编程语言(Solidity或Ether Script)。
个人资料:
- Bilibili:UID 280658782 @落叶Fall_Leaves,主要活动平台
- 知乎:@落叶,知识分享和交流的社区
- 微博:@落叶技术日记,关注技术发展和个人成长