如何在以太坊上构建graphqlapi

  • A+
所属分类:比特币钱包
摘要

雍和比特币

雍和比特币 如何在以太坊上构建graphqlapi曩昔,开发者经过构建自己的集中式索引服务器从区块链中提取数据,将数据存储在数据库中,并经过API进行揭露。这需求很多的工程和硬件资源,并破坏了涣散所需的重要安全性。本文将向您展现如安在涣散的web基础设施区块链数据上轻松布置api。散布式web基础设施散布式Internet的概念和发展方向一般称为Web3。Web3经过以下附加功用增强了咱们今日所知的互联网:分权可验证的不信任自我办理为了完成去中心化,协议界说了供给一系列数字服务的网络,如核算、存储、带宽、身份和其他不需求中介的web基础设施。这些协议一般散布在多个节点(服务器)上,因而大多数期望成为网络并供给服务的人都能够参加。以图表为基础在本文中,咱们还将研讨这样一个协议图,以及坐山观虎斗运用存储在以太坊区块链中的数据来构建和布置咱们自己的graphqlapi。Graph是一种索引协议,用于查询以太坊等区块链和IPFs等网络。任何人都能够构建和发布一个名为subgraph的敞开API,这使得数据易于拜访。子图界说要经过graphqlapi供给的数据、数据源和数据拜访形式。作为一个开发人员,您能够挑选运用另一个现已布置了其子图形的开发人员,或许界说和布置您自己的子图形并运用它。子图由几个首要部分组成1Graphql形式graphql形式界说要保存和查询的数据类/实体。您还能够在体系结构中界说联系和全文搜索功用等装备。2子图列表(yaml装备)该列表界说了子图索引的智能契约、它们的abi、这些契约中要注意的事情,以及坐山观虎斗将事情数据映射到在graph节点中存储和答应查询的实体。3程序集脚本映射Assembyscript映射使您能够保存要运用架构中界说的实体类编制索引的数据;diagramcli还运用子图形式的组合来生成assembyscript类以及智能合约的ABI。开端构建已然咱们现已很好地舆解了graph及其作业原理,那么让咱们开端编写一些代码。在本教程中,咱们将构建一个子图来查询Zora智能合约中的NTF数据,完成查询以获取NFT及其一切者,并在它们之间树立联系。前提条件:要在本教程中取得成功,您应该在核算机上装置node.js。我建议您运用NVM或FNM来办理node.js的版别。在图形资源办理器中创立图形项目首要,翻开图形资源办理器,然后登录或创立一个新帐户。接下来,转到仪表板并单击增加子图以创立新的子图。运用以下特点装备子图:子图称号-zoranft子图副标题-用于查询NFT子图可选-填写描述和GitHub URL特点运用graph cli初始化新子图接下来,装置graph cli:美元;npm公司;装置-g@graphprotocol/graph cli#;或美元;纱线;全球;增加@graphprotocol/graph指令行

装置graph cli后,能够运用graph cliinit指令初始化新的子图。有两种办法图中的1美元;图形;初始化--来自示例/[]

2.现有智能合约假如您已将智能合约布置到以太坊主网络或测验网络之一,则从合约初始化新的子图是发动和运转的简略办法。美元;图形;初始化--来自合同/[--网络]/[--abi]//[]

在咱们的示例中,咱们将运用Zora令牌契约,因而咱们能够经过运用–from contract标志传递契约地址来从契约地址进行初始化:美元;图形;初始化--来自合同;0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7-网络;主网/--合同称号;代币索引事情;子图;称号›您的用户名/Zoranftsubgraph?目录;至;创立;公司;子图;在›Zoranftsubgraph?以太坊;网络›主网;合同;地址›0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7?合同;名字·代币

