Github: https://github.com/ethereum/pyethereum
これは、EthereumプロジェクトのPythonコアライブラリです。
Pythonベースのコマンドラインクライアントについては、 https : //github.com/ethereum/pyethappを参照してください。
インストール:
sudo apt-get install libssl-dev build-essential automake pkg-config libtool libffi-dev libgmp-dev libyaml-cpp-dev
git clone https://github.com/ethereum/pyethereum/
cd pyethereum
python setup.py install
コンポーネント
ethereum.pow.chain
ブロックチェーンの管理に使用できるChainクラスが含まれています。 主な方法は次のとおりです。
-
__init__(genesis=None, env=None, new_head_cb=None, reset_genesis=False, localtime=None)
– 指定された起源で初期化します。env
は環境 (チェーンの設定とデータベースを含む)を指定し、new_head_cb
は新しいヘッドが追加されたときに呼び出されるコールバックで、localtime
はチェーンが現在のタイムスタンプとみなすものです。 起源は次のとおりです:- None –
env
が与えられていると仮定し、env.db
保存されたデータでChainオブジェクトを作成します。reset_genesis
が設定されている場合、チェーンを再初期化します。 -
State
オブジェクト - 起源宣言
- 状態スナップショット(
State.snapshot()
) - 割り当て(すなわち、
{address: {balance: 1, nonce: 2, code: b'\x03\x04\x05', storage: {"0x06": "0x07"}}}
)
- None –
-
add_block(block)
– ブロックをチェーンに追加する -
process_time_queue(timestamp)
– 現在の時刻が新しいタイムスタンプに増加したことをチェーンに伝えます。 チェーンは、あまりにも早い時期に出現したため、未処理のブロックを処理します。 -
get_blockhash_by_number(num)
– 指定されたブロック番号でブロックのブロックハッシュを取得する -
get_block(hash)
– 指定されたブロックget_block(hash)
ブロックを取得する -
get_block_by_number(num)
–get_block(get_blockhash_by_number(num))
と同等get_block(get_blockhash_by_number(num))
-
get_parent(block)
–get_parent(block)
の親を取得する -
get_children(block)
–get_children(block)
の子を取得する -
head
(property) – チェーンの先頭にブロックを取得する -
state
(property) – チェーンの先頭の状態を取得する -
mk_poststate_of_blockhash(hash)
– 指定されたブロックの後に状態オブジェクトを作成する -
has_block(block)
– チェーン内のブロックですか? True / Falseを返します。 -
get_chain(from, to)
–[get_block_by_number(i) for i in range(from, to)]
ほぼ同じですが、頭に達すると自動的に停止します。 〜から始めることができます起源から、頭に行くために逃げることができます。 -
get_tx_position(tx)
– トランザクションがチェーン内にある場合、(blknum, index)
返しますblknum
はトランザクションを含むブロックのブロック番号で、index
はブロック内の位置です
ethereum.state
状態を管理するために使用されるStateクラスを含みます。 主な方法は次のとおりです。
-
__init__(root_hash, env, **kwargs)
– 指定されたルートハッシュ、与えられたenv(設定とデータベースを含む)、および与えられた補助引数で状態を初期化します。 これらには、-
txindex
– トランザクションインデックス -
gas_used
– 使用されるガスの量 -
gas_limit
– ブロックガス制限 -
block_number
– ブロック番号 - block_coinbase – コインベースアドレスをブロックする
-
block_difficulty
– 難易度をブロックする -
timestamp
– タイムスタンプ -
logs
– これまでに作成されたログ -
receipts
– これまでに作成された領収書(現在のブロックの前のトランザクションから) -
bloom
– ブルームフィルター -
suicides
– 自殺(または自己破滅、より新しい政治的に正しい同義語) -
recent_uncles
– チェーン内の最近の叔父のブロック -
prev_headers
– 前のブロックヘッダー -
refunds
– 自殺/自己払い戻しカウンター
-
Pyethereumは、 最大限に状態中心のモデルに従う。 トランザクションまたはブロックを処理するために必要なapply_transaction(state, tx)
情報は状態自体の中にあり、実際の状態遷移ロジックは非常にきれいなapply_transaction(state, tx)
およびapply_block(state, block)
ます。
-
get_balance
– アカウントの残高を取得する -
get_code
– アカウントのコードを取得する -
get_storage_data(addr, k)
– 指定されたアドレスの指定されたキーの記憶域を取得します。 数値形式のキーが必要です(例:b “牛”または “0x636f77″は6516599として表されます)。 -
to_snapshot(root_only=False, no_prevblocks=False)
– 現在の状態のスナップショットを作成します。root_only
が設定されている場合は、状態全体ではなく状態ルートのみが追加されます。no_prevblocks
が設定されている場合、以前のヘッダーと叔父は追加されません。 これらのフラグのいずれかを設定すると、スナップショットから回復するために同じデータベースが必要になることを意味します。 -
from_snapshot(snapshot, env)
(classmethod) – 指定されたenv
指定されたスナップショットから状態を作成します。 -
ephemeral_clone()
– オリジナルに影響を与えずに作業できる状態のクローンを作成します。
状態を変更する多くの方法もあります。 set_code
、 set_storage_data
ですが、通常はこれらの使用を避け、 apply_transaction
とapply_block
介してのみ状態を変更することをお勧めします。
ethereum.meta
このファイルには2つの機能があります。
-
apply_block(state, block)
– 状態をとり、ブロックをその状態に処理する -
make_head_candidate(chain, txqueue=None, parent=None, timestamp, coinbase, extra_data, min_gasprice=0)
– 指定された親ブロックの上にチェーンの候補ブロックを作成します(デフォルト:チェーンの先頭)。 与えられたtxqueue
オブジェクトから指定されたmingasprice
トランザクションを取得します(そうでなければトランザクションを追加しません)。timestamp
、coinbase
およびextra_data
を使用して、ブロック内のパラメータを指定できます。 それ以外の場合はデフォルトが使用されます
ethereum.messages
ここから呼び出される主な関数はapply_transaction(state, tx)
です。
ethereum.utils
次のようなユーティリティ機能が含まれています。
数値と16進数の変換
-
encode_int(i)
– 整数をビッグエンディアンのバイナリ表現に変換する -
zpad(data, length)
– 左に0バイトを追加してデータを所望の長さまでパッドする -
encode_int32(i)
–zpad(encode_int(i), 32)
と同等zpad(encode_int(i), 32)
、高速です -
big_endian_to_int(d)
– バイナリデータを整数に変換する -
encode_hex(b)
– バイトを16進数に変換する -
decode_hex(h)
– 16進数をバイトに変換する -
int_to_addr(i)
– 整数をアドレスに変換する -
is_numeric(i)
– 値がintまたはlongの場合はTrueを返し、そうでない場合はFalseを返します。
暗号
-
sha3(data)
– SHA3(より正確にはkeccak256)ハッシュを計算する -
ecrecover_to_pub(hash, v, r, s)
– 署名を作成した公開鍵をencode_int32(x) + encode_int32(y)
64バイトバイナリBLOBとしてencode_int32(x) + encode_int32(y)
ます。 これをハッシュし、最後の20バイトを取ると、メッセージに署名したアドレスが得られます。 -
ecsign(hash, key)
– 署名のv、r、sの値を返す -
normalize_key(key)
– 多くの形式のキーを32バイトのバイナリに変換します。 -
privtoaddr(key)
– キーをアドレスに変換する
アドレス
-
normalize_address(addr)
– アドレスを20バイトのバイナリ形式に変換します。 -
check_checksum(addr)
– アドレスチェックサムがパスするとTrueを返し、そうでない場合はFalseを返します。 -
checksum_encode(addr)
– アドレスをチェックサム付きの16進形式に変換します。 -
mk_contract_address(addr, nonce)
– 指定されたアドレスによって作成された契約のアドレスを、与えられたnonceで作成する
雑
-
denoms
– エーテルのdenoms
含む。denoms.finney = 10**15
、denoms.shannon = 10**9
、denoms.gwei = 10**9
ethereum.block
Block
クラスとBlockHeader
クラスが含まれます。 通常、 mk_head_candidate
を使用する代わりに、ブロックの作成とヘッダーの直接ブロックを避けるために推奨されます。 メンバ変数は簡単です:
-
block.transactions
– ブロック内のトランザクション -
block.uncles
– ブロック内のblock.uncles
-
block.header
– ブロックのヘッダ
ヘッダーには:
-
header.hash
– ハッシュ(ブロックハッシュ) -
header.mining_hash
– 作業マイニングの証明に使用されるハッシュ -
header.to_dict()
– 人間が読めるheader.to_dict()
シリアライズする -
header.prevhash
– 前のブロックのハッシュ -
header.uncles_hash
– 叔父リストのハッシュ -
header.coinbase
– コインベース(マイナー)アドレス -
header.state_root
– ポストステートのルートハッシュ -
header.tx_list_root
– ブロック内のトランザクションのハッシュ -
header.receipts_root
– 領収書トライのハッシュ -
header.bloom
– ブルームフィルタ -
header.difficulty
– ブロック難易度 -
header.number
– ブロック番号 -
header.gas_limit
– ガス制限 -
header.gas_used
– 使用されたガス -
header.timestamp
– タイムスタンプ -
header.extra_data
– 余分なデータをブロックする -
header.mixhash
とheader.nonce
– Ethashの作業証明値
ethereum.transactions
次のメソッドと値を持つTransactionクラスが含まれます。
-
__init__(nonce, gasprice, startgas, to, value, data, (v, r, s optional))
– コンストラクタ -
sign(key, network_id=None)
– 指定された鍵と、指定されたEIP155チェーンIDを持つトランザクションに署名します(NoneはEIP155のpre-txを作成し、これを行うとリプレイ攻撃を警告します)。 -
sender
– トランザクションの送信者アドレス - network_id – トランザクションのEIP155チェーンID
-
hash
– トランザクションのハッシュ -
to_dict()
– 人間が読めるto_dict()
シリアライズする -
intrinsic_gas_used
– トランザクションによって消費されたガスの量(txデータのコストを含む) -
creates
– トランザクションが契約を作成した場合は、契約アドレスを返します。 -
nonce
、gasprice
、startgas
、to
、value
、data
、v
、r
、s
– トランザクションのパラメータ
ethereum.tools.keys
暗号化された秘密鍵記憶装置を作成する
-
decode_keystore_json(jsondata, password)
– 暗号化されたキーストアオブジェクトから秘密鍵を返します。 注:ファイルからロードする場合、これを行う最も便利な方法はimport json; key = decode_keystore_json(json.load(open('filename.json')), 'password')
import json; key = decode_keystore_json(json.load(open('filename.json')), 'password')
-
make_keystore_json(key, pw, kdf='pbkdf2', cipher='aes-128-ctr')
– キーの暗号化されたキーストアオブジェクトを作成します。kdf
とcipher
をデフォルト値に保つことをお勧めします。
エテルリアム
Ethereum上のHLL(solidity、serpent、viperなど)用のコンパイラのほとんどは、プログラムのABI宣言を出力するオプションを持っています。 これは、次のようなjsonオブジェクトです。
[{"name": "ecrecover(uint256,uint256,uint256,uint256)", "type": "function", "constant": false,
"inputs": [{"name": "h", "type": "uint256"}, {"name": "v", "type": "uint256"}, {"name": "r", "type": "uint256"}, {"name": "s", "type": "uint256"}],
"outputs": [{"name": "out", "type": "int256[]"}]},
{"name": "PubkeyTripleLogEvent(uint256,uint256,uint256)", "type": "event",
"inputs": [{"name": "x", "type": "uint256", "indexed": false}, {"name": "y", "type": "uint256", "indexed": false}, {"name": "z", "type": "uint256", "indexed": false}]}]
abi.ContractTranslator
オブジェクトを初期化して、契約のデータを次のようにエンコードおよびデコードすることができます。
true, false = True, False
ct = abi.ContractTranslator(<json here>)
txdata = ct.encode('function_name', [arg1, arg2, arg3])
ct.decode_event([topic1, topic2...], logdata)
を呼び出してログをデコードすることもできます。
RLP符号化および復号化
トランザクションやブロックの場合は、次の操作を行うだけです。
import rlp
bindata = rlp.encode(<tx or block>)
デコードするには:
import rlp
from ethereum.transactions import Transaction
rlp.decode(blob, Transaction)
または:
import rlp
from ethereum.blocks import Block
rlp.decode(blob, Block)
コンセンサス抽象化
pyethereumコードベースは、多くの異なるコンセンサスアルゴリズムで使用するために最大限の親和性を持つように設計されています。 新しい合意を追加する場合は、次の手順を実行する必要があります。
-
pow
と並んでディレクトリを追加し、Chain
モジュールを実装するchain.py
クラスを作成します。 これは仕事の証明(GHOST、署名カウント、キャスパーなど)のために全く異なるフォーク選択ルールを持つかもしれません。 -
consensus_strategy.py
エントリを追加します。 実装する必要があります:-
check_seal
– ブロックが正しく “封印されている”ことを確認します(マイニング、署名など) -
validate_uncles(state, block)
– 叔父が有効であることを確認する -
initialize(state, block)
– トランザクションが処理される前にapply_block
呼び出されます。 -
finalize(state, block)
– トランザクションの処理後にapply_block
呼び出されます。 -
get_uncle_candidates(chain, state)
– ブロックに叔父を含めるためにmk_head_candidate
でmk_head_candidate
れます。
-
-
CONSENSUS_STRATEGY
新しいコンセンサス戦略の名前に設定してチェーン設定を作成する
テスターモジュール
https://github.com/ethereum/pyethereum/wiki/Using-pyethereum.testerを参照してください。
テスト
python3.6 -m pytest ethereum/tests/<filename>
を、そのディレクトリ内の.pyファイルに対して実行します。 現在、すべてのテストは、メトロポリス特有の状態テストとブロックテストを除いて、合格しています。
独自の状態テストを行うには、次のようにテスターモジュールを使用します。
from ethereum.tools import tester as t
import json
c = t.Chain()
x = c.contract(<code>, language=<language>)
pre = t.mk_state_test_prefill(c)
x.foo(<args>)
post = t.mk_state_test_postfill(c, pre)
open('output.json', 'w').write(json.dumps(post, indent=4))
代わりにテストフィラーファイルを作成するには、 post = t.mk_state_test_postfill(c, pre, True)
ます。
ライセンス
LICENSEを参照してください