Wie Python mit Smart Contracts interagiert – web3.py

1. Intelligenter Vertrag

Zur Veranschaulichung wird hier die öffentliche Ethereum-Kette verwendet. Die auf Ethereum unterstützten Smart Contracts sind hauptsächlich in der Solidity-Sprache geschrieben. Nachfolgende Einführungen werden die Goerli-Testkette von Ethereum als Beispiel nehmen.
Smart Contract : bezieht sich auf Code, der in einer bestimmten Sprache geschrieben und dann auf der Blockchain bereitgestellt wird, um bestimmte Funktionen zu implementieren.
Ich habe die Schwachstellen von Smart Contracts schon früher untersucht, aber nicht mit den Smart Contracts in der tatsächlichen Testkette interagiert. Dieses Mal habe ich dies in einem Projekt verwendet und web3.py studiert.
Heutzutage verwendet die Mainstream-Smart-Contract-Entwicklung im Allgemeinen kein web.py. Es gibt gekapselte Trüffel-Frameworks, Hardhat-Frameworks und Foundry usw.
Dieser Artikel ist nur ein vorläufiges Verständnis der vollständigen Web3-Entwicklung.

2. Testen Sie Ketten- und Knotendaten

Die hier verwendeten Ethereum-Testketten Goerli und Sepolia können ebenfalls verwendet werden, ebenso wie die von Geth und Ganache zum Testen erstellten privaten Ketten. Versuchen Sie zunächst, eine
Verbindung zur Blockchain herzustellen:

  • Wenn Sie die Kette testen möchten, beantragen Sie einen Knoten auf infura. Sie erhalten dann eine URL, was dem Zugriff auf die Daten in der Testkette über diesen Knoten entspricht.
  • Für eine private Verbindung stellen Sie einfach eine direkte Verbindung zu einem bestimmten Port auf dem Server oder lokalen Computer her, normalerweise 7545 oder 8545.

3. Verwendung von web3.py

Installieren Sie zuerst web3

pip install web3

3.1 Mit der Blockchain verbinden

w3 = Web3(Web3.HTTPProvider(url))
print(w3.is_connected())  ##判断是否连接上

3.2 Einsatzvertrag

3.2.1 Abi und Bytecode abrufen:

Bevor web3.py einen Vertrag bereitstellt, muss es den Quellcode analysieren, um dessen Abi und Bytecode zu erhalten.
abi : abi enthält hauptsächlich die Funktionsaufrufinformationen des Vertrags, dh Funktionsparameter, Rückgabewerte, Signaturen und andere Informationen.
Bytecode : Bytecode bezieht sich auf den kompilierten Quellcode. Binärcode
Python kann übergeben werdensolcxin der Büchereikompilieren_standardDie Funktion führt eine Vertragsanalyse durch und ruft die ABI und den Bytecode des Vertrags ab, die beim Erstellen und Bereitstellen des Vertrags verwendet werden.

3.2.2 Bereitstellungsvertrag:

Bereitstellungsverträge werden hauptsächlich durch offiziell gekapselte Standardfunktionen implementiert. Die zugehörigen Funktionen von web3.py und web3.js sind den offiziellen Funktionen von geth sehr ähnlich.

  • Die Transaktion zum Aufbau und zur Bereitstellung des Vertrags
Contract = w3.eth.contract(abi = abi, bytecode = bytecode)
nonce = w3.eth.get_transaction_count(Goerli_address)
transaction = Contract.constructor().build_transaction(
    {
    
    
        "gasPrice": w3.eth.gas_price,
        "from": Goerli_address,
        "nonce": nonce
    }
)
  • Unterzeichnen und veröffentlichen Sie die Transaktion
signed_txn = w3.eth.account.sign_transaction(transaction, private_key = Goerli_privateKey)   
##账户私钥对交易进行验证
tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)    
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
##根据交易哈希获取交易凭证,可获取部署合约的地址

3.2.3 Aufruffunktionen im Vertrag

Das Aufrufen von Funktionen in Ethereum wird hauptsächlich durch Aufrufen von Funktionssignaturen durch Aufrufen implementiert. Es ist ersichtlich, dass der Artikel Soliditätsvertragsfunktionsaufrufe
zuvor von Bi She zusammengefasst wurde

Der Einfachheit halber verwenden wir hier den Funktionsnamen, um die Funktion direkt aufzurufen.
Hier verwenden wir den Aufruf der Funktion „storeUserData“ als Beispiel zur Veranschaulichung:

Contract = w3.eth.contract(address = contract_address, abi = abi) 
nonce = w3.eth.get_transaction_count(call_address)
transaction = Contract.functions.storeUserData(dataHash).build_transaction(
   {
    
    
       "gas": 1000000,
       "gasPrice": w3.eth.gas_price,
       "from": call_address,
       "nonce": nonce 
   }
)
## dataHash这里为storeUserData需要传入的参数
signed_txn = w3.eth.account.sign_transaction(transaction, private_key = addressKey)
##签名该函数调用的交易
send_tx = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
tx_receipt = w3.eth.wait_for_transaction_receipt(send_tx)
## 根据交易哈希,获取交易凭证,后对交易凭证进行分析处理

3.2.4 Ereignisüberwachung

Da die nachfolgende Implementierung die von der Funktion ausgelösten Ereignisse in Echtzeit überwacht, erhält der obige Code den tx_receipt der Funktionsaufruftransaktion, dh den Transaktionsbeleg, der die Protokollinformationen des Ereignisses enthält.
Code wie folgt anzeigen:

logs = Contract.events.AccessRequested().process_receipt(tx_receipt)
## AccessRequested()为对应的事件event

Anschließend werden die Protokolle verarbeitet, um eine Echtzeitüberwachung des durch den Vertrag ausgelösten Ereignisses zu realisieren.

Guess you like

Origin blog.csdn.net/m0_53689197/article/details/133948903