【python】Web3.py从入门到精通

目录

一、Web3.py 是什么

二、Web3.py 核心功能速览

(一)连接以太坊节点

(二)账户管理

(三)智能合约交互

(四)交易签名与发送

(五)事件监听

三、Web3.py 安装指南

(一)创建虚拟环境(推荐)

(二)安装 Web3.py

(三)验证安装

四、Web3.py 使用详解

(一)连接到以太坊节点

(二)获取账户余额

(三)部署和调用智能合约

(四)签名和发送交易

五、常见问题与解决方案

(一)连接问题

(二)智能合约交互效率问题

(三)交易安全性问题

六、实战案例

(一)发送 ERC - 20 代币

(二)创建去中心化应用(DApp)

七、总结与展望


一、Web3.py 是什么

在区块链技术飞速发展的当下,以太坊作为最具影响力的区块链平台之一,为开发者们提供了丰富的应用场景和创新空间。而 Web3.py,作为连接 Python 与以太坊区块链的桥梁,正逐渐成为区块链开发者不可或缺的工具。

Web3.py 本质上是一个 Python 库,专门用于与以太坊区块链进行交互。它就像是一个翻译官,让 Python 程序能够理解以太坊区块链的 “语言”,并与之进行顺畅的沟通。通过 Web3.py,开发者可以在 Python 环境中轻松地实现与以太坊节点的连接,发送交易、部署和调用智能合约,查询区块链数据等一系列操作。

想象一下,以太坊区块链是一个庞大的分布式数据库,里面存储着各种交易信息、智能合约代码以及其他重要数据。而 Web3.py 就是一把钥匙,它能够帮助开发者打开这个数据库的大门,获取所需的数据,并对其进行操作。无论是开发去中心化应用(DApps)、构建区块链基础设施,还是进行加密货币相关的开发工作,Web3.py 都发挥着至关重要的作用。

例如,当你想要开发一个基于以太坊的去中心化金融(DeFi)应用时,Web3.py 可以帮助你实现与以太坊区块链的交互,包括创建和管理用户账户、处理交易、调用智能合约中的各种功能等。它为开发者提供了一个简洁、高效的编程接口,大大降低了以太坊区块链开发的门槛。

二、Web3.py 核心功能速览

(一)连接以太坊节点

Web3.py 支持多种连接以太坊节点的方式,包括 HTTP、WebSocket 和 IPC(进程间通信) 。其中,HTTP 连接方式最为常见,适用于大多数场景,特别是在使用远程节点(如 Infura 或 Alchemy)时;WebSocket 连接适合需要实时监听事件的场景,适合需要高频率数据更新的应用;IPC 连接则用于本地节点连接,通常适用于开发和调试环境。

以使用 Infura 的 HTTP 连接以太坊主网为例,代码如下:

 

from web3 import Web3

# 使用Infura的HTTP连接(以太坊主网)

infura_url = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'

web3 = Web3(Web3.HTTPProvider(infura_url))

# 检查连接状态

print(web3.isConnected())

在上述代码中,我们首先导入了 Web3 库,然后通过Web3.HTTPProvider指定了连接的节点地址,这里使用的是 Infura 提供的以太坊主网节点。YOUR_INFURA_PROJECT_ID需要替换为你自己在 Infura 平台上创建项目后获得的 ID。最后,通过web3.isConnected()方法检查是否成功连接到节点。如果输出为True,则表示连接成功。

(二)账户管理

在以太坊开发中,账户管理是非常重要的一环。Web3.py 提供了强大的账户管理功能,让开发者可以轻松地创建、管理和使用以太坊账户。

创建新的以太坊钱包是账户管理的基础操作之一。使用 Web3.py 创建新钱包的代码示例如下:

 

from web3 import Web3

from eth_account import Account

# 创建Web3实例

w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'))

# 创建新账户

account = Account.create()

# 打印钱包地址和私钥

print(f"Address: {account.address}")

print(f"Private Key: {account.privateKey.hex()}")

在这段代码中,我们首先创建了一个 Web3 实例,连接到以太坊主网。然后,通过Account.create()方法创建了一个新的以太坊账户。account.address属性返回生成的钱包地址,account.privateKey.hex()则将私钥以十六进制字符串的形式输出。需要注意的是,私钥是非常重要的信息,一定要妥善保管,避免泄露。

(三)智能合约交互

智能合约是以太坊的核心功能之一,它允许开发者在区块链上部署和执行代码。Web3.py 提供了完整的智能合约交互支持,让开发者可以方便地与已部署的智能合约进行通信。

与智能合约交互的关键在于 ABI(应用程序二进制接口)和合约地址。ABI 定义了智能合约的接口,包括函数签名、参数类型和返回值类型等信息。通过 ABI 和合约地址,Web3.py 可以构建与智能合约交互的请求,并将其发送到以太坊节点。

以下是一个简单的智能合约交互代码示例,假设我们有一个已部署的智能合约,它有一个名为getBalance的函数,用于获取账户余额:

 

from web3 import Web3

# 连接到以太坊节点

w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'))

# 合约的ABI和地址

contract_abi = [...] # 这是合约的ABI,需根据实际合约生成

contract_address = '0xYourContractAddress'

