区块链技术博客
www.b2bchain.cn

The Graph入门教程:如何索引合约事件求职学习资料

本文介绍了The Graph入门教程:如何索引合约事件求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

编写智能的合约时,通常状态的变化是通过触发一个事件来表达,The Graph则是捕捉区块链事件并提供一个查询事件的GraphQL接口,让我们可以方便的跟踪数据的变化。 实际上很多 DEFI 协议及都是The Graph来基于查询数据。

这篇TheGraph教程在官方的教程基础上,进行了一些补充扩展主要包含以下内容:

  1. 在Ropsten部署一个合约,并调用触发事件。
  2. 创建定义数据索引的Subgraph。
  3. 部署Subgraph到TheGraph,实现数据索引。
  4. 在前端 DApp 中查询索引数据。

本教程的完整代码已上传到 GitHub: https://github.com/xilibi2003/Gameplayer

1. 合约开发与部署

克隆教程的代码,在contracts下可以看到GravatarRegistry智能合约,用户可以调用GravatarRegistry合约来创建及更新自己的昵称和头像,合约关键代码如下:

contract GravatarRegistry {   event NewGravatar(uint id, address owner, string displayName, string imageUrl);   event UpdatedGravatar(uint id, address owner, string displayName, string imageUrl);    struct Gravatar {     address owner;     string displayName;     string imageUrl;   }    Gravatar[] public gravatars;    mapping (uint => address) public gravatarToOwner;   mapping (address => uint) public ownerToGravatar;    function createGravatar(string _displayName, string _imageUrl) public {     require(ownerToGravatar[msg.sender] == 0);     uint id = gravatars.push(Gravatar(msg.sender, _displayName, _imageUrl)) - 1;      gravatarToOwner[id] = msg.sender;     ownerToGravatar[msg.sender] = id;      emit NewGravatar(id, msg.sender, _displayName, _imageUrl);   }    function updateGravatarName(string _displayName) public {     require(ownerToGravatar[msg.sender] != 0);     require(msg.sender == gravatars[ownerToGravatar[msg.sender]].owner);      uint id = ownerToGravatar[msg.sender];      gravatars[id].displayName = _displayName;     emit UpdatedGravatar(id, msg.sender, _displayName, gravatars[id].imageUrl);   } }

可以看到合约里在创建和更新时分别触发了 NewGravatarUpdatedGravatar 事件,稍后再subgraph里,将跟踪这两个事件,但是需要我们先把合约部署到网络上,这里使用以太坊测试网Ropsten(使用其他的网络也是一样的):

module.exports = {   networks: {     ropsten: {       provider: function() {         return new HDWalletProvider(           process.env.MNEMONIC,           `https://ropsten.infura.io/v3/${process.env.ROPSTEN_INFURA_API_KEY}`         )       },       network_id: '3',     },   } }

这里为了安全考虑,把助记词和 API KEY 保存在.env文件中

添加部署脚本2_deploy_contract.js:

const GravatarRegistry = artifacts.require('./GravatarRegistry.sol')  module.exports = async function(deployer) {   await deployer.deploy(GravatarRegistry) }

添加执行交易脚本,以便触发事件3_create_gravatars.js:

const GravatarRegistry = artifacts.require('./GravatarRegistry.sol')  module.exports = async function(deployer, network, accounts) {   const registry = await GravatarRegistry.deployed()   console.log('Account address:', registry.address)   await registry.createGravatar('Carl', 'https://thegraph.com/img/team/team_04.png', {     from: accounts[0],   })  }

然后执行 truffle migrate --network ropsten 以便完成部署和执行createGravatar交易,控制台里会打印出GravatarRegistry合约部署的地址,复制这个合约地址,后面在编写subgraph需要使用到。

2. 创建定义数据索引的Subgraph

TheGraph中定义如何为数据建立索引,称为Subgraph,它包含三个组件:

  1. Manifest 清单(subgraph.yaml) – 定义配置项
  2. Schema 模式(schema.graphql) – 定义数据
  3. Mapping 映射(mapping.ts) – 定义事件到数据的转换

后面我们将逐一介绍他们的作用及如何来编写。

在TheGraph创建一个 Subgraph 空间

因为需要借助 TheGraph 的节点来完成数据的索引,因此我们需要在TheGraph网站)上创建一个Subgraph。

