🇧🇷
Ethereum Developer Pack - PT
  • Ethereum Developer Pack - PT
  • Módulo 1
    • Introdução a Smart Contracts
      • Fundamentos de Blockchain
        • Histórico
        • Bitcoin
        • O que é Blockchain
        • Conceitos-chave em Blockchain
        • Como funciona a Blockchain
        • Tipos de Blockchain
        • Modelos de Consenso
      • A nova Internet
        • Web 3
        • Elementos Fundamentais
        • Impacto do Ethereum em Diversos Setores
      • Wallets
        • Componentes de uma wallet
        • Tipos de Wallet
        • Códigos Mnemônicos
      • Ethereum 101
        • Smart Contracts
        • Contas
          • Tipos de contas
          • Conteúdo das contas
        • Transações
          • Componentes
          • Ciclo de vida
        • Gás
        • Solidity
        • EVM
          • A máquina de estados
          • Opcodes
          • Como funciona a EVM
          • Clientes de execução
          • DApps
      • Blockchain Explorer
        • Funções de um blockchain explorer
        • Beneficios de utilizar um blockchain explorer
      • Remix
        • Características do Remix
        • Workspaces ou espaços de trabalho
        • Carregar e compilar um contrato
        • Implantar na máquina virtual do Remix (Remix VM)
        • Interagindo com funções
        • Deployar em uma rede pública
      • Crie seu primeiro Smart Contract
  • Módulo 2
    • Fundamentos de Solidity
      • Hello World
      • Tipos de Dados
      • Funções
      • Variáveis
        • Exercício 1
      • Operadores
        • Ejercicio 2
      • Constructor
        • Exercício 3
      • Convenções de nomenclatura
      • Tipos de armazenamento para variáveis
      • Estruturas de Controle
        • Exercício 4
      • Modificadores
      • Eventos
        • Exercício 5
      • Tipos de Referencia
        • Arrays
          • Exercício 6
        • Mappings
          • Exercício 7
        • Structs
          • Exercício 8
      • Address Payable
      • Como os contratos e funções recebem Ether.
      • Transferências de Ether
      • Conceitos Avançados
        • Codificação de ABI
        • Hashing
        • This
        • Herança
        • Abstract
        • Interface
        • Chamada entre contratos
        • EVM
        • ABI
        • Bytecode
        • Opcodes
  • Módulo 3
    • ERCs, Bibliotecas e Padrões de Desenvolvimento
      • Boas Práticas de Desenvolvimento
      • Padrões de Desenvolvimento
      • EIP & ERC
      • ERC-20
      • ERC-721
      • Open Zeppelin
      • Crie um Token ERC-20
      • Almacenamiento Descentralizado: IPFS
      • Crea un Token ERC-721
      • DeFi
  • Módulo 4
    • Kit de ferramentas para desenvolvimento na Ethereum
      • Requisitos para o módulo 4
        • Terminal
        • Git e Github
        • Node.js e npm
        • Visual Studio Code para Solidity
      • Toolkit
        • JSON-RPC
        • Ethers.js
          • Exercício
        • Hardhat
          • Implantação de um contrato no Hardhat
          • Implantação de um contrato em uma rede pública
        • Scaffold-ETH
          • Características do Scaffold-ETHCaracterísticas
          • Como instalar o Scaffold-ETH
  • Módulo 5
    • Segurança, Testes e Auditorias
      • Testes
        • Importância de realizar testes
        • Métodos para testar contratos inteligentes
          • Testes automatizados
          • Testes manuais
        • Conceitos importantes em testes
        • Ferramentas para testes
        • Testes com Hardhat
        • Recursos adicionais
      • Segurança
        • Uma mentalidade diferente de design
        • Principais vulnerabilidades em contratos inteligentes
          • Reentrancy attack (ataque de reentrada)
          • Replay attack (ataque de repetición)
          • Price Oracle Manipulation (Manipulación de Oráculos de Precios)
          • Missing Access Control (Pérdida de Control de Acceso)
          • Reward Manipulation (Manipulación de Recompensas)
          • Failure to Initialize (Falla al Inicializar)
          • Front-running
          • Invariant Breaks (Quebra de Invariantes)
          • Mishandling of ETH (Má gestão de ETH)
          • Denial of Service (DoS - Negação de Serviço)
          • Integer overflow and underflow (Overflow e Underflow de inteiros)
          • Phishing y Typosquatting
        • Recursos adicionais
      • Auditoria de smart contracts
        • Processo de Auditoria
        • Ferramentas
        • Como se preparar para uma auditoria
        • O teste Rekt
        • Desafios
        • Recursos adicionais
  • Contribuye
    • Kipu Explorer
