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

py-evm系列译文之1-cookbook翻译

食谱

Cookbook是一系列简单的食谱,展示了完成常见任务的良好实践。这些示例通常是简单的“我如何…”问题的简短答案,这些问题超出了简单的API描述,但也不需要完整的指南才能变得清晰。

使用Chain对象

一个"单独"的区块链是由一系列不同的虚拟机组成的,它们用于不同的块跨度,例如,以太坊主网有一个虚拟机用于块0到1150000(称为Frontier),另一个VM用于块1150000到1920000(称为Homestead)。

Chain在定义VM范围后,该对象将管理一系列fork规则。例如,要设置一个跟踪主网以太坊网络的链,直到块1920000,您可以创建此链类:

1
2
3
4
5
6
7
8
9
10
11
12
>>> from eth import constants, Chain
>>> from eth.vm.forks.frontier import FrontierVM
>>> from eth.vm.forks.homestead import HomesteadVM
>>> from eth.chains.mainnet import HOMESTEAD_MAINNET_BLOCK

>>> chain_class = Chain.configure(
... __name__='Test Chain',
... vm_configuration=(
... (constants.GENESIS_BLOCK_NUMBER, FrontierVM),
... (HOMESTEAD_MAINNET_BLOCK, HomesteadVM),
... ),
... )

然后要初始化,您可以使用内存数据库启动它:

1
2
3
4
5
6
7
>>> from eth.db.atomic import AtomicDB
>>> from eth.chains.mainnet import MAINNET_GENESIS_HEADER

>>> # 开始一个新的内存数据酷酷

>>> # 初始化一个新链
>>> chain = chain_class.from_genesis_header(AtomicDB(), MAINNET_GENESIS_HEADER)

用自定义状态创建链

虽然前面的食谱演示了如何从现有的genesis头创建链,但我们也可以通过指定各种genesis参数以及可选的genesis状态来创建链。

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
>>> from eth_keys import keys
>>> from eth import constants
>>> from eth.chains.mainnet import MainnetChain
>>> from eth.db.atomic import AtomicDB
>>> from eth_utils import to_wei, encode_hex



>>> # 给some_address加点赞助(就是往里面打钱)
>>> SOME_ADDRESS = b'\x85\x82\xa2\x89V\xb9%\x93M\x03\xdd\xb4Xu\xe1\x8e\x85\x93\x12\xc1'
>>> GENESIS_STATE = {
... SOME_ADDRESS: {
... "balance": to_wei(10000, 'ether'),
... "nonce": 0,
... "code": b'',
... "storage": {}
... }
... }

>>> 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
... }

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

从帐户中获取余额

考虑到我们之前的例子,我们可以获得预付资金账户的余额如下。

1
2
3
4
>>> current_vm = chain.get_vm()
>>> state = current_vm.state
>>> state.get_balance(SOME_ADDRESS)
10000000000000000000000

递增构建块

默认链是无状态的,因此不能保持一个提示块开放,使我们逐步构建块。然而我们可以导入 允许我们构建块的MiningChain

1
>>> from eth.chains.base import MiningChain

请查看“ 了解挖掘过程指南 ”以获取演示如何使用MiningChain。的完整示例