py-evm系列译文,有不当之处请联系改正,原文如下:https://py-evm.readthedocs.io/en/latest/guides/building_an_app_that_uses_pyevm.html

py-evm系列译文之2-Guides翻译1:构建一个使用Py-EVM的应用程序

构建一个使用Py-EVM的应用程序

Py-EVM库的主要用例之一是使开发人员能够构建想要与以太坊生态系统交互的应用程序。

在本指南中,我们要构建一个非常简单的脚本,该脚本使用Py-EVM库创建一个带有预先资助地址的新区块链,以便通过常规Py-EVMAPI 简单地读取该地址的余额。坦率地说,这不是世界上最激动人心的应用程序,但对于更激动人心的用例,如何使用Py-EVM库的原则保持不变。

设置应用程序

让我们开始设置一个新的应用程序。通常,该过程涉及大量重复的样板代码,因此不要手动完成所有操作,只需克隆包含我们想要的所有典型事物的 以太坊Python项目模板

要将其克隆到新目录中,请demo-app运行:

1
git clone https://github.com/carver/ethereum-python-project-template.git demo-app

然后,切换到目录

1
cd demo-app

添加Py-EVM库作为依赖

要添加Py-EVM为依赖项,请setup.py在应用程序的根目录中打开该文件,然后install_requires按如下所示更改该部分。

1
2
3
4
install_requires=[
"eth-utils>=1,<2",
"py-evm==0.2.0a40",
],

!警告

确保还将文件setup.py 的内部name更改为有效项目名(例如demo-app)或其他内容,否则获取依赖项将失败。

接下来,我们需要使用pip包管理器来获取和安装我们的应用程序的依赖项。

!注意

**可选:**通常,保证干净的Python 3环境的最佳方法是使用 virtualenv。如果我们还没有virtualenv安装,我们首先需要通过pip安装它。

pip install virtualenv

然后,我们可以初始化一个新的虚拟环境venv,例如:

virtualenv -p python3 venv

这将创建一个新目录venv,其中安装包与任何其他全局包隔离。

要激活虚拟目录,我们必须source它

. venv/bin/activate

要安装依赖项,请运行:

pip install -e .[dev]

恭喜!我们现在准备构建我们的应用程序了!

编写应用程序代码

接下来,我们将创建一个新目录app并在其中创建一个文件main.py。粘贴以下内容。

!注意

代码示例通常以交互式会话语法编写,该语法由以>>>或开头的行指示...。这使我们能够针对示例运行自动测试,以确保它们在库不断发展时继续工作。当我们想要复制并粘贴示例代码以使用它时,我们需要删除这些额外的字符以获得可运行的有效Python代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
>>> from eth import constants
>>> from eth.chains.mainnet import MainnetChain
>>> from eth.db.atomic import AtomicDB

>>> from eth_utils import to_wei, encode_hex


>>> MOCK_ADDRESS = constants.ZERO_ADDRESS
>>> DEFAULT_INITIAL_BALANCE = to_wei(10000, 'ether')

>>> GENESIS_PARAMS = {
... 'parent_hash': constants.GENESIS_PARENT_HASH,
... 'uncles_hash': constants.EMPTY_UNCLE_HASH,
... 'coinbase': constants.ZERO_ADDRESS,
... 'transaction_root': constants.BLANK_ROOT_HASH,
... 'receipt_root': constants.BLANK_ROOT_HASH,
... 'difficulty': constants.GENESIS_DIFFICULTY,
... 'block_number': constants.GENESIS_BLOCK_NUMBER,
... 'gas_limit': constants.GENESIS_GAS_LIMIT,
... 'extra_data': constants.GENESIS_EXTRA_DATA,
... 'nonce': constants.GENESIS_NONCE
... }

>>> GENESIS_STATE = {
... MOCK_ADDRESS: {
... "balance": DEFAULT_INITIAL_BALANCE,
... "nonce": 0,
... "code": b'',
... "storage": {}
... }
... }

>>> chain = MainnetChain.from_genesis(AtomicDB(), GENESIS_PARAMS, GENESIS_STATE)

>>> mock_address_balance = chain.get_vm().state.get_balance(MOCK_ADDRESS)

>>> print("The balance of address {} is {} wei".format(
... encode_hex(MOCK_ADDRESS),
... mock_address_balance)
... )
The balance of address 0x0000000000000000000000000000000000000000 is 10000000000000000000000 wei

运行脚本

让我们通过调用以下命令来运行脚本。

1
$ python app/main.py

我们应该看到以下输出。

1
The balance of address 0x0000000000000000000000000000000000000000 is 10000000000000000000000 wei