Verbinden Sie Web3 Smart Contracts mithilfe von Python mit der Ganache-CLI

Erstellen Sie ein Web3-Smart-Contract-Skript, das eine Verbindung zur Ganache-CLI herstellt, um DApps mit Python zu entwickeln und zu testen.

Für die Web3.0-Smart-Contract-Entwicklung ist das Testen oder UAT einer der wichtigsten Prozesse, bevor der Smart Contract im echten Blockchain-Netzwerk lebt. Daher werde ich untersuchen, wie man mit Python und Ganache ein Skript entwickelt und einen intelligenten Vertrag erstellt, der die lokale Umgebung testet.

Zutaten zum Erstellen von Web3-Smart-Verträgen, die mithilfe von Ganache und Python auf einer lokalen visuellen Ethereum-Blockchain bereitgestellt werden

Python3, Ganache, Solcx, Solidity, Web3, Json, OS, Dotenv

Agenda

Web3 Smart Contract – Installieren Sie Solcx und Jsonify Ihre Solidity-Datei

Als Erstes benötigt das Skript eine Sprache, um Smart Contracts auf Blockchain-Plattformen wie dem bekanntesten Ethereum zu implementieren. Für die Sprache verwende ich Solidity und werde in einem anderen kommenden Artikel weitere Einzelheiten mitteilen.

Im Hinblick auf Solidity können wir Solcx verwenden, um den Smart-Contract-Datensatz in einer Python-Entwicklungsumgebung zu kompilieren. Python-Wrapper und Versionsverwaltungstool für den Solc Solidity-Compiler.

Wenn Sie die Solidity-Datei easy2digital.sol für diesen Artikel haben möchten, abonnieren Sie bitte unseren Newsletter und hinterlassen Sie eine Nachricht „Web3.0 + 1 Solidity and Ganache“ . Wir senden Ihnen so schnell wie möglich zu.

Schritt 1. Installieren Sie Solcx, öffnen und kompilieren Sie Ihre Solidity-Datei im Python-Skript

Nehmen Sie als Beispiel den Mac. Hier ist die Solcx-Installation im Terminal wie folgt:

pip install py-solc-x

Dann müssen wir Solcx und eine erforderliche Methode in das Python-Skript importieren

From solcx import compile_standard

With open(“./your solidity file name.sol”, “r”) as file:

Single_contract_file = file.read()

Zuletzt müssen wir die Methode „compile_standard“ verwenden, um die Informationen der Sol-Datei in eine Variable zu kompilieren

compiled_sol = compile_standard(

{

"language": "Solidity",

"sources": {"your file name.sol": {"content": ;single_contract_file}},

"settings": {

"outputSelection": {

"*": {"*": ["abi", "metadata", "evm.bytecode", "evm.sourceMap"]}

}

},

},

solc_version="0.8.7",

)

Schritt 2: Jsonifizieren Sie die kompilierte Datei

Um das Abrufen der Dateidaten und die Interaktion mit dem Blockchain-Netzwerk und den Transaktionen bequemer zu gestalten, können wir die kompilierten Daten in ein JSON-Datenformat jsonifizieren. Hier ist der Code wie folgt:

with open("compiled_solCode.json", "w") as file:

json.dump(compiled_sol, file)

Web3 Smart Contract – Bytecode und ABI

Sowohl ABI- als auch Bytecode-Informationen sind für die Interaktion mit dem Ethereum-Blockchain-Netzwerk und die Steuerung der Computerkommunikation von entscheidender Bedeutung.

Bytecode

Bytecode ist die Information, die Anweisungen an den Computer in Binärform enthält. Jede geschriebene Codezeile wird in Opcodes zerlegt, sodass der Computer genau weiß, was zu tun ist, wenn er unseren Code ausführt.

In der Ethereum-Welt ist der Bytecode tatsächlich das, was in der Ethereum-Blockchain bereitgestellt wird. Wenn wir in einem Ethereum-Netzwerk bereitstellen und die Transaktion mit einer browserbasierten Wallet wie Metamask bestätigen, können wir tatsächlich den Bytecode sehen, der bereitgestellt wird.

# Get Bytecode

Bytecode = compiled_sol['contracts']['easy2digital.sol']['SingleContract']["evm"]["bytecode"]["object"]

