GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

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"}}}
  • 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_codeset_storage_dataですが、通常はこれらの使用を避け、 apply_transactionapply_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トランザクションを取得します(そうでなければトランザクションを追加しません)。 timestampcoinbaseおよび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**15denoms.shannon = 10**9denoms.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.mixhashheader.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 – トランザクションが契約を作成した場合は、契約アドレスを返します。
  • noncegaspricestartgastovaluedatavrs – トランザクションのパラメータ

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') – キーの暗号化されたキーストアオブジェクトを作成します。 kdfcipherをデフォルト値に保つことをお勧めします。

エテルリアム

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_candidatemk_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を参照してください







-ethereum

執筆者: