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

这篇具有很好参考价值的文章主要介绍了用Web3.py、Infura和Graph查询以太坊数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

web3 与 infura

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

pip install web3

Web3.py的功能是连接到以太坊网络的节点,以检索数据和向网络广播数据。节点存储区块链数据,所以我们可以查询以太坊区块链的状态来收集我们需要的数据。数据检索对我们来说是一个有效的免费操作,因为唯一的成本是节点正在进行的存储和计算。

有了这个库,我们可以连接到自己的节点或网络上的现有节点来建立我们想要的东西。我们可以在自己的机器上建立一个本地节点,但这样做的成本是相当高的;截至4/21,一个完整的节点大约有7TB的数据。与其在我们想要访问数据时操作自己的节点,不如通过使用像Infura这样的服务来达到目的。

Infura是Consensys的产品,我们将使用它作为我们的节点,连接到以太坊区块链。许多顶级项目都是Infura的用户。首先在Infura网站注册并创建一个新项目。在那里你会发现一个项目ID。

web3 与 infura

该项目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( https://zapper.fi/dashboard)这样的产品功能,跟踪我们代币的美元价值如何?首先,需要扫描我们的地址,看看持有哪些代币。为了做到这一点,我们将与各个代币的智能合约进行交互。这些合约的地址看起来像我们的钱包地址,只不过这些是合约地址。在这个地址上有智能合约代码。代币将遵守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( 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中的价值,这是一个与美元相对挂钩的稳定币。

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

web3 与 infura

- 点击下方阅读原文加入社区会员 -文章来源地址https://www.toymoban.com/news/detail-791802.html

到了这里,关于用Web3.py、Infura和Graph查询以太坊数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Web3】Web3连接到以太坊网络(测试网、主网)

    目录 什么是Web3 Web3项目连接以太坊网络 1.下载Web3 2.实例化Web3对象 3.infura 获取连接以太坊网络节点 4.添加网络节点 什么是Web3 web3.js开发文档:web3.js - Ethereum JavaScript API — web3.js 1.0.0 documentation web3.js 中文文档 : web3.js - 以太坊 JavaScript API — web3.js 中文文档 — 登链社区 github地

    2024年02月12日
    浏览(23)
  • Web3.py使用详解

    测试提供商 本地提供商 远程提供商 与以太坊区块链交互的最快方法是使用远程节点提供商,如Infura、Alchemy或QuickNode。您可以通过指定端点连接到远程节点,就像本地节点一样: 判断连接状态  使用web3创建账户 使用eth_account创建账户 效果与 web3 一致,安装web3.py会自动安装

    2024年02月16日
    浏览(29)
  • 【Web3】认识以太坊钱包

    目录 区块链钱包概念 密码 私钥 Private Key 公钥Public Key  Keystore 助记词 Mnemonic 如何解锁账户 区块链钱包概念 钱包用来存钱的,在区块链中,我们的数字资产都会对应到一个账户地址上, 只有拥 有账户的钥匙(私钥)才可以对资产进行消费(用私钥对消费交易签名)。 数字

    2024年02月12日
    浏览(26)
  • 【WEB3】如何使用Web3J库开发应用连接到以太坊区块链网络

    ​ Web3j 是一个与以太坊智能合约交互并与以太坊节点集成的 Java 库。它是高度模块化、类型安全和反应式的,专为以太坊上的 Java 和 Android 开发而构建。Web3j 消除了编写自定义集成代码以连接到以太坊区块链网络的开销。 通过 HTTP 和 IPC 实现完整的 Ethereum JSON-RPC客户端 API,

    2024年02月02日
    浏览(41)
  • 【以太坊开发05】Web3.js

    正式开发环境中,我们一般不是使用remix去编译和部署合约,而是使用goland调用web3进行开发。 Web3工作模式 : 使用脚锁架创建一个react项目,初始化NPM项目,执行下面命令,创建package.json,描述当前模块属性的⽂件。 一路yes下来即可。 项目的目录结构如下: 2.1 安装编译器

    2024年02月16日
    浏览(32)
  • 【web3实践 | 以太坊开发框架Truffle使用】

    Truffle是一个面向以太坊的开发框架,提供一整套构建、测试、部署以及管理智能合约的开发工具。Truffle可以与以太坊节点交互,使开发人员能够在本地开发、测试和部署智能合约。 Truffle提供了一个基于命令行的、易于使用的开发环境,可以通过Truffle来编写智能合约,进行

    2024年02月07日
    浏览(49)
  • web3系列———2.以太坊与智能合约

    主流币: 中本聪设计的比特币大获成功后,各种区块链和其对应的加密货币层出不穷,其中不乏新技术的使用,不过大部分的模仿货币最后都销声匿迹了,最终存活并存有大量用户的被称作主流币。 BTC比特币 ETH以太坊 LTC莱特币 XRP瑞波币 USDT (代币) USDC (代币) BUSD (代币) …

    2024年04月24日
    浏览(27)
  • 【web3py】批量创建eth账号

    ____tz_zs 创建可在eth链及其侧链上使用的账号。内容包括:远程节点、本地节点、本地密钥对等。 前言:建议使用方式三的方法,在本地生成密钥对。 使用远程节点(如 Infura)创建帐户时,会报如下错误: web3py the method personal_newAccount does not exist/is not available 。出于安全原因,

    2024年02月02日
    浏览(34)
  • Python 使用 Web3.py 进行 ETH 和代币转账

    1、安装 Web3.py 2、注册 Infura 获得节点服务 使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL 可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请

    2024年02月16日
    浏览(33)
  • Web3中文|关于以太坊“上海升级”,你需要知道哪些?

    今年3月,以太坊将进行自2022年9月转向权益证明系统以来的首次大升级,即上海硬交叉。一旦以太坊完成“上海升级”,帮助运营网络的验证者将能够提取1600万枚被质押的以太币(ETH)。 除了重点落实以太坊改进建议——4895(解锁验证者的提款权),根据全新且完整的更改

    2024年02月06日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包