ABI

ABI ist die Binärschnittstelle der Anwendung. Es definiert die Methoden und Variablen, die in einem Smart Contract verfügbar sind und die wir zur Interaktion mit diesem Smart Contract verwenden können. Da intelligente Verträge in Bytecode umgewandelt werden, bevor sie in der Blockchain bereitgestellt werden, müssen wir wissen, welche Vorgänge und Interaktionen wir mit ihnen initiieren können.

Dann brauchen wir eine standardisierte Möglichkeit, diese Schnittstellen auszudrücken, damit jede Programmiersprache für die Interaktion mit Smart Contracts verwendet werden kann.

Ihre Anwendung kann mit einem Smart Contract in jeder Programmiersprache interagieren, solange Sie über die ABI für diesen Smart Contract und eine Bibliothek verfügen, die Ihnen bei der Kommunikation mit jedem Knoten hilft und Ihnen einen Einstiegspunkt in das Ethereum-Netzwerk bietet.

Hier ist der Code zum Generieren des ABI-Werts in easy2digital.sol wie folgt:

# Get ABI

getABI = compiled_sol['contracts']['SimpleStorage.sol']['SimpleStorage']['abi']

Installieren Sie das Web3-Modul und stellen Sie eine Verbindung zu Ganache her

Wenn Bytecode und ABI, die zum Abrufen der Methoden und Variablen in der Smart-Contract-konformen Datei verwendet werden, bereit sind, ist es an der Zeit, ein Modul für die Ethereum-Interaktion zu installieren. In Python wird es Web3-Modul genannt

Im Terminal geben wir diesen Befehl wie folgt ein:

pip install web3

Geben Sie im Python-Skript bitte auch das Modul mithilfe des Codes ein

from web3 import Web3

Ganache

Für die Entwicklung einer Web3-Smart-Contract-Testumgebung benötigen wir dann eine visuelle Ethereum-Blockchain, anstatt über Metamask eine Verbindung zur realen Blockchain herzustellen. Hier brauchen wir also eine Software namens Ganache.

Ganache erleichtert Web3-Entwicklern, weil es Ihnen eine persönliche Ethereum-Blockchain zur Verfügung stellt, mit der Sie Tests ausführen, Befehle ausführen und den Status überprüfen können, während Sie gleichzeitig steuern, wie die Kette funktioniert.

Die Installationsmethode ist super einfach. Anschließend können Sie schnell ein Ethereum öffnen und das visuelle ETH-Netzwerk-Dashboard öffnen. Auf dem Dashboard gibt es mehrere Elemente, die für die Verwendung im Python-Skript erforderlich sind. Hier ist die Liste der Artikel wie folgt:

  • HTTP-URL
  • Ketten-ID
  • Die visuelle Krypto-Wallet-Adresse
  • Der private Schlüssel der Brieftasche

Bei der Ketten-ID kann es bei Ganache manchmal zu Fehlern kommen und Ihre eindeutige ID funktioniert möglicherweise nicht. Wenn dieser Fall bei Ihnen auftritt, versuchen Sie es bitte mit der Ketten-ID 1337.

Dann sind hier die Codes für die Verwendung des Web3-Moduls, das eine Verbindung zu Ganache herstellt.

w3 = Web3(Web3.HTTPProvider("your ganache HTTP URL"))

gasPrice = w3.eth.gas_price

chain_id = "your ganache chain id"

my_address = "select a key and copy and paste the address here"

Verstecken Sie den privaten Schlüssel der Kryptowährungs-Wallet

Tatsächlich simuliert Ganache eine Umgebung, die Ihr Web3 mit einer echten Ethereum-Blockchain verbindet. Nehmen wir zum Beispiel Metamask: Die Adresse entspricht der echten Wallet-Adresse und der private Schlüssel ist der echte private Wallet-Schlüssel. Dennoch möchten Sie Ihren privaten Schlüssel nicht auf dem Server preisgeben, da das Risiko besteht, dass Sie Ihr gesamtes Geld verlieren.

In DApp oder Web3 müssen wir also den privaten Schlüssel im Python-Skript verbergen. Hier würden wir verwenden. env and gitignore.