Powered by GitBook
On this page
  • Estrutura de uma notificação JSON-RPC
  • Conexão com a Ethereum utilizando o terminal e JSON-RPC
  • Informação adicional
  1. Módulo 4
  2. Kit de ferramentas para desenvolvimento na Ethereum
  3. Toolkit

JSON-RPC

PreviousToolkitNextEthers.js

Last updated 14 days ago

Como conectamos uma aplicação ou nosso terminal a uma blockchain para que ela possa interagir com ela? Precisamos nos conectar a um nó da blockchain utilizando um protocolo de comunicação.

No caso do Ethereum, cada cliente de execução (como Geth, Erigon, Besu ou Nethermind) implementa a mesma especificação JSON-RPC, permitindo o uso de um conjunto padronizado de métodos — independentemente do cliente usado.

JSON-RPC é um protocolo para executar métodos remotamente que utiliza JSON como formato padrão para transferência de dados. É independente da linguagem de programação, o que facilita sua implementação em diferentes tecnologias e ambientes.

A que nó devemos nos conectar? Você pode se conectar a qualquer nó da blockchain — seja um nó que você mesmo controla ou um de terceiros. No segundo caso, existem provedores de acesso à blockchain, como: Alchemy, Quicknode o Infura.

JSON-RPC pode ser transportado por diversos protocolos de comunicação, como HTTP, WebSockets, TCP, entre outros. No caso do HTTP, a conexão não permanece aberta, ao contrário do WebSockets, que mantém a conexão ativa.

Estrutura de uma notificação JSON-RPC

Uma notificação é uma requisição sem o campo id, o que indica que o cliente não espera uma resposta

  • jsonrpc: A versão do protocolo (atualmente "2.0").

  • method: El nombre del método a invocar.

  • params: (Opcional) Los parámetros para el método, que pueden ser un array o un objeto.

  • id: (Opcional) Un identificador único para la solicitud, utilizado para correlacionar las respuestas. Si no se especifica, la solicitud se considera una notificación y no se espera una respuesta.

  • method: O nome do método a ser invocado.

  • params: (Opcional) Os parâmetros do método, que podem ser um array ou um objeto.

  • id: (Opcional) Um identificador único para a requisição, usado para correlacionar as respostas. Se não for especificado, a requisição é considerada uma notificação e não se espera uma resposta.

Vamos ver um exemplo:

{
  "jsonrpc": "2.0",
  "method": "subtract",
  "params": [42, 23],
  "id": 1
}

Estrutura de uma resposta JSON-RPC

Uma resposta JSON-RPC contém os seguintes campos:

  • jsonrpc: A versão do protocolo (atualmente "2.0").

  • result: O resultado da execução do método (presente se não houve erro).

  • error: Um objeto de erro (presente se houve um erro na execução).

  • id: O identificador da requisição correspondente.

Exemplo de uma resposta bem-sucedida

{
  "jsonrpc": "2.0",
  "result": 19,
  "id": 1
}

Exemplo de uma resposta com error

{
  "jsonrpc": "2.0",
  "error": {
    "code": -32601,
    "message": "Method not found"
  },
  "id": 1
}

Estrutura de uma notificação JSON-RPC

Uma notificação é uma solicitação sem o campo id, o que indica que o cliente não espera uma resposta.

{
  "jsonrpc": "2.0",
  "method": "update",
  "params": ["parameter1", "parameter2"]
}

Uso de JSON-RPC no Ethereum

Os métodos JSON-RPC no Ethereum permitem enviar transações, consultar saldos, interagir com contratos inteligentes, e muitas outras operações. A seguir, alguns exemplos:

  1. eth_blockNumber: Obtém o número do bloco mais recente. Requisição:

    {
      "jsonrpc": "2.0",
      "method": "eth_blockNumber",
      "params": [],
      "id": 1
    }

    Resposta:

    {
      "jsonrpc": "2.0",
      "result": "0x5b8d80",
      "id": 1
    }

    Pode-se observar que o resultado da resposta é retornado em hexadecimal. Convertido para decimal, o valor seria "6000000".

  2. eth_getBalance: Obtém o saldo de um endereço especificado.

    Requisição:

    {
      "jsonrpc": "2.0",
      "method": "eth_getBalance",
      "params": ["0x742d35Cc6634C0532925a3b844Bc454e4438f44e", "latest"],
      "id": 1
    }

    Neste caso, foi necessário especificar como parâmetros o endereço e o número do bloco em que queremos consultar o saldo (no exemplo, o mais recente: "latest").

    Resposta:

    {
      "jsonrpc": "2.0",
      "result": "0x0234c8a3397aab58",
      "id": 1
    }

    Expresso em decimal, o resultado seria “158972490234375000” wei, ou seja, 0,159 ETH.

  3. eth_sendTransaction: Envia uma transação.

    Requisição:

    jsonCopiar código
    {
      "jsonrpc": "2.0",
      "method": "eth_sendTransaction",
      "params": [{
        "from": "0xYourAddress",
        "to": "0xReceiverAddress",
        "value": "0x9184e72a000"  // 0.01 ether
      }],
      "id": 1
    }

    Resposta:

    {
      "jsonrpc": "2.0",
      "result": "0xTransactionHash",
      "id": 1
    }

    O resultado que obteremos como resposta, neste caso, é o hash da transação.

