amino-js
amino-js copied to clipboard
Fail to unmarshal tx data from a block
Using: [email protected] @tendermint/[email protected] @tendermint/[email protected]
Trying to decode tx from block with:
import { decodeString, unmarshalTx } from '@tendermint/amino-js';
import { base64ToBytes } from '@tendermint/belt';
decodeTx(txHash) {
try {
const decoded = base64ToBytes(txHash);
const unmarshaled = unmarshalTx(decoded);
return decoded
}
catch (error) {
console.log(error)
return null
}
}
Throws this error on every tx data string from blocks: For example:
3wEoKBapCluclZNGChRm0QXKCIrFakuLzpL0oqW3MHzH/RIUyTRRx8hJmGRpUL1G+yw8xXQRSHsaFE3H7L64W8UP7sICyw32yIwMNrM6IhMKBXVhdG9tEgoyMDQ5ODQ5MTQwEhAKCgoFdWF0b20SATEQgNMOGmoKJuta6YchAzpqNiIl4AIZl3rIYeUHLU10NyCNiEapGx3SKZ338sTwEkDgs/cND/XjaiNySQxrLQRGbgaLqhyyjozvYozBqvmAiEVxiG5W63DzhGm8UeMxXDh3zemjyMfkZB0XAGqcjs8V
at block 1416024
Error: unmarshal to types.Tx failed after 4 bytes (unrecognized prefix bytes 282816A9): 282816A90A5B9C9593460A1466D105C.....6A9C8ECF15
Thanks for the report! Can you show me how you're getting the base64 data?
Thanks for the report! Can you show me how you're getting the base64 data?
by fetching block data from any lcd REST server
Example: GET request to https://api.cosmos.network/blocks/{block_height}
then I get tx_data from block["block]["data"]["txs"]
can confirm this is happening for Microtick as well on the hub-3-gaia-2-alpha branch, hub-3-gaia-2, and extend branches
const { marshalTx, unmarshalTx } = require('./node.js')
const obj = {
'type': 'cosmos-sdk/StdTx',
'value': {
'msg': [{
'type': 'cosmos-sdk/MsgSend',
'value': {
'from_address': 'cosmos1h806c7khnvmjlywdrkdgk2vrayy2mmvf9rxk2r',
'to_address': 'cosmos1z7g5w84ynmjyg0kqpahdjqpj7yq34v3suckp0e',
'amount': [{
'denom': 'uatom',
'amount': '11657995'
}]
}
}],
'fee': {
'amount': [{
'denom': 'uatom',
'amount': '5000'
}],
'gas': '200000'
},
'signatures': [{
'pub_key': {
'type': 'tendermint/PubKeySecp256k1',
'value': 'AtQaCqFnshaZQp6rIkvAPyzThvCvXSDO+9AzbxVErqJP'
},
'signature': '1nUcIH0CLT0/nQ0mBTDrT6kMG20NY/PsH7P2gc4bpYNGLEYjBmdWevXUJouSE/9A/60QG9cYeqyTe5kFDeIPxQ=='
}],
'memo': '1122672754'
}
};
const m = marshalTx(obj)
console.log("bytes=" + JSON.stringify(m))
const u = unmarshalTx(m)
console.log(JSON.stringify(u, null, 2))
Error: unmarshal to types.Tx failed after 102 bytes (error reading array contents: expected field number: 1; got: 4): 282816A90A43A8A3619A0A14B9DFAC7AD79B372F91CD1D9A8B2983E908ADED8912141791471EA49EE4443EC00F6ED90032F1011AB2301A110A057561746F6D1208313136353739393512130A0D0A057561746F6D12043530303010C09A0C1A6A0A26EB5AE9872102D41A0AA167B21699429EAB224BC03F2CD386F0AF5D20CEFBD0336F1544AEA24F1240D6751C207D022D3D3F9D0D260530EB4FA90C1B6D0D63F3EC1FB3F681CE1BA583462C46230667567AF5D4268B9213FF40FFAD101BD7187AAC937B99050DE20FC5220A31313232363732373534 at $callDeferred (/home/mjackson/cosmos/amino-js/go/src/github.com/cosmos/amino-js/dist/node.js:1544:17) at $panic (/home/mjackson/cosmos/amino-js/go/src/github.com/cosmos/amino-js/dist/node.js:1583:3) at DecodeTx (/home/mjackson/cosmos/amino-js/go/src/github.com/cosmos/amino-js/dist/node.js:69725:4) at Module.v.$externalizeWrapper (/home/mjackson/cosmos/amino-js/go/src/github.com/cosmos/amino-js/dist/node.js:1996:22) at unmarshalTx (/home/mjackson/cosmos/amino-js/go/src/github.com/cosmos/amino-js/dist/node.js:77090:66)
also happens if we call marshal, unmarshal with 'false' as the second parameter for length prefixed encoding
I've tracked this issue down to the pub_key field for a Secp256k1 signature. In the JSON example above if you omit the following, it works.
'pub_key': {
'type': 'tendermint/PubKeySecp256k1',
'value': 'AtQaCqFnshaZQp6rIkvAPyzThvCvXSDO+9AzbxVErqJP'
}
Specifically, it appears to be having trouble with the base64 byte array in the pub_key.value. I don't have a good idea why yet.
I have the same issue, when i parse the transaction D11E6BD640D9B5F1A5C5C39E03C75CFAD519CD45FE415D082A79421D9483C8B9 in block 1861036 with raw: iBgoKBapCv8WtC1hTgrQFuaBeAcKMUNvc21XYXNtIEludGVncmF0aW9uIDEgLSBQZXJtaXNzaW9ucyBhbmQgVXBncmFkZXMS6hVDb3NtV2FzbSBJbnRlZ3JhdGlvbiAxIC0gUGVybWlzc2lvbnMgYW5kIFVwZ3JhZGVzCgpDb21tdW5pdHktc3BlbmQgcHJvcG9zYWwgc3VibWl0dGVkIGJ5IEV0aGFuIEZyZXkgKGh0dHBzOi8vZ2l0aHViLmNvbS9ldGhhbmZyZXkpIG9mIENvbmZpbyBVTyAoaHR0cDovL2NvbmZpby50ZWNoLykgYW5kIENvc21XYXNtIChodHRwczovL3d3dy5jb3Ntd2FzbS5jb20pCgotPS09LQoKRnVsbCBwcm9wb3NhbDogaHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1iRDNiTWFqUUNGbXREbWt1UlZXaG1NV1ZkTjJzSzhRUDJGb0ZDejljalBpQwpGb3J1bSBQb3N0OiBodHRwczovL2ZvcnVtLmNvc21vcy5uZXR3b3JrL3QvcHJvcG9zYWwtY29zbXdhc20tb24tY29zbW9zLWh1Yi8zNjI5CgotPS09LQoKQW1vdW50IHRvIHNwZW5kIGZyb20gdGhlIGNvbW11bml0eSBwb29sOiAyNTAwMCBBVE9NcwoKVGltZWxpbmU6IDItNCBtb250aHMgZnJvbSBhcHByb3ZhbAoKRGVsaXZlcmFibGVzOgoxLiBBZGRpbmcgZ292ZXJuYW5jZSBjb250cm9sIHRvIGFsbCBhc3BlY3RzIG9mIHRoZSBDb3NtV2FzbSBjb250cmFjdCBsaWZlY3ljbGUgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggdGhlIGh1Yi4gQWxsb3dpbmcgZ292ZXJuYW5jZSB0byBjb250cm9sIGNvZGUgdXBsb2FkLCBjb250cmFjdCBpbnN0YW50aWF0aW9uLCB1cGdyYWRlcywgYW5kIGRlc3RydWN0aW9uIChpZiBuZWVkZWQpLgoyLiBBZGRpbmcgYWJpbGl0eSB0byB1cGdyYWRlIGNvbnRyYWN0cyBhbG9uZyB3aXRoIG1pZ3JhdGlvbnMgKGFsc28gYWxsb3dpbmcgb3JkZXJseSBzaHV0ZG93bnMpLiBUaGlzIGNvbnRyb2xsZWQgYnkgYSBnb3Zlcm5hbmNlIHZvdGUuCjMuIExhdW5jaCBhIHRlc3RuZXQgd2l0aCB3b3JraW5nIHZlcnNpb24gb2YgdGhpcyBjb2RlIChDb3Ntb3MgU0RLIDAuMzggb3IgMC4zOSkgdG8gZW5hYmxlIGFsbCBpbnRlcmVzdGVkIHBhcnRpZXMgdG8gdHJpYWwgdGhlIHByb2Nlc3MgYW5kIHByb3ZpZGUgZmVlZGJhY2suCjQuIFByb3ZpZGUgc2FtcGxlIGNvbnRyYWN0cyB0byBkZW1vIG9uIHRoZSB0ZXN0bmV0LCBhbG9uZyB3aXRoIHNvbWUgbWlncmF0aW9uIHNjZW5hcmlvcwoKV2l0aGluIDIgbW9udGhzLCB0aGUgd29ya2luZyBjb2RlIGFuZCBiaW5hcmllcyBzaG91bGQgYmUgZGVsaXZlcmVkIGFuZCBvcGVuIGZvciBwdWJsaWMgcmV2aWV3LiBXaXRoaW4gNCBtb250aHMsIHRoZXNlIGJpbmFyaWVzIHdpbGwgYmUgdXNlZCBvbiBhIHRlc3RuZXQsIHdpdGggc3VmZmljaWVudCBzdGFraW5nIHRva2VucyBnaXZlbiB0byBhbGwgYWN0aXZlIHZvdGVycyBvbiB0aGUgQ29zbW9zIEh1YiwgYW5kIHdlIHdpbGwgZ28gdGhyb3VnaCBhIGZldyBnb3Zlcm5hbmNlIHZvdGluZyBjeWNsZXMgdG8gdHJpYWwgY29udHJhY3QgZGVwbG95bWVudCBhbmQgbWlncmF0aW9ucyAod2l0aCBhIHNob3J0ZXIgdm90aW5nIGN5Y2xlcywgZWcuIDMgZGF5cykKCkRldGFpbGVkIG1pbGVzdG9uZXMgaW4gdGhlIGZ1bGwgcHJvcG9zYWw6Cmh0dHBzOi8vaXBmcy5pby9pcGZzL1FtYkQzYk1halFDRm10RG1rdVJWV2htTVdWZE4yc0s4UVAyRm9GQ3o5Y2pQaUMKCkJleW9uZCB0aGUgbWlsZXN0b25lcywgQ29zbVdhc20gd2lsbCBlbmhhbmNlIGRvY3VtZW50YXRpb24gb2YgdGhlIHBsYXRmb3JtIGFuZCBvZmZlciB0ZWNobmljYWwgc3VwcG9ydCBvbiBvdXIgVGVsZWdyYW0gY2hhbm5lbC4KCi09LT0tCgpfUHJvYmxlbV8KV2l0aCB0aGUgdXBjb21pbmcgbGF1bmNoIG9mIElCQywgdGhlIGh1YiB3aWxsIG5lZWQgdG8gYWRhcHQgbW9yZSByYXBpZGx5IHRvIHRoZSBuZWVkcyBvZiB0aGUgZWNvc3lzdGVtLCB3aGlsZSBhbHNvIGxpbWl0aW5nIGNoYWluIHJlc3RhcnRzLCB3aGljaCBtYXkgYmUgZGV0cmltZW50YWwgdG8gSUJDIGNvbm5lY3Rpb25zLiBJbiBwYXJ0aWN1bGFyIHN1cHBvcnQgZm9yIHJlbGF5aW5nIER5bmFtaWMgSUJDIFByb3RvY29scyBhbmQgUmVudGVkIFNlY3VyaXR5LCB1c2luZyBBVE9NcyBhcyBjb2xsYXRlcmFsIGZvciBzbWFsbGVyIHpvbmVzLCB3b3VsZCBncmVhdGx5IGJlbmVmaXQgZnJvbSBDb3NtV2FzbSdzIGZsZXhpYmlsaXR5LgoKX1NvbHV0aW9uXwpXZeKAmXJlIGFkZGluZyBzb21lIGtleSBmZWF0dXJlcyB0byBDb3NtV2FzbSB0byBjb252ZXJ0IGl0IGZyb20gYSBwZXJtaXNzaW9ubGVzcywgaW1tdXRhYmxlIHNtYXJ0IGNvbnRyYWN0IHBsYXRmb3JtIHRvIGEgcGVybWlzc2lvbmVkIHBsYXRmb3JtIHdpdGggZ292ZXJuYW5jZSBjb250cm9sIGZvciB1cGdyYWRpbmcgb3Igc2h1dHRpbmcgZG93biBjb250cmFjdHMuIFRoaXMgaXMgYSBrZXkgcmVxdWlyZW1lbnQgdG8gYmUgYWJsZSB0byBpbnRlZ3JhdGUgQ29zbVdhc20gdG8gdGhlIENvc21vcyBIdWIgd2l0aCBtaW5pbWFsIGRpc3J1cHRpb24uCgpfRnV0dXJlXwpXZSB3aWxsIGNvbnRpbnVlIGRldmVsb3BtZW50IG9mIENvc21XYXNtLCBlc3BlY2lhbGx5IGFkZGluZyBJQkMgaW50ZWdyYXRpb24gYXMgd2VsbCBhcyB3b3JraW5nIHRvd2FyZHMgYSBzdGFibGUgMS4wIHJlbGVhc2UgdGhhdCBjYW4gYmUgYXVkaXRlZCBhbmQgc2FmZWx5IGRlcGxveWVkIChRMy9RNCAyMDIwKS4KCi09LT0tCgpUd2l0dGVyOiBodHRwczovL3R3aXR0ZXIuY29tL0Nvc21XYXNtCk1lZGl1bTogaHR0cHM6Ly9tZWRpdW0uY29tL2NvbmZpbwpUZWxlZ3JhbTogaHR0cHM6Ly90Lm1lL2pvaW5jaGF0L0FrWnJpRWhrOXFjUnc1QTVVMk1hcEEKV2Vic2l0ZTogaHR0cHM6Ly93d3cuY29zbXdhc20uY29tCkdpdGh1YjogaHR0cHM6Ly9naXRodWIuY29tL0Nvc21XYXNtGhQkTeB7yuHgqmKCZktSpv2Y7s2ufCIUCgV1YXRvbRILMjUwMDAwMDAwMDASEAoFdWF0b20SBzEwMDAwMDAaFNLeTkR7r4sZBGNww1wp6GKnFM8jEhQKDgoFdWF0b20SBTc1MDAwEKDCHhpqCibrWumHIQPV9nf5JdcbunAdCyEux+ZHFqRY1VezQ7CoWte2jIpzBxJAb6fNnsKfFqxNwZJwzrMDfdDLxxh4I7jlIIK/p5TCjUceB1UhhZbNq3NPRkkC1ojv5F27qru/7wBgHbzJOCxMIQ==. it doesn't work, i can see it on https://hubble.figment.network/cosmos/chains/cosmoshub-3/blocks/1861036/transactions/D11E6BD640D9B5F1A5C5C39E03C75CFAD519CD45FE415D082A79421D9483C8B9?format=json.
I made some progress on this. the old pub_key format no longer works. instead, the pubkey is a base64 encoded value of the following format:
0xEB5AE987 + 0x21 + pubkey bytes
The first two values are amino headers discussed here: https://docs.tendermint.com/master/spec/blockchain/encoding.html
Once I made this change I was able to successfully sign Tx's and decode transactions as well.
Is there a work around regarding this issue? I think I'm seeing similar issue...
Any update on this?