web3.py是一个与区块链以太坊交互的python库。它提供了一个简单而强大的API来执行诸如咨询区块链,发送交易并与智能合同互动的任务。通过以太坊智能合同并在区块链中执行操作。
requilisitos
要使用web3.py,您需要以下内容:
- 带有ethi余额的以太坊帐户
- 以太坊客户端软件,例如薄雾或Geth
- python 3.6 ou superior
- o PIP软件包管理器
instalaã§o
要安装web3.py,打开一个终端并运行以下命令:
pip install web3
注意安装lib辅助:
pip install python-dotenv
configuraã§o
要配置Web3.py,您需要创建一个Web3实例。为此,您需要要连接的Nã³以太坊的地址。您可以在这里找到一个不是恶霸的清单:https://infura.io/
from web3 import Web3
from dotenv import load_dotenv
import os
# Variáveis de ambiente
load_dotenv(".env")
# Configurar a conexão com o Ganache (ou outro endpoint Ethereum)
provider_url = os.getenv('PROVIDER_URL')
web3 = Web3(Web3.HTTPProvider(provider_url))
# Verificar a conexão
if web3.is_connected():
print("Conectado à rede Ethereum")
else:
print("Não foi possível conectar à rede Ethereum. Verifique o URL.")
配置了Web3.Py后,您可以开始咨询区块链信息。为此,您可以使用所有Web3.Py API,例如Koud0和Koud1。
from web3 import Web3
from dotenv import load_dotenv
import os
# Variáveis de ambiente
load_dotenv(".env")
# Configurar a conexão
provider_url = os.getenv('PROVIDER_URL')
web3 = Web3(Web3.HTTPProvider(provider_url))
# Consultando informações da blockchain
latest_block = web3.eth.block_number
print(f"Número do bloco mais recente: {latest_block}")
# Obter saldo de uma conta Ethereum
account_address = os.getenv('MY_ACCOUNT') # Substitua pelo endereço desejado
balance_wei = web3.eth.get_balance(account_address)
balance_eth = web3.from_wei(balance_wei, "ether")
print(f"Saldo da conta {account_address}: {balance_eth} ETH")
Enviando Transaã§ãµEs
您还可以使用web3.py发送交易。为此,您将需要创建一个Transaion并用您的私钥签名。
from web3 import Web3
from dotenv import load_dotenv
import os
# Variáveis de ambiente
load_dotenv(".env")
# Configurar a conexão
provider_url = os.getenv('PROVIDER_URL')
web3 = Web3(Web3.HTTPProvider(provider_url))
from_address = os.getenv('MY_ACCOUNT')
to_address = os.getenv('TO_ADDRESS')
amount = "0.1"
# MUITO CUIDADO SEMPRE UTILIZAR CONTA DE TESTE
private_key = os.getenv('PRIVATE_KEY')
tx = {
'type': '0x2',
'nonce': web3.eth.get_transaction_count(from_address),
'from': from_address,
'to': to_address,
'value': web3.to_wei(amount, 'ether'),
'maxFeePerGas': web3.to_wei('250', 'gwei'),
'maxPriorityFeePerGas': web3.to_wei('3', 'gwei'),
'chainId': 80001
}
gas = web3.eth.estimate_gas(tx)
tx['gas'] = gas
# ASSINATURA
signed_tx = web3.eth.account.sign_transaction(tx, private_key)
# ENVIO DA TRANSACAO
tx_hash = web3.eth.send_raw_transaction(signed_tx.rawTransaction)
# ESPERAR PARA FINALIZAR
tx_receipt = web3.eth.wait_for_transaction_receipt(tx_hash)
# VERIFICAR
if tx_receipt['status'] == 1:
print('ETH transferido com sucesso! Hash: {}'.format(
str(web3.to_hex(tx_hash))))
else:
print('Ocorreu um erro na transferência')
与智能合约互动
您可以使用web3.py与智能合同进行交互。为此,您将首先需要智能合约并获得ABI。接下来,您可以创建智能合同的完全合同,并致电您的母亲©all。
# Importar o contrato e ABI
contract_address = "0xContractAddress" # Substitua pelo endereço do seu contrato
contract_abi = [...] # Substitua pelo ABI do seu contrato
# Criar um objeto de contrato
contract = web3.eth.contract(address=contract_address, abi=contract_abi)
# Chamar uma função do contrato
result = contract.functions.someFunction().call()
print(f"Resultado da função do contrato: {result}")
# Enviar uma transação para o contrato (se a função modificar o estado)
transaction = {
"from": "0xYourAddress",
"gas": 2000000, # A quantidade de gás pode variar
"gasPrice": web3.toWei("50", "gwei"), # Preço do gás em Gwei
}
transaction_hash = contract.functions.someFunction().transact(transaction)
print(f"Hash da transação: {transaction_hash.hex()}")
如何阅读ERC20合同的信息
这样,我将打印My_Account差异中指定的以太坊帐户余额和合同发出的总代币。
from web3 import Web3
from dotenv import load_dotenv
import os
# Variáveis de ambiente
load_dotenv(".env")
# Configurar a conexão
provider_url = os.getenv('PROVIDER_URL')
web3 = Web3(Web3.HTTPProvider(provider_url))
abi_contrato = open("contrato_erc20.json", "r").read()
contract = web3.eth.contract(
abi=abi_contrato, address=os.getenv('CONTRACT_ADDRESS'))
my_acc = os.getenv('MY_ACCOUNT')
balance = contract.functions.balanceOf(os.getenv('MY_ACCOUNT')).call()
balance_fmt = web3.from_wei(balance, "ether")
total_supply = web3.from_wei(contract.functions.totalSupply().call(), "ether")
print(f"O total de tokens emitidos é {total_supply}")
print('Contract Name: ', contract.functions.name().call())
print('Symbol: ', contract.functions.symbol().call())
print(f"Saldo da conta {my_acc}: {balance_fmt} {contract.functions.symbol().call()}")
如何将Transaion发送到ERC20合同
这样,我将从My_Account方差中指定的to_address差异中指定的以太坊帐户发送10个ERC-20令牌。
from web3 import Web3
from dotenv import load_dotenv
import os
# Variáveis de ambiente
load_dotenv(".env")
# Configurar a conexão
provider_url = os.getenv('PROVIDER_URL')
web3 = Web3(Web3.HTTPProvider(provider_url))
# Obtém o ABI do contrato
abi_contrato = open("contrato_erc20.json", "r").read()
# Cria uma instância do contrato
contract = web3.eth.contract(
abi=abi_contrato, address=os.getenv('CONTRACT_ADDRESS'))
my_acc = os.getenv('MY_ACCOUNT')
balance = contract.functions.balanceOf(os.getenv('MY_ACCOUNT')).call()
balance_antes = web3.from_wei(balance, "ether")
# TRANSAÇÃO INICIO
from_address = my_acc
to_address = os.getenv('TO_ADDRESS')
private_key = os.getenv('PRIVATE_KEY')
amount_wei = web3.to_wei(10, 'ether')
print(f"Transferindo 10")
# Cria uma transação
tx = contract.functions.transfer(to_address, amount_wei).build_transaction({
'from': from_address,
'nonce': web3.eth.get_transaction_count(from_address),
'maxFeePerGas': web3.to_wei('250', 'gwei'),
'maxPriorityFeePerGas': web3.to_wei('3', 'gwei'),
'value': 0,
'chainId': 80001
})
gas = web3.eth.estimate_gas(tx)
tx['gas'] = gas
# Assina a transação
signed_tx = web3.eth.account.sign_transaction(tx, private_key)
# Envia a transação
tx_hash = web3.eth.send_raw_transaction(signed_tx.rawTransaction)
tx_receipt = web3.eth.wait_for_transaction_receipt(tx_hash)
if tx_receipt['status'] == 1:
print('Tokens transferido com sucesso! Hash: {}'.format(
str(web3.to_hex(tx_hash))))
else:
print('Ocorreu um erro na transferência de tokens')
if tx_receipt['status'] == 1:
balance = contract.functions.balanceOf(os.getenv('MY_ACCOUNT')).call()
balance_depois = web3.from_wei(balance, "ether")
total_supply = web3.from_wei(
contract.functions.totalSupply().call(), "ether")
print(f"O total de tokens emitidos é {total_supply}")
print('Contract Name: ', contract.functions.name().call())
print('Symbol: ', contract.functions.symbol().call())
print(
f"Saldo da conta antes {my_acc}: {balance_antes} {contract.functions.symbol().call()}")
print(
f"Saldo da conta depois {my_acc}: {balance_depois} {contract.functions.symbol().call()}")
observaã§ãµEs
要发送Transaion,您将需要您的私钥。您可以在以太坊钱包中找到私钥。
如果您使用的是测试网络,则需要一个测试帐户。
了解更多
要了解有关web3.py的更多信息,您可以咨询官方文档:https://web3py.readthedocs.io/en/latest/
您还可以在存储库中找到来源:https://github.com/valterlobo/web3py-tutorial
我希望本教程是。如果您有生命,请不要犹豫。