# 获取合约对象

contract = w3.eth.contract(address=contract_address, abi=contract_abi)

# 调用合约方法

result = contract.functions.getBalance().call()

print(result)

在上述代码中,我们首先连接到以太坊节点,然后定义了合约的 ABI 和地址。通过w3.eth.contract方法创建了合约对象,该对象包含了与合约交互的各种方法。最后,通过contract.functions.getBalance().call()调用合约的getBalance方法,并将返回结果打印出来。这里的call方法用于调用合约的只读方法,不会产生交易。

(四)交易签名与发送

在以太坊区块链上,交易是状态变更的唯一方式。Web3.py 支持离线签名并发送交易到区块链网络,确保交易的安全性和不可篡改。

在发送交易之前,需要对交易进行签名,以证明交易的真实性和发送者的身份。Web3.py 使用私钥对交易进行签名,并将签名后的交易发送到以太坊节点。在一些私有链或测试链中,可能需要设置 PoA(Proof of Authority)中间件来处理特殊的共识机制。

以下是一个设置 PoA 中间件,并创建、签名和发送交易的代码示例:

 

from web3 import Web3

from web3.middleware import geth_poa_middleware

# 连接到以太坊节点

w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'))

# 设置PoA中间件(如果在私链或测试链中使用)

w3.middleware_onion.inject(geth_poa_middleware, layer=0)

# 创建交易

transaction = {

'to': '0xRecipientAddress',

'value': w3.toWei(0.01, 'ether'),

'gas': 2000000,

'gasPrice': w3.toWei('50', 'gwei'),

'nonce': w3.eth.getTransactionCount('0xYourAddress')

}

# 签名交易

private_key = 'YourPrivateKey'

signed_txn = w3.eth.account.sign_transaction(transaction, private_key=private_key)

# 发送交易

tx_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction)

print(f"Transaction sent with hash: {w3.toHex(tx_hash)}")

在这段代码中,我们首先连接到以太坊节点,并设置了 PoA 中间件(如果需要)。然后,构建了一个交易对象,包含了交易的接收地址、转账金额、gas 限制、gas 价格和 nonce 值等信息。接下来,使用私钥对交易进行签名,最后通过w3.eth.sendRawTransaction方法将签名后的交易发送到区块链网络,并打印出交易哈希。

(五)事件监听

Web3.py 支持实时监听区块链上的事件,这在很多实际应用中非常有用,比如监控特定的交易、跟踪智能合约状态的变化等。

通过设置事件过滤器,Web3.py 可以监听智能合约发出的事件,并在事件发生时执行相应的处理逻辑。以下是一个简单的事件监听示例,假设我们有一个智能合约,它在每次转账时会触发一个Transfer事件:

 

from web3 import Web3

# 连接到以太坊节点

w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'))

# 合约的ABI和地址

contract_abi = [...]

contract_address = '0xYourContractAddress'

# 获取合约对象

contract = w3.eth.contract(address=contract_address, abi=contract_abi)

# 创建事件过滤器,监听最新区块的Transfer事件

event_filter = contract.events.Transfer.createFilter(fromBlock='latest')

while True:

for event in event_filter.get_new_entries():

print(f"New Transfer event: {event}")

在上述代码中,我们首先连接到以太坊节点,并获取了合约对象。然后,通过contract.events.Transfer.createFilter(fromBlock='latest')创建了一个事件过滤器,用于监听最新区块中合约发出的Transfer事件。在一个无限循环中,通过event_filter.get_new_entries()获取新的事件,并打印出来。这样,每当有新的转账事件发生时,我们的程序就会捕获到并进行相应的处理。

三、Web3.py 安装指南

(一)创建虚拟环境(推荐)

在开始安装 Web3.py 之前,强烈推荐先创建一个虚拟环境。虚拟环境就像是一个独立的 “小世界”,在这个世界里,你可以安装项目所需的各种库,而不会影响系统的全局 Python 环境,也能有效避免不同项目之间的依赖冲突。例如,项目 A 需要 Web3.py 的某个特定版本,而项目 B 需要另一个版本,通过虚拟环境,你可以为每个项目创建独立的环境,分别安装各自所需的版本,互不干扰。

MacOS/Linux 系统

  1. 首先,确保你已经安装了 Python 3.3 或更高版本,因为这些版本内置了venv模块用于创建虚拟环境。如果没有安装,可以从 Python 官方网站下载安装。
  1. 打开终端,切换到你想要创建虚拟环境的目录,比如你的项目目录。然后执行以下命令创建一个名为myenv的虚拟环境(myenv可替换为你喜欢的任何名称):
 

python3 -m venv myenv

  1. 创建完成后,通过以下命令激活虚拟环境:
 

source myenv/bin/activate

激活后,你会发现终端提示符前面多了一个(myenv),这就表示你已经成功进入虚拟环境了。

Windows 系统

  1. 同样,先确认已安装 Python 3.3 及以上版本。若未安装,前往 Python 官方网站下载 Windows 安装包进行安装,注意在安装过程中勾选 “Add Python to PATH” 选项,以便在命令行中能够直接使用 Python 命令。
  1. 打开命令提示符或 PowerShell,切
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雨淅淅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值