Add generic wire methods for signer
This commit is contained in:
parent
ffcde95e5f
commit
418c54e9c7
@ -17,9 +17,17 @@ from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer
|
||||
# local imports
|
||||
from chainlib.eth.address import AddressChecksum
|
||||
from chainlib.eth.connection import EthHTTPConnection
|
||||
|
||||
from chainlib.eth.gas import (
|
||||
OverrideGasOracle,
|
||||
RPCGasOracle,
|
||||
)
|
||||
from chainlib.eth.nonce import (
|
||||
OverrideNonceOracle,
|
||||
RPCNonceOracle,
|
||||
)
|
||||
script_dir = os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
|
||||
class Wallet(BaseWallet):
|
||||
"""Convenience constructor to set Ethereum defaults for chainlib cli Wallet object
|
||||
|
||||
@ -32,11 +40,42 @@ class Wallet(BaseWallet):
|
||||
|
||||
class Rpc(BaseRpc):
|
||||
"""Convenience constructor to set Ethereum defaults for chainlib cli Rpc object
|
||||
|
||||
|
||||
"""
|
||||
def __init__(self, wallet=None):
|
||||
super(Rpc, self).__init__(EthHTTPConnection, wallet=wallet)
|
||||
|
||||
|
||||
def connect_by_config(self, config):
|
||||
"""
|
||||
|
||||
If the standard arguments for nonce and fee price/price have been defined (which generate the configuration keys "_NONCE", "_FEE_PRICE" and "_FEE_LIMIT" respectively) , the corresponding overrides for fee and nonce generators will be defined.
|
||||
|
||||
"""
|
||||
super(Rpc, self).connect_by_config(config)
|
||||
|
||||
if self.can_sign():
|
||||
nonce = config.get('_NONCE')
|
||||
if nonce != None:
|
||||
self.nonce_oracle = OverrideNonceOracle(self.get_sender_address(), nonce, id_generator=self.id_generator)
|
||||
else:
|
||||
self.nonce_oracle = RPCNonceOracle(self.get_sender_address(), self.conn, id_generator=self.id_generator)
|
||||
|
||||
fee_price = config.get('_FEE_PRICE')
|
||||
fee_limit = config.get('_FEE_LIMIT')
|
||||
if fee_price != None or fee_limit != None:
|
||||
self.fee_oracle = OverrideGasOracle(price=fee_price, limit=fee_limit, conn=self.conn, id_generator=self.id_generator)
|
||||
else:
|
||||
self.fee_oracle = RPCGasOracle(self.conn, id_generator=self.id_generator)
|
||||
|
||||
return self.conn
|
||||
|
||||
|
||||
def get_gas_oracle(self):
|
||||
return self.get_fee_oracle()
|
||||
|
||||
|
||||
class Config(BaseConfig):
|
||||
"""Convenience constructor to set Ethereum defaults for the chainlib cli config object
|
||||
"""
|
||||
|
@ -179,13 +179,13 @@ class EthUnixSignerConnection(EthUnixConnection):
|
||||
"""Connects rpc signer methods to Unix socket connection interface
|
||||
"""
|
||||
|
||||
def sign_transaction_to_rlp(self, tx):
|
||||
def sign_transaction_to_wire(self, tx):
|
||||
"""Sign transaction using unix socket rpc.
|
||||
|
||||
:param tx: Transaction object
|
||||
:type tx: dict
|
||||
:rtype: See chainlin.eth.connection.sign_transaction_to_rlp
|
||||
:returns: See chainlin.eth.connection.sign_transaction_to_rlp
|
||||
:rtype: See chainlib.eth.connection.sign_transaction_to_rlp
|
||||
:returns: Serialized signature
|
||||
"""
|
||||
return sign_transaction_to_rlp(self.chain_spec, self.do, tx)
|
||||
|
||||
@ -203,13 +203,13 @@ class EthUnixSignerConnection(EthUnixConnection):
|
||||
|
||||
class EthHTTPSignerConnection(EthHTTPConnection):
|
||||
|
||||
def sign_transaction_to_rlp(self, tx):
|
||||
def sign_transaction_to_wire(self, tx):
|
||||
"""Sign transaction using http json-rpc.
|
||||
|
||||
:param tx: Transaction object
|
||||
:type tx: dict
|
||||
:rtype: See chainlin.eth.connection.sign_transaction_to_rlp
|
||||
:returns: See chainlin.eth.connection.sign_transaction_to_rlp
|
||||
:returns: Serialized signature
|
||||
"""
|
||||
return sign_transaction_to_rlp(self.chain_spec, self.do, tx)
|
||||
|
||||
|
@ -9,6 +9,7 @@ from hexathon import (
|
||||
from crypto_dev_signer.eth.transaction import EIP155Transaction
|
||||
|
||||
# local imports
|
||||
from chainlib.fee import FeeOracle
|
||||
from chainlib.hash import keccak256_hex_to_hex
|
||||
from chainlib.jsonrpc import JSONRPCRequest
|
||||
from chainlib.eth.tx import (
|
||||
@ -100,7 +101,7 @@ class Gas(TxFactory):
|
||||
if data != None:
|
||||
tx['data'] = data
|
||||
txe = EIP155Transaction(tx, tx['nonce'], tx['chainId'])
|
||||
tx_raw = self.signer.sign_transaction_to_rlp(txe)
|
||||
tx_raw = self.signer.sign_transaction_to_wire(txe)
|
||||
tx_raw_hex = add_0x(tx_raw.hex())
|
||||
tx_hash_hex = add_0x(keccak256_hex_to_hex(tx_raw_hex))
|
||||
|
||||
@ -114,7 +115,7 @@ class Gas(TxFactory):
|
||||
|
||||
|
||||
|
||||
class RPCGasOracle:
|
||||
class RPCGasOracle(FeeOracle):
|
||||
"""JSON-RPC only gas parameter helper.
|
||||
|
||||
:param conn: RPC connection
|
||||
@ -128,13 +129,13 @@ class RPCGasOracle:
|
||||
"""
|
||||
|
||||
def __init__(self, conn, code_callback=None, min_price=1, id_generator=None):
|
||||
super(RPCGasOracle, self).__init__(code_callback=code_callback)
|
||||
self.conn = conn
|
||||
self.code_callback = code_callback
|
||||
self.min_price = min_price
|
||||
self.id_generator = id_generator
|
||||
|
||||
|
||||
def get_gas(self, code=None, input_data=None):
|
||||
def get_fee(self, code=None, input_data=None):
|
||||
"""Retrieve gas parameters from node.
|
||||
|
||||
If code is given, the set code callback will be used to estimate gas usage.
|
||||
@ -163,6 +164,10 @@ class RPCGasOracle:
|
||||
return (gas_price, fee_units)
|
||||
|
||||
|
||||
def get_gas(self, code=None, input_data=None):
|
||||
return self.get_fee(code=code, input_data=input_data)
|
||||
|
||||
|
||||
class RPCPureGasOracle(RPCGasOracle):
|
||||
"""Convenience constructor for rpc gas oracle without minimum price.
|
||||
|
||||
@ -213,14 +218,12 @@ class OverrideGasOracle(RPCGasOracle):
|
||||
super(OverrideGasOracle, self).__init__(price_conn, code_callback, id_generator=id_generator)
|
||||
|
||||
|
||||
def get_gas(self, code=None):
|
||||
"""See chainlib.eth.gas.RPCGasOracle.
|
||||
"""
|
||||
def get_fee(self, code=None, input_data=None):
|
||||
r = None
|
||||
fee_units = None
|
||||
fee_price = None
|
||||
|
||||
rpc_results = super(OverrideGasOracle, self).get_gas(code)
|
||||
rpc_results = super(OverrideGasOracle, self).get_fee(code)
|
||||
|
||||
if self.limit != None:
|
||||
fee_units = self.limit
|
||||
@ -245,4 +248,8 @@ class OverrideGasOracle(RPCGasOracle):
|
||||
return (fee_price, fee_units)
|
||||
|
||||
|
||||
def get_gas(self, code=None, input_data=None):
|
||||
return self.get_fee(code=code, input_data=input_data)
|
||||
|
||||
|
||||
DefaultGasOracle = RPCGasOracle
|
||||
|
@ -5,6 +5,7 @@ from hexathon import (
|
||||
)
|
||||
|
||||
# local imports
|
||||
from chainlib.nonce import NonceOracle as BaseNonceOracle
|
||||
from chainlib.jsonrpc import JSONRPCRequest
|
||||
|
||||
|
||||
@ -22,7 +23,6 @@ def nonce(address, confirmed=False, id_generator=None):
|
||||
o = j.template()
|
||||
o['method'] = 'eth_getTransactionCount'
|
||||
o['params'].append(address)
|
||||
o['params'].append('pending')
|
||||
if confirmed:
|
||||
o['params'].append('latest')
|
||||
else:
|
||||
@ -34,7 +34,7 @@ def nonce_confirmed(address, id_generator=None):
|
||||
return nonce(address, confirmed=True, id_generator=id_generator)
|
||||
|
||||
|
||||
class NonceOracle:
|
||||
class NonceOracle(BaseNonceOracle):
|
||||
"""Base class for the nonce parameter helpers.
|
||||
|
||||
:param address: Address to retireve nonce for, in hex
|
||||
@ -43,9 +43,8 @@ class NonceOracle:
|
||||
:type id_generator: chainlib.connection.JSONRPCIdGenerator
|
||||
"""
|
||||
def __init__(self, address, id_generator=None):
|
||||
self.address = address
|
||||
self.id_generator = id_generator
|
||||
self.nonce = self.get_nonce()
|
||||
super(NonceOracle, self).__init__(address)
|
||||
|
||||
|
||||
def get_nonce(self):
|
||||
|
@ -299,7 +299,7 @@ class TxFactory:
|
||||
:param chain_spec: Chain spec to use for signer.
|
||||
:type chain_spec: chainlib.chain.ChainSpec
|
||||
:param signer: Signer middleware.
|
||||
:type param: Object implementing interface ofchainlib.eth.connection.sign_transaction_to_rlp.
|
||||
:type param: Object implementing interface ofchainlib.eth.connection.sign_transaction_to_wire
|
||||
:param gas_oracle: Backend to generate gas parameters
|
||||
:type gas_oracle: Object implementing chainlib.eth.gas.GasOracle interface
|
||||
:param nonce_oracle: Backend to generate gas parameters
|
||||
@ -328,7 +328,7 @@ class TxFactory:
|
||||
if tx['to'] == None or tx['to'] == '':
|
||||
tx['to'] = '0x'
|
||||
txe = EIP155Transaction(tx, tx['nonce'], tx['chainId'])
|
||||
tx_raw = self.signer.sign_transaction_to_rlp(txe)
|
||||
tx_raw = self.signer.sign_transaction_to_wire(txe)
|
||||
tx_raw_hex = add_0x(tx_raw.hex())
|
||||
tx_hash_hex = add_0x(keccak256_hex_to_hex(tx_raw_hex))
|
||||
return (tx_hash_hex, tx_raw_hex)
|
||||
|
@ -176,7 +176,7 @@ class TestRPCConnection(RPCConnection):
|
||||
tx_dict = p[0]
|
||||
tx = EIP155Transaction(tx_dict, tx_dict['nonce'], tx_dict['chainId'])
|
||||
passphrase = p[1]
|
||||
r = self.signer.sign_transaction_to_rlp(tx, passphrase)
|
||||
r = self.signer.sign_transaction_to_wire(tx, passphrase)
|
||||
return r
|
||||
|
||||
|
||||
@ -192,9 +192,9 @@ class TestRPCConnection(RPCConnection):
|
||||
return self.signer.sign_transaction(tx, passphrase)
|
||||
|
||||
|
||||
def sign_transaction_to_rlp(self, tx, passphrase=''):
|
||||
def sign_transaction_to_wire(self, tx, passphrase=''):
|
||||
self.__verify_signer(tx, passphrase)
|
||||
return self.signer.sign_transaction_to_rlp(tx, passphrase)
|
||||
return self.signer.sign_transaction_to_wire(tx, passphrase)
|
||||
|
||||
|
||||
def disconnect(self):
|
||||
|
@ -1,7 +1,7 @@
|
||||
crypto-dev-signer>=0.4.14b7,<=0.4.14
|
||||
crypto-dev-signer>=0.4.15a1,<=0.4.15
|
||||
pysha3==1.0.2
|
||||
hexathon~=0.0.1a8
|
||||
websocket-client==0.57.0
|
||||
potaahto~=0.0.1a1
|
||||
chainlib==0.0.8a2
|
||||
chainlib==0.0.9a2
|
||||
confini>=0.4.1a1,<0.5.0
|
||||
|
Loading…
Reference in New Issue
Block a user