Ensure base web3 clients and geeth suport transaction signing endpoints

pull/1092/head
Kieran Prasch 2019-07-11 14:01:39 -07:00
parent 118262a9f4
commit d539017426
No known key found for this signature in database
GPG Key ID: 199AB839D4125A62
1 changed files with 19 additions and 2 deletions

View File

@ -6,6 +6,7 @@ from typing import Union
import maya import maya
from constant_sorrow.constants import NOT_RUNNING, UNKNOWN_DEVELOPMENT_CHAIN_ID from constant_sorrow.constants import NOT_RUNNING, UNKNOWN_DEVELOPMENT_CHAIN_ID
from cytoolz.dicttoolz import dissoc
from eth_account import Account from eth_account import Account
from eth_account.messages import encode_defunct from eth_account.messages import encode_defunct
from eth_utils import to_canonical_address from eth_utils import to_canonical_address
@ -199,6 +200,9 @@ class Web3Client:
receipt = self.w3.eth.waitForTransactionReceipt(transaction_hash, timeout=timeout) receipt = self.w3.eth.waitForTransactionReceipt(transaction_hash, timeout=timeout)
return receipt return receipt
def sign_transaction(self, transaction: dict):
raise NotImplementedError
def get_transaction(self, transaction_hash) -> str: def get_transaction(self, transaction_hash) -> str:
return self.w3.eth.getTransaction(transaction_hash) return self.w3.eth.getTransaction(transaction_hash)
@ -268,6 +272,19 @@ class GethClient(Web3Client):
def unlock_account(self, address, password): def unlock_account(self, address, password):
return self.w3.geth.personal.unlockAccount(address, password) return self.w3.geth.personal.unlockAccount(address, password)
def sign_transaction(self, transaction: dict) -> bytes:
# Do not include a 'to' field for contract creation.
if transaction['to'] == b'':
transaction = dissoc(transaction, 'to')
# Sign
result = self.w3.eth.signTransaction(transaction=transaction)
# Return RLP bytes
rlp_encoded_transaction = result.raw
return rlp_encoded_transaction
class ParityClient(Web3Client): class ParityClient(Web3Client):
@ -306,9 +323,9 @@ class EthereumTesterClient(Web3Client):
def sync(self, *args, **kwargs): def sync(self, *args, **kwargs):
return True return True
def sign_transaction(self, account: str, transaction: dict): def sign_transaction(self, transaction: dict):
# Get signing key of test account # Get signing key of test account
address = to_canonical_address(account) address = to_canonical_address(transaction['from'])
signing_key = self.w3.provider.ethereum_tester.backend._key_lookup[address]._raw_key signing_key = self.w3.provider.ethereum_tester.backend._key_lookup[address]._raw_key
# Sign using a local private key # Sign using a local private key