本文转载自The Graph中文,原标题《深入了解The Graph》,原文作者Brandon Ramirez。
去年七月(深链财经注:2018年7月)首次向外界介绍The Graph时,我们分享了为Web3开发去中心化索引协议的愿景。此后团队一直兢兢业业,今天我非常高兴能够详细分享第一版The Graph去中心化网络的方方面面。
The Graph网络是Web3的核心基础架构——为去中心化应用提供用户级体验的必要组件。
在阅读本文之前,我们假设读者对The Graph具备基础的了解。如果您是第一次听说The Graph,那么我们官网的公告博客、文档或来自社区的几篇佳作都是很好的入门材料。
全栈去中心化 Full-Stack Decentralization
The Graph的使命是赋能完全由公共基础架构所驱动的互联网应用。
全栈去中心化让应用具备应对商业失败和寻租的能力,同时带来前所未有的互操作性。用户和开发者都清楚知晓他们投入时间和资金打造的软件不会凭空消失。
为了实现完全去中心化应用(dApp)的愿景,有一点非常关键,就是我们要进行一个范式转移,从为应用正常运行所需的持续存储、计算和其他服务付费的业务模式,转变成用户直接为去中心化服务提供商网络付费。
目前大多数“去中心化”应用只是在堆栈的最底层(即区块链)采用这种模型,其中用户对应用状态进行修改都需要付费。而堆栈的其余部分仍然由中心化业务运营,并且受制于任意故障和寻租问题。
The Graph网络简介
The Graph网络对Web3的查询层和API层进行了去中心化,消除了dApp开发者目前面临的取舍难题:到底是开发一个高性能应用,还是开发一个完全去中心化的应用。
目前,开发者可以在自己的基础架构上运行一个Graph节点,也可以在我们的托管服务上开发一个。其中,开发者构建和部署从Web3数据源提取数据并为其编制索引的子图。目前已经有许多领先的以太坊项目创建了子图,包括Uniswap、ENS、DAOstack、Synthetix和Moloch等。在The Graph网络中,任何索引器都能够通过抵押Graph代币(GRT)参与到网络中,并在提供查询服务的过程赚取费用和通货膨胀奖励。
用户则按照使用次数进行付费,使用日益增长的索引器,此做法证明了供需规律也适用于该协议提供的服务。
协议角色Protocol Roles
与The Graph系统交互的角色有好几种,他们的恰当参与保证了协议的正常运行,同时也有激励驱动他们这样做。
用户 Consumer
用户向索引器支付查询费用。他们通常是终端用户,但也可能是集成The Graph的网络服务或中间件。
索引器 Indexer
索引器是The Graph的运行节点。其动力是赚取财务奖励。
策展人 Curator
策展人使用GRT代币来指明哪些子图值得索引。他们通常是开发者,也可能是支持他们在使用服务的终端用户,或者纯粹出于经济动机的一种角色。
委托人 Delegator
委托人向某个Indexer质押GRT代币,赚取一部分通货膨胀奖励和费用,他们无需亲自运行一个Graph节点。这类角色主要出于经济动机。
渔夫 Fisherman
渔夫们时刻检查查询响应是否正确,以此保护网络。渔夫动机是利他的,因此The Graph将率先为网络提供渔夫服务。
仲裁员 Arbitrator
在争议解决期间,仲裁员决定是否对索引器进行罚没。他们可能出于经济或利他动机。
用例
开发者 Developers
对开发者来说构建子图的API与使用本地或托管Graph节点的API基本相同。
最大的不同之处在于开发者部署子图的方式。他们不选择将子图部署在本地或托管的Graph节点上,而是部署到以太坊托管的注册表,然后抵押一些GRT对子图进行策展。这为索引器传递了一个信号,表明该子图也应该被索引。
终端用户 End Users
对于终端用户,主要区别是他们需要付费查询索引器的去中心化网络,而不是与有补贴的中心化API进行交互。这一点是通过他们计算机上运行的查询引擎(无论是浏览器中的插件,或者是内置在dApp中)来实现的。
查询引擎确保了用户安全地查询存储在The Graph上的大量数据,无需亲自处理计算和存储数据的工作。查询引擎还充当了交易引擎,根据使用的dApp或用户偏好,决定选择哪个索引器,需要支付多少费用等。
查询引擎为了提供良好的用户体验,它将代表用户自动对小额支付交易进行签名,而不是每笔交易都需要提示签名。我们正在与基于以太坊的多个状态通道团队进行合作,确保他们的钱包和功能满足按使用次数进行计价协议的需求(如The Graph)。同时,我们提供了一个允许dApp对用户查询进行补贴的网关。
索引器 Indexer
索引者通过质押GRT代币,运行一个Graph节点版本参与到The Graph中。
他们还希望运行一个索引器代理,自动化监控索引器资源的使用情况、设置查询价格、确定对哪些子图进行索引。索引器代理是可插入式的,并且我们希望节点运营商尝试使用自己的定价模型和策略,从而在市场上获得竞争优势。
策展人和委托人
策展人和委托人通过Graph浏览器进行策展和委托。当我们上线网络后,Graph浏览器将成为一个完全去中心化的应用,只需一个支持dApp的浏览器和一个以太坊钱包就能使用。
架构
The Graph网络包含以太坊上的智能合约,以及链下运行的各种其他服务和客户端。
查询市场Query Market
查询市场的用途与传统基于云服务应用的API类似——通过一个运行在用户设备的前端,有效提供所需的数据。其主要区别是传统的API有一个经济实体运营,用户毫无发言权;而The Graph的查询市场由去中心化索引器网络组成,它们彼此竞争,以最低的价格提供最好的服务。
The Graph网络的这种冗余意味着即使单个索引器宕机,但是只要存在查询数据的需求,就会激励其他索引器去完成这些任务。
查询市场中的交易由处理查询所需的带宽和计算资源所决定。
我们来看一下用户与查询市场交互的典型流程。
服务发现 Service Discovery
用户询问The Graph有哪些索引器提供他们感兴趣的数据。
索引器选择 Indexer Selection
用户选择他们认为最有可能以最低价格提供最好服务的索引器。
查询+限额小额付款 Query + Conditional Micropayment
用户向索引器发送查询以及限额小额支付,指明他们愿意为计算和带宽支付的费用。
响应+证明 Response + Attestation
如果索引器接受用户的出价,那么他们就会处理查询请求,返还查询结果,并证明该响应是正确的。提供了证明后,就会收到用户的限额小额付款。
这个证明的产生是确定性的,对索引器来说它也是唯一性的(用于验证目的),争议解决则由协议的其他板块负责。某个去中心化应用查询The Graph时可利用不同索引器提供的多个子图,该情况下每个被查询的子图都要经历上述流程。
Graph 代币Graph Tokens
为了支持查询市场的功能,The Graph协议引入了一种原生代币:Graph代币(GRT)。
Graph代币在协议中主要有2个用途:
索引器质押 Indexer Staking
索引器质押Graph代币,以便自身被查询市场所发现,同时在执行工作过程中提供经济安全。
策展人信号 Curator Signaling
策展人将Graph代币质押到策展市场中,预测哪些子图对网络具备价值,他们因为正确预测而获得奖励。
用户能够支付ETH或DAI进行查询。但是最终的结算将以GRT进行,以确保整个协议中使用一种通用的帐户单位。
此外,持有原生代币还能够通过通货膨胀来激励特定行为。动态调整通货膨胀货币政策的能力是工具箱中的一个强大手段。
索引器质押Indexer Staking
The Graph采用应用型代币模型,其中索引器必须质押Graph代币才能在查询市场上提供服务。该服务的功能主要包括2方面:
提供经济安全性
如果索引器做出恶意行为,则面临着GRT被罚没的风险。GRT一旦被质押后,只能经过一段解锁期才能取回,这一点为验证和解决争端提供了充足的空间。
提供一个抵抗女巫攻击的机制
某个特定子图存在虚假或低质量的索引器会降低查找优质服务商的速度。因此我们只希望发现那些利益相关的索引器。
为了确保上述机制正常运行,有一点非常重要,就是对索引器进行激励,让他们持有的GRT与他们为网络所做出的的贡献大致相当。
一个最直接的方法是根据质押的GRT,在网络中为某个索引器分配一定量的任务。但这会带来两个问题:首先它为网络可执行的工作量设定了一个任意上限;其次,该方式几乎无法进行扩展,因为它要求所有工作都在链上进行集中协调。
0x团队首次提出了一种更好的方法,它对协议中的所有交易收取一定的协议费用,然后根据参与者的质押比例和网络收入的比例,利用Cobb-Douglas生产函数重新向参与者分配这些费用。
在我们的体系中,索引器i在某段时间获得的收益Yi为:
我推荐您阅读Research on Protocol Fees and Liquidity Incentives by Peter Zeitz (2019)这篇论文了解更多内容——但我们发现一点很有趣的是,在平衡状态下,一个理性决策者能够根据生产公式,用两个输入算出其花费的稳定的大致比例。在我们的情况中,也就是租用或持有GRT的成本与运行一个Graph节点涉及的运营费用,正是这一点决定了一个索引器接到更多任务,从而赚取更多的协议费用。
我们希望所有理性的索引器平衡状态下能作出相应的预算决策,因此我们期望索引器质押一定比例的GRT,相当于他们在网络中的任务比例。
该做法的好处在于,协议不需要强制要求它们质押特定比例的代币,索引器会从最符合自身的经济利益的角度作出决策。
策展信号Curator Signaling
消费者要查询某个子图的话,这个子图必须先建立索引——该过程可能需要几个小时甚至几天。如果索引器盲目猜测应该在哪些子图建立索引,从而赚取查询费,那么市场就非常低效。
策展人信号是指将GRT质押到某个子图的联合曲线,从而为索引器指明该子图应当被索引的过程。
索引器信任这些信号,因为策展人将GRT质押到联合曲线,为各个子图创建策展信号,从而在未来从该子图赚取部分查询费用。出于个人利益,理性的策展人应当为子图质押GRT创建信号,他们期望从中获取费用。
在联合曲线(一种价格由函数所决定的算法做市商)中,策展信号越强,GRT和策展的信号之间的汇率就越高。因此,成功的策展人如果认为未来策展费的价格已经回归价值,便可以立即获利。同样,如果他们认为市场对策展信号的价格定价过高,他们可以马上把GRT提现出来。
这种动态变化意味着对子图发出的GRT信号应当提供一个持续且有价值的市场信号,它随着市场对某个子图上的未来查询量而改变。
索引器通胀奖励Indexer Inflation Reward
将索引器质押以及策展人信号联系起来的另一种机制是索引器膨胀奖励。
该奖励的目的是激励索引器为还没有具有大量查询量的子图建立索引。该做法有助于解决新子图的启动问题,它们在早期可能没有预先存在的需求来吸引索引器。
它的原理是根据子图占总策展信号的比例,对网络中的每个子图进行总网络膨胀奖励分配。相对应的,该部分分配给所有进行质押的索引器,数量按照它们贡献的质押比例。
在数学上,索引器i的索引器通胀奖励为:
目前对通货膨胀率进行动态设置是一个有待探索的领域,但它可能会很低,为个位数。
该机制为索引器对策展人信号提供了额外的激励,让策展一种有意义的活动。
从长远来看,我们希望理性的索引器将GRT质押到子图上,他们从中获得通货膨胀奖励和查询费用。但是在网络启动早期,有些索引器存在着只进行质押但实际上未在任何子图上进行索引和服务查询的动机。
因此,在启动阶段会有一个协议治理设置的索引器监控服务。如果发现某个索引器质押到某个子图但不提供查询功能,那么监控服务有权将该索引器加到黑名单中。
由于存在着其他非恶意原因会导致无法提供服务,因此索引器被列入黑名单的唯一惩罚是取消获得通货膨胀奖励的资格,直到从黑名单中移除。被列入黑名单不会对质押的代币进行罚没。
Graph浏览器以及Graph域名服务 Graph Explorer and Graph Name Service
当涉及到有价值的子图时,为索引器策展子图才刚刚开始。我们还希望为开发人员展示有价值的子图。
这是The Graph的核心价值主张之一:帮助开发人员找到有用的可开发数据,让他们轻易将各种基础协议和去中心化数据源的数据整合到某一个应用中。
开发者目前可以通过导航到Graph浏览器来做到:
在Graph网络中,Graph浏览器是一个基于子图顶层的dApp,其中子图能够对Graph协议的智能合约(元数据,我知道!)进行索引,包括Graph域名服务(GNS,一个子图的链上注册表)。
子图是由子图清单定义的,该清单存储在IPFS上,不可篡改。不可篡改特性对于具有确定性和可复制性的查询进行验证和解决争端非常重要。GNS允许团队为子图添加一个名称,因此它的角色很重要,然后用户可以使用该名称指向连续、无法篡改的子图“版本”。
这种人性化的名称以及GNS中存储的其他元数据,让Graph浏览器的用户更好地理解子图的目标和可能的用途,而字母数字字符和已编译WASM字节码的随机字符串则无法做到这一点。
在Graph网络中,发现有用的子图更加重要,因为我们会调整子图的组成。与单纯支持dApp在多个单独的子图上构建不同,子图组合还能引入全新的子图,让它们直接引用现有子图中的实体。
让多个dApp和其他子图能重复使用相同的子图是Graph具备的核心效率之一。我们来对比一下现状,目前每个新的应用都会部署自己的数据库和API 服务器 ,但他们通常没有得到充分利用。
限额小额付款Conditional Micropayments
我们的支付层旨尽可能最小化消费者与索引器之间的信任。付款渠道是一项针对可扩展、链下、最小化信任付款而开发的技术。它涉及到交易双方,他们将资金锁定到链上托管,其中资金只能在它们之间进行链下的交易,除非提出从托管中提现资金的链上交易。
传统的支付渠道通常强调安全地在链下发送小额付款,而不考虑服务或商品实际上是否已经收到。
The Graph在一些数字商品或外包计算微支付的原子交换方面已经取得了一些成果,我们把该架构称为波浪锁(WAVE Lock)。波浪代表了任务、证明、验证和到期时间,其总体设计如下:
任务 Work
用户发送锁定的小额付款,同时指明需要执行的工作。该项工作即为小额付款的锁。
证明 Attestation
服务提供商按照用户请求,返还数字商品或服务以及已正确完成任务的签名证明。
验证 Verification
使用某种方法对上述签名证明进行验证。如果无法正确执行任务,可能会存在一些惩罚(如罚没)。
到期时间 Expiration
服务提供商必须在小额付款锁定到期之前收到用户收据确认,或者在链上提交证明,来获取他们的小额付款。
在付款渠道上进行锁定并非新鲜事,Lightning和Raiden的论文都探讨了通过哈希原象对小额支付进行解锁。该方法在多hop小额支付中特别有用,其中每个hop都用同一个哈希值锁定,通过一个原象值解锁,该数值会在输入到指定的哈希函数时生成。
虽然我们可以推出自己专门设计嵌入锁定机制的付款通道方案,但目前使用状态通道是最实际的。
我们可以将状态通道看成支付通道,将以太坊等智能合约区块链看成比特币。他们可以处理简单的支付场景,也可以编码更复杂的状态切换,同时保持着支付通道的可扩展性和安全性。
支付和状态通道的共同点在于,它们的基本形式是在预先认识的两个参与方之间进行价值交换或状态更新。在上文提到的多hop小额付款中,任何两个参与者之间进行支付都需要在多个其他参与者之间形成一个支付通道链,将两个原始参与方连接起来。
目前有许多不错的项目正在处理不同形式的Graph遍历,为任意两个参与者方提供小额付款。为简单起见,Graph网络最初会使用轴辐式(hub and spoke)的结构。这意味着如果要用The Graph,用户需要通过状态通道轴在链上开启一个状态通道,该通道使用用户选择的稳定代币或ETH。同时索引器也要在轴开通一个状态通道来接收GRT。
状态通道轴需要质押GRT并设置付款面额与GRT之间的汇率,让所有小额付款都以同一单位结算。
验证Verification
为了确保波浪锁的构造和索引器质押发挥效果,必须要有一个有效的验证机制,该机制能够重现索引器执行的任务、识别故障并惩罚恶意的索引器。
在Graph网络的第一阶段,这一点通过链上争议解决流程来处理,最终结果由仲裁院决定。
渔夫提出争议、保证金,以及由索引器签署的证明。如果发现索引器证明了错误的查询响应,则渔夫将获得一部分罚没金额作为奖励。相反,如果争议不成功,渔夫将会失去保证金。
有一点很重要,就是渔夫的奖励必须低于罚没金额。否则,恶意索引器可能(自己举报自己)大摇大摆绕过解冻期,或者避免被其他人罚没。
从长远来看,随着网络变得更加可靠,我们预期对活跃渔夫的奖励将逐渐降低到接近零。因此即使存在着渔夫的奖励,我们也认为该角色受到利他动机的激励。
因此The Graph最初有一个渔夫服务,消费者可以在上面发布证明,同时我们将负责验证查询响应并在链上提交争议。当然任何希望的人也可以扮演该角色。
此外,协议治理会在网络初期设置一个仲裁服务,它将充当争端解决中的唯一仲裁者。这能够让我们在软件漏洞、索引器丢失区块链事件或其他可能导致严重攻击的偶然因素而导致错误查询时做出判断。
最终,随着软件的成熟,索引器会逐渐发展,能够操作专有技术避免此类错误。
未来的工作Future Work
The Graph网络未来的规划包括探索新的市场机制以及对现有机制进行参数化,让查询市场更加动态和高效。后者将涉及对现有机制的设计进行基于代理的动态模拟,以及主网启动后的分析。
区块链的智能合约通常是支持升级的,因此The Graph协议在启动后可以进行持续迭代。
从长远来看,我们希望通过依靠经过验证的数据结构、共识算法和加密证明最终去掉渔夫和仲裁员两种角色。The Graph团队将持续对该领域进行探索,做到高效执行该操作,同时我们在接下来会对此进行更多介绍。