此指令依据作为参数传入的协议地址,从协议生成基簿本图。经过运用此约好地址,CLI将初始化项目中的某些内容,以帮助您开端。子图的首要装备和界说在subgraph.yaml文件中。子图代码库由几个文件组成Subgraph.yaml:包含子图列表的yaml文件。架构。Graphql:一种Graphql体系结构,用于界说为子图存储的数据以及坐山观虎斗经过Graphql查询数据。程序集脚本映射:将事情数据从以太坊转换为架构中界说的实体的程序集脚本代码。咱们将运用subgraph.yaml中的条目:描述(可选):子图的可读描述。将子图布置到保管服务时,图形资源办理器将显现此描述。Repository(可选):能够在其中找到子图列表的存储库的URL。Datasources.source:子图来历的智能合约的地址,以及要运用的智能合约的ABI。Datasources.source.startblock(可选):数据源从中开端索引的块的编号。Datasources.mapping.entities:数据源写入存储的实体。每个实体的架构都在schema.grapql文件中界说。Datasources.mapping.abis:源协议的一个或多个命名ABI文件,以及在映射中与之交互的任何其他智能协议。Datasources.mapping.eventhandlers:列出子图呼应的智能协议事情以及映射中的处理程序(在示例中为./SRC/映射。TS),将这些事情转换为存储中的实体。界说实体经过该图,能够在形式中界说实体类。Grapql和graph节点生成尖端字段,用于查询该实体类的各个实例和调集。每个应该是实体的类都必须用@entity指令进行注释。咱们要索引的实体/数据是token和user。这样,咱们能够索引用户和用户创立的令牌。为此,请运用以下代码更新schema.grapql:类;代币@实体{个人信息号码:;ID!令牌ID:;BigInt!内容URI:;字符串!元数据URI:;字符串!创立者:;用户!一切者:;用户!}类;用户@实体{个人信息号码:;ID!代币:[令牌!]!@派生自(字段:;quot;一切者(quot;);已创立:[令牌!]!@派生自(字段:;quot;creatorquot;)}

经过@derivedfrom(来自文档)经过“联系”能够经过@derived from字段在实体上界说反向查找。这将在实体上创立一个虚拟字段,该字段能够查询,但不能经过映射API手动设置。相反,它派生自另一个实体上界说的联系。关于这种联系,存储联系的两头都没有什么含义,当只存储一方并派生另一方时,索引和查询的功用会更好。现在咱们现已为应用程序创立了graphql形式,咱们能够在本地生成实体,开端在mappingscli创立的实体中运用它们图形;编码基因

为了使作业中的智能合约、事情和实体变得简略和类安全,graph cli经过子图的graph QL形式和数据源中包含的合约ABI的组合生成assembyscript类。用实体和映射更新子图现在咱们能够装备子图了。Yaml运用咱们刚刚创立的实体并装备它们的映射。为此,首要用datasources.mapping.entities的用户和令牌实体更新字段实体:;令牌-用户

接下来,更新datasources.mapping.eventhandlers以仅包含以下两个事情处理程序:事情处理程序:-事情:;符号已更新(已索引);uint256,地址,字符串);经办人:;手电筒更新-事情:;搬运(索引);地址,索引;地址,索引;(第256页);经办人:;手搬运

最终,更新装备以增加startblock:材料来历:;地址:;quot;0XABEFBC9FD2F8065B4F3C237D4B59D9A97BCAC7quot;;abi:;代币;发动块:;一千一百五十六万五千零二十

程序集脚本映射接下来,翻开Src/mappings。Ts来编写咱们在子图中界说的映射事情处理程序。运用以下代码更新文件:导入{令牌更新;作为;令牌更新事情;转账;作为;搬运事情;代币;作为;代币合约};来自;quot;../generated/Token/tokenquot;导入{代币;用户};从39;../ 生成/形式#39;出口;功用;handleTokenUri更新(事情:;TokenUriUpdateEvent):无效{让;令牌=Token.load(event.params.tokenId.toString());token.contentURI=event.params.uuri;token.save();}出口;功用;把手搬运(事情:;转让方):无效{让;令牌=Token.load(event.params.tokenId.toString());假如(!代币)令牌=新建;令牌(event.params.tokenId.toString());token.creator=event.params.to.toHexString();token.tokenID=event.params.tokenId;让;代币合约TokenContract.bind(event.address);token.contentURI=tokenContract.tokenURI(event.params.tokenId);token.metadataURI=tokenContract.tokenMetadataURI(event.params.tokenId);}token.owner=event.params.to.toHexString();token.save();让;用户=User.load(event.params.to.toHexString());假如(!用户){用户=新建;用户(event.params.to.toHexString());user.save();}}

