Vollständige Web3-DApp-Entwicklung mit Python und Brownie

0

Erfahren Sie, wie Sie eine Web3-DApp mit Python, Brownie, Solidity und anderen Hilfsmodulen entwickeln. Nehmen Sie zum Beispiel die Verlosung oder das Lotteriespiel

In diesem Artikel erfahren Sie, wie Sie eine Web3-DApp mit Python, Brownie, Solidity und anderer Hilfssoftware entwickeln. Diese Anwendung kann grundsätzlich Krypto nutzen, um über Blockchain-Netzwerke eine Verlosung zu spielen. Es ist wie bei jedem Lotteriespiel, bei dem der Gastgeber ein Lotteriespiel organisieren kann und die Spieler, die dafür bezahlen und teilnehmen, zufällig einen Preis gewinnen können oder nicht.

Zutaten für die vollständige Entwicklung von Web3 DApp

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

Inhaltsverzeichnis zum Beispiel eines Lotterieantrags

Entwickeln Sie einen intelligenten Vertrag mit Solidity und Chainlink

Hier ist der Hauptablauf in der Lotterie-DApp, die in mehrere Netzwerke integriert ist, wie folgt:

  • Benutzer können am Lotteriefonds teilnehmen
  • Die Lotterie beginnt und endet automatisch
  • Die Anwendung kann einen Gewinner nach dem Zufallsprinzip auswählen

Im Hinblick auf diese DApp-Entwicklungslogik sind im Smart Contract einige wichtige Teile zu teilen.

1. Erstellen Sie einen logischen Lotteriefluss in einem Solidity-Smart-Vertrag, indem Sie Funktionen hinzufügen

In einem Lotterie-Smart-Vertrag umfasst die Spielreise grundsätzlich zumindest

  • Geben Sie den Währungsbetrag ein
  • Holen Sie sich die Transaktionsgebühr
  • Starten Sie die Lotterie
  • Schluss mit der Lotterie
  • Erfüllen Sie die Zufallsfunktion

web3 dapp

2. Testen Sie die Lotterie-Smart-Contract-Funktion, indem Sie eine mainnet-fork env und ein Testskript erstellen.

Bevor Sie über Punkt 2 sprechen, beachten Sie bitte unbedingt Pragma 0.8, das msg.sender nicht mehr automatisch zahlbar macht. Sie müssen es also zuerst wie folgt zahlbar machen:

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

Um das Testen mainnet-fork network in der lokalen Umgebung hinzuzufügen, verwenden wir hier Alchemy als Host

Geben Sie einfach diese Befehlsliste in das Terminal ein:

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

Nehmen Sie zum Beispiel die Funktion getEntraceFee. Hier ist das Testergebnis der Ausführung des brownie test –network mainnet-fork

Für das Testskript abonnieren Sie bitte unseren Easy2Digital-Newsletter, indem Sie eine Nachricht „Web3.0 DApp vollständiges Skript-Tutorial 5“ hinterlassen, die wir Ihnen in Kürze zusenden.

3. ENUM-Anweisung hinzufügen

Für eine Lotterie müssen wir drei Szenarien einrichten: die offene, die geschlossene Lotterie und die Berechnung des Gewinners. Hier ist der Code wie folgt:

enum LOTTERY_STATE {

OPEN,

CLOSED,

CALCULATING_WINNER

}

LOTTERY_STATE public lottery_state;

Dann benötigen wir für jeden Lotteriestart nur Besitzer, die einen Anruf tätigen können, und nicht alle Spielteilnehmer, die dazu berechtigt sind. Zu diesem Zweck können wir mithilfe von Open Zeppelin ein Smart-Contract-Inhaber-Sol importieren.

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;

};

Stellen Sie bei der brownie-config.yaml sicher, dass Sie die neueste Open-Zeppelin-Version verwenden. Meiner ist zum Beispiel 4.8.0

- OpenZeppelin/openzeppelin-contracts@4.8.0

4. Zufälligkeit

Nachdem die Lotterie begonnen hat, ist es notwendig, ein zufälliges Ergebnis zu generieren. Daher benötigen wir ein Zufallszahlenpaket, um diese Funktion zu erfüllen und das Ergebnis zu liefern.

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

Basierend auf den Zufallsfunktionen und -parametern müssen wir auf sie verweisen und sie im Smart Contract bereitstellen. Nachfolgend sind die Orte aufgeführt, die wie folgt aktualisiert werden müssen:

Vertrag –> um VRFConsumerBase in der Lotteriefunktion hinzuzufügen

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;

Konstruktor → wie folgt hinzufügen:

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;

}

Zusammengestellt!!

Hauptbereitstellungs- und Hilfs-Python-Skripte in der Lotterieanwendung

In dieser Lotterieanwendung können einige Kern-Python-Skripte bereitgestellt werden. Hier die Details wie folgt:

1. Hauptskript, z. B. „deploy_lottery.py“ für die Elementauswahl von Konten, Netzwerk, Wallets usw.

1) Konto-ID und Grabber

Bei einem echten Lotteriespiel könnten die Leute unterschiedliche Arten von Konten verwenden, um teilzunehmen und zu spielen. Daher muss das Hauptskript in der Lage sein, das von Benutzern verwendete Konto zu erkennen, einschließlich des Netzwerks. Hier ist das Codebeispiel wie folgt:

