主页 > imtoken国内怎么下 > 使用 Web3.py、Infura 和 Graph 查询以太坊数据

使用 Web3.py、Infura 和 Graph 查询以太坊数据

imtoken国内怎么下 2023-01-17 02:54:36

Web3.py 是为与以太坊区块链交互而构建的 Python 库。有了它以太坊关机价,我们可以为去中心化应用构建各种核心功能。我们可以直接与智能合约交互,收集区块链数据并发送交易。让我们开始安装 Web3.py。

pip install web3

以太坊关机价

Web3.py 的作用是连接以太坊网络的节点以检索数据并将数据广播到网络。节点存储区块链数据,因此我们可以查询以太坊区块链的状态以收集我们需要的数据。数据检索对我们来说实际上是一项免费操作,因为唯一的成本是节点正在进行的存储和计算。有了这个库,我们可以连接到我们自己的节点或网络上现有的节点来构建我们想要的东西。我们可以在自己的机器上建立一个本地节点,但是这样做会很昂贵;截至 4 月 21 日,一个全节点大约有 7TB 的数据。我们不是在想要访问数据时操作自己的节点,而是通过使用 Infura 之类的服务来实现。Infura 是 Consensys 产品,我们将使用它作为我们的节点,连接到以太坊区块链。许多顶级项目都是 Infura 用户。首先在 Infura 网站上注册并创建一个新项目。在那里您会找到一个项目 ID。

项目 ID 将放置在 Web3.py 中此代码的末尾,它将定义您要连接的节点。

以太坊关机价

from web3 importWeb3

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


现在与以太坊网络的连接已准备就绪,可以进行一些基本查询。

# Get information about the latest block
w3.eth.getBlock('latest')

# Get the ETH balance of an address
w3.eth.getBalance('YOUR_ADDRESS_HERE')


以太坊关机价

这段代码很简洁,我们可以尝试深入一点。跟踪我们代币的美元价值怎么样,比如模仿 Zapper(​​​​​​​)这样的产品的功能?首先,我们需要扫描我们的地址以查看持有哪些代币。为此,我们将与各个代币的智能合约进行交互。这些合约的地址看起来像我们的钱包地址,除了这些是合约地址。这个地址上有智能合约代码。代币将遵守 ERC-20 标准,使我们更容易与这些合约进行交互。ERC-20 合约默认具有以下功能:

function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)


​​​balanceOf​​是一个让我们查看我们查询的钱包地址持有多少代币的函数。

以太坊关机价

import json

ABI = json.loads('[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf",
"outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]')


我们首先定义一个 ABI。ABI(应用程序二进制接口)是我们为与合约交互而定义的一种格式。它是我们用来定义如何在 EVM 中编码/解码数据的方法。抛开技术细节不谈以太坊关机价,重要的是要理解它是我们定义的一种格式,我们将如何与我们想要的智能合约进行交互。

wallet_address = 'YOUR_ADDRESS_HERE'
wallet_address = Web3.toChecksumAddress(wallet_address)

token_contract_address = '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f'
token_contract_address = Web3.toChecksumAddress(token_contract_address)

# define contract
contract = w3.eth.contract(token_contract_address, abi=ABI)

# call contract and get data from balanceOf for argument wallet_address
raw_balance = contract.functions.balanceOf(wallet_address).call()

# convert the value from Wei to Ether
synthetix_value = Web3.fromWei(raw_balance, 'ether')


以太坊关机价

接下来我们采取一系列步骤,输入地址并返回我们选择的钱包地址持有的代币数量。我们的示例地址是 Synthetix (SNX),您可以输入任何您喜欢的合约地址。你可以想象,你可以建立一个 ERC-20 合约地址的主列表并迭代以查找特定钱包持有的代币。我们使用Web3函数toChecksumAddress()​​来确保我们的地址是校验和格式。我们使用 fromWei() 将我们的 Wei 价格转换为以太币。1ETH 是 1E18 魏。最后,我们将使用 The Graph 来获取一些市场数据。由于我们希望一切都在链上,我们需要在 DAI 中获得我们想要的代币的价值,这是一种与美元挂钩的稳定币。

from gql import gql, Client
from gql.transport.requests importRequestsHTTPTransport
sample_transport=RequestsHTTPTransport(
url='https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2',
verify=True,
retries=5,
)
client = Client(
transport=sample_transport
)

# Get the value of SNX/ETH
query = gql('''
query {
pair(id: "0x43ae24960e5534731fc831386c07755a2dc33d47"){
reserve0
reserve1
}
}
''')
response = client.execute(query)
snx_eth_pair = response['pair']
eth_value = float(snx_eth_pair['reserve1']) / float(snx_eth_pair['reserve0'])

# Get the value of ETH/DAI
query = gql('''
query {
pair(id: "0xa478c2975ab1ea89e8196811f51a7b7ade33eb11"){
reserve0
reserve1
}
}
''')
response = client.execute(query)
eth_dai_pair = response['pair']
dai_value = float(eth_dai_pair['reserve0']) / float(eth_dai_pair['reserve1'])

snx_dai_value = eth_value * dai_value


我们查询 The Graph 以获取 SNX 的 DAI 值。我们先得到每个 SNX 的 ETH 值,然后乘以一个 ETH 等值的 DAI 的数量,得到一个 SNX 的 DAI 值。然后,我们可以通过将最终 DAI 值乘以我们钱包中持有的 SNX 数量来找到头寸的总美元价值。我们不得不做所有这些额外的步骤,因为 Uniswap 中没有一个活动池可以直接将 DAI 交换为 SNX。所以我们从 SNX 到 ETH 再到 DAI。下一步将解释我们如何查询实时区块链数据以获取有关链上活动的更新。