Desarrollo a escala completa de Web3 DApp usando Python y Brownie

Aprenda a desarrollar una DApp Web3 usando Python, Brownie, Solidity, otro módulo asistente. Tome el sorteo de la suerte, el juego de lotería, por ejemplo.

Este artículo comparte cómo desarrollar una DApp Web3 usando Python, Brownie, Solidity y otro software asistente. Esta aplicación básicamente puede usar Crypto para jugar un sorteo a través de redes blockchain. Es como cualquier juego de sorteo en el que el anfitrión puede configurar un juego de lotería y los jugadores que pagan y se unen pueden ganar un premio al azar o no.

Ingredientes en Web3 DApp Desarrollo a escala completa

Python, Brownie, Solidity, Openzeppelink, Ethereum, Ganache-CLI, MetaMask, Alchemy, Chainlink, Etherscan

Índice de la muestra de una solicitud de lotería

Desarrolle un contrato inteligente usando Solidity y Chainlink

Aquí está el flujo principal en la Lottery DApp integrada con múltiples redes de la siguiente manera:

  • Los usuarios pueden ingresar al fondo de la lotería
  • La lotería comienza y termina automáticamente
  • La aplicación puede seleccionar al azar un ganador

Hay algunas partes imprescindibles para compartir en términos de esta lógica de desarrollo de DApp en el contrato inteligente.

1. Cree un flujo lógico de lotería en un contrato inteligente de solidez agregando funciones

En un contrato inteligente de lotería, el viaje de juego básicamente incluye al menos

  • Ingrese el monto de la moneda
  • Obtenga la tarifa de transacción
  • Empieza la lotería
  • acabar con la loteria
  • Cumplir con la función de aleatoriedad

2. Pruebe la función de contrato inteligente de lotería creando un mainnet-fork env y un script de prueba.

Antes de hablar sobre el punto 2, asegúrese de notar pragma 0.8 que msg.sender ya no se paga automáticamente. Por lo tanto, debe hacerlo pagadero primero de esta manera:

players.push(payable(msg.sender));

Para agregar la prueba mainnet-fork network en el entorno local, aquí usamos Alchemy como host

Simplemente ingrese esta lista de comandos en la terminal:

brownie networks add development main net-fork cmd=ganache-cli host=http://127.0.0.1 fork=https://eth-mainnet.g.alchemy.com/v2/abcabc accounts=10 mnemonic=brownie port=8545

Tome la función getEntraceFee por ejemplo. Aquí está el resultado de la prueba ejecutando la brownie test –network mainnet-fork

Para el script de prueba, suscríbase a nuestro boletín Easy2Digital dejando un mensaje "Web3.0 DApp full script tutorial 5", que le enviaremos pronto.

3. Agregar declaración ENUM

Para una lotería, debemos configurar tres escenarios, que son la lotería abierta, cerrada y el cálculo del ganador. Aquí está el código de la siguiente manera:

enum LOTTERY_STATE {

OPEN,

CLOSED,

CALCULATING_WINNER

}

LOTTERY_STATE public lottery_state;

Entonces, para cualquier inicio de lotería, solo requerimos propietarios que puedan hacer una llamada en lugar de cualquier jugador del juego que tenga derecho a hacerlo. Para esto, podemos importar un propietario de contrato inteligente sol usando un zepelín abierto.

import "@openzeppelin/contracts/access/Ownable.sol";

function startLottery() public onlyOwner {

require(lottery_state == LOTTERY_STATE.CLOSED, "Can't start a new lottery yet!")

lottery_state = LOTTERY_STATE.OPEN;

};

Y el brownie-config.yaml , asegúrese de usar la última versión de Open Zeppelin. Por ejemplo, el mío es 4.8.0

- OpenZeppelin/openzeppelin-contracts@4.8.0

4. Aleatoriedad

Una vez que ha comenzado la lotería, es necesario generar un resultado al azar. Por lo tanto, necesitamos un paquete de números aleatorios para cumplir esta función y entregar el resultado.

