• 区块链真的离不开预言机吗?


    对区块链而言,外部数据是指无法由区块链的运行自身产生的数据,例如DeFi平台所需的币种间“汇率”,去中心化竞猜平台所需的结果例如美国总统选举胜者、比赛的输赢等等。而预言机正是为区块链提供外部数据的组件。

    至于为什么区块链不能主动获取外部数据而必须要通过预言机,大部分文章都把原因一笔带过成:区块链是一个封闭系统无法与外界交流,或是区块链为保持确定性所以不能主动获取外部信息。但细究起来,区块链的确定性是什么,区块链为什么要设计成封闭系统,或是如果区块链能主动获取外部信息会产生什么问题,往往难以找到满意的回答。

    接下来笔者通过回顾一笔区块链记账的过程来详细说明区块链为什么被设计成一个封闭的系统,以及什么是区块链的确定性。

     区块链记账的过程 

    以POW共识的以太坊为例,一笔交易的流程大致如图1:

    图片1:区块链的记账过程

    来源:https://view.inews.qq.com/a/20220214A07F3300

    1. 用户在本地客户端(例如Metamask)发起一笔交易;

    2. 使用这个账户的私钥这笔交易进行签名,以证明交易是由账户所有人授权发起的;

    3. 交易被上传到区块链网络的一个节点,我们称其为本地节点(图中为向Metamaske提供服务的以太坊节点),本地节点校验这笔交易的签名确保交易是由正确的账户地址发起;

    4. 交易由本地节点向相邻节点广播并最终传遍整个网络,此时可在浏览器上(例如etherscan.io)查到交易处于等待确认(pending)的状态;

    5. 在广播的过程中,其他矿工节点在收到该笔交易的广播后,同样也会验证交易的签名然后把交易放入交易池(Mempool)。网络中不是所有节点都是矿工节点(正式名称为全节点,他们保留了区块链的全部数据,包括区块头和区块体的数据),也有非矿工节点(例如只保留区块头信息和部分状态数据的轻节点),下文所提到的节点都是全节点;

    6. 矿工节点选出交易池中的交易打包在区块中,并开始做工作量证明(POW)。当其中一个矿工终于解出了POW难题,它所打包的区块就成为了候补区块(图中Block n+1),该矿工节点更新自己的区块链账本信息将候补区块加入链上。同时,该矿工会向像第5步一样在网络中广播这个区块;

    7. 其他矿工收到广播后验证该区块,并同步各自本地区块链账本(像6中的出块矿工一样把Block n+1 加入链上)。在这一过程中,其他矿工会重新执行一遍区块里的交易和智能合约,并将执行结果记录到Merkle Trie中,之后会与记账矿工广播出来的区块作比较,如果执行结果有差异则根节点哈希也会不同,导致区块不能通过验证。简单讲,其他矿工会验证交易和智能合约的执行结果是否一致,如果不一致将无法确认该笔交易并拒绝该区块加入本地账本。等网络中足够数量的矿工验证结束之后,该候补区块正式上链成为有效区块(暂不考虑分叉回滚的情况)。这时的交易结果可以在etherscan.io等浏览器上查到为确认状态;

    8. 最后,该笔交易相关的状态更新返回给本地客户端,交易正式完成并得到确认。

    其中第1,2步是可以不用连网的,比如用硬件钱包的时候就不需要连网。从第3步开始才连入区块链网络。第3,4,5步都不涉及到区块链账本的确认(账本共识,详情参阅《从区块链到DAG(一)--区块链的账本结构和共识机制》)即所谓的上链,从第6步开始交易内容才会上链。

     节点间互不信任与外部数据的纠葛 

    从上面的交易过程可以发现去中心化系统的一个特点:网络中的节点相互间是不信任的,因此当任一节点接收到其他节点传来的交易或区块广播时,该节点都会重新对交易的签名进行验证才会将其加入交易池,或是对区块中的每笔交易验算无误后才会将其同步到自己的账本(链)上。

    至此我们已经能看出区块链被设计成封闭的无法主动获取外部数据的端倪。如果区块链可以获取外部数据,那每一次验证矿工都必须重新获取外部数据。而外部数据可能时刻在变化,无法保证矿工获得相同数据,也就无法验证区块中的交易。这意味着节点将无法就区块链的状态(state)达成一致,共识机制土崩瓦解,记账无法进行下去。

    *状态是指在任何时间点有关系统的信息。在以太坊中,特定时刻的账户余额、智能合约等储存在Merkle Trie中的储蓄值统称为“状态”。这些储蓄值的变化就叫状态转化,这种变化会反映在整个网络中。

    举个例子,甲用1个ETH向乙换取USDT,记账矿工调用智能合约读取一个外部的汇率为1:1000,据此甲向乙转账1ETH,乙向甲转账1000USDT,而记账矿工将该笔交易记录进区块并广播。稍后等其他矿工收到广播并验证这笔交易时,又需要重新调用合约读取汇率。而此时读取到的汇率可能已经是1:900了,据此其他矿工的验证将会得出与记账矿工的不同结果:即甲应向乙转账1ETH,而乙应向甲转账900USDT。此时,其他矿工将无法对该区块做出确认。甚至该区块将永远无法得到确认,因为汇率是随时变化的。

     长期存在的矿工验证 

    可能会有人建议读取外部数据时限定只读取已经既定的数据(例如只能读取昨天的汇率),这样就不会出现因为验算的时间差异而导致不同节点读取数据不一致的情况。乍一看这好像有道理,但实际上是不可行的。因为提供数据的外部数据源可能被修改、被黑客攻击,也可能供应商倒闭关掉了数据源。

    因此,尽管当时矿工获取的外部数据一致能够使得区块得到确认,但当将来需要重现链时,依就无法保证每个节点执行合约时能读取到一致的外部数据。换言之,假如要矿工需要重现整个链的交易,他并不会信任网络现有的区块链账本并直接下载使用,而是会自己重新计算并执行网络中的交易和智能合约,并且会确认最后重现出来的所有的交易记录都要和网络中链的历史完全一致,重现的链的状态也要和网络中链的状态一致,否则“不一致”会导致区块链网络共识机制的崩溃。这就好像阅卷老师在批改试卷时,他不会下载一份标准答案判卷,而是在拿到试卷后自己把试卷上的题目计算一遍作为标准答案,再与考生的答案比较。

    常见的需要重现交易的验证场景有以下几种:

    • 当一个新节点加入网络后,它需要处理链上的所有交易(把所有交易再重新执行)以验证这条链并计算当前的状态。最终新节点中链的状态会和其他节点的一致。

    • 当网络中的一些节点掉线了又重新接入网时,这些节点需要重新执行验证断网时新产生的交易,然后保持和其他节点中链的状态一致。

    • POW中矿工(POS中验证人)打包好区块后向全网广播,其他矿工需要验证,重新执行区块中的交易。换句话说在出块矿工先更新链的状态后,其他矿工也跟进更新,并且最终当所有矿工完成更新后储存的链状态都保持一致。

    这个如何保持各节点储存链的历史交易和链的状态一致的准则就是共识机制。去中心化系统正是用共识机制解决了信任难题。最典型的就是比特币最长链共识,其他的还有以太坊的GHOST共识等,具体内容可参考《从区块链到DAG(一)—区块链的账本结构和共识机制》

     确定性和封闭系统的解答 

    在对区块链的特点和工作原理进行了仔细的剖析之后,现在可以回答开头提出的问题了:

    区块链的确定性是指区块链上的交易可以随时随地按顺序被重新执行也能得到完全一致的结果,区块链也能处于相同的状态。设计为有确定性的区块链外在表现成一个封闭的系统。

    确定性其实是对信任难题的妥协。我们生活中常见的记录系统都是中心化的,比如银行、网站服务器等。系统中的所有记录都有一个权威中心来确认,其他人只要信任这个权威从它这直接下载就可以了。但在去中心化系统中,由于没有能信任的权威中心,每个节点只会信任自己的数据而不会信任其他节点的。也正因如此,在去中心化的区块链中,交易需要被反复验证。而与之相应的,区块链在设计之初就需要保证链上每一笔交易要能经得起验证。什么叫经得起验证?那便是确定性。区块链只能被设计成确定性的,才能保证共识机制不会被瓦解。

    外部传给区块链的数据有可能导致不同节点间的交易数据不一致的。A节点记账的时候,和B节点验证的时候,得到的交易结果不一致就无法达成共识。这会造成整个区块链账本体系的崩坏。区块链的基础——共识机制在设计之初就天然地排斥出现这种不一致的可能性。这便是区块链确定性的由来,因此区块链被设计成了无法主动获取外界信息的封闭系统。区块链被设计成确定性(determinism)的,这是区块链天然自带的属性。如果去掉了这个属性,区块链将不复存在。

    但这并不意味着区块链就无法获取外部信息了,只不过需要借用预言机这一媒介来完成。下篇文章会着重介绍预言机是怎么把外部信息传递入区块链的。

     区块链能否脱离预言机 

    目前尚没有号称能脱离预言机的区块链项目出现。当前区块链的确定性可以看作是“结果正义”,即所有矿工只有在得到相同验算结果时才能达成共识。或许未来新的共识机制会被设计出来,不再追求“结果正义”的确定性,而是“程序正义”的确定性。在“程序正义”下,矿工不再强求通过验证得到相同结果,而是只需要验证所有交易或智能合约都按照恰当的流程被执行即可,这样或许可以规避外部数据不确定所带来的问题。只是到时候区块链是否还能保持“区块”和“链”的结构就不得而知了。

    ————  e n d ————

    历史文章

    参考文献

    [1] 百度百科 预言机:https://baike.baidu.com/item/%E9%A2%84%E8%A8%80%E6%9C%BA/22787297?fr=aladdin

    [2] 人人都可以是科学家:教你用科学家的方法抢购NFT:https://view.inews.qq.com/a/20220214A07F3300

    [3] Life Cycle of an Ethereum Transaction:https://medium.com/blockchannel/life-cycle-of-an-ethereum-transaction-e5c66bae0f6e

    [4] Why can't contracts make API calls?:https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls

    [5] The Journey of an Ethereum Transaction:https://mycelium.xyz/research/the-journey-of-an-ethereum-transaction/

    [6] Satoshi Nakamoto, Bitcoin: A Peer-to-Peer Electronic Cash System:https://bitcoin.org/en/bitcoin-paper

    [7] What number of confirmations is considered secure in Ethereum?:https://ethereum.stackexchange.com/questions/319/what-number-of-confirmations-is-considered-secure-in-ethereum

    [8] How should I handle blockchain forks in my DApp?:https://ethereum.stackexchange.com/questions/183/how-should-i-handle-blockchain-forks-in-my-dapp/203#203

    [9] Who will execute the smart contract for us?:https://ethereum.stackexchange.com/questions/90828/who-will-execute-the-smart-contract-for-us

    [10] What Is a Blockchain Oracle?:https://betterprogramming.pub/what-is-a-blockchain-oracle-f5ccab8dbd72

    [11] If all nodes execute smart contracts, why do only block creators get the gas fee?:https://ethereum.stackexchange.com/questions/15114/if-all-nodes-execute-smart-contracts-why-do-only-block-creators-get-the-gas-fee

    [12]Ethereum:https://en.wikipedia.org/wiki/Ethereum

    [13]以太坊虚拟机(EVM)简介:https://baijiahao.baidu.com/s?id=1729349414370642195&wfr=spider&for=pc

     希望大家可以关注微信公众号更加方便交流。公众号的文章也会率先更新~

     

  • 相关阅读:
    Qt 实现软件启动界面动画
    运行软件找不到mfc140u.dll怎么解决,mfc140u.dll是什么文件
    (附源码)计算机毕业设计SSM基于的仓库管理系统
    top命令 – 实时显示系统运行状态
    【C语言】IO流(文件操作)- scanf / printf没那么简单!
    机器学习笔记 十四:k-近邻算法(kNN)的实现
    netsh interface portproxy端口转发,从本地端口到本地端口不起作用的解决办法
    Elasticsearch - What‘s new in 8.3
    【Code Style】CodeStyle template XML file for JAVA‘s IDE - Eclipse
    移动端学习:实现App中的下载功能,在手机接管文件系统
  • 原文地址:https://blog.csdn.net/NewBlockChain/article/details/125448032