mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-22 22:38:08 +00:00
lisk: Add lisk_sign_tx
This commit is contained in:
parent
5e1168c48d
commit
45cca15e5f
17
trezorctl
17
trezorctl
@ -917,6 +917,23 @@ def lisk_verify_message(connect, pubkey, signature, message):
|
||||
return connect().lisk_verify_message(pubkey, signature, message)
|
||||
|
||||
|
||||
@cli.command(help='Sign Lisk transaction.')
|
||||
@click.option('-n', '--address', required=True, help="BIP-32 path to signing key, e.g. m/44'/134'/0'/0'")
|
||||
@click.option('-f', '--file', type=click.File('r'), default='-', help='Transaction in JSON format')
|
||||
# @click.option('-b', '--broadcast', help='Broadcast Lisk transaction')
|
||||
@click.pass_obj
|
||||
def lisk_sign_tx(connect, address, file):
|
||||
client = connect()
|
||||
address_n = client.expand_path(address)
|
||||
transaction = client.lisk_sign_tx(address_n, json.load(file))
|
||||
|
||||
payload = {
|
||||
"signature": binascii.hexlify(transaction.signature).decode()
|
||||
}
|
||||
|
||||
return payload
|
||||
|
||||
|
||||
#
|
||||
# CoSi functions
|
||||
#
|
||||
|
@ -654,7 +654,50 @@ class ProtocolMixin(object):
|
||||
resp = self.call(proto.LiskVerifyMessage(signature=signature, public_key=pubkey, message=message))
|
||||
except CallException as e:
|
||||
resp = e
|
||||
return isinstance(resp, proto.Success)
|
||||
return isinstance(resp, proto.Success)
|
||||
|
||||
@expect(proto.LiskSignedTx)
|
||||
def lisk_sign_tx(self, n, transaction):
|
||||
n = self._convert_prime(n)
|
||||
|
||||
def asset_to_proto(asset):
|
||||
msg = proto.LiskTransactionAsset()
|
||||
|
||||
if "votes" in asset:
|
||||
msg.votes = asset["votes"]
|
||||
if "data" in asset:
|
||||
msg.data = asset["data"]
|
||||
if "signature" in asset:
|
||||
msg.signature = proto.LiskSignatureType()
|
||||
msg.signature.public_key = binascii.unhexlify(asset["signature"]["publicKey"])
|
||||
if "delegate" in asset:
|
||||
msg.delegate = proto.LiskDelegateType()
|
||||
msg.delegate.username = asset["delegate"]["username"]
|
||||
if "multisignature" in asset:
|
||||
msg.multisignature = proto.LiskMultisignatureType()
|
||||
msg.multisignature.min = asset["multisignature"]["min"]
|
||||
msg.multisignature.life_time = asset["multisignature"]["lifetime"]
|
||||
msg.multisignature.keys_group = asset["multisignature"]["keysgroup"]
|
||||
return msg
|
||||
|
||||
msg = proto.LiskTransactionCommon()
|
||||
|
||||
msg.type = transaction["type"]
|
||||
msg.fee = int(transaction["fee"]) # Lisk use strings for big numbers (javascript issue)
|
||||
msg.amount = int(transaction["amount"]) # And we convert it back to number
|
||||
msg.timestamp = transaction["timestamp"]
|
||||
|
||||
if "recipientId" in transaction:
|
||||
msg.recipient_id = transaction["recipientId"]
|
||||
if "senderPublicKey" in transaction:
|
||||
msg.sender_public_key = binascii.unhexlify(transaction["senderPublicKey"])
|
||||
if "requesterPublicKey" in transaction:
|
||||
msg.requester_public_key = binascii.unhexlify(transaction["requesterPublicKey"])
|
||||
if "signature" in transaction:
|
||||
msg.signature = binascii.unhexlify(transaction["signature"])
|
||||
|
||||
msg.asset = asset_to_proto(transaction["asset"])
|
||||
return self.call(proto.LiskSignTx(address_n=n, transaction=msg))
|
||||
|
||||
@field('entropy')
|
||||
@expect(proto.Entropy)
|
||||
|
172
trezorlib/tests/device_tests/test_msg_lisk_signtx.py
Normal file
172
trezorlib/tests/device_tests/test_msg_lisk_signtx.py
Normal file
@ -0,0 +1,172 @@
|
||||
# This file is part of the TREZOR project.
|
||||
#
|
||||
# Copyright (C) 2012-2016 Marek Palatinus <slush@satoshilabs.com>
|
||||
# Copyright (C) 2012-2016 Pavol Rusnak <stick@satoshilabs.com>
|
||||
#
|
||||
# This library is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from .common import *
|
||||
from trezorlib import messages as proto
|
||||
|
||||
PUBLIC_KEY = unhexlify('eb56d7bbb5e8ea9269405f7a8527fe126023d1db2c973cfac6f760b60ae27294')
|
||||
|
||||
|
||||
@pytest.mark.skip_t1
|
||||
class TestMsgLiskSignTx(TrezorTest):
|
||||
|
||||
def test_lisk_sign_tx_send(self):
|
||||
self.setup_mnemonic_nopin_nopassphrase()
|
||||
|
||||
with self.client:
|
||||
self.client.set_expected_responses([
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.SignTx),
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
|
||||
proto.LiskSignedTx(
|
||||
signature=unhexlify('b62717d581e5713bca60b758b661e6cfa091addc6caedd57534e06cda805943ee80797b9fb9a1e1b2bd584e292d2a7f832a4d1b3f15f00e1ee1b72de7e195a08')
|
||||
)
|
||||
])
|
||||
|
||||
self.client.lisk_sign_tx(self.client.expand_path("m/44'/134'/0'/0'"), {
|
||||
"amount": "10000000",
|
||||
"recipientId": "9971262264659915921L",
|
||||
"timestamp": 57525937,
|
||||
"type": 0,
|
||||
"fee": "10000000",
|
||||
"asset": {}
|
||||
})
|
||||
|
||||
def test_lisk_sign_tx_send_with_data(self):
|
||||
self.setup_mnemonic_nopin_nopassphrase()
|
||||
|
||||
with self.client:
|
||||
self.client.set_expected_responses([
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.SignTx),
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
|
||||
proto.LiskSignedTx(
|
||||
signature=unhexlify('5dd0dbb87ee46f3e985b1ef2df85cb0bec481e8601d150388f73e198cdd57a698eab076c7cd5b281fbb6a83dd3dc64d91a6eccd1614dffd46f101194ffa3a004')
|
||||
)
|
||||
])
|
||||
|
||||
self.client.lisk_sign_tx(self.client.expand_path("m/44'/134'/0'/0'"), {
|
||||
"amount": "10000000",
|
||||
"recipientId": "9971262264659915921L",
|
||||
"timestamp": 57525937,
|
||||
"type": 0,
|
||||
"fee": "20000000",
|
||||
"asset": {
|
||||
"data": "Test data"
|
||||
}
|
||||
})
|
||||
|
||||
def test_lisk_sign_tx_second_signature(self):
|
||||
self.setup_mnemonic_nopin_nopassphrase()
|
||||
|
||||
with self.client:
|
||||
self.client.set_expected_responses([
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.PublicKey),
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
|
||||
proto.LiskSignedTx(
|
||||
signature=unhexlify('a3165c77c53d0407c4b0037e9aa40155c531e779049a2a40ee374877f4f9e72e69ae2cfc387c5ee6dd7770069b24e5a9914fb7c289491e10dd67931dee14b304')
|
||||
)
|
||||
])
|
||||
|
||||
self.client.lisk_sign_tx(self.client.expand_path("m/44'/134'/0'/0'"), {
|
||||
"amount": "0",
|
||||
"timestamp": 57525937,
|
||||
"type": 1,
|
||||
"fee": "500000000",
|
||||
"asset": {
|
||||
"signature": {
|
||||
"publicKey": "5d036a858ce89f844491762eb89e2bfbd50a4a0a0da658e4b2628b25b117ae09"
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
def test_lisk_sign_tx_delegate_registration(self):
|
||||
self.setup_mnemonic_nopin_nopassphrase()
|
||||
|
||||
with self.client:
|
||||
self.client.set_expected_responses([
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.SignTx),
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
|
||||
proto.LiskSignedTx(
|
||||
signature=unhexlify('fb7403f4c582ed9c4a65699442e9b61f01718c4455ca3bd68d3840d057ef62d6c361b0242f4988fd53d155892a84a84b675208c80a8cbde49e7b1e2cc762cc08')
|
||||
)
|
||||
])
|
||||
|
||||
self.client.lisk_sign_tx(self.client.expand_path("m/44'/134'/0'/0'"), {
|
||||
"amount": "0",
|
||||
"timestamp": 57525937,
|
||||
"type": 2,
|
||||
"fee": "2500000000",
|
||||
"asset": {
|
||||
"delegate": {
|
||||
"username": "trezor_t"
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
def test_lisk_sign_tx_cast_votes(self):
|
||||
self.setup_mnemonic_nopin_nopassphrase()
|
||||
|
||||
with self.client:
|
||||
self.client.set_expected_responses([
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.SignTx),
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
|
||||
proto.LiskSignedTx(
|
||||
signature=unhexlify('1d0599a8387edaa4a6d309b8a78accd1ceaff20ff9d87136b01cba0efbcb9781c13dc2b0bab5a1ea4f196d8dcc9dbdbd2d56dbffcc088fc77686b2e2c2fe560f')
|
||||
)
|
||||
])
|
||||
|
||||
self.client.lisk_sign_tx(self.client.expand_path("m/44'/134'/0'/0'"), {
|
||||
"amount": "0",
|
||||
"timestamp": 57525937,
|
||||
"type": 3,
|
||||
"fee": "100000000",
|
||||
"asset": {
|
||||
"votes": [
|
||||
"+b002f58531c074c7190714523eec08c48db8c7cfc0c943097db1a2e82ed87f84",
|
||||
"-ec111c8ad482445cfe83d811a7edd1f1d2765079c99d7d958cca1354740b7614"
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
def test_lisk_sign_tx_multisignature(self):
|
||||
self.setup_mnemonic_nopin_nopassphrase()
|
||||
|
||||
with self.client:
|
||||
self.client.set_expected_responses([
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.SignTx),
|
||||
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
|
||||
proto.LiskSignedTx(
|
||||
signature=unhexlify('99d201637931cc546e240569d9d6d84add989d81d1b03b34b966625ad49e334986868368d5b1f04599c6330f6bd0223635e032014ecb405501a02842dd5c320f')
|
||||
)
|
||||
])
|
||||
|
||||
self.client.lisk_sign_tx(self.client.expand_path("m/44'/134'/0'/0'"), {
|
||||
"amount": "0",
|
||||
"timestamp": 57525937,
|
||||
"type": 4,
|
||||
"fee": "1500000000",
|
||||
"asset": {
|
||||
"multisignature": {
|
||||
"min": 2,
|
||||
"lifetime": 5,
|
||||
"keysgroup": [
|
||||
"+5d036a858ce89f844491762eb89e2bfbd50a4a0a0da658e4b2628b25b117ae09",
|
||||
"+922fbfdd596fa78269bbcadc67ec2a1cc15fc929a19c462169568d7a3df1a1aa"
|
||||
]
|
||||
}
|
||||
}
|
||||
})
|
Loading…
Reference in New Issue
Block a user