import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";

Según las funciones y los parámetros de aleatoriedad, debemos referirnos a ellos e implementarlos en el contrato inteligente. A continuación se muestran los lugares que se actualizarán de la siguiente manera:

Contrato –> para agregar VRFConsumerBase en la función de lotería

In the contract, we need to add some global variables as follows:

address payable[] public players;

address payable public recentWinner;

uint256 public randomness;

uint256 public fee;

bytes32 public keyhash;

Constructor → para agregar de la siguiente manera:

contract Lottery is VRFConsumerBase, Ownable {

address payable[] public players;

address payable public recentWinner;

uint256 public randomness;

uint256 public usdEntryFee;

AggregatorV3Interface internal ethUsdPriceFeed;

enum LOTTERY_STATE {

OPEN,

CLOSED,

CALCULATING_WINNER

}

LOTTERY_STATE public lottery_state;

uint256 public fee;

bytes32 public keyhash;

constructor(

address _priceFeedAddress,

address _vrfCoordinator,

address _link,

uint256 _fee,

bytes32 _keyhash

) public VRFConsumerBase(_vrfCoordinator, _link) {

usdEntryFee = 50 * (10**18);

ethUsdPriceFeed = AggregatorV3Interface(_priceFeedAddress);

lottery_state = LOTTERY_STATE.CLOSED;

fee = _fee;

keyhash = _keyhash;

}

Compilado!!

Implementación principal y secuencias de comandos auxiliares de Python en la aplicación de lotería

Hay algunos scripts básicos de Python para implementar en esta aplicación de Lotería. Aquí están los detalles de la siguiente manera:

1. Script principal, como deployment_lottery.py en selecciones de elementos de cuentas, red, billeteras, etc., etc.

1) Identificador de cuenta y capturador

En un juego de lotería real, las personas pueden usar diferentes tipos de cuentas para unirse y jugar. Por lo tanto, el script principal debe poder detectar la cuenta que usan los usuarios, lo que incluye la red. Aquí está el ejemplo de código de la siguiente manera:

def deploy_lottery():

account = get_account(id="easy2digitalAccount")

2) Contrato, Redes, Identificador de Monedero y Grabber

   lottery = Lottery.deploy(

       get_contract ( "eth_usd_price_feed" ).address,

       get_contract ( "vrf_coordinator" ).address,

       get_contract ( "link_token" ).address,

config[ "networks" ][network.show_active()][ "fee" ],

config[ "networks" ][network.show_active()][ "keyhash" ],

{ "from" : account },

       publish_source =config[ "networks" ][network.show_active()].get(

           "verify" , False ),

)

3) Funciones sobre el inicio de la lotería, la entrada de la tarifa y el final

Extracto de la función de implementación, también es necesario tener funciones de inicio, entrada y finalización en el script de Python que funciona con el contrato inteligente de la Lotería.

  • start_lottery()
  • enter_lottery()
  • end_lottery()

Tome start_lottery() para el ejemplo

def start_lottery ():

   account = get_account ()

   lottery = Lottery[- 1 ]

   starting_tx = lottery .startLottery({ "from" : account })

   starting_tx .wait( 1 )

   print ( "The lottery has started!!" )

2. Asistente de secuencias de comandos.py

Con respecto a este archivo auxiliar de python, se usa para admitir la ejecución del script de implementación de Python. Los importamos al comienzo del script de implementación:

from scripts.scriptAssistant import get_account, get_contract, fund_with_link
Aquí están las cuatro funciones principales en el guión asistente
  • get_account()
  • get_contract()
  • deploy_mocks()
  • fund_with_links()

Tome la función Get_account por ejemplo

def get_account(index=None, id=None):

if index:

return accounts[index]

if id:

return accounts.load(id)

if (

network.show_active() in LOCAL_BLOCKCHAIN_ENVIRONMENTS or network.show_active(

) in FORKED_LOCAL_ENVIRONMENTS

):

