2.提供器Provider


文档摘要

title: 2. 提供器 Provider tags: tags: web3py python ens web Ethers极简入门: 2. Provider 提供器 我们最近在重新学 ,巩固一下细节,也写一个 ,供小白们使用。 推特:@0xAAScience0xXQ WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请 所有代码和教程开源在github: github.com/WTFAcademy/WTF-web3py 这一讲,我们将介绍web3.py的 类,然后利用它连接上Infura节点,读取链上的信息。 类 类是对以太坊网络连接的抽象,为标准以太坊节点功能提供简洁、一致的接口。 是 与区块链通信的方式。

title: 2. 提供器 Provider tags: tags: - web3py - python - ens - web

Ethers极简入门: 2. Provider 提供器

我们最近在重新学web3.py,巩固一下细节,也写一个WTF web3py极简入门,供小白们使用。

推特@0xAA_Science0xXQ

WTF Academy社群: 官网 wtf.academy | WTF Solidity教程 | discord | 微信群申请

所有代码和教程开源在github: github.com/WTFAcademy/WTF-web3py

这一讲,我们将介绍web3.py的Provider类,然后利用它连接上Infura节点,读取链上的信息。

Provider

Provider类是对以太坊网络连接的抽象,为标准以太坊节点功能提供简洁、一致的接口。Providerweb3.py 与区块链通信的方式。提供者接受 JSON-RPC 请求并返回响应。这通常是通过将请求提交到基于 HTTPIPC 套接字的服务器来完成的。

HTTPProvider

创建节点服务商的API Key

首先,你需要去节点服务商的网站注册并创建API Key。在WTF Solidity极简教程的工具篇,我们介绍了InfuraAlchemy两家公司API Key的创建方法,大家可以参考。

Infura API Key

你还可以在 Chainlist 网站找到各个链的公开节点。

连接公开节点

这里,我们用Chainlist上的公开节点作为例子。在找到合适的rpc之后,可以利用Web3.HTTPProvider()方法来创建Provider变量,该方法以节点服务的url链接作为参数。

在下面这个例子中,我们分别创建连接到ETH主网和Sepolia测试网的provider,并构建响应的Web3实例:

# 利用公共rpc节点连接以太坊网络 # 可以在 https://chainlist.org 上找到 from web3 import Web3 ALCHEMY_MAINNET_URL = 'https://rpc.ankr.com/eth' ALCHEMY_SEPOLIA_URL = 'https://rpc.sepolia.org' # 连接以太坊主网 provider_main = Web3.HTTPProvider(ALCHEMY_MAINNET_URL) # 连接Sepolia测试网 provider_test = Web3.HTTPProvider(ALCHEMY_SEPOLIA_URL) w3_main = Web3(provider_main) w3_test = Web3(provider_test)

利用Web3.eth实例读取链上数据

Web3.eth实例封装了一些方法,可以便捷的读取链上数据:

1. 利用get_balance()函数读取主网和测试网Vitalik的ETH余额,并且使用Web3.from_wei()函数将返回的结果转化为ETH单位:

# 1. 查询vitalik在主网和Sepolia测试网的ETH余额 print("1. 查询vitalik在主网和Sepolia测试网的ETH余额") balance_main = w3_main.eth.get_balance("vitalik.eth") balance_test = w3_test.eth.get_balance("vitalik.eth") # 将余额输出在console(主网) print("ETH Balance of vitalik",w3_main.from_wei(balance_main,'ether')) # 输出Sepolia测试网ETH余额 print("Sepolia ETH Balance of vitalik",w3_test.from_wei(balance_test,'ether'))

Vitalik余额

2. 利用chain_id属性查询provider连接到了哪条链:

# 2. 查询provider连接到了哪条链 print("2. 查询provider连接到了哪条链") chain_id_main = w3_main.eth.chain_id print(f"Chain id: {chain_id_main}")

getNetwork

3. 利用block_number属性查询当前区块高度:

# 3. 查询区块高度 print("3. 查询区块高度") block_number_main = w3_main.eth.block_number print(f"Block number: {block_number_main}")

getBlockNumber

4. 利用get_transaction_count()查询某个钱包的历史交易次数。

# 4. 查询 vitalik 钱包历史交易次数 print("4. 查询 vitalik 钱包历史交易次数") tx_count_main = w3_main.eth.get_transaction_count("vitalik.eth") print(f"Tx Count: {tx_count_main}")

getGasPrice

5. 利用gas_price属性查询当前建议的gas设置,并以gwei为单位返回。

# 5. 查询当前建议的gas设置 print("5. 查询当前建议的gas设置") fee_data_main = w3_main.eth.gas_price print(f"Gas price: {w3_main.from_wei(fee_data_main, 'gwei')}")

getFeeData

6. 利用get_block()查询区块信息,参数为要查询的区块高度:

# 6. 查询区块信息 print("6. 查询区块信息") block_main = w3_main.eth.get_block(0) print(block_main)

getBlock

7. 利用get_code()查询某个地址的合约bytecode,参数为合约地址,下面例子中用的主网WETH的合约地。注意,这里的合约地址需要将地址使用Web3.to_checksum_address()转化为校验和地址:

# 7. 给定合约地址查询合约bytecode,例子用的WETH地址 print("7. 给定合约地址查询合约bytecode,例子用的WETH地址") weth_address = w3_main.to_checksum_address("0xc778417e063141139fce010982780140aa0cd5ab") code_main = w3_main.eth.get_code(weth_address) print(code_main.hex())

getCode

总结

这一讲,我们介绍了web3.pyProvider类,并用Infura的节点API Key创建了HTTPProvider,读取了ETH主网和Sepolia测试网的链上信息。


发布者: 作者: 转发
评论区 (0)
U