Conexão com a Ethereum utilizando o terminal e JSON-RPC

Para estabelecer comunicação entre seu terminal e a blockchain Ethereum utilizando chamadas JSON-RPC, siga os passos abaixo:

Passo 1: Configurar um nó Ethereum ou utilizar um nó público

Como mencionado anteriormente, para interagir com a blockchain do Ethereum, é necessário conectar-se a um nó.

Você pode:

  • Configurar seu próprio nó utilizando softwares como Geth ou Nethermind, ou

  • Usar um nó público como Alchemy, Infura ou QuickNode.

Neste exemplo, utilizaremos um nó da Alchemy.

Passo 2: Obter um Endpoint JSON-RPC

  • Crie um novo projeto e obtenha a URL do seu endpoint, que terá um formato semelhante a:

    <https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_PROJECT_ID>

Passo 3: Realizar chamadas JSON-RPC a partir do terminal

Você pode usar ferramentas como curl para enviar chamadas JSON-RPC diretamente do terminal.

Exemplo: Obter o número do bloco atual

Usando o curl, você pode fazer uma chamada JSON-RPC para obter o número do bloco atual da rede Ethereum.

curl -X POST <https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_PROJECT_ID> \\
     -H "Content-Type: application/json" \\
     -d '{
           "jsonrpc":"2.0",
           "method":"eth_blockNumber",
           "params":[],
           "id":1
         }'

Explicación del comando

  • X POST: Indica que se trata de uma requisição POST.

  • https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_PROJECT_ID: URL do nó Ethereum ao qual você está se conectando.

  • H "Content-Type: application/json": Define o tipo de conteúdo da requisição como JSON.

  • d '...': Define o corpo da requisição, que contém os parâmetros da chamada JSON-RPC.

Resposta esperada A resposta será um objeto JSON que contém o número do bloco atual em formato hexadecimal.

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x131f640" // Número de bloque en formato hexadecimal
}

Alguns métodos JSON-RPC

Método
Descrição
Parâmetros
JSON

eth_chainId

Retorna o ID da blockchain atual. No caso do Ethereum, o valor retornado é 1.

{ "jsonrpc": "2.0", "method": "eth_chainId", "params": [] }

eth_blockNumber

Retorna o número do bloco mais recente.

{ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [] }

eth_gasPrice

Retorna o preço atual do gás, expresso em wei.

{ "jsonrpc": "2.0", "method": "eth_gasPrice", "params": [] }

eth_blobBaseFee

Retorna a tarifa base por gás de blob, expressa em wei.

{ "jsonrpc": "2.0", "method": "eth_blobBaseFee", "params": [] }

eth_getBalance

Retorna o saldo de uma conta em um bloco específico.

account, block (earliest, latest, safe, finalized, pending)

{ "jsonrpc": "2.0", "method": "eth_getBalance", "params": [ "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest" ] }

eth_getCode

Retorna o código armazenado em um endereço específico.

account, block (earliest, latest, safe, finalized, pending)

{ "jsonrpc": "2.0", "method": "eth_getCode", "params": [ "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "latest" ] }

eth_call

Executa uma chamada sem criar uma transação na blockchain (somente leitura).

nonce, type, from, to, gas, value, data, gas price, max fee per gas, max priority fee per gas, max fee per blob gas, block.

{ "jsonrpc": "2.0", "method": "eth_call", "params": [ { "nonce": null, "type": null, "from": null, "to": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "gas": null, "value": null, "data": null, "gasPrice": null, "maxFeePerGas": null, "maxPriorityFeePerGas": null, "maxFeePerBlobGas": null }, "latest" ] }

eth_getBlockByNumber

Retorna informações de um bloco com base no número do bloco.

block, is full (boolean)

{ "jsonrpc": "2.0", "method": "eth_getBlockByNumber", "params": [ "latest", false ] }

Informação adicional

Para se conectar a um nó da Alchemy, você deve criar uma conta em e obter uma URL de endpoint JSON-RPC.

Registre-se na .

https://www.alchemy.com
Alchemy
JSON-RPC en ethereum.org
Playground de JSON-RPC
Especificación técnica de los métodos JSON-RPC