Telegram Channel
https://laisky.notion.site/Oracles-ethereum-org-39ad225791784191873d4791bdf164e2?pvs=4

ETH 官网这篇关于预言机(Oracle)的文档写得很好,帮我厘清了很多概念。

作为一个多年的服务端开发人员,有很多先入为主的观念,这些观念反而会误导我理解区块链的概念。比如说起分布式,直觉上就觉得会有很多节点在并行计算,会有大量的通讯开销,以及可怕的数据竞争(data race)。服务端领域有 RAFT 等协议,让你可以协调许多的节点,让其能够就数据的状态达成一致。

我们知道区块链的核心也是追求数据的一致性,而且是在拜占庭条件下的一致性(即节点可能会作恶)。但是区块链并不需要依赖网络通信来就某一数据的一致性进行反复协商,实际上每个节点都是独立的运行,按照区块链协议的设计来生成区块,同时尽可能地广播自己所生成的区块,如果自己生成的区块被广为接受成为链的一部分,那么自己就能赢得挖矿所产生的奖励。

生成区块时每个矿工都埋头干活不依赖于和其他矿工交互,而最终所有的矿工却能产生出唯一的同一个链,这其中的核心就在于确定性(deterministic)。无论是 PoS 还是 PoW,区块生成算法的核心都是确定性,确定性使得区块具有了可验证性(proof),每个矿工生成新的区块后尽可能地广播出去,其他矿工收到后可以验证这个区块是否符合规则,如果符合规则,那么就可以接受这个区块添加到自己所处于的链的头部,当遇到分叉时选取最长的链,这样就实现了最终只会有一个链的历史被广泛接受,这个链也就是最终的数据共识。(网络的交互主要在于验证,而不是生成)

区块的核心是交易记录,而智能合约则是一种根据条件自动执行的交易。我曾一度疑惑,智能合约分布式地并行运行于大量节点上,最终如何保证数据一致性?比如如何保证生成的 NFT 的 tokenID 不冲突?实际上答案就在前文所述的决定性之中,虽然运行时是并行的,但是最终被接纳的区块是串行的(serializable),所以从数据一致性的角度去考虑智能合约时,可以简单地将其理解为一个单线程的程序,根本不需要考虑数据竞争问题。

也正是因为要严格保持决定性,极大的限制了智能合约的能力,比如无法访问 off-chain 的外部的数据,因为外部数据是不确定的。对此的解决办法就是引入 Oracle。Oracle 扮演了一个 on-chain/off-chain 的桥梁,既可以将外部数据固化到链上,也可以将链上的数据推送到外部,这样就实现了智能合约与外部世界的交互。 #blockchain Oracles | ethereum.org | Notion
 
 
Telegram Channel