Als Erstes müssen wir eine.env-Datei erstellen und sie im selben Ordner wie das Python-Skript ablegen.

Hier ist der Code in der env-Datei:

export PRIVATE_KEY="0x + your private key"
Zweitens fügen Sie bitte auch eine .gitinore Datei im selben Ordner hinzu
Zu guter Letzt können wir os, dotenv importieren und die Methode getenv() verwenden, um die Variable in der env-Datei aufzurufen
import os
from dotenv import load_dotenv
private_key = os.getenv("PRIVATE_KEY")

Erstellen Sie einen Smart Contract auf der Ethereum-Blockchain

Wie bereits erwähnt, haben wir Solidity verwendet, um eine intelligente Vertragslogik zu schreiben. Die Frage ist also, wie diese Logik auf der Blockchain eingesetzt werden kann. Das Web3-Modul stellt contract() bereit und erleichtert uns den Abschluss des Vorgangs.

singleContractA = w3.eth.contract(abi=getABI, bytecode=Bytecode)
Wenn Sie die Transaktionsanzahl-ID generieren möchten, können wir getTransactionCount() verwenden.
nonceA = w3.eth.getTransactionCount(my_address)

Aktivieren Sie Transaktionsfunktionen – Erstellen, Signieren, Senden und Bestätigen einer Transaktion

Der Kernwert von Web3.0 ist die dezentrale Transaktions- und Zahlungsabwicklung. Solange sowohl Ihr Unternehmen als auch Ihre Kunden bereit sind, mit Kryptowährungen zu handeln, müssen Sie beide von nun an nicht mehr das traditionelle Banksystem nutzen. Das impliziert und bedeutet viel!

Daher ist einer der Schlüsselaspekte der Interaktion mit der Blockchain der Aufbau eines Transaktionsflusses. Unabhängig davon, welche Art von Geschäft oder Transaktion Sie normalerweise tätigen, gibt es grundsätzlich vier grundlegende Schritte:

# Build a transaction
transactionA = singleContractA.constructor().buildTransaction(
{"gasPrice": gasPrice, "chainId": int(chain_id), "from": my_address, "nonce": nonceA})
# Sign a transaction
signedTransaction = w3.eth.account.sign_transaction(
transactionA, private_key=private_key)
# Send a transaction
transactionHash = w3.eth.send_raw_transaction(signedTransaction.rawTransaction)
# Wait for the pending and confirmed transaction response
transactionReceipt = w3.eth.wait_for_transaction_receipt(transactionHash)

Fügen Sie einen spezifischen Wert hinzu und aktualisieren Sie den Vertrag

Darüber hinaus können Sie auch die bestehende Transaktion aktualisieren und einen spezifischen Wert hinzufügen.

singleContractB = w3.eth.contract(
address=transactionReceipt.contractAddress, abi=getABI)

print("Updating the contract.....")
contractTransaction = singleContractB.functions.store(75).buildTransaction(
{"gasPrice": gasPrice, "chainId": int(chain_id), "from": my_address, "nonce": nonceA + 1})
signedcontractTransaction = w3.eth.account.sign_transaction(
contractTransaction, private_key=private_key)
# Send the transaction
print("Deploying the contract.....")
sendcontractTransaction = w3.eth.send_raw_transaction(signedcontractTransaction.rawTransaction)
# Wait for the pending and confirmed transaction response
print("Deployed!!!")
transactionReceipt = w3.eth.wait_for_transaction_receipt(sendcontractTransaction)
print(singleContractB.functions.retrieve().call())

Vollständiges Python-Skript von Web3 Smart Contract, das eine Verbindung zu Ganache herstellt

Wenn Sie sich für das Web3.0-Tutorial 1 – die Verbindung von Web3 Smart Contracts mit Ganache unter Verwendung von Python zum Entwickeln und Testen von DApps – interessieren, Bitte abonnieren Sie unseren Newsletter , indem Sie die Nachricht „Web3.0-Tutorial 1“ hinzufügen. . Wir senden Ihnen das Skript umgehend in Ihr Postfach.

Ich wünsche Ihnen viel Spaß beim Lesen von Web3.0-Tutorial 1 – „Verbinden Sie Web3 Smart Contracts mit Ganache mithilfe von Python zum Entwickeln und Testen von DApps“. 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 )