diff --git a/docs/architecture/adr-050-sign-mode-textual-annex1.md b/docs/architecture/adr-050-sign-mode-textual-annex1.md index a96fde0934..48a03e8064 100644 --- a/docs/architecture/adr-050-sign-mode-textual-annex1.md +++ b/docs/architecture/adr-050-sign-mode-textual-annex1.md @@ -256,11 +256,16 @@ Examples: ### bytes -* Bytes of length shorter or equal to 32 are rendered in hexadecimal, all capital letters, without the `0x` prefix. -* Bytes of length greater than 32 are hashed using SHA256. The rendered text is `SHA-256=`, followed by the 32-byte hash, in hexadecimal, all capital letters, without the `0x` prefix. +* Bytes of length shorter or equal to 35 are rendered in hexadecimal, all capital letters, without the `0x` prefix. +* Bytes of length greater than 35 are hashed using SHA256. The rendered text is `SHA-256=`, followed by the 32-byte hash, in hexadecimal, all capital letters, without the `0x` prefix. * The hexadecimal string is finally separated into groups of 4 digits, with a space `' '` as separator. If the bytes length is odd, the 2 remaining hexadecimal characters are at the end. -Note: Data longer than 32 bytes are not rendered in a way that can be inverted. See ADR-050's [section about invertability](./adr-050-sign-mode-textual.md#invertible-rendering) for a discussion. +The number 35 was chosen because it is the longest length where the hashed-and-prefixed representation is longer than the original data directly formatted, using the 3 rules above. More specifically: +- a 35-byte array will have 70 hex characters, plus 17 space characters, resulting in 87 characters. +- byte arrays starting from length 36 will be be hashed to 32 bytes, which is 64 hex characters plus 15 spaces, and with the `SHA-256=` prefix, it takes 87 characters. +Also, secp256k1 public keys have length 33, so their Textual representation is not their hashed value, which we would like to avoid. + +Note: Data longer than 35 bytes are not rendered in a way that can be inverted. See ADR-050's [section about invertability](./adr-050-sign-mode-textual.md#invertible-rendering) for a discussion. #### Examples @@ -268,8 +273,8 @@ Inputs are displayed as byte arrays. * `[0]`: `00` * `[0,1,2]`: `0001 02` -* `[0,1,2,..,31]`: `0001 0203 0405 0607 0809 0A0B 0C0D 0E0F 1011 1213 1415 1617 1819 1A1B 1C1D 1E1F` -* `[0,1,2,..,32]`: `SHA-256=5D8F CFEF A9AE EB71 1FB8 ED1E 4B7D 5C8A 9BAF A46E 8E76 E68A A18A DCE5 A10D F6AB` +* `[0,1,2,..,34]`: `0001 0203 0405 0607 0809 0A0B 0C0D 0E0F 1011 1213 1415 1617 1819 1A1B 1C1D 1E1F 2021 22` +* `[0,1,2,..,35]`: `SHA-256=5D7E 2D9B 1DCB C85E 7C89 0036 A2CF 2F9F E7B6 6554 F2DF 08CE C6AA 9C0A 25C9 9C21` ### address bytes diff --git a/tx/textual/bytes.go b/tx/textual/bytes.go index 14b431a268..401b35c906 100644 --- a/tx/textual/bytes.go +++ b/tx/textual/bytes.go @@ -13,7 +13,7 @@ import ( var ( hashPrefix = "SHA-256=" - maxByteLen = 32 // Maximum byte length to be displayed as is. Longer than this, we hash. + maxByteLen = 35 // Maximum byte length to be displayed as is. Longer than this, we hash. ) // NewBytesValueRenderer returns a ValueRenderer for Protobuf bytes, which are diff --git a/tx/textual/bytes_test.go b/tx/textual/bytes_test.go index 9041495a66..ab82a8cd37 100644 --- a/tx/textual/bytes_test.go +++ b/tx/textual/bytes_test.go @@ -23,22 +23,24 @@ func TestBytesJsonTestCases(t *testing.T) { textual := textual.NewTextual(nil) for _, tc := range testcases { - valrend, err := textual.GetFieldValueRenderer(fieldDescriptorFromName("BYTES")) - require.NoError(t, err) + t.Run(tc.hex, func(t *testing.T) { + valrend, err := textual.GetFieldValueRenderer(fieldDescriptorFromName("BYTES")) + require.NoError(t, err) - screens, err := valrend.Format(context.Background(), protoreflect.ValueOfBytes(tc.base64)) - require.NoError(t, err) - require.Equal(t, 1, len(screens)) - require.Equal(t, tc.hex, screens[0].Text) + screens, err := valrend.Format(context.Background(), protoreflect.ValueOfBytes(tc.base64)) + require.NoError(t, err) + require.Equal(t, 1, len(screens)) + require.Equal(t, tc.hex, screens[0].Text) - // Round trip - val, err := valrend.Parse(context.Background(), screens) - require.NoError(t, err) - if len(tc.base64) > 32 { - require.Equal(t, 0, len(val.Bytes())) - } else { - require.Equal(t, tc.base64, val.Bytes()) - } + // Round trip + val, err := valrend.Parse(context.Background(), screens) + require.NoError(t, err) + if len(tc.base64) > 35 { + require.Equal(t, 0, len(val.Bytes())) + } else { + require.Equal(t, tc.base64, val.Bytes()) + } + }) } } diff --git a/tx/textual/internal/testdata/bytes.json b/tx/textual/internal/testdata/bytes.json index b8636f7796..b6d116f481 100644 --- a/tx/textual/internal/testdata/bytes.json +++ b/tx/textual/internal/testdata/bytes.json @@ -7,6 +7,6 @@ ["Zm9vYg==", "666F 6F62"], ["Zm9vYmE=", "666F 6F62 61"], ["Zm9vYmFy", "666F 6F62 6172"], - ["AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=", "0001 0203 0405 0607 0809 0A0B 0C0D 0E0F 1011 1213 1415 1617 1819 1A1B 1C1D 1E1F"], - ["AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8g", "SHA-256=5D8F CFEF A9AE EB71 1FB8 ED1E 4B7D 5C8A 9BAF A46E 8E76 E68A A18A DCE5 A10D F6AB"] + ["AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISI=", "0001 0203 0405 0607 0809 0A0B 0C0D 0E0F 1011 1213 1415 1617 1819 1A1B 1C1D 1E1F 2021 22"], + ["AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj", "SHA-256=5D7E 2D9B 1DCB C85E 7C89 0036 A2CF 2F9F E7B6 6554 F2DF 08CE C6AA 9C0A 25C9 9C21"] ] diff --git a/tx/textual/internal/testdata/e2e.json b/tx/textual/internal/testdata/e2e.json index 5eb670f929..793eddbc9e 100644 --- a/tx/textual/internal/testdata/e2e.json +++ b/tx/textual/internal/testdata/e2e.json @@ -54,7 +54,7 @@ { "text": "Address: cosmos1ulav3hsenupswqfkw2y3sup5kgtqwnvqa8eyhs" }, { "text": "Public key: /cosmos.crypto.secp256k1.PubKey", "expert": true }, { "text": "PubKey object", "indent": 1, "expert": true }, - { "text": "Key: SHA-256=F795 2F7F 4120 C816 DFCF F060 E486 734B 0145 590B 1968 3856 DD00 3074 BD0D 146C", "indent": 2, "expert": true }, + { "text": "Key: 02EB DD7F E4FD EB76 DC8A 205E F65D 790C D30E 8A37 5A5C 2528 EB3A 923A F1FB 4D79 4D", "indent": 2, "expert": true }, { "text": "This transaction has 1 Message" }, { "text": "Message (1/1): /cosmos.bank.v1beta1.MsgSend", "indent": 1 }, { "text": "MsgSend object", "indent": 2 }, @@ -66,7 +66,7 @@ { "text": "Gas limit: 100'000", "expert": true }, { "text": "Hash of raw bytes: 785bd306ea8962cdb9600089bdd65f3dc029e1aea112dee69e19546c9adad86e", "expert": true } ], - "cbor": "91a10172436861696e2069643a206d792d636861696ea101714163636f756e74206e756d6265723a2031a1016b53657175656e63653a2032a1017836416464726573733a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e7671613865796873a201782b5075626c6963206b65793a202f636f736d6f732e63727970746f2e736563703235366b312e5075624b657903f5a3016d5075624b6579206f626a656374020103f5a301785c4b65793a205348412d3235363d46373935203246374620343132302043383136204446434620463036302045343836203733344220303134352035393042203139363820333835362044443030203330373420424430442031343643020203f5a101781e54686973207472616e73616374696f6e206861732031204d657373616765a201782b4d6573736167652028312f31293a202f636f736d6f732e62616e6b2e763162657461312e4d736753656e640201a2016e4d736753656e64206f626a6563740202a201783b46726f6d20616464726573733a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e76716138657968730203a2017839546f20616464726573733a20636f736d6f7331656a726634637572327779366b667572673966326a707070326833616665356836706b6835740203a2016f416d6f756e743a2031302041544f4d0203a1016e456e64206f66204d657373616765a10170466565733a20302e3030322041544f4da20172476173206c696d69743a203130302730303003f5a201785348617368206f66207261772062797465733a203738356264333036656138393632636462393630303038396264643635663364633032396531616561313132646565363965313935343663396164616438366503f5" + "cbor": "91a10172436861696e2069643a206d792d636861696ea101714163636f756e74206e756d6265723a2031a1016b53657175656e63653a2032a1017836416464726573733a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e7671613865796873a201782b5075626c6963206b65793a202f636f736d6f732e63727970746f2e736563703235366b312e5075624b657903f5a3016d5075624b6579206f626a656374020103f5a30178574b65793a2030324542204444374620453446442045423736204443384120323035452046363544203739304320443330452038413337203541354320323532382045423341203932334120463146422034443739203444020203f5a101781e54686973207472616e73616374696f6e206861732031204d657373616765a201782b4d6573736167652028312f31293a202f636f736d6f732e62616e6b2e763162657461312e4d736753656e640201a2016e4d736753656e64206f626a6563740202a201783b46726f6d20616464726573733a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e76716138657968730203a2017839546f20616464726573733a20636f736d6f7331656a726634637572327779366b667572673966326a707070326833616665356836706b6835740203a2016f416d6f756e743a2031302041544f4d0203a1016e456e64206f66204d657373616765a10170466565733a20302e3030322041544f4da20172476173206c696d69743a203130302730303003f5a201785348617368206f66207261772062797465733a203738356264333036656138393632636462393630303038396264643635663364633032396531616561313132646565363965313935343663396164616438366503f5" }, { "name": "a bit of everything", @@ -197,7 +197,7 @@ { "text": "Address: cosmos1ulav3hsenupswqfkw2y3sup5kgtqwnvqa8eyhs" }, { "text": "Public key: /cosmos.crypto.secp256k1.PubKey", "expert": true }, { "text": "PubKey object", "indent": 1, "expert": true }, - { "text": "Key: SHA-256=F795 2F7F 4120 C816 DFCF F060 E486 734B 0145 590B 1968 3856 DD00 3074 BD0D 146C", "indent": 2, "expert": true }, + { "text": "Key: 02EB DD7F E4FD EB76 DC8A 205E F65D 790C D30E 8A37 5A5C 2528 EB3A 923A F1FB 4D79 4D", "indent": 2, "expert": true }, { "text": "This transaction has 2 Messages" }, { "text": "Message (1/2): /cosmos.authz.v1beta1.MsgExec", "indent": 1 }, { "text": "MsgExec object", "indent": 2 }, @@ -235,10 +235,10 @@ { "text": "Public keys: 2 Any", "indent": 4, "expert": true }, { "text": "Public keys (1/2): /cosmos.crypto.secp256k1.PubKey", "indent": 5, "expert": true }, { "text": "PubKey object", "indent": 6, "expert": true }, - { "text": "Key: SHA-256=8560 3B16 9613 06E3 9D23 BEE0 3156 7D77 F9BB 5977 A249 529F 8D9C AE2D 71CA 0ADE", "indent": 7, "expert": true }, + { "text": "Key: 0257 4EBE 0BFC 754F 5967 3BA1 1B27 500F 9158 ADE2 E17E 1A01 82B0 CA8B C652 4DB0 93", "indent": 7, "expert": true }, { "text": "Public keys (2/2): /cosmos.crypto.ed25519.PubKey", "indent": 5, "expert": true }, { "text": "PubKey object", "indent": 6, "expert": true }, - { "text": "Key: SHA-256=2DEF 8D73 17D8 7F1F A337 CA21 9CDE 80EC C602 6605 1328 B964 E27D 056A 94DD AC64", "indent": 7, "expert": true }, + { "text": "Key: 0315 0C47 F18A A327 16A6 547E DA8B 7369 067D CE11 D141 6245 B778 756C F835 9678 77", "indent": 7, "expert": true }, { "text": "End of Public keys", "indent": 4, "expert": true }, { "text": "Mode info: ModeInfo object", "indent": 2, "expert": true }, { "text": "Multi: Multi object", "indent": 3, "expert": true }, @@ -266,6 +266,6 @@ { "text": "End of Non critical extension options", "expert": true }, { "text": "Hash of raw bytes: 7ea02e8f0baed2db969e2d9ae4dc51fa31116259bd42897588072faf0ebb4d2e", "expert": true } ], - "cbor": "9847a10172436861696e2069643a206d792d636861696ea101714163636f756e74206e756d6265723a2031a1016b53657175656e63653a2032a1017836416464726573733a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e7671613865796873a201782b5075626c6963206b65793a202f636f736d6f732e63727970746f2e736563703235366b312e5075624b657903f5a3016d5075624b6579206f626a656374020103f5a301785c4b65793a205348412d3235363d46373935203246374620343132302043383136204446434620463036302045343836203733344220303134352035393042203139363820333835362044443030203330373420424430442031343643020203f5a101781f54686973207472616e73616374696f6e206861732032204d65737361676573a201782c4d6573736167652028312f32293a202f636f736d6f732e617574687a2e763162657461312e4d7367457865630201a2016e4d736745786563206f626a6563740202a20178364772616e7465653a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e76716138657968730203a2016b4d7367733a203120416e790203a20178284d7367732028312f31293a202f636f736d6f732e62616e6b2e763162657461312e4d736753656e640204a2016e4d736753656e64206f626a6563740205a201783b46726f6d20616464726573733a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e76716138657968730206a2017839546f20616464726573733a20636f736d6f7331656a726634637572327779366b667572673966326a707070326833616665356836706b6835740206a2016f416d6f756e743a2031302041544f4d0206a2016b456e64206f66204d7367730203a20178254d6573736167652028322f32293a202f636f736d6f732e676f762e76312e4d7367566f74650201a2016e4d7367566f7465206f626a6563740202a2016e50726f706f73616c2069643a20310203a2017834566f7465723a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e76716138657968730203a201774f7074696f6e3a20564f54455f4f5054494f4e5f5945530203a2017901ed4d657461646174613a204c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742c2073656420646f20656975736d6f642074656d706f7220696e6369646964756e74207574206c61626f726520657420646f6c6f7265206d61676e6120616c697175612e20557420656e696d206164206d696e696d2076656e69616d2c2071756973206e6f737472756420657865726369746174696f6e20756c6c616d636f206c61626f726973206e69736920757420616c697175697020657820656120636f6d6d6f646f20636f6e7365717561742e2044756973206175746520697275726520646f6c6f7220696e20726570726568656e646572697420696e20766f6c7570746174652076656c697420657373652063696c6c756d20646f6c6f726520657520667567696174206e756c6c612070617269617475722e204578636570746575722073696e74206f6363616563617420637570696461746174206e6f6e2070726f6964656e742c2073756e7420696e2063756c706120717569206f666669636961206465736572756e74206d6f6c6c697420616e696d20696420657374206c61626f72756d2e20416c736f20697420656e647320696e2020612073696e676c6520616d70657273616e6420400203a1016e456e64206f66204d657373616765a101781f4d656d6f3a203e20e29a9befb88f5c7532363942e29a9befb88f2020202020a10170466565733a20302e3030322041544f4da20178384665652070617965723a20636f736d6f7331656a726634637572327779366b667572673966326a707070326833616665356836706b68357403f5a201783a466565206772616e7465723a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e767161386579687303f5a101781c5469703a20302e30322041544f4d2c2033302730303020756f736d6fa10178355469707065723a20636f736d6f7331656a726634637572327779366b667572673966326a707070326833616665356836706b683574a20172476173206c696d69743a203130302730303003f5a2017254696d656f7574206865696768743a20323003f5a201781a4f74686572207369676e65723a2031205369676e6572496e666f03f5a30178254f74686572207369676e65722028312f31293a205369676e6572496e666f206f626a656374020103f5a30178355075626c6963206b65793a202f636f736d6f732e63727970746f2e6d756c74697369672e4c6567616379416d696e6f5075624b6579020203f5a30178184c6567616379416d696e6f5075624b6579206f626a656374020303f5a3016c5468726573686f6c643a2032020403f5a301725075626c6963206b6579733a203220416e79020403f5a30178325075626c6963206b6579732028312f32293a202f636f736d6f732e63727970746f2e736563703235366b312e5075624b6579020503f5a3016d5075624b6579206f626a656374020603f5a301785c4b65793a205348412d3235363d38353630203342313620393631332030364533203944323320424545302033313536203744373720463942422035393737204132343920353239462038443943204145324420373143412030414445020703f5a30178305075626c6963206b6579732028322f32293a202f636f736d6f732e63727970746f2e656432353531392e5075624b6579020503f5a3016d5075624b6579206f626a656374020603f5a301785c4b65793a205348412d3235363d32444546203844373320313744382037463146204133333720434132312039434445203830454320433630322036363035203133323820423936342045323744203035364120393444442041433634020703f5a30172456e64206f66205075626c6963206b657973020403f5a301781a4d6f646520696e666f3a204d6f6465496e666f206f626a656374020203f5a301734d756c74693a204d756c7469206f626a656374020303f5a301782042697461727261793a20436f6d706163744269744172726179206f626a656374020403f5a30174457874726120626974732073746f7265643a2035020503f5a30169456c656d733a203438020503f5a301764d6f646520696e666f733a2032204d6f6465496e666f020403f5a30178214d6f646520696e666f732028312f32293a204d6f6465496e666f206f626a656374020503f5a3017553696e676c653a2053696e676c65206f626a656374020603f5a30178214d6f64653a205349474e5f4d4f44455f4c45474143595f414d494e4f5f4a534f4e020703f5a30178214d6f646520696e666f732028322f32293a204d6f6465496e666f206f626a656374020503f5a3017553696e676c653a2053696e676c65206f626a656374020603f5a30178214d6f64653a205349474e5f4d4f44455f4c45474143595f414d494e4f5f4a534f4e020703f5a30171456e64206f66204d6f646520696e666f73020403f5a3016b53657175656e63653a2035020203f5a20173456e64206f66204f74686572207369676e657203f5a2017818457874656e73696f6e206f7074696f6e733a203120416e7903f5a3017832457874656e73696f6e206f7074696f6e732028312f31293a202f636f736d6f732e626173652e763162657461312e436f696e020103f5a30166352041544f4d020203f5a2017818456e64206f6620457874656e73696f6e206f7074696f6e7303f5a20178254e6f6e20637269746963616c20657874656e73696f6e206f7074696f6e733a203120416e7903f5a30178414e6f6e20637269746963616c20657874656e73696f6e206f7074696f6e732028312f31293a202f636f736d6f732e617574682e763162657461312e506172616d73020103f5a3016d506172616d73206f626a656374020203f5a301774d6178206d656d6f20636861726163746572733a203130020303f5a2017825456e64206f66204e6f6e20637269746963616c20657874656e73696f6e206f7074696f6e7303f5a201785348617368206f66207261772062797465733a203765613032653866306261656432646239363965326439616534646335316661333131313632353962643432383937353838303732666166306562623464326503f5" + "cbor": "9847a10172436861696e2069643a206d792d636861696ea101714163636f756e74206e756d6265723a2031a1016b53657175656e63653a2032a1017836416464726573733a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e7671613865796873a201782b5075626c6963206b65793a202f636f736d6f732e63727970746f2e736563703235366b312e5075624b657903f5a3016d5075624b6579206f626a656374020103f5a30178574b65793a2030324542204444374620453446442045423736204443384120323035452046363544203739304320443330452038413337203541354320323532382045423341203932334120463146422034443739203444020203f5a101781f54686973207472616e73616374696f6e206861732032204d65737361676573a201782c4d6573736167652028312f32293a202f636f736d6f732e617574687a2e763162657461312e4d7367457865630201a2016e4d736745786563206f626a6563740202a20178364772616e7465653a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e76716138657968730203a2016b4d7367733a203120416e790203a20178284d7367732028312f31293a202f636f736d6f732e62616e6b2e763162657461312e4d736753656e640204a2016e4d736753656e64206f626a6563740205a201783b46726f6d20616464726573733a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e76716138657968730206a2017839546f20616464726573733a20636f736d6f7331656a726634637572327779366b667572673966326a707070326833616665356836706b6835740206a2016f416d6f756e743a2031302041544f4d0206a2016b456e64206f66204d7367730203a20178254d6573736167652028322f32293a202f636f736d6f732e676f762e76312e4d7367566f74650201a2016e4d7367566f7465206f626a6563740202a2016e50726f706f73616c2069643a20310203a2017834566f7465723a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e76716138657968730203a201774f7074696f6e3a20564f54455f4f5054494f4e5f5945530203a2017901ed4d657461646174613a204c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742c2073656420646f20656975736d6f642074656d706f7220696e6369646964756e74207574206c61626f726520657420646f6c6f7265206d61676e6120616c697175612e20557420656e696d206164206d696e696d2076656e69616d2c2071756973206e6f737472756420657865726369746174696f6e20756c6c616d636f206c61626f726973206e69736920757420616c697175697020657820656120636f6d6d6f646f20636f6e7365717561742e2044756973206175746520697275726520646f6c6f7220696e20726570726568656e646572697420696e20766f6c7570746174652076656c697420657373652063696c6c756d20646f6c6f726520657520667567696174206e756c6c612070617269617475722e204578636570746575722073696e74206f6363616563617420637570696461746174206e6f6e2070726f6964656e742c2073756e7420696e2063756c706120717569206f666669636961206465736572756e74206d6f6c6c697420616e696d20696420657374206c61626f72756d2e20416c736f20697420656e647320696e2020612073696e676c6520616d70657273616e6420400203a1016e456e64206f66204d657373616765a101781f4d656d6f3a203e20e29a9befb88f5c7532363942e29a9befb88f2020202020a10170466565733a20302e3030322041544f4da20178384665652070617965723a20636f736d6f7331656a726634637572327779366b667572673966326a707070326833616665356836706b68357403f5a201783a466565206772616e7465723a20636f736d6f7331756c6176336873656e7570737771666b77327933737570356b677471776e767161386579687303f5a101781c5469703a20302e30322041544f4d2c2033302730303020756f736d6fa10178355469707065723a20636f736d6f7331656a726634637572327779366b667572673966326a707070326833616665356836706b683574a20172476173206c696d69743a203130302730303003f5a2017254696d656f7574206865696768743a20323003f5a201781a4f74686572207369676e65723a2031205369676e6572496e666f03f5a30178254f74686572207369676e65722028312f31293a205369676e6572496e666f206f626a656374020103f5a30178355075626c6963206b65793a202f636f736d6f732e63727970746f2e6d756c74697369672e4c6567616379416d696e6f5075624b6579020203f5a30178184c6567616379416d696e6f5075624b6579206f626a656374020303f5a3016c5468726573686f6c643a2032020403f5a301725075626c6963206b6579733a203220416e79020403f5a30178325075626c6963206b6579732028312f32293a202f636f736d6f732e63727970746f2e736563703235366b312e5075624b6579020503f5a3016d5075624b6579206f626a656374020603f5a30178574b65793a2030323537203445424520304246432037353446203539363720334241312031423237203530304620393135382041444532204531374520314130312038324230204341384220433635322034444230203933020703f5a30178305075626c6963206b6579732028322f32293a202f636f736d6f732e63727970746f2e656432353531392e5075624b6579020503f5a3016d5075624b6579206f626a656374020603f5a30178574b65793a2030333135203043343720463138412041333237203136413620353437452044413842203733363920303637442043453131204431343120363234352042373738203735364320463833352039363738203737020703f5a30172456e64206f66205075626c6963206b657973020403f5a301781a4d6f646520696e666f3a204d6f6465496e666f206f626a656374020203f5a301734d756c74693a204d756c7469206f626a656374020303f5a301782042697461727261793a20436f6d706163744269744172726179206f626a656374020403f5a30174457874726120626974732073746f7265643a2035020503f5a30169456c656d733a203438020503f5a301764d6f646520696e666f733a2032204d6f6465496e666f020403f5a30178214d6f646520696e666f732028312f32293a204d6f6465496e666f206f626a656374020503f5a3017553696e676c653a2053696e676c65206f626a656374020603f5a30178214d6f64653a205349474e5f4d4f44455f4c45474143595f414d494e4f5f4a534f4e020703f5a30178214d6f646520696e666f732028322f32293a204d6f6465496e666f206f626a656374020503f5a3017553696e676c653a2053696e676c65206f626a656374020603f5a30178214d6f64653a205349474e5f4d4f44455f4c45474143595f414d494e4f5f4a534f4e020703f5a30171456e64206f66204d6f646520696e666f73020403f5a3016b53657175656e63653a2035020203f5a20173456e64206f66204f74686572207369676e657203f5a2017818457874656e73696f6e206f7074696f6e733a203120416e7903f5a3017832457874656e73696f6e206f7074696f6e732028312f31293a202f636f736d6f732e626173652e763162657461312e436f696e020103f5a30166352041544f4d020203f5a2017818456e64206f6620457874656e73696f6e206f7074696f6e7303f5a20178254e6f6e20637269746963616c20657874656e73696f6e206f7074696f6e733a203120416e7903f5a30178414e6f6e20637269746963616c20657874656e73696f6e206f7074696f6e732028312f31293a202f636f736d6f732e617574682e763162657461312e506172616d73020103f5a3016d506172616d73206f626a656374020203f5a301774d6178206d656d6f20636861726163746572733a203130020303f5a2017825456e64206f66204e6f6e20637269746963616c20657874656e73696f6e206f7074696f6e7303f5a201785348617368206f66207261772062797465733a203765613032653866306261656432646239363965326439616534646335316661333131313632353962643432383937353838303732666166306562623464326503f5" } ] diff --git a/tx/textual/internal/testdata/tx.json b/tx/textual/internal/testdata/tx.json index 1f59ba6244..8accda2523 100644 --- a/tx/textual/internal/testdata/tx.json +++ b/tx/textual/internal/testdata/tx.json @@ -54,7 +54,7 @@ { "text": "Address: cosmos1ulav3hsenupswqfkw2y3sup5kgtqwnvqa8eyhs" }, { "text": "Public key: /cosmos.crypto.secp256k1.PubKey", "expert": true }, { "text": "PubKey object", "indent": 1, "expert": true }, - { "text": "Key: SHA-256=F795 2F7F 4120 C816 DFCF F060 E486 734B 0145 590B 1968 3856 DD00 3074 BD0D 146C", "indent": 2, "expert": true }, + { "text": "Key: 02EB DD7F E4FD EB76 DC8A 205E F65D 790C D30E 8A37 5A5C 2528 EB3A 923A F1FB 4D79 4D", "indent": 2, "expert": true }, { "text": "This transaction has 1 Message" }, { "text": "Message (1/1): /cosmos.bank.v1beta1.MsgSend", "indent": 1 }, { "text": "MsgSend object", "indent": 2 }, @@ -123,7 +123,7 @@ { "text": "Address: cosmos1ulav3hsenupswqfkw2y3sup5kgtqwnvqa8eyhs" }, { "text": "Public key: /cosmos.crypto.secp256k1.PubKey", "expert": true }, { "text": "PubKey object", "indent": 1, "expert": true }, - { "text": "Key: SHA-256=F795 2F7F 4120 C816 DFCF F060 E486 734B 0145 590B 1968 3856 DD00 3074 BD0D 146C", "indent": 2, "expert": true }, + { "text": "Key: 02EB DD7F E4FD EB76 DC8A 205E F65D 790C D30E 8A37 5A5C 2528 EB3A 923A F1FB 4D79 4D", "indent": 2, "expert": true }, { "text": "This transaction has 1 Message" }, { "text": "Message (1/1): /cosmos.bank.v1beta1.MsgSend", "indent": 1 }, { "text": "MsgSend object", "indent": 2 }, @@ -193,7 +193,7 @@ { "text": "Address: cosmos1ulav3hsenupswqfkw2y3sup5kgtqwnvqa8eyhs" }, { "text": "Public key: /cosmos.crypto.secp256k1.PubKey", "expert": true }, { "text": "PubKey object", "indent": 1, "expert": true }, - { "text": "Key: SHA-256=F795 2F7F 4120 C816 DFCF F060 E486 734B 0145 590B 1968 3856 DD00 3074 BD0D 146C", "indent": 2, "expert": true }, + { "text": "Key: 02EB DD7F E4FD EB76 DC8A 205E F65D 790C D30E 8A37 5A5C 2528 EB3A 923A F1FB 4D79 4D", "indent": 2, "expert": true }, { "text": "This transaction has 1 Message" }, { "text": "Message (1/1): /cosmos.gov.v1.MsgVote", "indent": 1 }, { "text": "MsgVote object", "indent": 2 }, @@ -339,7 +339,7 @@ { "text": "Address: cosmos1ulav3hsenupswqfkw2y3sup5kgtqwnvqa8eyhs" }, { "text": "Public key: /cosmos.crypto.secp256k1.PubKey", "expert": true }, { "text": "PubKey object", "indent": 1, "expert": true }, - { "text": "Key: SHA-256=F795 2F7F 4120 C816 DFCF F060 E486 734B 0145 590B 1968 3856 DD00 3074 BD0D 146C", "indent": 2, "expert": true }, + { "text": "Key: 02EB DD7F E4FD EB76 DC8A 205E F65D 790C D30E 8A37 5A5C 2528 EB3A 923A F1FB 4D79 4D", "indent": 2, "expert": true }, { "text": "This transaction has 2 Messages" }, { "text": "Message (1/2): /cosmos.authz.v1beta1.MsgExec", "indent": 1 }, { "text": "MsgExec object", "indent": 2 }, @@ -377,10 +377,10 @@ { "text": "Public keys: 2 Any", "indent": 4, "expert": true }, { "text": "Public keys (1/2): /cosmos.crypto.secp256k1.PubKey", "indent": 5, "expert": true }, { "text": "PubKey object", "indent": 6, "expert": true }, - { "text": "Key: SHA-256=8560 3B16 9613 06E3 9D23 BEE0 3156 7D77 F9BB 5977 A249 529F 8D9C AE2D 71CA 0ADE", "indent": 7, "expert": true }, + { "text": "Key: 0257 4EBE 0BFC 754F 5967 3BA1 1B27 500F 9158 ADE2 E17E 1A01 82B0 CA8B C652 4DB0 93", "indent": 7, "expert": true }, { "text": "Public keys (2/2): /cosmos.crypto.ed25519.PubKey", "indent": 5, "expert": true }, { "text": "PubKey object", "indent": 6, "expert": true }, - { "text": "Key: SHA-256=2DEF 8D73 17D8 7F1F A337 CA21 9CDE 80EC C602 6605 1328 B964 E27D 056A 94DD AC64", "indent": 7, "expert": true }, + { "text": "Key: 0315 0C47 F18A A327 16A6 547E DA8B 7369 067D CE11 D141 6245 B778 756C F835 9678 77", "indent": 7, "expert": true }, { "text": "End of Public keys", "indent": 4, "expert": true }, { "text": "Mode info: ModeInfo object", "indent": 2, "expert": true }, { "text": "Multi: Multi object", "indent": 3, "expert": true }, diff --git a/tx/textual/tx_test.go b/tx/textual/tx_test.go index fc1f352168..42e0c0c96e 100644 --- a/tx/textual/tx_test.go +++ b/tx/textual/tx_test.go @@ -6,20 +6,17 @@ import ( "os" "testing" - "github.com/cosmos/cosmos-proto/any" "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/testing/protocmp" - "google.golang.org/protobuf/types/known/anypb" _ "cosmossdk.io/api/cosmos/auth/v1beta1" _ "cosmossdk.io/api/cosmos/authz/v1beta1" bankv1beta1 "cosmossdk.io/api/cosmos/bank/v1beta1" _ "cosmossdk.io/api/cosmos/crypto/ed25519" - "cosmossdk.io/api/cosmos/crypto/multisig" _ "cosmossdk.io/api/cosmos/crypto/secp256k1" _ "cosmossdk.io/api/cosmos/gov/v1" txv1beta1 "cosmossdk.io/api/cosmos/tx/v1beta1" @@ -102,15 +99,9 @@ func TestTxJsonTestcases(t *testing.T) { parsedAuthInfo := &txv1beta1.AuthInfo{} err = proto.Unmarshal(parsedTextualData.AuthInfoBytes, parsedAuthInfo) require.NoError(t, err) - // Remove the non-parsable fields, i.e. the hashed bytes - for i, si := range txAuthInfo.SignerInfos { - txAuthInfo.SignerInfos[i].PublicKey = removePkKeys(t, si.PublicKey) - } diff = cmp.Diff(txAuthInfo, parsedAuthInfo, protocmp.Transform()) require.Empty(t, diff) - // Remove the non-parsable fields, i.e. the hashed public key - removePkKeys(t, signerData.PubKey) diff = cmp.Diff( signerData, signerDataFromProto(parsedTextualData.SignerData), @@ -156,27 +147,3 @@ func signerDataFromProto(d *textualpb.SignerData) signing.SignerData { PubKey: d.PubKey, } } - -// removePkKeys takes a public key Any, decodes it, and recursively removes all -// the "key" fields (hashed by textual) inside it. -func removePkKeys(t *testing.T, pkAny *anypb.Any) *anypb.Any { - pk, err := anypb.UnmarshalNew(pkAny, proto.UnmarshalOptions{}) - require.NoError(t, err) - m := pk.ProtoReflect().Interface() - switch m := m.(type) { - case *multisig.LegacyAminoPubKey: - newAnys := make([]*anypb.Any, len(m.PublicKeys)) - for i, any := range m.PublicKeys { - newAnys[i] = removePkKeys(t, any) - } - - m.PublicKeys = newAnys - newMultisigAny, err := any.New(m) - require.NoError(t, err) - - return newMultisigAny - default: - pkAny.Value = nil - return pkAny - } -}