2020.12.12_pyhack
https://gyazo.com/7859629bd18bf53adb365832e0488d34
Ethereum Protocolに対応したクライアントノードの1つであるPython実装である #py-evm の状況を調べている。 前回(20201107)では時間が一時間くらいしかとれなかったのでそのpyhack1107の続き。
releasenoteを理解して何をしているのか把握しようとしたが時間がかかるので、適宜追記していくとして、
まずはpy-evmを使ったappが動作できるかどうかから進めることにする。
Install
readthedocsにあるように、pipでインストールするだけ。
$ pip3 install -U py-evm
5分でできる!って書いてあるけどほんとかな。=> 動きませんでした!
上の画像にあるように"Build a first app"のリンクがあるのですが、これはreadthedocsのguideへのリンクでした。
Py-EVM Sample App
上のリンクをそのまま実行できるサンプルもなかったので自分で作っておきました。
以下のEthereumでのHelloWorld的なコードを実行するものです。LINK これをベースにコントラクトのロジックを今後追加していきたいと思います。
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
# まとめ
HelloWorld的なtoken発行と動作確認のサンプルを作ってgithubにアップした。
動作確認の過程で、python3.7では動いていたのに、python3.9にしたら動かなくなった。
原因はまた解決する機会を作ってやってみたいとおもう。