这些映射将处理创立、传输或更新新令牌的事情。当触发这些事情时,映射会将数据保存到子图中。运转生成接下来,让咱们运转一个构建以保证一切装备都正确。为此,请运转以下生成指令:美元;图形;制作

假如生成成功,您应该在根目录中看到一个新的生成文件夹。布置子图要布置,咱们能够运用deploy来运用graph cli运转指令。要布置,首要需求仿制在graph Explorer中创立的子图的拜访令牌:如何在以太坊上构建graphqlapi接下来,运转以下指令:美元;图形;授权;https://api.thegraph.com/deploy/ 美元;纱线;布置

布置子图后,您应该会看到它显现在仪表板中:如何在以太坊上构建graphqlapi单击子图时,它应翻开图形资源办理器:如何在以太坊上构建graphqlapi查询数据现在咱们在仪表板中,应该能够开端查询数据了。运转以下查询以获取令牌及其元数据的列表:{;代币{个人信息;令牌ID;内容URI;元数据URI

咱们还能够装备订单方向:{;代币;订购者:id;订单方向:;描述){个人信息;令牌ID;内容URI;元数据URI

或许挑选越过一些成果来完成一些根本的分页:{;代币;越过:;100个;订购者:id;订单方向:;描述){个人信息;令牌ID;内容URI;元数据URI

或查询用户及相关内容:{;用户{个人信息;代币{个人信息;内容URI}}}

更新子图假如咱们想对子图进行一些更改,然后从头布置它,咱们应该怎么做?假定咱们想给子图增加一个新函数。假定除了现有的查询函数之外,咱们还想增加这个函数,以便依照创立NFT的时刻戳进行排序。要做到这一点,咱们需求向实体增加一个新的created at timestamp字段符号类;代币@实体{个人信息号码:;ID!令牌ID:;BigInt!内容URI:;字符串!元数据URI:;字符串!创立者:;用户!一切者:;用户!quot;增加;新建;创立日期时刻amp字段6035;创立日期时刻戳:;比京特!}

现在咱们能够从头运转代码生成:图形;编码基因

接下来,咱们需求更新映射以保存新字段://更新;公司;手部搬运;功用;至;增加;公司;创立日期时刻戳;至;公司;代币;目标导出;功用;把手搬运(事情:;转让方):无效{让;令牌=Token.load(event.params.tokenId.toString());假如(!代币)令牌=新建;令牌(event.params.tokenId.toString());token.creator=event.params.to.toHexString();token.tokenID=event.params.tokenId;//增加;公司;创立日期时刻戳;至;公司;代币;目标;token.createdAtTimestamp=event.block.timestamp;让;代币合约TokenContract.bind(event.address);token.contentURI=tokenContract.tokenURI(event.params.tokenId);token.metadataURI=tokenContract.tokenMetadataURI(event.params.tokenId);}token.owner=event.params.to.toHexString();token.save();让;用户=User.load(event.params.to.toHexString());假如(!用户){用户=新建;用户(event.params.to.toHexString());user.save();}}

现在咱们能够从头布置子图:美元;纱线;布置

从头布置子图后,咱们现在能够按时刻戳查询最近创立的NFT:{;代币;orderBy:createdAtTimestamp,订单方向:;描述){个人信息;令牌ID;内容URI;元数据URI

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
头像

发表评论取消回复

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:0   其中:访客  0   博主  0

    • 头像 BITCOIN86 9

      比如Visa推出基于区块链技术的 Visa B2B Connect,它能为机构提供一种费用更低、