Graph es un protocolo para crear aplicaciones descentralizadas (dApps) rápidamente en Ethereum e IPFS utilizando GraphQL.
Graph Node es una implementación de Rust de código abierto que genera eventos en la cadena de bloques Ethereum para actualizar de manera determinista un almacén de datos que se puede consultar a través del punto final GraphQL.
Para obtener instrucciones detalladas y más contexto, consulte la Guía de introducción.
Para construir y ejecutar este proyecto necesita tener lo siguiente instalado en su sistema:
rustfmt
, que forma parte de la instalación predeterminada de Rust, es un requisito en el momento de la compilación.Para los datos de la red Ethereum, puede ejecutar su propio nodo Ethereum o utilizar un proveedor de nodos Ethereum de su elección.
Requisitos mínimos de hardware:
cargo
, se requieren 8 GB de RAM.La forma más sencilla de ejecutar un Graph Node es utilizar la configuración oficial de redacción de Docker. Esto iniciará una base de datos Postgres, un nodo IPFS y un nodo Graph. Siga las instrucciones aquí.
Este es un ejemplo rápido para mostrar un nodo gráfico en funcionamiento. Es un subgrafo para Gravatars.
ipfs init
seguido de ipfs daemon
.initdb -D .postgres -E UTF8 --locale=C
seguido de pg_ctl -D .postgres -l logfile start
y createdb graph-node
.sudo apt-get install -y clang libpq-dev libssl-dev pkg-config
yarn
yarn codegen
cargo build
.Una vez que tenga todas las dependencias configuradas, puede ejecutar lo siguiente:
cargo run -p graph-node --release --
--postgres-url postgresql://USERNAME[:PASSWORD]@localhost:5432/graph-node
--ethereum-rpc NETWORK_NAME:[CAPABILITIES]:URL
--ipfs 127.0.0.1:5001
Pruebe su nombre de usuario del sistema operativo como USERNAME
y PASSWORD
. Para obtener detalles sobre cómo configurar la cadena de conexión, consulte la documentación de Postgres. graph-node
utiliza algunas extensiones de Postgres. Si el usuario de Postgres con el que ejecuta graph-node
es un superusuario, graph-node
habilitará estas extensiones cuando inicialice la base de datos. Si el usuario de Postgres no es un superusuario, deberá crear las extensiones manualmente, ya que solo los superusuarios pueden hacerlo. Para crearlos es necesario conectarse como superusuario, que en muchas instalaciones es el usuario postgres
:
psql -q -X -U < SUPERUSER > graph-node << EOF
create extension pg_trgm;
create extension pg_stat_statements;
create extension btree_gist;
create extension postgres_fdw;
grant usage on foreign data wrapper postgres_fdw to <USERNAME>;
EOF
Esto también activará una interfaz GraphiQL en http://127.0.0.1:8000/
.
yarn create-local
Luego puedes implementar el subgrafo:
yarn deploy-local
Esto construirá e implementará el subgrafo en el nodo Graph. Debería comenzar a indexar el subgrafo inmediatamente.
USAGE:
graph-node [FLAGS] [OPTIONS] --ethereum-ipc <NETWORK_NAME:FILE> --ethereum-rpc <NETWORK_NAME:URL> --ethereum-ws <NETWORK_NAME:URL> --ipfs <HOST:PORT> --postgres-url <URL>
FLAGS:
--debug Enable debug logging
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
--admin-port <PORT> Port for the JSON-RPC admin server [default: 8020]
--elasticsearch-password <PASSWORD>
Password to use for Elasticsearch logging [env: ELASTICSEARCH_PASSWORD]
--elasticsearch-url <URL>
Elasticsearch service to write subgraph logs to [env: ELASTICSEARCH_URL=]
--elasticsearch-user <USER> User to use for Elasticsearch logging [env: ELASTICSEARCH_USER=]
--ethereum-ipc <NETWORK_NAME:[CAPABILITIES]:FILE>
Ethereum network name (e.g. 'mainnet'), optional comma-separated capabilities (eg full,archive), and an Ethereum IPC pipe, separated by a ':'
--ethereum-polling-interval <MILLISECONDS>
How often to poll the Ethereum node for new blocks [env: ETHEREUM_POLLING_INTERVAL=] [default: 500]
--ethereum-rpc <NETWORK_NAME:[CAPABILITIES]:URL>
Ethereum network name (e.g. 'mainnet'), optional comma-separated capabilities (eg 'full,archive'), and an Ethereum RPC URL, separated by a ':'
--ethereum-ws <NETWORK_NAME:[CAPABILITIES]:URL>
Ethereum network name (e.g. 'mainnet'), optional comma-separated capabilities (eg `full,archive), and an Ethereum WebSocket URL, separated by a ':'
--node-id <NODE_ID>
A unique identifier for this node instance. Should have the same value between consecutive node restarts [default: default]
--http-port <PORT> Port for the GraphQL HTTP server [default: 8000]
--ipfs <HOST:PORT> HTTP address of an IPFS node
--postgres-url <URL> Location of the Postgres database used for storing entities
--subgraph <[NAME:]IPFS_HASH> Name and IPFS hash of the subgraph manifest
--ws-port <PORT> Port for the GraphQL WebSocket server [default: 8001]
Los argumentos de la línea de comando generalmente son todo lo que se necesita para ejecutar una instancia graph-node
. Para usos avanzados, se pueden configurar varios aspectos del graph-node
a través de variables de entorno. Las instancias graph-node
muy grandes también pueden dividir el trabajo de consulta e indexación en múltiples bases de datos.
node
: un nodo gráfico local.graph
: biblioteca que proporciona características de los componentes del sistema y tipos de datos comunes.core
: biblioteca que proporciona implementaciones para componentes principales, utilizada por todos los nodos.chain/ethereum
: una biblioteca con componentes para obtener datos de Ethereum.graphql
: una implementación de GraphQL con generación de esquemas API, introspección y más.mock
: una biblioteca que proporciona implementaciones simuladas para todos los componentes del sistema.runtime/wasm
: una biblioteca para ejecutar scripts de extracción de datos WASM.server/http
: una biblioteca que proporciona un servidor GraphQL a través de HTTP.store/postgres
: una tienda de Postgres con una interfaz compatible con GraphQL y registros de auditoría. ? = En progreso
? = Función completa. Se requieren pruebas adicionales.
✅ = Función completa
Característica | Estado |
---|---|
Etereum | |
Indexación de eventos de contratos inteligentes | ✅ |
Manejar reorganizaciones de cadena | ✅ |
Mapeos | |
Mapeos basados en WASM | ✅ |
Cadena de herramientas de TypeScript a WASM | ✅ |
Tipos de TypeScript generados automáticamente | ✅ |
GrafoQL | |
Consultar entidades por ID | ✅ |
Consultar colecciones de entidades | ✅ |
Paginación | ✅ |
Filtración | ✅ |
Filtrado basado en bloques | ✅ |
Relaciones entre entidades | ✅ |
Suscripciones | ✅ |
Consulte CONTRIBUTING.md para conocer el flujo de desarrollo y las convenciones que utilizamos. Aquí hay una lista de buenos primeros números.
Copyright © 2018-2019 Graph Protocol, Inc. y colaboradores.
Graph tiene doble licencia: la licencia MIT y la licencia Apache, versión 2.0.
A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye "TAL CUAL", SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer el idioma específico que rige los permisos y limitaciones de la Licencia.