通过命令行在 Python 中测试以太坊 RPC 客户端
在这个笔记中,我将使用Python命令行测试以太坊的RPC客户端,准备好狂敲键盘吧。过程中有关JSON RPC的更多信息,可以参阅JSON RPC。
输入:
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import sys
sys.version
输出:
'3.6.0 |Anaconda 4.3.0 (64-bit)| (default, Dec 23 2016, 12:22:00) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]'
准备环境
为以太坊安装Python RPC客户端,输入:
jitsejan@jjvps:~$ pip install ethereum-rpc-client
启动区块链以确保启用RPC。
输入:
jitsejan@jjvps:~$ geth --networkid 23 --nodiscover --maxpeers 0 --port 30333 --rpc
验证geth是否正在运行并且列出了该帐户。
输入:
!geth account list
输出:
Account #0: {8cf9deda0712f2291fb16739f8759e4a0a575854} keystore:///home/jitsejan/.ethereum/keystore/UTC--2017-05-01T14-58-43.532247863Z--8cf9deda0712f2291fb16739f8759e4a0a575854
链接到RPC客户端
输入:
from eth_rpc_client import Client
client = Client(host="127.0.0.1", port="8545")
检查客户端
输入:
import pdir
pdir(client)
输出:
abstract class:
__subclasshook__
attribute access:
__delattr__, __dir__, __getattribute__, __setattr__
class customization:
__init_subclass__
object customization:
__format__, __hash__, __init__, __new__, __repr__, __sizeof__, __str__
other:
_coinbase_cache, _coinbase_cache_til, _nonce, async_timeout, host, is_async, port, request_queue, request_thread, results, session
pickle:
__reduce__, __reduce_ex__
rich comparison:
__eq__, __ge__, __gt__, __le__, __lt__, __ne__
special attribute:
__class__, __dict__, __doc__, __module__, __weakref__
descriptor:
default_from_address: @property with getter, Cache the coinbase address so that we don't make two requests for every
function:
_make_request:
call: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_call
construct_json_request:
get_accounts: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_accounts
get_balance: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getbalance
get_block_by_hash: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getblockbyhash
get_block_by_number: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getblockbynumber
get_block_number: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_blocknumber<F37>
get_code: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getcode
get_coinbase: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_coinbase
get_filter_changes: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getfilterchanges
get_filter_logs: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getfilterlogs
get_gas_price: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gasprice
get_logs: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getlogs
get_max_gas:
get_nonce:
get_transaction_by_hash: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gettransactionbyhash
get_transaction_receipt: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gettransactionreceipt
make_request:
new_block_filter: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_newblockfilter
new_filter: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_newfilter
new_pending_transaction_filter: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_newpendingtransactionfilter
process_requests: Loop that runs in a thread to process requests synchronously.
send_transaction: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sendtransaction
uninstall_filter: https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_uninstallfilter
wait_for_block:
wait_for_transaction:
获取区块链的coinbase
输入:
address = client.get_coinbase()
address
输出:
0x8cf9deda0712f2291fb16739f8759e4a0a575854
查询主地址的余额
输入:
client.get_balance(address)
输出:
135000419895999999940
设置其他两台机器的地址
输入:
address_vps_one = "0xc257beaea430afb3a09640ce7f020c906331f805"
address_vps_two = "0xe86ee31b7d32b743907fa7438c422a1803717deb"
client.get_balance(address_vps_one)
client.get_balance(address_vps_two)
输出:
6999160060000000000
83000420044000000060
交易
让我们从主机发送12个以太网到VPS,1 GWEI=0.000000001 Ether。
输入:
amount = 12 # Ether
sending_address = address
receiving_address = address_vps_one
获取密码以解锁发送帐户
输入:
from getpass import getpass
pw = getpass(prompt='Enter the password for the sender: ')
通过命令行解锁帐户
输入:
command = r'geth --exec "personal.unlockAccount(\"%s\", \"%s\");" attach ' % (sending_address, pw)
result = !$command
if result[0] != 'true':
print('Fail: %s' % result[0])
else:
print('Account is unlocked!')
输出:
Account is unlocked!
发送交易
tx_hash = client.send_transaction(to=receiving_address, _from=sending_address, value=amount * 10**9)
检查交易明细
client.get_transaction_by_hash(tx_hash)
输出:
{'blockHash': '0x0000000000000000000000000000000000000000000000000000000000000000',
'blockNumber': None,
'from': '0x8cf9deda0712f2291fb16739f8759e4a0a575854',
'gas': '0x15f90',
'gasPrice': '0x4a817c800',
'hash': '0x3d1a193ccfccc4e9ab2a411044069deeec2feef31a594bbf73726b463e8e90b4',
'input': '0x',
'nonce': '0xb',
'r': '0xe8698846a461938e800698fcc34570e0c4e9a3425f0bc441bf3e0716dab7b3e0',
's': '0x4fcd9bda8a1e98a7b0e8d953dec0cc733238c383d97393aa15c43963551f8daf',
'to': '0xc257beaea430afb3a09640ce7f020c906331f805',
'transactionIndex': '0x0',
'v': '0x42',
'value': '0x2cb417800'}
执行一个挖掘步骤
执行矿工以验证交易。
输入:
prev_balance_sen = client.get_balance(sending_address)
prev_balance_rec = client.get_balance(receiving_address)
result = !geth --exec "miner.start();admin.sleepBlocks(1);miner.stop();" attach
if result[0] != 'true':
print('Fail: %s' % result[0])
else:
print("Mining finished!")
输出挖矿完成:
Mining finished!
检查是否已收到以太网
输入:
print("Received %d"% (client.get_balance(receiving_address)-prev_balance_rec))
输出收到金额:
Received 12000000000
检查Ether是否已发送
首先检查余额的差异,输入:
print("Difference of the sender %d"% (client.get_balance(sending_address)-prev_balance_sen))
输出:
Difference of the sender 4999999988000000000
对于采矿来说,矿工将获得采矿奖金。
输入:
mining_bonus = 5000000000000000000
要获得以太网发送的数量,我们需要减去采矿奖金。
输入:
print("Amount difference: %d" % int(client.get_balance(sending_address)-prev_balance_sen - mining_bonus))
输出金额差异:
Amount difference: -12000000000
。
python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
这里是原文在Python中使用以太坊RPC客户端
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: