Criando o pacote nestjs-web3js: Integração do NestJS com Web3.js
O NestJS é um framework para a construção de aplicativos Node.js escaláveis e eficientes. Por outro lado, o Web3.js é uma biblioteca JavaScript para interagir com a blockchain Ethereum. Neste artigo, vamos explorar como criar um pacote chamado nestjs-web3js
que permite a integração fácil e eficiente do NestJS com o Web3.js.
Se você quiser entender um pouco como funciona o pacote web3.js, veja os artigos abaixo:
Minting de NFTs com NestJS e web3.js | by Cláudio Rapôso | Jul, 2023 | Medium
Visão geral do pacote
O pacote nestjs-web3js
é projetado para fornecer um módulo do NestJS chamado Web3jsModule
e um serviço correspondente chamado Web3jsService
. Ele permite que os desenvolvedores acessem a instância do Web3.js de forma centralizada e fácil em seus aplicativos NestJS.
Estrutura do pacote
A estrutura básica do pacote nestjs-web3js
é a seguinte:
nestjs-web3js
├── src
│ └── web3js
│ ├── dto
│ │ └── create-web3js-service.dto.ts
│ ├── web3js.module.ts
│ └── web3js.service.ts
└── index.ts
A pasta src
contém todo o código-fonte do pacote, e o arquivo index.ts
é usado para exportar os principais componentes do pacote.
Componentes principais
Vamos analisar os principais componentes do pacote nestjs-web3js
:
Web3jsModule
O Web3jsModule
é um módulo do NestJS que fornece o serviço Web3jsService
para toda a aplicação. Ele é projetado para ser importado no módulo principal do NestJS usando o método forRoot
.
Aqui está a implementação do Web3jsModule
:
import { DynamicModule, Global, Module } from '@nestjs/common';
import { Web3jsService } from './web3js.service';
import Web3 from 'web3';
import { CreateWeb3jsServiceDto } from './dto/create-web3js-service.dto';
@Global()
@Module({
providers: [Web3jsService],
exports: [Web3jsService],
})
export class Web3jsModule {
static forRoot({ infuraUrl }: CreateWeb3jsServiceDto): DynamicModule {
return {
module: Web3jsModule,
providers: [
{
provide: Web3jsService,
useFactory: () => new Web3jsService(new Web3(infuraUrl)),
},
],
};
}
}
O Web3jsModule
é marcado com o decorador @Global
para permitir que o serviço Web3jsService
seja compartilhado entre os diferentes módulos do NestJS.
Web3jsService
O Web3jsService
é um serviço do NestJS que encapsula a instância do Web3.js. Ele fornece uma interface conveniente para interagir com a blockchain Ethereum em um aplicativo NestJS.
Aqui está a implementação do Web3jsService
:
import { Injectable } from '@nestjs/common';
import Web3 from 'web3';
@Injectable()
export class Web3jsService {
private readonly props: Required<Web3>;
constructor(web3: Web3) {
this.props = web3;
}
get web3(): Required<Web3> {
return this.props;
}
}
O Web3jsService
é injetável usando o decorador @Injectable
do NestJS. Ele recebe uma instância do Web3.js no construtor e fornece uma propriedade web3
para acessar a instância do Web3.js.
create-web3js-service.dto.ts
O arquivo create-web3js-service.dto.ts
define o esquema de validação e criação de um objeto de configuração para o serviço Web3jsService
. Ele usa a biblioteca nestjs-zod
para criar o esquema.
Aqui está a implementação do create-web3js-service.dto.ts
:
import { createZodDto } from 'nestjs-zod';
import { z } from 'nestjs-zod/z';
export const CreateWeb3jsServiceSchema = z
.object({
infuraUrl: z.string().url().min(3),
})
.required();
// class is required for using DTO as a type
export class CreateWeb3jsServiceDto extends createZodDto(
CreateWeb3jsServiceSchema,
) {}
O esquema CreateWeb3jsServiceSchema
define uma propriedade infuraUrl
que deve ser uma string contendo uma URL válida com pelo menos 3 caracteres. O CreateWeb3jsServiceDto
é criado usando a função createZodDto
do nestjs-zod
para aplicar o esquema de validação.
Usando o pacote nestjs-web3js
Agora que o pacote nestjs-web3js
está pronto, vamos ver como usá-lo em um aplicativo NestJS.
Instalação
Para começar, você precisa instalar o pacote nestjs-web3js
em seu aplicativo NestJS. Abra um terminal na raiz do seu projeto e execute o seguinte comando:
npm install nestjs-web3js
Importação e configuração
Após a instalação, você pode importar o módulo Web3jsModule
em seu módulo principal do NestJS. Certifique-se de fornecer a configuração necessária ao usar o método forRoot
.
Aqui está um exemplo de como importar e configurar o Web3jsModule
:
import { Module } from '@nestjs/common';
import { Web3jsModule, CreateWeb3jsServiceDto } from 'nestjs-web3js';
@Module({
imports: [
Web3jsModule.forRoot({
infuraUrl: 'https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY',
} as CreateWeb3jsServiceDto),
],
})
export class AppModule {}
Certifique-se de substituir 'https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY'
pelo URL do Infura correspondente à sua chave de API.
Uso do serviço
Uma vez configurado, você pode injetar o serviço Web3jsService
em seus controladores, serviços ou outros componentes do NestJS.
Aqui está um exemplo de como usar o serviço Web3jsService
em um controlador:
import { Controller, Get } from '@nestjs/common';
import { Web3jsService } from 'nestjs-web3js';
@Controller('example')
export class ExampleController {
constructor(private readonly web3jsService: Web3jsService) {}
@Get()
async getBlockNumber(): Promise<number> {
const blockNumber = await this.web3jsService.web3.eth.getBlockNumber();
return blockNumber;
}
}
Neste exemplo, o controlador ExampleController
injeta o serviço Web3jsService
por meio do construtor e usa a propriedade web3
para interagir com a instância do Web3.js.
Conclusão
Neste artigo, exploramos a criação do pacote nestjs-web3js
que fornece uma integração fácil e eficiente do NestJS com o Web3.js. Vimos como importar, configurar e usar o pacote em um aplicativo NestJS. Agora você pode aproveitar os recursos poderosos do Web3.js em seus aplicativos NestJS de maneira simples e organizada. Para obter mais informações e exemplos de uso, consulte a documentação oficial do NestJS e do Web3.js.
Espero que este artigo tenha sido útil e que você possa aproveitar ao máximo o pacote nestjs-web3js
em seus projetos.
O Pacote: nestjs-web3js — npm (npmjs.com)
Caso queira ler o artigo em inglês: Creating the nestjs-web3js Package: Integrating NestJS with Web3.js | by Cláudio Rapôso | Jul, 2023 | Medium