def deploy_lottery():

account = get_account(id="easy2digitalAccount")

2) Vertrag, Netzwerke, Wallet-Identifikator und 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) Funktionen zu Lotteriestart, Gebühreneingabe und Ende

Auszug aus der Bereitstellungsfunktion: Außerdem sind Start-, Einstiegs- und Endfunktionen im Python-Skript erforderlich, das mit dem Lottery-Smart-Vertrag funktioniert.

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

Nehmen Sie als Beispiel start_lottery()

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. scriptAssistant.py

Diese Assistenten-Python-Datei wird zur Unterstützung der Ausführung des Python-Bereitstellungsskripts verwendet. Wir importieren sie zu Beginn des Bereitstellungsskripts:

from scripts.scriptAssistant import get_account, get_contract, fund_with_link
Hier sind die vier Hauptfunktionen im Assistentenskript
  • get_account()
  • get_contract()
  • deploy_mocks()
  • fund_with_links()

Nehmen Sie zum Beispiel die Funktion Get_account

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]

Fügen Sie Mock-, VRF- und Link-Token-Testverträge hinzu

Basierend auf dem Smart-Contract-Konstruktor zum Aufbau einer Lotterieanwendung benötigen wir einige externe Ressourcen zur Integration in unsere Anwendung. In diesem Artikel verwenden wir Chainlink als Ressourcenbeispiel. Nachfolgend finden Sie die 5 Komponenten, die wir benötigen:

  • Preis-Feed-Adresse
  • VRF-Koordinator
  • Link-Token
  • Schlüssel-Hash
  • Gebühren

Wir müssen zu Chainlink GitHub gehen, um die neueste Version zu kopieren und sie separat in unseren Vertragsordner einzufügen. Das Beispiel sieht wie folgt aus:

web3 dapp

Für die Preis-Feed-Adresse, den Link-Token-Schlüssel, den Schlüssel-Hash und die Gebühr besuchen Sie bitte die offizielle Website von Chainlink und schlagen Sie die entsprechenden Informationen nach.

Rest der kritischen Komponenten – YAML-Konfiguration und Umgebung

Die restlichen Schlüsselkomponenten sind die Brownie-Konfigurations-YAML-Datei und die Env-Datei. Weitere Informationen finden Sie im vorherigen Artikel zum Fund-me-Smart-Vertrag. Im Grunde ist die Einstellung dieselbe wie bei der Lotterieanwendung, über die wir gerade sprechen

Brownie FundMe Smart Contract wird auf Ethereum mit Python und Web3 bereitgestellt

Unit-Tests

Wie in den vorherigen Artikeln erwähnt, ist die Testumgebung eine der leistungsstärksten Funktionen von Brownie. Ohne Zweifel sind wir nicht bereit, mit der Bewerbung zu beginnen, bevor wir bestätigt haben, dass alles fertig ist. Daher ist das Testen ein Muss, unabhängig davon, welche DApp Sie entwickeln.

Was die Testkomponenten betrifft, müssen wir im Grunde die Smart-Contract-Schritte befolgen und sie einzeln testen. Hier sind die 5 Schritte wie folgt:

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

Nehmen Sie zum Beispiel test_get_entrance_fee()

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

Verbinden Sie das Authentic Network und machen Sie es live

Sobald die Tests abgeschlossen sind und alles gut läuft, ist es an der Zeit, das echte Netzwerk anzuschließen und loszulegen! Weitere Informationen finden Sie im vorherigen Artikel zur Verwendung von Infura und MetaMask für die Bereitstellung auf Ethereum.

Vollständiges Python- und Solidity-Skript von Web3 DApp Full Scale – Lotterieanwendung

Wenn Sie an den vollständigen Skripten der Web3 DApp Lottery interessiert sind, Bitte abonnieren Sie unseren Newsletter , indem Sie die Nachricht „Web3.0 Tutorial 5“ hinzufügen. . Wir senden Ihnen das Skript umgehend in Ihr Postfach.

Ich wünsche Ihnen viel Spaß beim Lesen von „Web3 DApp Full Scale Development Using Python and Brownie – Lottery“. Wenn ja, unterstützen Sie uns bitte, indem Sie eine der unten aufgeführten Maßnahmen ergreifen, da dies unserem Kanal immer weiterhilft.

  • Unterstützen Sie meinen Kanal und spenden Sie über PayPal ( paypal.me/Easy2digital )
  • Abonnieren Sie meinen Kanal und aktivieren Sie die Benachrichtigungsglocke des Easy2Digital-Youtube-Kanals .
  • Folgen und liken Sie meine Easy2Digital-Facebook-Seite
  • Teilen Sie den Artikel in Ihrem sozialen Netzwerk mit dem Hashtag #easy2digital
  • Sie melden sich für unseren wöchentlichen Newsletter an, um die neuesten Artikel, Videos und Rabattcodes von Easy2Digital zu erhalten
  • Abonnieren Sie unsere monatliche Mitgliedschaft über Patreon, um exklusive Vorteile zu genießen ( www.patreon.com/louisludigital )

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert