Web3.py 教程:使用 Python 开发以太坊区块链的指南
<> 14 分钟阅读

介绍
如今,Web进化领域发生了很多事情 - 您可能听说过Web 3.0。如果您是这个领域的新手并且不完全理解它的含义,或者如果您对这项新技术感到不知所措 - 那么,不用担心!这篇文章只适合你。
在这篇文章中,我们将通过以太坊区块链深入了解去中心化网络(也称为 Web 3.0)的世界。我们将利用 web3.py 客户端,一个用于与以太坊区块链接口的Python编程语言客户端。
归根结底,我们的计划是涵盖如何连接以太坊区块链并与之交互。要完全理解并遵循这篇文章,您应该拥有:
- 至少对Python有基本的了解
- 了解如何使用终端
- 了解构建在区块链上运行的应用程序,也称为智能合约
- 了解Solidity编程语言
什么是 Web 3.0?
在我们深入研究这篇文章之前,让我们尝试从高层次上了解 Web 的当前状态以及 Web 3.0 如何适应它。
您可能已经知道,我们正在从 Web 2.0 时代中脱颖而出,它基本上强制执行中心化,并将过多的控制权放在少数有权势的个人手中。当然,这带来了许多与公平数据使用、隐私等相关的挑战和问题。
在 Web 3.0 中,有一种自治感,它为每个人提供了一个公平开放的网络,让每个人都能作为玩家茁壮成长。基本上,这是一项使网络去中心化、可验证和安全的运动。该生态系统的工作原理是依靠高度可互操作的系统来消除不受信任的第三方中介。
就用户数据的拥有、管理和交易方式而言,可验证且公平的用户体验确实是这种演变的真正本质。
与 Web 2.0 不同,Web 3.0 支持一种点对点网络模型,其中每个对等方在网络上维护相同数据的副本,并且整个网络也保持同步。从这个意义上说,这些对等体也称为节点。
Web 3.0 能够为用户验证在线信息,并提供一组协议来构建新型应用程序,用户在其中了解他们提供和接收的信息级别——更像是一个开放的网络,支持点对点应用程序、自主去中心化应用程序 (DApps)、加密安全应用程序等。
交易是高度安全的,用户拥有并操作他们的数据。网络作为数据的连接,可通过各种协议以分散的方式相互连接和互操作,并通过智能合约采取行动。
区块链术语定义
Web3 基金会定义了有关这项新技术的一些要点,强调了在线信息尽可能开放的必要性。
以下是在我们深入研究之前需要了解的一些术语:
- 节点 – 节点存储数据,以便我们可以轻松查询区块链的状态以获取所需的数据
- 块 – 互连节点的组或网络称为块;例如,不同以太坊节点的网络称为以太坊区块链
- 区块链 – 由一系列区块组成的去中心化点对点网络。第一个区块通常被称为创世区块,每个后续区块都有一个对它之前的区块的引用,没有中央权威,每个节点都在保持链的活力和竞争下一个区块中包含的交易方面发挥作用。
- 交易 – 这些或多或少是一个帐户到另一个帐户的指令,为了安全起见,以加密方式签名;交易通常会导致区块链状态发生变化。

区块内的节点如何与 EVM、web3.py 库和智能合约交互
开始使用 Web3.py 和以太坊区块链
以太坊区块链是一种去中心化技术,为数百万个应用程序提供动力,通常是今天的去中心化(DApps)。它还为加密货币以太币提供动力。
有很多不同的方法可以使用不同的编程语言客户端连接到以太坊区块链。在这篇文章中,我们将专注于使用基于 Python 的 web3.py 库与这项技术进行交互。
首先,您需要设置一些基本内容。如果您不确定您的机器上安装了最新的 Python 版本,请继续检查。您还需要一个以太坊节点,这是一种连接到该技术或网络的方式,就像我们需要一个 URL 来连接到外部第三方 API 一样。
python --version
我们还将介绍弄湿地面所需的一些基本功能,并在与以太坊区块链交互时为您设置更高级的功能。基本上,我们将涵盖:
- 选择并连接到我们的以太坊节点
- 查询以太坊区块链
- 检查以太坊地址的有效性
- 在以太坊区块链上进行交易
- 与智能合约功能交互
选择并连接到我们的以太坊节点
首先,让我们选择并连接到以太坊节点。然后,我们将执行一些基本操作。
在选择要使用的节点或提供程序时,我们可以选择使用本地或托管节点选项。在这篇文章中,我们将使用托管版本Infura,原因很简单,连接到本地节点需要大量的工作,包括下载区块链的完整历史记录所需的时间,磁盘空间,计算时间,带宽等。设置、运行和维护节点非常复杂,实际上并不是本文的目的。
还有许多其他人也提供免费计划,但Infura最适合我们在这篇文章中的用例,因为我们只对学习这项技术感兴趣,目前还不打算建立一个区块链初创公司。
如果您有兴趣,web3.py 文档广泛概述了何时使用本地节点与托管节点的论据,以及两者的最佳用例。我推荐的两个自运行提供商选项是Geth和Parity,它们是用于连接到以太坊区块链的本地提供商。
通常,有三种基本方法可以连接到以太坊节点:
- 通过 HTTP
- 通过网络套接字
- 通过IPC
目前最受支持的节点是HTTP节点,但IPC节点更安全,因为它们依赖于本地文件系统。
设置因富拉
现在,让我们前往Infura并创建一个帐户。使用Infura,我们可以通过HTTP和WebSocket协议即时访问以太坊网络。
继续注册,验证您的电子邮件,然后在仪表板上创建新项目。为项目指定您选择的任何名称。我在这里打电话是为了演示目的。infura.ioweb3_test
在项目仪表板上,您可以看到项目所需的密钥和所有凭据,以及连接到托管以太坊网络或节点所需的端点。请注意,我们还可以在应用程序上设置其他类型的安全性,例如使用 JWT 进行应用程序身份验证。在 LogRocket 博客上查看这篇文章,详细了解如何使用 JWT。

