mikeshultz/ledger-eth-lib

Issue signing large transactions

Closed this issue · 2 comments

Recently saw an issue signing a large contract transaction. Haven't had the chance to dig into it too far but wanted to document it for reference.

This is the encoded tx:

0xf907308084b2d05e00835b8d808080b90721608060405234801561001057600080fd5b506040516020806107018339810180604052602081101561003057600080fd5b5051610045338264010000000061004b810204565b5061011c565b600160a060020a038216151561006057600080fd5b60025461007a908264010000000061059161010382021704565b600255600160a060020a0382166000908152602081905260409020546100ad908264010000000061059161010382021704565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008282018381101561011557600080fd5b9392505050565b6105d68061012b6000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161007857806370a0823114610166578063a457c2d71461018c578063a9059cbb146101b8578063dd62ed3e146101e4576100a5565b8063095ea7b3146100aa57806318160ddd146100ea57806323b872dd14610104578063395093511461013a575b600080fd5b6100d6600480360360408110156100c057600080fd5b50600160a060020a038135169060200135610212565b604080519115158252519081900360200190f35b6100f2610290565b60408051918252519081900360200190f35b6100d66004803603606081101561011a57600080fd5b50600160a060020a03813581169160208101359091169060400135610296565b6100d66004803603604081101561015057600080fd5b50600160a060020a038135169060200135610333565b6100f26004803603602081101561017c57600080fd5b5035600160a060020a03166103e3565b6100d6600480360360408110156101a257600080fd5b50600160a060020a0381351690602001356103fe565b6100d6600480360360408110156101ce57600080fd5b50600160a060020a038135169060200135610449565b6100f2600480360360408110156101fa57600080fd5b50600160a060020a038135811691602001351661045f565b6000600160a060020a038316151561022957600080fd5b336000818152600160209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60025490565b600160a060020a03831660009081526001602090815260408083203384529091528120548211156102c657600080fd5b600160a060020a03841660009081526001602090815260408083203384529091529020546102fa908363ffffffff61048a16565b600160a060020a038516600090815260016020908152604080832033845290915290205561032984848461049f565b5060019392505050565b6000600160a060020a038316151561034a57600080fd5b336000908152600160209081526040808320600160a060020a038716845290915290205461037e908363ffffffff61059116565b336000818152600160209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a031660009081526020819052604090205490565b6000600160a060020a038316151561041557600080fd5b336000908152600160209081526040808320600160a060020a038716845290915290205461037e908363ffffffff61048a16565b600061045633848461049f565b50600192915050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b60008282111561049957600080fd5b50900390565b600160a060020a0383166000908152602081905260409020548111156104c457600080fd5b600160a060020a03821615156104d957600080fd5b600160a060020a038316600090815260208190526040902054610502908263ffffffff61048a16565b600160a060020a038085166000908152602081905260408082209390935590841681522054610537908263ffffffff61059116565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828201838110156105a357600080fd5b939250505056fea165627a7a72305820c1007c25cbb2c51d6c0aa6c7962374874a574895dffe42ae6eef70e4009c2c60002900000000000000000000000000000000000000000000003635c9adc5dea00000

This tx was assembled by web3.py using solidbyte and the LedgerSignerMiddleware.

Traceback (most recent call last):
  File "/home/mike/dev/solidbyte/solidbyte/deploy/objects.py", line 372, in deployed
    return self._deploy(*args, **kwargs)
  File "/home/mike/dev/solidbyte/solidbyte/deploy/objects.py", line 595, in _deploy
    deploy_txhash = self._transact(deploy_tx)
  File "/home/mike/dev/solidbyte/solidbyte/deploy/objects.py", line 492, in _transact
    signed_tx = ledgereth.sign_transaction(ledger_tx, sender_path=ledger_account.path)
  File "/home/mike/dev/ledger-eth-lib/ledgereth/transactions.py", line 61, in sign_transaction
    raise Exception('Invalid response from Ledger')
Exception: Invalid response from Ledger
Traceback (most recent call last):
  File "/home/mike/.venvs/solidbyte/bin/sb", line 11, in <module>
    load_entry_point('solidbyte', 'console_scripts', 'sb')()
  File "/home/mike/dev/solidbyte/solidbyte/cli/handler.py", line 86, in main
    IMPORTED_MODULES[args.command].main(parser_args=args)
  File "/home/mike/dev/solidbyte/solidbyte/cli/deploy.py", line 55, in main
    deployer.deploy()
  File "/home/mike/dev/solidbyte/solidbyte/deploy/__init__.py", line 226, in deploy
    self._execute_deploy_scripts()
  File "/home/mike/dev/solidbyte/solidbyte/deploy/__init__.py", line 310, in _execute_deploy_scripts
    retval = script.main(**script_kwargs)
  File "/home/mike/dev/erc20-project/deploy/deploy_main.py", line 38, in main
    web3_contract_instance = token.deployed(initialSupply=initial_supply)
  File "/home/mike/dev/solidbyte/solidbyte/deploy/objects.py", line 375, in deployed
    raise e
  File "/home/mike/dev/solidbyte/solidbyte/deploy/objects.py", line 372, in deployed
    return self._deploy(*args, **kwargs)
  File "/home/mike/dev/solidbyte/solidbyte/deploy/objects.py", line 595, in _deploy
    deploy_txhash = self._transact(deploy_tx)
  File "/home/mike/dev/solidbyte/solidbyte/deploy/objects.py", line 492, in _transact
    signed_tx = ledgereth.sign_transaction(ledger_tx, sender_path=ledger_account.path)
  File "/home/mike/dev/ledger-eth-lib/ledgereth/transactions.py", line 61, in sign_transaction
    raise Exception('Invalid response from Ledger')
Exception: Invalid response from Ledger

The ledger is responding with 9000 as if it was expecting further data(ledgerblue lib is returning an empty bytearray). I'm inferring that the ledger doesn't see this as a properly formatted transaction. I have not yet verified this rlp decodes properly yet. Could be as simple as a missing or extra field.

This may not actually be an issue, but need to explore testing signing transaction deployments.

The example tx is improperly encoded. However, there was an issue with large transactions and that's been fixed in PR #22.