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

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

pipinstallweb3

Web3.py的功能是连接到以太坊网络的节点,以检索数据和向网络广播数据。节点存储区块链数据,所以我们可以查询以太坊区块链的状态来收集我们需要的数据。数据检索对我们来说是一个有效的免费操作,因为唯一的成本是节点正在进行的存储和计算。有了这个库,我们可以连接到自己的节点或网络上的现有节点来建立我们想要的东西。我们可以在自己的机器上建立一个本地节点,但这样做的成本是相当高的;截至4/21,一个完整的节点大约有7TB的数据。与其在我们想要访问数据时操作自己的节点,不如通过使用像Infura这样的服务来达到目的。Infura是Consensys的产品,我们将使用它作为我们的节点,连接到以太坊区块链。许多顶级项目都是Infura的用户。首先在Infura网站注册并创建一个新项目。在那里你会发现一个项目ID。

该项目ID将被放在Web3.py的这段代码中的末尾,它将定义你要连接到的节点。

fromweb3importWeb3

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( ​​https://zapper.fi/dashboard​​)这样的产品功能,跟踪我们代币的美元价值如何?首先,需要扫描我们的地址,看看持有哪些代币。为了做到这一点,我们将与各个代币的智能合约进行交互。这些合约的地址看起来像我们的钱包地址,只不过这些是合约地址。在这个地址上有智能合约代码。代币将遵守ERC-20标准,使我们更容易与这些合约进行交互。一个ERC-20合约默认具有以下功能:

functionname() publicviewreturns (string)
functionsymbol() publicviewreturns (string)
functiondecimals() publicviewreturns (uint8)
functiontotalSupply() publicviewreturns (uint256)
functionbalanceOf(address_owner) publicviewreturns (uint256balance)
functiontransfer(address_to, uint256_value) publicreturns (boolsuccess)
functiontransferFrom(address_from, address_to, uint256_value) publicreturns (boolsuccess)
functionapprove(address_spender, uint256_value) publicreturns (boolsuccess)
functionallowance(address_owner, address_spender) publicviewreturns (uint256remaining)


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

importjson

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


我们从定义一个ABI开始。ABI( application binary interface)是我们定义的一种格式,用于与合约交互。它是我们用来定义数据在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价格转换为 ether。1ETH是1E18 Wei。最后,我们将使用The Graph来获取一些行情数据。由于我们希望所有的东西都在链上,所以我们需要得到我们想要的代币在DAI中的价值,这是一个与美元相对挂钩的稳定币。

fromgqlimportgql, Client
fromgql.transport.requestsimportRequestsHTTPTransport
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。下一步会讲解我们如何查询实时区块链数据,以了解链上活动的最新情况。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/232165.html<

(0)
管理的头像管理
上一篇2025-04-20 01:11
下一篇 2025-04-20 01:12

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注