国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何在以太坊上構建GraphQL API

區塊鏈
過去,開發人員通過構建自己的集中式索引服務器從區塊鏈中提取數據,將數據存儲在數據庫中,并通過API進行公開。這需要大量的工程和硬件資源,并且破壞了分散化所需的重要安全性。

 [[397787]]

本文轉載自微信公眾號「區塊鏈研究實驗室」,作者鏈三豐。轉載本文請聯系區塊鏈研究實驗室公眾號。

過去,開發人員通過構建自己的集中式索引服務器從區塊鏈中提取數據,將數據存儲在數據庫中,并通過API進行公開。這需要大量的工程和硬件資源,并且破壞了分散化所需的重要安全性。

本文將向大家介紹如何在去中心化Web基礎架構-區塊鏈數據上輕松部署API。

分散Web基礎架構

分布式互聯網的構想和發展方向通常稱為Web3,Web3通過以下附加功能增強了我們今天所知道的互聯網:

  • 去中心化
  • 可驗證的
  • 不信任
  • 自我管理

為了實現分散化,協議定義了網絡,這些網絡提供了一系列數字服務,例如計算,存儲,帶寬,身份以及其他沒有中介的Web基礎結構。這些協議通常分布在多個節點(服務器)上,使大部分希望成為網絡并提供服務的任何人都能參與。

在圖上建立

在本文中,我們還將研究一種這樣的協議Graph,以及如何使用以太坊區塊鏈中存儲的數據來構建和部署我們自己的GraphQL API。

Graph是一個索引協議,用于查詢以太坊等區塊鏈和IPFS等網絡,任何人都可以構建和發布稱為子圖的開放API,從而使數據易于訪問。

子圖定義了您希望通過GraphQL API提供的數據,數據源和數據訪問模式。作為一個開發人員可以選擇使用一個子已經部署的其他開發人員,或者定義和部署自己的子圖,并使用它。

子圖由幾個主要部分組成:

1. GraphQL模式

GraphQL模式定義您要保存和查詢的數據類型/實體,您還可以在架構中定義諸如關系和全文搜索功能之類的配置。

2.子圖清單(yaml配置)

清單定義了子圖索引的智能合約,它們的ABI,這些合約中要注意的事件以及如何將事件數據映射到Graph Node存儲并允許查詢的實體。

3. AssemblyScript映射

AssemblyScript映射使您可以保存要使用架構中定義的實體類型建立索引的數據;該圖表CLI還使用子圖的模式的組合與智能合約的ABI一起產生AssemblyScript類型。

開始建造

現在我們對Graph及其工作原理有了很好的了解,讓我們開始編寫一些代碼。

在本教程中,我們將構建一個子圖,用于從Zora智能合約查詢NTF數據,實現用于獲取NFT及其所有者的查詢,并在它們之間建立關系。

先決條件:

為了在本教程中取得成功,您應該在計算機上安裝Node.js,我建議您使用NVM或FNM管理Node.js的版本。

在圖資源管理器中創建圖項目

首先,打開Graph Explorer,然后登錄或創建一個新帳戶。接下來,轉到儀表板,然后單擊“添加子圖”以創建一個新的子圖。

使用以下屬性配置子圖:

  1. 子圖名稱-Zoranft子圖
  2. 字幕-用于查詢NFT的子圖
  3. 可選-填寫說明和GITHUB URL屬性

使用Graph CLI初始化新的子圖

接下來,安裝Graph CLI:

  1. $ npm install -g @graphprotocol/graph-cli 
  2. or 
  3. $ yarn global add @graphprotocol/graph-cli 

安裝Graph CLI后,您可以使用Graph CLIinit命令初始化一個新的子圖。

兩種方法:

1 從示例子圖中

  1. $ graph init --from-example <GITHUB_USERNAME>/<SUBGRAPH_NAME> [<DIRECTORY>] 

2 來自現有的智能合約

如果您已經將智能合約部署到以太坊主網或測試網之一,則從該合約初始化新的子圖是啟動和運行的簡便方法。

  1. $ graph init --from-contract <CONTRACT_ADDRESS> \ 
  2.   [--network <ETHEREUM_NETWORK>] \ 
  3.   [--abi <FILE>] \ 
  4.   <GITHUB_USER>/<SUBGRAPH_NAME> [<DIRECTORY>] 