如果你有自己的私有链,这可以克隆Graph节点代码(https://github.com/graphprotocol/graph-node/),自己运行Graph节点来完成数据的索引。

如果没有The Graph 的账户,可以用GitHub注册。创建账户之后,进入仪表盘就可以开始通过界面创建subgraph,进入你的仪表板,并点击Add Subgraph

The Graph入门教程:如何索引合约事件

image-20210428095928210

可以为你的 subgraph 选择一个图像,定义一个名称。完成后点击保存,一个新的、未部署的subgraph将显示在仪表板上。

开发和部署subgraph

先使用Yarn或NPM在全局安装Graph CLI:

$ npm install -g @graphprotocol/graph-cli $ yarn global add @graphprotocol/graph-cli

初始化配置

使用graph init 创建一个subgraph项目:

$ graph init <GITHUB_USERNAME>/<SUBGRAPH_NAME> <DIRECTORY>
  • <GITHUB_USERNAME>是必需的,这是你的GitHub用户名
  • <SUBGRAPH_NAME>是必需的,这是你的前面创建subgraph项目的名称
  • <DIRECTORY>是可选的,它是创建subgraph的子目录的名称。

这个命令也可以加入参数 --from-example ,基于官方的示例创建项目。

“`

graph init xilibi2003/Gameplayer
✔ Subgraph name · xilibi2003/Gameplayer
✔ Directory to create the subgraph in · Gameplayer
✔ Ethereum network · ropsten
✔ Contract address · 0x8CfDDbD441Fc6ffE3c02244a6B93EF9e89FaFA4D
✖ Failed to fetch ABI from Etherscan: request to https://api-ropsten.etherscan.io/api?module=contract&action=getabi&address=0x8CfDDbD441Fc6ffE3c02244a6B93EF9e89FaFA4D failed, reason: connect ETIMEDOUT 103.240.180.117:443

编写智能的合约时,通常状态的变化是通过触发一个事件来表达,The Graph则是捕捉区块链事件并提供一个查询事件的GraphQL接口,让我们可以方便的跟踪数据的变化。 实际上很多 DEFI 协议及都是The Graph来基于查询数据。

这篇TheGraph教程在官方的教程基础上,进行了一些补充扩展主要包含以下内容:

  1. 在Ropsten部署一个合约,并调用触发事件。
  2. 创建定义数据索引的Subgraph。
  3. 部署Subgraph到TheGraph,实现数据索引。
  4. 在前端 DApp 中查询索引数据。

本教程的完整代码已上传到 GitHub: https://github.com/xilibi2003/Gameplayer

1. 合约开发与部署

克隆教程的代码,在contracts下可以看到GravatarRegistry智能合约,用户可以调用GravatarRegistry合约来创建及更新自己的昵称和头像,合约关键代码如下:

contract GravatarRegistry {   event NewGravatar(uint id, address owner, string displayName, string imageUrl);   event UpdatedGravatar(uint id, address owner, string displayName, string imageUrl);    struct Gravatar {     address owner;     string displayName;     string imageUrl;   }    Gravatar[] public gravatars;    mapping (uint => address) public gravatarToOwner;   mapping (address => uint) public ownerToGravatar;    function createGravatar(string _displayName, string _imageUrl) public {     require(ownerToGravatar[msg.sender] == 0);     uint id = gravatars.push(Gravatar(msg.sender, _displayName, _imageUrl)) - 1;      gravatarToOwner[id] = msg.sender;     ownerToGravatar[msg.sender] = id;      emit NewGravatar(id, msg.sender, _displayName, _imageUrl);   }    function updateGravatarName(string _displayName) public {     require(ownerToGravatar[msg.sender] != 0);     require(msg.sender == gravatars[ownerToGravatar[msg.sender]].owner);      uint id = ownerToGravatar[msg.sender];      gravatars[id].displayName = _displayName;     emit UpdatedGravatar(id, msg.sender, _displayName, gravatars[id].imageUrl);   } }

可以看到合约里在创建和更新时分别触发了 NewGravatarUpdatedGravatar 事件,稍后再subgraph里,将跟踪这两个事件,但是需要我们先把合约部署到网络上,这里使用以太坊测试网Ropsten(使用其他的网络也是一样的):

module.exports = {   networks: {     ropsten: {       provider: function() {         return new HDWalletProvider(           process.env.MNEMONIC,           `https://ropsten.infura.io/v3/${process.env.ROPSTEN_INFURA_API_KEY}`         )       },       network_id: '3',     },   } }

这里为了安全考虑,把助记词和 API KEY 保存在.env文件中

添加部署脚本2_deploy_contract.js:

const GravatarRegistry = artifacts.require('./GravatarRegistry.sol')  module.exports = async function(deployer) {   await deployer.deploy(GravatarRegistry) }

添加执行交易脚本,以便触发事件3_create_gravatars.js:

const GravatarRegistry = artifacts.require('./GravatarRegistry.sol')  module.exports = async function(deployer, network, accounts) {   const registry = await GravatarRegistry.deployed()   console.log('Account address:', registry.address)   await registry.createGravatar('Carl', 'https://thegraph.com/img/team/team_04.png', {     from: accounts[0],   })  }

然后执行 truffle migrate --network ropsten 以便完成部署和执行createGravatar交易,控制台里会打印出GravatarRegistry合约部署的地址,复制这个合约地址,后面在编写subgraph需要使用到。

2. 创建定义数据索引的Subgraph

TheGraph中定义如何为数据建立索引,称为Subgraph,它包含三个组件:

  1. Manifest 清单(subgraph.yaml) – 定义配置项
  2. Schema 模式(schema.graphql) – 定义数据
  3. Mapping 映射(mapping.ts) – 定义事件到数据的转换

后面我们将逐一介绍他们的作用及如何来编写。

在TheGraph创建一个 Subgraph 空间

因为需要借助 TheGraph 的节点来完成数据的索引,因此我们需要在TheGraph网站)上创建一个Subgraph。

