Python 経由で Ethereum にアクセスしたい場合は、Ethereum の公式 Github から、web3.py と pyethereum という 2 つのモジュールで実現できることがわかります。私の現在の理解では、両者の違いは、web3.py は主に Ethereum への外部アクセス用のクライアントとして使用されるということです。つまり、web3.py 関数ライブラリ自体はブロックチェーン ノードにはならず、ブロックチェーン ノードにもなりません。ブロックを実行します。チェーン同期は、ブロックチェーン上のノードに接続し、ブロックチェーンを外部データベースとして使用することです。一方、pyethereum は、それ自体をブロックチェーン ノードにするために使用される geth に似ています。ブロック同期は通常どおり実行され、次のことができますマイナーとして採掘を開始することもできます。
この記事では、軽量クライアントでブロックチェーンと対話する必要があり、ブロックチェーン データを保存するための巨大なストレージ領域を用意したくないため、web3.py をメインに使用します。
web3.py は pip を通じて直接インストールできます。
pip install web3
Windows にインストールする場合は、事前に Visual C Builder をインストールする必要があります。そうしないと、インストールの最終段階でコンパイルできずにインストールが失敗します。
web3.py ブロックチェーンノードとしては存在しないため、ブロックチェーンにアクセスするためのノードが必要です。一般的に、最も安全な方法は、geth または parity を使用して独自のノードを構築することですが、独自のノードを構築したくない場合は、infura が提供する HTTP ノード サービスを検討することもできます。
infura の現在の API を例に挙げると、Ropsten テスト チェーンに接続する場合、リンク URL は https://ropsten.infura.io/v3/api_key で、ここに api_key を登録する必要があります。アカウントを取得します。次のプログラムは、web3.py の組み込み auto.infura の実践を模倣しています。これは、環境変数から INFURA_API_KEY パラメーターを読み取り、Ropsten テスト チェーンとの接続を確立するために使用される infura.io の HTTP アドレスを形成します。
import os from web3 import ( HTTPProvider, Web3, ) INFURA_ROPSTEN_BASE_URL = 'https://ropsten.infura.io/v3' def load_infura_url(): key = os.environ.get('INFURA_API_KEY', '') return "%s/%s" % (INFURA_ROPSTEN_BASE_URL, key) w3 = Web3(HTTPProvider(load_infura_url()))
契約の入金と出金を始める前に、ABI とは何かについて話しておく必要があります。イーサリアムでは、コントラクトはすべてコンパイルされたバイナリコードの形式で存在するため、コントラクトの戻り値はすべてバイナリであるため、関数ライブラリはコントラクトによって送信されるコンテンツが何であるかを直接知る方法がありません。したがって、コントラクトを操作する前に、関数ライブラリにコントラクトの使用方法を指示する ABI ファイルを提供する必要があります。
# Assume the contract we're going to invoke is a standard ERC20 contract. with open("erc20.abi.json") as f: erc20_abi = json.load(f) # Web3 accept only checksum address. So we should ensure the given address is a # checksum address before accessing the corresponding contract. contract_addr = w3.toChecksumAddress('0x4e470dc7321e84ca96fcaedd0c8abcebbaeb68c6'); erc20_contract = w3.eth.contract(address=contract_addr, abi=erc20_abi) for func in erc20_contract.all_functions(): logger.debug('contract functions: %s', func) logger.debug("Name of the token: %s", erc20_contract.functions.name().call())
ここで、Ropsten テスト チェーン上のアドレス 0x4e470dc7321e84ca96fcaedd0c8abcebbaeb68c6 のスマート コントラクトにアクセスするとします。このコントラクトは、etherscan を通じてランダムに検出された ERC20 コントラクトであるため、標準の ERC20 ABI を使用してアクセスできます。このコントラクトのインスタンスを作成するときは、まずループを実行してコントラクト内のすべての関数を出力し (このステップは実際には ABI 上の情報をリストします)、次にコントラクト内で name() を呼び出して、契約宣言、トークン名。最終的な出力内容は次のとおりです。
2018-09-07 15:02:53,815 | __main__ | DEBUG | contract functions: <Function name()> 2018-09-07 15:02:53,816 | __main__ | DEBUG | contract functions: <Function approve(address,uint256)> 2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions: <Function totalSupply()> 2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions: <Function transferFrom(address,address,uint256)> 2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions: <Function decimals()> 2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions: <Function balanceOf(address)> 2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions: <Function symbol()> 2018-09-07 15:02:53,825 | __main__ | DEBUG | contract functions: <Function transfer(address,uint256)> 2018-09-07 15:02:53,825 | __main__ | DEBUG | contract functions: <Function allowance(address,address)> 2018-09-07 15:02:54,359 | __main__ | DEBUG | Name of the token: KyberNetwork
上記の例では、スマート コントラクトを呼び出すときに、契約されていますが、これは通常、ブロックチェーン上のデータを読み取るためにのみ使用できます。スマート コントラクトを呼び出してブロックチェーンにデータを書き込む場合は、別の方法でコントラクトを呼び出す必要があります。つまり、最初にトランザクションに署名し、次にトランザクションを実行するためにガスを支払う必要があります。
また、ERC20 コントラクトを呼び出し、そのコントラクトに対して transferFrom() 関数を実行するとします。 transferFrom() には 3 つのパラメータ _from、_to、_value が必要です。これは、送金金額が _from アカウントから _to アカウントに送金されることを意味し、送金金額は _value です。
# Set the account which makes the transaction. account = w3.toChecksumAddress(os.environ.get('ETHEREUM_ACCOUNT', '')) w3.eth.defaultAccount = account # Web3 accept only checksum address. So we should ensure the given address is a # checksum address before accessing the corresponding contract. contract_address = w3.toChecksumAddress('0x4e470dc7321e84ca96fcaedd0c8abcebbaeb68c6') contract = w3.eth.contract(address=contract_address, abi=contract_abi) # Prepare the necessary parameters for making a transaction on the blockchain. estimate_gas = contract.functions.transferFrom(account, account, w3.toWei('1', 'eth')).estimateGas() nonce = w3.eth.getTransactionCount(account) # Build the transaction. txn = contract.functions.transferFrom(account, account, w3.toWei('1', 'eth')).buildTransaction({ 'chainId': 3, 'gas': estimate_gas, 'gasPrice': w3.toWei('1', 'gwei'), 'nonce': nonce }) logger.debug('Transaction: %s', txn) # Sign the transaction. private_key = bytes.fromhex(os.environ.get('ETHEREUM_ACCOUNT_PKEY', '')) signed_txn = w3.eth.account.signTransaction(txn, private_key=private_key) tx_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction) logger.debug('Txhash: 0x%s', bytes.hex(tx_hash))
上記プログラムでは、2~3行目でまず環境変数から使用したいアカウントを読み込み、トランザクションの送信に使用します。もちろんガスの支払いもこのアカウントから行われます。バックル。 10~20行目で生のトランザクションを作成しますが、このトランザクションではgasやnonceなどのパラメータを指定する必要があるため、前の11~12行目で設定するパラメータの数を確認する必要があります。次に、最も重要な行 25 ~ 26 で秘密キーを読み取り、その秘密キーを使用してトランザクションに署名します。ここでは、秘密キーが 16 進数でエンコードされたテキストで構成されていると想定しているため、bytes.fromhex を使用して 16 進数エンコードをバイト形式に変換します。署名後、トランザクションを送信します。トランザクションを送信すると、API はトランザクション ハッシュをバイト形式で返します。それをエンコードして出力し、etherscan でトランザクションを検索できます。
以上がweb3.py 経由で Python を使用して Ethereum にアクセスするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。