Usando WebSockets
Este é um guia de nível de entrada para usar WebSockets e Alchemy para fazer solicitações para a blockchain Ethereum.
WebSockets vs. HTTP
Ao contrário da HTTP, com WebSockets, você não precisa continuamente fazer solicitações quando quiser informações específicas. WebSockets mantêm uma conexão de rede para você (se for feito corretamente) e ouvem por mudanças.
Como em qualquer conexão de rede, você não deve assumir que um WebSocket permanecerá aberto para sempre sem interrupção, mas o processamento correto de conexões descartadas e reconexão à mão podem ser desafiadores pra acertar. Outro lado negativo dos WebSockets é que você não obtém códigos de status HTTP na resposta, mas apenas a mensagem de erro.
£Alquimia Web3(opens in a new tab) adiciona automaticamente manipulação em falhas de WebSocket e obtém sem a configuração necessária.
Experimente
A maneira mais fácil de testar WebSockets é instalar uma ferramenta de linha de comando para fazer solicitações de WebSocket como wscat(opens in a new tab). Usando o wscat, você pode enviar solicitações da seguinte forma:
Nota: se você tem uma conta da Alchemy, você pode substituir demo
com sua própria chave de API. Cadastre-se para uma conta de Alquimia gratuita aqui!(opens in a new tab)
1wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo23> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}45< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}6
Como usar WebSockets
Para começar, abra um WebSocket usando a URL de WebSocket para seu aplicativo. Você pode encontrar a URL de WebSocket do seu aplicativo abrindo a página do aplicativo no seu painel(opens in a new tab) e clicando em "Visualizar chave". Note que a URL do seu aplicativo para WebSockets é diferente da URL para solicitações HTTP, mas ambos podem ser encontrados clicando em "Ver Chave".
Qualquer uma das APIs listadas na Referência API do Alquimia(opens in a new tab) pode ser usada via WebSocket. Para fazer isso, use o mesmo payload que seria enviado como corpo de uma solicitação HTTP POST, mas ao invés disso, envie esse payload através do WebSocket.
Com Web3
A transição para WebSockets enquanto se usa uma biblioteca de clientes como a Web3 é simples. Simplesmente passe a URL de WebSocket em vez da URL HTTP ao instanciar seu cliente Web3. Por exemplo:
1const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")23web3.eth.getBlockNumber().then(console.log) // -> 7946893Copiar
Assinatura
Quando conectado através de um WebSocket, você pode usar dois métodos adicionais: eth_subscribe
e eth_unsubscribe
. Esses métodos permitirão que você ouça eventos específicos e seja notificado imediatamente.
eth_subscribe
Cria uma nova assinatura para eventos específicos. Saiba mais sobre eth_subscribe
(opens in a new tab).
Parâmetros
- Tipos de assinatura
- Parâmetros opcionais
O primeiro argumento especifica o tipo de evento para o qual ouvir. O segundo argumento contém opções adicionais que dependem do primeiro argumento. Os diferentes tipos de descrição, suas opções e suas cargas de evento são descritos abaixo.
Retorna
O ID de subscrição: Este ID será anexado a qualquer evento recebido, e também pode ser usado para cancelar a assinatura usando eth_unsubscribe
.
Eventos de assinatura
Enquanto a assinatura estiver ativa, você receberá eventos que são objetos com os seguintes campos:
jsonrpc
: Sempre "2.0"método
: Sempre "eth_subscription"params
: Um objeto com os seguintes campos:subscription
: O ID de assinatura retornado pela chamadaeth_subscription
que criou essa assinatura.resultado
: Um objeto cujo conteúdo varia dependendo do tipo de assinatura.
Tipos de assinatura
alchemy_newFullPendingTransactions
Retorna as informações de transação para todas as transações que são adicionadas ao estado pendente. Este tipo de assinatura se inscreve em transações pendentes, similar à chamada Web3 padrão web3.eth. ubscribe("pendingTransações")
, mas difere do que emite informações completas de transação ao invés de apenas hashes de transação.
Exemplo:
1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]}23< {"id":1,"result":"0x9a52eeddc2b289f985c0e23a7d8427c8","jsonrpc":"2.0"}4< {5 "jsonrpc":"2.0",6 "method":"eth_subscription",7 "params":{8 "result":{9 "blockHash":null,10 "blockNumber":null,11 "from":"0xa36452fc31f6f482ad823cd1cf5515177d57667f",12 "gas":"0x1adb0",13 "gasPrice":"0x7735c4d40",14 "hash":"0x50bff0736c713458c92dd1848d12f3354149be1363123dae35e94e0f2a9d56bf",15"input":"0xa9059cbb0000000000000000000000000d0707963952f2fba59dd06f2b425ace40b492fe0000000000000000000000000000000000000000000015b1111266cfca100000",16 "nonce":"0x0",17 "to":"0xea38eaa3c86c8f9b751533ba2e562deb9acded40",18 "transactionIndex":null,19 "value":"0x0",20 "v":"0x26",21 "r":"0x195c2c1ed126088e12d290aa93541677d3e3b1d10f137e11f86b1b9227f01e3b",22 "s":"0x60fc4edbf1527832a2a36dbc1e63ed6193a6eee654472fbebbf88ef1750b5344"},23 "subscription":"0x9a52eeddc2b289f985c0e23a7d8427c8"24 }25 }26Exibir tudoCopiar
newHeads
Emite um evento a qualquer momento que um novo cabeçalho seja adicionado à cadeia, incluindo durante uma reorganização em cadeia.
Quando ocorre uma reorganização da cadeia, esta assinatura emitirá um evento contendo todos os novos cabeçalhos da nova cadeia. Em particular, isso significa que você pode ver vários cabeçalhos emitidos com a mesma altura, e quando isso acontecer, o cabeçalho mais recente deve ser tomado como o correto após uma reorganização.
Exemplo:
1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}23< {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"}4< {5 "jsonrpc": "2.0",6 "method": "eth_subscription",7 "params": {8 "result": {9 "extraData": "0xd983010305844765746887676f312e342e328777696e646f7773",10 "gasLimit": "0x47e7c4",11 "gasUsed": "0x38658",12 "logsBloom":13"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",14 "nonce": "0x084149998194cc5f",15 "number": "0x1348c9",16 "parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",17 "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",18 "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",19 "stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",20 "timestamp": "0x56ffeff8",21 "transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f"22 },23 "subscription": "0x9ce59a13059e417087c02d3236a0b1cc"24 }25}26Exibir tudoCopiar
logs
Emite logs que fazem parte dos blocos recém-adicionados que correspondem aos critérios de filtro especificado.
Quando ocorre uma reorganização da cadeia, logs que fazem parte dos blocos da cadeia antiga serão emitidos novamente com a propriedade removido
definido como verdadeiro
. Além disso, são emitidos registros que fazem parte dos blocos da nova cadeia, significando que é possível ver logs para a mesma transação várias vezes no caso de uma reorganização.
Parâmetros
- Um objeto com os seguintes campos:
endereço
(opcional): ou uma string representanda por um endereço, ou um array de tais strings.- Somente logs criados a partir de um desses endereços serão emitidos.
Tópicos
: um array de especificadores de tópicos.- Cada especialista de tópico é
null
uma string que representa um tópico, ou uma matriz de strings. - Cada posição no array que não é
nulo
restringe os logs emitidos para apenas aqueles que têm um dos tópicos indicados nessa posição.
- Cada especialista de tópico é
Alguns exemplos de especificações de tópico:
[]
: Qualquer tópico permitido.[A]
: A na primeira posição (e qualquer coisa depois).[null, B]
: Qualquer coisa na primeira posição e B na segunda posição (e qualquer coisa depois).[null, B]
: Qualquer coisa na primeira posição e B na segunda posição (e qualquer coisa depois).- .
[[A, B], [A, B]]
: (A or B) na primeira posição e (A or B) na segunda posição (e nada depois).
Exemplo:
1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}23< {"jsonrpc":"2.0","id":2,"result":"0x4a8a4c0517381924f9838102c5a4dcb7"}4< {5 "jsonrpc": "2.0",6 "method": "eth_subscription",7 "params": {8 "subscription": "0x4a8a4c0517381924f9838102c5a4dcb7",9 "result": {10 "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd",11 "blockHash": "0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04",12 "blockNumber": "0x29e87",13 "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003",14 "logIndex":"0x0",15 "topics":["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"],16 "transactionHash": "0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4",17 "transactionIndex": "0x0"18 }19 }20}21Exibir tudoCopiar
eth_unsubscribe
Cancela uma assinatura existente para que não sejam enviados mais eventos.
Parâmetros
- Inscrição ID, como retornado anteriormente de uma chamada de
eth_subscribe
.
Retornos
true
se uma assinatura foi cancelada com sucesso, ou false
se não existir nenhuma assinatura com o ID fornecido.
Exemplo:
Requisição
1curl https://eth-mainnet.alchemyapi.io/v2/your-api-key2-X POST3-H "Content-Type: application/json"4-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'56
Resultado
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": true5}Copiar
Cadastre-se com o Alchemy(opens in a new tab) gratuitamente, confira a nossa documentação(opens in a new tab), e para receber as últimas notícias, siga-nos no Twitter(opens in a new tab).
Última edição: @pettinarip(opens in a new tab), 8 de dezembro de 2023