web3.py:与Python一起为以太坊开发客户
#python #区块链 #etherum #web3py

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

我希望本教程是。如果您有生命,请不要犹豫。