在我們的例子中,我們將使用Zora令牌合約,因此我們可以通過使用--from-contract標志傳遞合約地址來從該合約地址進行初始化:

  1. $ graph init --from-contract 0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7 --network mainnet  \ 
  2. --contract-name Token --index-events 
  3. ? Subgraph name › your-username/Zoranftsubgraph 
  4. ? Directory to create the subgraph in › Zoranftsubgraph 
  5. ? Ethereum network › Mainnet 
  6. ? Contract address › 0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7 
  7. ? Contract Name · Token 

此命令將根據作為參數傳入的合同地址生成一個基本子圖--from-contract。通過使用此合同地址,CLI將在項目中初始化一些內容以幫助您入門。

子圖的主要配置和定義位于subgraph.yaml文件中,子圖代碼庫由幾個文件組成:

  • subgraph.yaml:包含子圖清單的YAML文件。
  • schema.graphql:一個GraphQL架構,用于定義為子圖存儲的數據以及如何通過GraphQL查詢數據。
  • AssemblyScript映射:從以太坊中的事件數據轉換為架構中定義的實體的AssemblyScript代碼。

我們將使用的subgraph.yaml中的條目是:

  • description(可選):子圖是什么的可讀描述,子圖部署到Hosted Service時,圖資源管理器將顯示此描述。
  • repository(可選):可在其中找到子圖清單的存儲庫的URL。
  • dataSources.source:子圖來源的智能合約的地址,以及要使用的智能合約的abi。
  • dataSources.source.startBlock(可選):數據源從其開始索引的塊的編號。
  • dataSources.mapping.entities:數據源寫入存儲的實體,每個實體的架構都在schema.graphql文件中定義。
  • dataSources.mapping.abis:一個或多個命名ABI文件,用于源合同以及您在映射中與之交互的任何其他智能合同。
  • dataSources.mapping.eventHandlers:列出該子圖所響應的智能合約事件以及映射中的處理程序(示例中為./src/mapping.ts),這些處理程序將這些事件轉換為商店中的實體。

定義實體

使用The Graph,您可以在schema.graphql中定義實體類型,并且Graph Node將生成用于查詢該實體類型的單個實例和集合的頂級字段。每種應為實體的類型都必須使用@entity指令進行注釋。

我們將要建立索引的實體/數據是Token和User。這樣,我們可以索引用戶以及用戶自己創建的令牌。