如果你有自己的私有链,这可以克隆Graph节点代码(https://github.com/graphprotocol/graph-node/),自己运行Graph节点来完成数据的索引。

如果没有The Graph 的账户,可以用GitHub注册。创建账户之后,进入仪表盘就可以开始通过界面创建subgraph,进入你的仪表板,并点击Add Subgraph

The Graph入门教程:如何索引合约事件

image-20210428095928210

可以为你的 subgraph 选择一个图像,定义一个名称。完成后点击保存,一个新的、未部署的subgraph将显示在仪表板上。

开发和部署subgraph

先使用Yarn或NPM在全局安装Graph CLI:

$ npm install -g @graphprotocol/graph-cli $ yarn global add @graphprotocol/graph-cli

初始化配置

使用graph init 创建一个subgraph项目:

$ graph init <GITHUB_USERNAME>/<SUBGRAPH_NAME> <DIRECTORY>
  • <GITHUB_USERNAME>是必需的,这是你的GitHub用户名
  • <SUBGRAPH_NAME>是必需的,这是你的前面创建subgraph项目的名称
  • <DIRECTORY>是可选的,它是创建subgraph的子目录的名称。

这个命令也可以加入参数 --from-example ,基于官方的示例创建项目。

“`

graph init xilibi2003/Gameplayer
✔ Subgraph name · xilibi2003/Gameplayer
✔ Directory to create the subgraph in · Gameplayer
✔ Ethereum network · ropsten
✔ Contract address · 0x8CfDDbD441Fc6ffE3c02244a6B93EF9e89FaFA4D
✖ Failed to fetch ABI from Etherscan: request to https://api-ropsten.etherscan.io/api?module=contract&action=getabi&address=0x8CfDDbD441Fc6ffE3c02244a6B93EF9e89FaFA4D failed, reason: connect ETIMEDOUT 103.240.180.117:443

编写智能的合约时,通常状态的变化是通过触发一个事件来表达,The Graph则是捕捉区块链事件并提供一个查询事件的GraphQL接口,让我们可以方便的跟踪数据的变化。 实际上很多 DEFI 协议及都是The Graph来基于查询数据。

这篇TheGraph教程在官方的教程基础上,进行了一些补充扩展主要包含以下内容:

  1. 在Ropsten部署一个合约,并调用触发事件。
  2. 创建定义数据索引的Subgraph。
  3. 部署Subgraph到TheGraph,实现数据索引。
  4. 在前端 DApp 中查询索引数据。

本教程的完整代码已上传到 GitHub: https://github.com/xilibi2003/Gameplayer

1. 合约开发与部署

克隆教程的代码,在contracts下可以看到GravatarRegistry智能合约,用户可以调用GravatarRegistry合约来创建及更新自己的昵称和头像,合约关键代码如下:

contract GravatarRegistry {   event NewGravatar(uint id, address owner, string displayName, string imageUrl);   event UpdatedGravatar(uint id, address owner, string displayName, string imageUrl);    struct Gravatar {     address owner;     string displayName;     string imageUrl;   }    Gravatar[] public gravatars;    mapping (uint => address) public gravatarToOwner;   mapping (address => uint) public ownerToGravatar;    function createGravatar(string _displayName, string _imageUrl) public {     require(ownerToGravatar[msg.sender] == 0);     uint id = gravatars.push(Gravatar(msg.sender, _displayName, _imageUrl)) - 1;      gravatarToOwner[id] = msg.sender;     ownerToGravatar[msg.sender] = id;      emit NewGravatar(id, msg.sender, _displayName, _imageUrl);   }    function updateGravatarName(string _displayName) public {     require(ownerToGravatar[msg.sender] != 0);     require(msg.sender == gravatars[ownerToGravatar[msg.sender]].owner);      uint id = ownerToGravatar[msg.sender];      gravatars[id].displayName = _displayName;     emit UpdatedGravatar(id, msg.sender, _displayName, gravatars[id].imageUrl);   } }

可以看到合约里在创建和更新时分别触发了 NewGravatarUpdatedGravatar 事件,稍后再subgraph里,将跟踪这两个事件,但是需要我们先把合约部署到网络上,这里使用以太坊测试网Ropsten(使用其他的网络也是一样的):

module.exports = {   networks: {     ropsten: {       provider: function() {         return new HDWalletProvider(           process.env.MNEMONIC,           `https://ropsten.infura.io/v3/${process.env.ROPSTEN_INFURA_API_KEY}`         )       },       network_id: '3',     },   } }

这里为了安全考虑,把助记词和 API KEY 保存在.env文件中

添加部署脚本2_deploy_contract.js:

const GravatarRegistry = artifacts.require('./GravatarRegistry.sol')  module.exports = async function(deployer) {   await deployer.deploy(GravatarRegistry) }

添加执行交易脚本,以便触发事件3_create_gravatars.js:

const GravatarRegistry = artifacts.require('./GravatarRegistry.sol')  module.exports = async function(deployer, network, accounts) {   const registry = await GravatarRegistry.deployed()   console.log('Account address:', registry.address)   await registry.createGravatar('Carl', 'https://thegraph.com/img/team/team_04.png', {     from: accounts[0],   })  }

然后执行 truffle migrate --network ropsten 以便完成部署和执行createGravatar交易,控制台里会打印出GravatarRegistry合约部署的地址,复制这个合约地址,后面在编写subgraph需要使用到。

2. 创建定义数据索引的Subgraph

TheGraph中定义如何为数据建立索引,称为Subgraph,它包含三个组件:

  1. Manifest 清单(subgraph.yaml) – 定义配置项
  2. Schema 模式(schema.graphql) – 定义数据
  3. Mapping 映射(mapping.ts) – 定义事件到数据的转换

后面我们将逐一介绍他们的作用及如何来编写。

在TheGraph创建一个 Subgraph 空间

因为需要借助 TheGraph 的节点来完成数据的索引,因此我们需要在TheGraph网站)上创建一个Subgraph。