return accounts[0]

Agregar contratos de prueba de token simulado, VRF y enlace

Basado en el constructor de contratos inteligentes para crear una aplicación de Lotería, necesitamos algunos recursos externos para integrarnos con nuestra aplicación. En este artículo, tomamos Chainlink como muestra de recursos. A continuación se muestran los 5 componentes que necesitamos de la siguiente manera:

  • Dirección de alimentación de precios
  • Coordinador VRF
  • Ficha de enlace
  • Hash clave
  • Honorarios

Necesitamos ir a Chainlink GitHub para copiar la última versión y pegarla en nuestra carpeta de contratos por separado. La muestra es la siguiente:

Para conocer la dirección del feed de precios, la clave del token del enlace, el hash de la clave y la tarifa, visite el sitio web oficial de Chainlink y busque la información relacionada.

Resto de los componentes críticos: config YAML y env

El resto de los componentes clave son el archivo YAML de configuración de brownie y el archivo env. Para obtener más detalles, consulte el artículo anterior sobre el contrato inteligente fund-me. Básicamente, la configuración es la misma que la aplicación de lotería ahora estamos hablando

Brownie FundMe Smart Contract implementado en Ethereum usando Python y Web3

Examen de la unidad

Como se mencionó en los artículos anteriores, una de las funciones más poderosas que ofrece Brownie es el entorno de prueba. Sin duda, no estamos dispuestos a lanzar la aplicación antes de haber confirmado que todo está listo. Por lo tanto, la prueba es un paso obligatorio, independientemente de la DApp que esté desarrollando.

En cuanto a los componentes de prueba, básicamente, debemos seguir los pasos del contrato inteligente y probarlos uno por uno. Aquí están los 5 pasos de la siguiente manera:

  • test_get_entrance_fee()
  • test_cant_enter_unless_starter()
  • test_can_enter_unless_starter()
  • test_can_end_lottery()
  • test_can_pick_winner_correctly()

Tome el test_get_entrance_fee() por ejemplo

def test_get_entrance_fee():
if network.show_active() notinLOCAL_BLOCKCHAIN_ENVIRONMENTS:
pytest.skip()
# Arrange
lottery = deploy_lottery()
# Act
expected_entrance_fee = Web3.toWei(0.025, "ether")
entrance_fee = lottery.getEntranceFee()
# Assert
assertexpected_entrance_fee == entrance_fee

Conecte la red auténtica y hágala vivir

Una vez que se realizan las pruebas y todo va bien, ¡es hora de conectar la red real y comenzar! Para obtener más detalles, consulte el artículo anterior sobre el uso de Infura y MetaMask para implementar en Ethereum.

Full Python y Solidity Script de Web3 DApp Full Scale – Aplicación de lotería

Si está interesado en el conjunto completo de scripts de Web3 DApp Lottery, suscríbase a nuestro boletín de noticias agregando el mensaje "Web3.0 tutorial 5" . Le enviaremos el guión inmediatamente a su buzón.

Espero que disfrute leyendo Web3 DApp Full Scale Development usando Python y Brownie – Lotería. Si lo hiciste, apóyanos haciendo una de las cosas que se enumeran a continuación, porque siempre ayuda a nuestro canal.

  • Apoya y dona a mi canal a través de PayPal ( paypal.me/Easy2digital )
  • Suscríbete a mi canal y activa la campanita de notificaciones Easy2Digital Youtube channel .
  • Sigue y dale me gusta a mi página Easy2Digital Facebook page
  • Comparte el artículo en tu red social con el hashtag #easy2digital
  • Te suscribes a nuestro boletín semanal para recibir los últimos artículos, videos y códigos de descuento de Easy2Digital
  • Suscríbase a nuestra membresía mensual a través de Patreon para disfrutar de beneficios exclusivos ( www.patreon.com/louisludigital )