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 = 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
。的完整示例