Lo que creará, vea la demostración en vivo en Bitfinity test network y el repositorio de git .
Bienvenido a esta guía completa donde crearemos una plataforma benéfica descentralizada Web3 utilizando Next.js, Solidity y TypeScript. Al final de este tutorial, tendrá una comprensión clara de:
Como beneficio adicional por participar en este tutorial, puede ganar fácilmente una copia de nuestro prestigioso libro sobre cómo convertirse en un desarrollador de solidez en demanda. Esta oferta es gratuita para las primeras 300 personas . Para obtener instrucciones sobre cómo ganar, mire el breve vídeo a continuación.
Necesitará las siguientes herramientas instaladas para construir conmigo:
Para configurar MetaMask para este tutorial, mire el video instructivo a continuación:
Una vez que haya completado la configuración, será elegible para recibir una copia gratuita de nuestro libro. Para reclamar su libro, complete el formulario para enviar su prueba de trabajo .
Mire los siguientes videos instructivos para recibir hasta 3 meses de cursos premium gratuitos en
Academia de Mentores Dapp, que incluye:
Comience su viaje con Bitfinity hoy. Experimente un proceso de desarrollo rápido, simple y sin complicaciones mientras crea su primera dApp de seguimiento de donaciones benéficas. Implemente sus contratos inteligentes en la red Bitfinity y genere un impacto positivo.
Dicho esto, pasemos al tutorial y configuremos nuestro proyecto.
Comenzaremos clonando un repositorio frontend preparado y configurando las variables de entorno. Ejecute los siguientes comandos:
git clone https://github.com/Daltonic/dappFundsX cd dappFundsX yarn install git checkout no_redux_no_blockchain
A continuación, cree un archivo .env
en la raíz del proyecto e incluya las siguientes claves:
NEXT_PUBLIC_RPC_URL=http://127.0.0.1:8545 NEXT_PUBLIC_ALCHEMY_ID=<YOUR_ALCHEMY_PROJECT_ID> NEXT_PUBLIC_PROJECT_ID=<WALLET_CONNECT_PROJECT_ID> NEXTAUTH_URL=http://localhost:3000 NEXTAUTH_SECRET=somereallysecretsecret
Reemplace <YOUR_ALCHEMY_PROJECT_ID>
y <WALLET_CONNECT_PROJECT_ID>
con sus respectivos ID de proyecto.
YOUR_ALCHEMY_PROJECT_ID
: Obtenga la clave aquí WALLET_CONNECT_PROJECT_ID
: Obtenga la clave aquí
Finalmente, ejecute yarn dev
para iniciar el proyecto.
Nuestra interfaz para este proyecto es sólida y está lista para alguna integración de contratos inteligentes, pero necesitaremos Reduxify nuestra aplicación para habilitar un espacio de datos compartido.
La imagen de arriba representa la estructura de nuestra tienda Redux, será simple ya que no estamos creando ningún proyecto demasiado complejo.
Configuraremos Redux para administrar el estado global de nuestra aplicación. Sigue estos pasos:
store
en la raíz del proyecto.store
, crea dos carpetas: actions
y states
.states
, cree un archivo globalStates.ts
.
actions
, cree un archivo globalActions.ts
.
globalSlices.ts
dentro de la carpeta de la store
.
index.ts
dentro de la carpeta store
.
pages/_app.ts
con el proveedor de Redux.
Nuestra aplicación ha sido empaquetada con el kit de herramientas de Redux y volveremos a visitar Redux cuando integremos el backend con el frontend.
A continuación, desarrollaremos el contrato inteligente para nuestra plataforma:
contracts
en la raíz del proyecto.contracts
, cree un archivo DappFund.sol
y agregue el código del contrato a continuación.
El contrato DappFund
facilitará la creación, actualización y donación a organizaciones benéficas, así como funciones administrativas como cambiar el impuesto a las organizaciones benéficas y prohibir una organización benéfica.
Aquí hay un desglose función por función:
constructor()
: esta función establece el impuesto benéfico inicial cuando se implementa el contrato. Se ejecuta solo una vez durante la implementación del contrato.createCharity()
: esta función permite a los usuarios crear una nueva organización benéfica. Requiere varios parámetros como el nombre, descripción, imagen, perfil y monto de la organización benéfica. Comprueba que estos parámetros sean válidos y luego crea un nuevo CharityStruct
y lo agrega al mapeo de charities
.updateCharity()
: esta función permite al propietario de una organización benéfica actualizar sus detalles. Comprueba que la organización benéfica existe y que el remitente es el propietario de la organización benéfica antes de actualizar los detalles de la organización benéfica.deleteCharity()
: esta función permite al propietario de una organización benéfica marcarla como eliminada. Comprueba que la organización benéfica existe y que el remitente es el propietario de la misma antes de marcarla como eliminada.toggleBan()
: esta función permite al propietario del contrato prohibir o cancelar la prohibición de una organización benéfica. Comprueba que la organización benéfica existe antes de cambiar su estado prohibido.donate()
: esta función permite a los usuarios donar a una organización benéfica. Comprueba que la organización benéfica existe, que no está prohibida y que aún no ha alcanzado su objetivo de recaudación de fondos. Luego incrementa el recuento total de donaciones, crea una nueva SupportStruct
y la agrega al mapeo supportersOf
. También actualiza el monto recaudado y el recuento de donaciones de la organización benéfica.changeTax()
: esta función permite al propietario del contrato cambiar el impuesto de caridad. Comprueba que el nuevo porcentaje de impuesto sea válido antes de actualizar el impuesto.getCharity()
: esta función permite que cualquiera obtenga los detalles de una organización benéfica. Devuelve el CharityStruct
asociado con el ID proporcionado.getCharities()
: esta función permite que cualquiera obtenga los detalles de todas las organizaciones benéficas activas. Devuelve una matriz de objetos CharityStruct
.getMyCharities()
: esta función permite al usuario obtener los detalles de todas sus organizaciones benéficas activas. Devuelve una matriz de objetos CharityStruct
.getSupports()
: esta función permite que cualquiera obtenga los detalles de todos los partidarios de una organización benéfica específica. Devuelve una matriz de objetos SupportStruct
.payTo()
: esta función interna se utiliza para transferir fondos. Envía la cantidad especificada de Ether a la dirección indicada.currentTime()
: esta función interna devuelve la hora actual en segundos desde la época de Unix. Se utiliza para marcar la hora de donaciones y creaciones benéficas.Ahora, implementemos nuestro contrato inteligente y rellenémoslo con algunos datos ficticios:
scripts
en la raíz del proyecto.scripts
, cree un archivo deploy.js
y un archivo seed.js
y agregue los siguientes códigos.
Implementar secuencia de comandos
Guión de semillas
Ejecute los siguientes comandos para implementar el contrato y inicializarlo con datos:
yarn hardhat node # Run in terminal 1 yarn hardhat run scripts/deploy.js # Run in terminal 2 yarn hardhat run scripts/seed.js # Run in terminal 2
Si lo hizo correctamente, debería ver un resultado similar al siguiente:
En este punto podemos comenzar la integración de nuestro contrato inteligente a nuestra interfaz.
Primero, cree una carpeta services
en la raíz del proyecto y, dentro de ella, cree un archivo blockchain.tsx
. Este archivo contendrá funciones para interactuar con nuestro contrato inteligente.
El código proporcionado es una implementación TypeScript de nuestro servicio blockchain para interactuar con nuestro contrato inteligente. Este servicio permite a los usuarios realizar acciones en nuestra plataforma benéfica, incluida la creación y actualización de organizaciones benéficas, la realización de donaciones y más.
Aquí hay un desglose función por función:
getEthereumContracts()
: esta función obtiene las instancias de contrato de Ethereum con las que interactuará el servicio. Comprueba si el usuario tiene una cuenta Ethereum conectada y la usa para interactuar con el contrato; de lo contrario, utiliza una billetera creada aleatoriamente.getAdmin()
: esta función devuelve el propietario del contrato.getCharities()
, getMyCharities()
, getCharity()
: estas funciones recuperan todas las organizaciones benéficas, las creadas por el usuario actual y una organización benéfica específica por su ID, respectivamente.getSupporters()
: esta función busca los seguidores de una organización benéfica específica por su ID.createCharity()
, updateCharity()
: estas funciones permiten a un usuario crear una nueva organización benéfica o actualizar una existente, respectivamente.makeDonation()
: esta función permite a un usuario hacer una donación a una organización benéfica específica.deleteCharity()
: esta función permite al propietario de una organización benéfica eliminarla.banCharity()
: esta función permite al propietario del contrato prohibir una organización benéfica.structuredCharities()
, structuredSupporters()
: estas son funciones auxiliares que estructuran los datos devueltos del contrato en un formato más utilizable.
Actualice el archivo provider.tsx
dentro de services
para incluir la red bitfinity
usando los siguientes códigos.
A continuación, vincularemos las funciones del servicio blockchain a sus respectivas interfaces en el frontend:
No 1: Mostrar todas pages/index.tsx
para obtener datos de la función getCharities()
.
Observe cómo se utiliza Redux para almacenar datos de blockchain antes de que se muestren en la pantalla.
No 2: Mostrar pages/projects.tsx
de actualización de organizaciones benéficas del usuario para usar el enlace useEffect()
para obtener las organizaciones benéficas del usuario actual.
Tenga en cuenta el uso del gancho useEffect()
para recuperar las organizaciones benéficas del usuario actual y cómo se usa Redux para manejar y mostrar datos de la cadena de bloques en múltiples componentes. Este será un patrón repetido en todas las páginas y componentes.
No 3: Creación de nuevas organizaciones benéficas Actualice pages/donations/create.tsx
para usar la función createCharity()
para el envío de formularios.
No 4: Mostrar pages/donations/[id].tsx
de actualización de organización benéfica única para usar las funciones getServerSideProps()
, getCharity()
y getSupporters()
para recuperar organizaciones benéficas y patrocinadores por ID.
No 5: Editar organizaciones benéficas existentes Actualice pages/donations/edit/[id].tsx
para usar la función getCharity()
para recuperar organizaciones benéficas por ID y completar los campos del formulario.
¿Viste cómo se usó la función getCharity()
para recuperar organizaciones benéficas por ID y también cómo se usó para completar los campos del formulario?
Como hicimos con las páginas anteriores, actualicemos los siguientes componentes para interactuar con el contrato inteligente:
No 1: Manejo de la prohibición de organizaciones benéficas Actualice components/Ban.tsx
para usar la función handleBanning()
para llamar a la función banCharity()
.
No 2: Manejo de la eliminación de organizaciones benéficas Actualice components/Delete.tsx
para usar las funciones handleDelete()
y deleteCharity()
para ejecutar un procedimiento de eliminación de organizaciones benéficas.
No 3: Hacer donaciones a organizaciones benéficas Actualice el archivo components/Donor.tsx
para usar la función handleSubmit()
para enviar el pago al contrato inteligente usando la función makeDonation()
.
Aquí están el resto de los componentes que también debes actualizar debido a la integración de Redux en ellos.
El componente NavBtn Revisa y actualiza el componente que permite a los usuarios navegar, eliminar y editar información de organizaciones benéficas. Utilice Redux para activar el modo de eliminación al hacer clic.
El componente de pago revisa y actualiza la implementación de Redux para activar los modos de donación, simpatizantes y prohibición al hacer clic en sus respectivos botones.
El componente de soporte revisa y actualiza la implementación de Redux para cerrar el modal de soporte cuando se hace clic en el botón cerrar.
Al implementar estas actualizaciones, todos los componentes y páginas ahora están conectados al contrato inteligente, lo que marca la finalización del proyecto.
Si su servidor Nextjs estuvo inactivo todo este tiempo, puede reactivarlo ejecutando yarn dev
.
Para obtener más información, recomendamos ver el vídeo completo de esta compilación en nuestro canal de YouTube .
En este tutorial, hemos creado una plataforma benéfica descentralizada utilizando Next.js, Solidity y TypeScript. Configuramos el entorno de desarrollo, construimos la tienda Redux e implementamos el contrato inteligente en la cadena de bloques. Al integrar el contrato inteligente con la interfaz, creamos una experiencia de usuario perfecta.
A lo largo del tutorial, adquirió valiosas habilidades en la creación de aplicaciones Web3, la elaboración de contratos inteligentes y la incorporación de verificación de tipos estáticos.
Ahora está listo para crear su propia plataforma benéfica descentralizada. ¡Feliz codificación y libera tu innovación en el mundo de Web3!