Infura 仪表板
连接到以太坊节点的格式如下所示:
https://<endpoint>.infura.io/v3/<project_id>
端点可以是 、 、 等。仪表板以 HTTP 和 WebSockets 格式显示,以便您可以选择适合您的用例的格式。mainnetropstenKovanrinkebyurl
web3.py 附带了一些默认提供程序,我们也可以使用。通常,每个具有 web3.py 库的正在运行的应用程序实例仅支持通过提供程序与区块链的单个连接。对于我们的基本用例来说,这通常已经足够了,但我们也可以利用多个提供程序来启动多个 web3.py 实例。
在这篇文章中,我们将使用 HTTP 端点。让我们继续将端点添加到我们的文件中。因此,请确保您尚未创建一个新文件。此外,请确保将该文件也添加到文件中。.env.env.gitignore
查询以太坊区块链
现在我们已经设置好了这一切,我们将创建一个小的存储库,我们可以使用它来尝试与以太坊区块链进行交互。
首先,让我们在计算机上创建一个新文件夹。导航到该文件夹,然后按照概述的步骤创建虚拟环境。确保在本地计算机上安装新创建的虚拟环境,以防万一您不想执行系统范围的安装。
在文件夹中,我们有文件、文件和一个文件,这是我们将用于演示的文件。该文件包含我们的 Infura URL,密钥存储为 .我们应该确保将文件也包含在文件中。.env.gitignoretest_web3.py.envINFURA_URL.env.gitignore
还要确保已安装 Python 包管理器并更新到最新版本。要安装 web3.py 库并开始构建,我们需要通过运行以下命令安装 web3:pip
pip install web3
我们的文件现在看起来像这样,因为我们只是要测试与网络的连接是否是实时的:test_web3.py
from web3 import Web3
from decouple import config
infura_url = config('INFURA_URL')
print(infura_url)
# HTTPProvider:
w3 = Web3(Web3.HTTPProvider(infura_url))
res = w3.isConnected()
print(res)
如您所见,我们还安装了一个新的包 decouple,它允许我们的代码访问环境变量,而不管它运行在什么环境中。请注意,这是个人选择,因为在这种情况下,我们还可以使用包来访问环境变量。python dot env
pip install python-decouple
当我们在终端中运行时,我们得到以下内容作为输出:python test_web3.py
(.venv-py3) retina@alexander web3py_tutorial % python test_web3.py
https://mainnet.infura.io/v3/<project_id>
True
这意味着我们可以访问我们的变量并且我们连接到网络。因此,让我们开始查询。例如,要获取最新的区块,我们可以执行以下操作:env
latest_block = w3.eth.get_block('latest')
print(latest_block)
并得到下面的结果:
True
AttributeDict({'baseFeePerGas': 106360190089, 'difficulty': 10166935943834278, 'extraData': HexBytes('0xe4b883e5bda9e7a59ee4bb99e9b1bc380021'), 'gasLimit': 29980831, 'gasUsed': 1834730, 'hash': HexBytes('0x9519c67cff19cc78de4c79c5a83a695a9ee532d813ee8eeb2f880d048563f8d6'), 'logsBloom': HexBytes('0x9022500244180211008021008181033400080000280400000045000a020280402414000008000020000009000248010002004080488021008a40000000200002000000802200082818000208010000640000284020600200000030008000000a102200000200808000241000000008c02100000000200400430001d00008c010000100060280000000c0000000600188804004010140000804020040001000800a0002000080280206014090c80280100000000100008000408204020048100340000002010000a40800000040400000000802010500001000000006010120000118200000000000020000004008009040000004000000404058401000000004'), 'miner': '0x829BD824B016326A401d083B33D092293333A830', 'mixHash': HexBytes('0xe4b3c7d6e45ea145a0b386ce5c68c522d85ab28f782648236ec6930e5fe8d913'), 'nonce': HexBytes('0x53dec07d101b2e87'), 'number': 13549938, 'parentHash': HexBytes('0x34045975d949f8a5c0db0c1e9e2461f8453a4aab3a3dd6e7602ef1eb331874fe'), 'receiptsRoot': HexBytes('0x77ddb86550c14c8a02185239f56861e011cfdba87409b9b8abcbd66cbcbcfbc7'), 'sha3Uncles': HexBytes('0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347'), 'size': 5611, 'stateRoot': HexBytes('0xa8c91e4a0ec984bc8e0606b2b8bf603bf9a6daf3c8aef6c1342f8683c968b2d7'), 'timestamp': 1636025184, 'totalDifficulty': 33727232539851256019228, 'transactions': [HexBytes('0x6df18cdb083066fd81f2376f82b7ebbdc26d0e6eee2a73dcc7d0e14f0d2e647e'), HexBytes('0xa5d3fc54f0d7c3f1b03882f72d6b1cb90dbc93ea9a3ff8701d905aa5b95007c3'),HexBytes('0x93f0ae71ad39561dba27bee65f8800de8228d97b9ce460d2f983759f8e0d7abd'), 'uncles': []})
(.venv-py3) retina@alexander web3py_tutorial %
正如我们在上面看到的,每个块都有一个对它之前或产生它的块的引用。这被称为 and 只是前一个块的哈希值。parentHash
检查以太坊地址的有效性
让我们看看如何检查以太坊地址是否有效。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。