如果你有自己的私有链,这可以克隆Graph节点代码(https://github.com/graphprotocol/graph-node/),自己运行Graph节点来完成数据的索引。

如果没有The Graph 的账户,可以用GitHub注册。创建账户之后,进入仪表盘就可以开始通过界面创建subgraph,进入你的仪表板,并点击Add Subgraph

The Graph入门教程:如何索引合约事件

image-20210428095928210

可以为你的 subgraph 选择一个图像,定义一个名称。完成后点击保存,一个新的、未部署的subgraph将显示在仪表板上。

开发和部署subgraph

先使用Yarn或NPM在全局安装Graph CLI:

$ npm install -g @graphprotocol/graph-cli $ yarn global add @graphprotocol/graph-cli

初始化配置

使用graph init 创建一个subgraph项目:

$ graph init <GITHUB_USERNAME>/<SUBGRAPH_NAME> <DIRECTORY>
  • <GITHUB_USERNAME>是必需的,这是你的GitHub用户名
  • <SUBGRAPH_NAME>是必需的,这是你的前面创建subgraph项目的名称
  • <DIRECTORY>是可选的,它是创建subgraph的子目录的名称。

这个命令也可以加入参数 --from-example ,基于官方的示例创建项目。

“`

graph init xilibi2003/Gameplayer
✔ Subgraph name · xilibi2003/Gameplayer
✔ Directory to create the subgraph in · Gameplayer
✔ Ethereum network · ropsten
✔ Contract address · 0x8CfDDbD441Fc6ffE3c02244a6B93EF9e89FaFA4D
✖ Failed to fetch ABI from Etherscan: request to https://api-ropsten.etherscan.io/api?module=contract&action=getabi&address=0x8CfDDbD441Fc6ffE3c02244a6B93EF9e89FaFA4D failed, reason: connect ETIMEDOUT 103.240.180.117:443

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » The Graph入门教程:如何索引合约事件求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们