為此,請使用以下代碼更新schema.graphql:

  1. type Token @entity { 
  2.   id: ID! 
  3.   tokenID: BigInt
  4.   contentURI: String! 
  5.   metadataURI: String! 
  6.   creator: User
  7.   owner: User
  8. type User @entity { 
  9.   id: ID! 
  10.   tokens: [Token!]! @derivedFrom(field: "owner"
  11.   created: [Token!]! @derivedFrom(field: "creator"

通過@derivedFrom(來自文檔)通過“關系”

可以通過@derivedFrom字段在實體上定義反向查找。這會在實體上創建一個虛擬字段,可以查詢該虛擬字段,但無法通過映射API手動設置。

相反,它是從另一個實體上定義的關系派生的。對于此類關系,存儲關系的兩邊幾乎沒有意義,并且僅存儲一側而派生另一側時,索引和查詢性能都將更好。

現在,我們已經為我們的應用程序創建了GraphQL模式,我們可以在本地生成實體,以開始在mappingsCLI所創建的實體中使用:

  1. graph codegen 

為了使工作中的智能合約,事件和實體變得容易且類型安全,Graph CLI從子圖的GraphQL模式和數據源中包含的合約ABI的組合中生成AssemblyScript類型。

使用實體和映射更新子圖

現在,我們可以配置subgraph.yaml以使用我們剛剛創建的實體并配置它們的映射。

為此,請先dataSources.mapping.entities使用User和Token實體更新字段:

  1. entities: 
  2.   - Token 
  3.   - User 

接下來,更新,dataSources.mapping.eventHandlers使其僅包括以下兩個事件處理程序:

  1. eventHandlers: 
  2.   - event: TokenURIUpdated(indexed uint256,address,string) 
  3.     handler: handleTokenURIUpdated 
  4.   - event: Transfer(indexed address,indexed address,indexed uint256) 
  5.     handler: handleTransfer 

最后,更新配置以添加startBlock:

  1. source: 
  2.   address: "0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7" 
  3.   abi: Token 
  4.   startBlock: 11565020 

Assemblyscript映射

接下來,打開src / mappings.ts來編寫我們在子圖subgraph中定義的映射eventHandlers。

使用以下代碼更新文件:

  1. import { 
  2.   TokenURIUpdated as TokenURIUpdatedEvent, 
  3.   Transfer as TransferEvent, 
  4.   Token as TokenContract 
  5. from "../generated/Token/Token" 
  6. import { 
  7.   Token, User 
  8. from '../generated/schema' 
  9. export function handleTokenURIUpdated(event: TokenURIUpdatedEvent): void { 
  10.   let token = Token.load(event.params._tokenId.toString()); 
  11.   token.contentURI = event.params._uri; 
  12.   token.save(); 
  13. export function handleTransfer(event: TransferEvent): void { 
  14.   let token = Token.load(event.params.tokenId.toString()); 
  15.   if (!token) { 
  16.     token = new Token(event.params.tokenId.toString()); 
  17.     token.creator = event.params.to.toHexString(); 
  18.     token.tokenID = event.params.tokenId; 
  19.     let tokenContract = TokenContract.bind(event.address); 
  20.     token.contentURI = tokenContract.tokenURI(event.params.tokenId); 
  21.     token.metadataURI = tokenContract.tokenMetadataURI(event.params.tokenId); 
  22.   } 
  23.   token.owner = event.params.to.toHexString(); 
  24.   token.save(); 
  25.   let user = User.load(event.params.to.toHexString()); 
  26.   if (!user) { 
  27.     user = new User(event.params.to.toHexString()); 
  28.     user.save(); 
  29.   } 

這些映射將處理創建,傳輸或更新新令牌的事件。當這些事件觸發時,映射會將數據保存到子圖中。

運行構建

接下來,讓我們運行一個構建以確保正確配置了所有內容。為此,請運行以下build命令:

  1. $ graph build 

如果構建成功,則應該在根目錄中看到一個新的構建文件夾。

部署子圖

要進行部署,我們可以deploy使用Graph CLI運行該命令。要進行部署,您首先需要為在Graph Explorer中創建的子圖復制Access令牌:

接下來,運行以下命令:

  1. $ graph auth https://api.thegraph.com/deploy/ <ACCESS_TOKEN> 
  2. $ yarn deploy 

部署子圖后,您應該看到它顯示在您的儀表板中:

當您單擊子圖時,它應該打開Graph資源管理器:

查詢數據

現在我們位于儀表板中,我們應該能夠開始查詢數據了。運行以下查詢以獲取令牌及其元數據的列表:

  1.   tokens { 
  2.     id 
  3.     tokenID 
  4.     contentURI 
  5.     metadataURI 
  6.   } 

我們還可以配置訂單方向:

  1.   tokens( 
  2.     orderBy:id, 
  3.     orderDirection: desc 
  4.   ) { 
  5.     id 
  6.     tokenID 
  7.     contentURI 
  8.     metadataURI 
  9.   } 

或選擇跳過某些結果以實現一些基本分頁:

  1.   tokens( 
  2.     skip: 100, 
  3.     orderBy:id, 
  4.     orderDirection: desc 
  5.   ) { 
  6.     id 
  7.     tokenID 
  8.     contentURI 
  9.     metadataURI 
  10.   } 

或查詢用戶及其相關內容:

  1.   users { 
  2.     id 
  3.     tokens { 
  4.       id 
  5.       contentURI 
  6.     } 
  7.   } 

更新子圖

如果我們想要對子圖進行一些更改然后重新部署,我們應該怎么辦?假設我們要向子圖添加新功能,假設我們除了現有的查詢功能外,還想添加該功能以按創建NFT的時間戳進行排序。

為此,我們需要先向實體添加一個新createdAtTimestamp字段Token:

  1. type Token @entity { 
  2.   id: ID! 
  3.   tokenID: BigInt
  4.   contentURI: String! 
  5.   metadataURI: String! 
  6.   creator: User
  7.   owner: User
  8.   "Add new createdAtTimesamp field" 
  9.   createdAtTimestamp: BigInt

現在,我們可以重新運行代碼生成:

  1. graph codegen 

接下來,我們需要更新映射以保存此新字段:

  1. // update the handleTransfer function to add the createdAtTimestamp to the token object 
  2. export function handleTransfer(event: TransferEvent): void { 
  3.   let token = Token.load(event.params.tokenId.toString()); 
  4.   if (!token) { 
  5.     token = new Token(event.params.tokenId.toString()); 
  6.     token.creator = event.params.to.toHexString(); 
  7.     token.tokenID = event.params.tokenId; 
  8.     // Add the createdAtTimestamp to the token object 
  9.     token.createdAtTimestamp = event.block.timestamp
  10.     let tokenContract = TokenContract.bind(event.address); 
  11.     token.contentURI = tokenContract.tokenURI(event.params.tokenId); 
  12.     token.metadataURI = tokenContract.tokenMetadataURI(event.params.tokenId); 
  13.   } 
  14.   token.owner = event.params.to.toHexString(); 
  15.   token.save(); 
  16.   let user = User.load(event.params.to.toHexString()); 
  17.   if (!user) { 
  18.     user = new User(event.params.to.toHexString()); 
  19.     user.save(); 
  20.   } 

現在我們可以重新部署子圖:

  1. $ yarn deploy 

子圖重新部署后,我們現在可以按時間戳查詢以查看最近創建的NFTS:

  1.   tokens( 
  2.     orderBy:createdAtTimestamp, 
  3.     orderDirection: desc 
  4.   ) { 
  5.     id 
  6.     tokenID 
  7.     contentURI 
  8.     metadataURI 
  9.   } 
  10. }} 

 【編輯推薦】

 

責任編輯:武曉燕 來源: 區塊鏈研究實驗室
相關推薦

2023-05-05 08:00:00

2020-09-28 06:57:39

Node.jsGraphQLAPI

2021-05-13 16:13:21

區塊鏈以太坊NFT

2023-10-12 09:05:11

2021-05-02 22:19:46

以太坊比特幣加密貨幣

2020-10-27 18:45:45

GolangGraphQ開發

2022-10-18 08:00:00

2021-05-03 23:32:55

以太坊區塊鏈比特幣

2021-10-26 00:27:28

Python以太坊智能

2021-12-08 13:57:29

以太坊加密貨幣比特幣

2021-05-22 22:57:24

以太坊加密貨幣比特幣

2018-04-23 14:31:02

微服務GraphQLBFF

2020-04-23 08:55:01

LinuxGradle工具

2021-04-19 12:31:04

太坊數據QuestDB

2021-04-29 16:11:14

以太坊共識鏈驗證者

2018-06-01 09:17:52

區塊鏈以太坊

2022-02-23 23:43:15

網絡安全IT云安全

2017-02-09 09:30:18

UbuntuDokuWikiApache

2022-12-05 07:13:44

2024-01-09 09:09:45

RESTGraphQL
點贊
收藏

51CTO技術棧公眾號

欧美性video| 亚洲精品aa| 国产毛片精品国产一区二区三区| 日韩中文在线不卡| 日本美女高潮视频| 精品福利av| 日韩中文字幕在线免费观看| 免费一级淫片| 欧美一区视频在线| 色偷偷福利视频| 日韩中文欧美在线| 国产精品老女人精品视频| 四虎亚洲成人| 一级日本不卡的影视| 女人床在线观看| 99视频精品全部免费在线视频| 一区二区三区 在线观看视| 国产在线导航| 国产精品国产三级国产aⅴ入口| 日韩一二三区不卡在线视频| 精品国产一区二区三区香蕉沈先生| 亚洲人成电影在线| 国产区在线视频| 国产免费久久精品| 先锋影音网一区| 性欧美69xoxoxoxo| 欧美亚洲国产日本| 日韩有码欧美| 欧美精品一区二区蜜臀亚洲| 四虎影视精品成人| 国产精品免费网站在线观看| 精品人伦一区二区三区 | 91麻豆精品国产91久久久资源速度| 亚洲黄色a v| 麻豆成人免费电影| 国产精品精品软件视频| 少妇久久久久| 欧美日韩国产va另类| 欧美日韩精品免费观看视完整| 欧美日韩精品一区二区三区蜜桃 | 欧美日韩一本到| 免费在线观看麻豆视频| 中文字幕视频一区| 日本人体一区二区| 国产福利一区二区三区| 国产精品无码乱伦| 丝袜亚洲另类丝袜在线| 国产99在线播放| 999精品一区| 国产精品成人一区| 中文字幕精品影院| 欧美在线激情网| 精品自拍偷拍| 97超级碰在线看视频免费在线看| 日韩国产一二三区| 中文字幕欧美日韩在线| av有声小说一区二区三区| 亚洲国内精品在线| 亚洲精华液一区二区三区| 在线播放欧美女士性生活| 福利片在线看| 欧美日韩国产乱码电影| 18在线观看的| 亚洲精品成人久久久| 日本在线影院| 中文字幕在线视频日韩| 国产精品视频一区视频二区| 另类色图亚洲色图| 国产精品av网站| 国产超碰在线观看| 欧美日韩一二三四五区| 天堂√在线中文官网在线| 欧美午夜片欧美片在线观看| 三上悠亚在线观看| 午夜欧美2019年伦理| 四虎精品成人免费网站| 欧美日韩dvd在线观看| 最新黄网在线观看| 亚洲欧美一区二区精品久久久| 高清在线视频不卡| 中文字幕日韩综合av| 亚洲网址在线观看| 国产99久久久欧美黑人| 亚洲一区二区| 欧美日韩成人一区二区三区| 国产乱色国产精品免费视频| 国产自偷自偷免费一区| 亚洲黄色小说网站| 91精品国产综合久久久久久豆腐| 欧美不卡激情三级在线观看| 欧洲午夜精品| 国产精品免费在线免费 | 宅男在线国产精品| 亚洲午夜天堂| 97国产精品视频人人做人人爱| 在线日韩av| 国产理论在线播放| 欧美一区二区啪啪| av不卡一区| 四虎影院一区二区三区| 国产精品传媒在线| 男人av在线播放| 亚洲va男人天堂| 91蜜桃网址入口| 黄色网页在线免费看| 26uuu亚洲伊人春色| 国精产品一区一区三区mba视频 | 国精产品一区一区三区mba桃花| 爱爱永久免费视频| 亚洲福利在线视频| 国产精品久久久久无码av| 狠狠精品干练久久久无码中文字幕| 精品国产999| 欧美午夜网站| 精品久久免费观看| 色呦呦国产精品| 女同久久另类99精品国产| 99re6这里有精品热视频| 在线观看视频一区二区欧美日韩| 亚洲精品不卡在线观看| 亚洲视频电影| 欧美午夜精品理论片a级按摩| 欧美a一欧美| 鲁一鲁一鲁一鲁一澡| 亚洲国产精久久久久久| 午夜精品999| 国产女王在线**视频| www亚洲欧美| 美女免费视频一区二区| 91短视频版在线观看www免费| 国产激情综合五月久久| 久久久蜜臀国产一区二区| 日韩天堂在线| 热这里只有精品| 精品福利在线导航| 久久久蜜桃一区二区人| а√天堂中文在线资源bt在线| 国产精品美女免费看| 国产精品美女久久久久久2018| yy6080久久伦理一区二区| 中文精品一区二区三区| 精品盗摄一区二区三区| 久热精品在线| 色呦呦在线播放| 日本免费高清一区二区| 337p亚洲精品色噜噜噜| 国产日韩综合| 少女频道在线观看高清 | 久久久久一区二区| 欧美亚洲国产一区在线观看网站| 91久久电影| 最新中文字幕在线观看| 国产精品久久97| 亚洲一区在线播放| 国产一区二区三区四区| 伊人发布在线| 成人免费网站在线看| 婷婷开心久久网| 久久久久国产精品| 国产黄色在线| 免费在线观看91| 欧美大片一区二区三区| 日本美女视频一区二区| 色偷偷色偷偷色偷偷在线视频| 色婷婷777777仙踪林| 日韩中文理论片| 久久久精品日韩欧美| 免费日韩一区二区三区 | 26uuu亚洲| 51亚洲精品| 天天干夜夜干| 国产日韩欧美精品| 精品精品国产高清a毛片牛牛 | 超级污的网站| 成人动漫网站在线观看| 欧美视频一区二区三区| 欧美综合二区| 在线毛片观看| www.色偷偷.com| 国产精品电影网站| 欧美日韩一区二区在线观看| 免费人成网站在线观看欧美高清| 涩涩视频在线| 中文字幕无码不卡免费视频| 国产suv精品一区二区| 欧美天堂在线观看| 日本vs亚洲vs韩国一区三区二区| 不卡一二三区| 四色永久网址| 99久久综合狠狠综合久久止| 亚洲国产精品女人久久久| www国产亚洲精品久久麻豆| 欧洲grand老妇人| 羞羞视频在线免费国产| 午夜肉伦伦影院| 国产日韩在线观看av| 亚洲第一精品夜夜躁人人爽| 久久久久免费观看| 在线成人欧美| 精品国模一区二区三区欧美 |