1
+ // Copyright 2025 Blink Labs Software
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
1
15
package mary_test
2
16
3
17
import (
18
+ "bytes"
4
19
"encoding/hex"
20
+ "strings"
5
21
"testing"
6
22
23
+ "github.com/blinklabs-io/gouroboros/cbor"
7
24
"github.com/blinklabs-io/gouroboros/ledger/mary"
8
25
)
9
26
@@ -13,7 +30,67 @@ import (
13
30
//slot:39916670
14
31
var maryBlockHex = "84828f1a005f27931a0261147e582084d910a9b03102f4d5d1cfa175595e0671fa16f9018ff1679750efc3d056e9595820f62edd10f9c922efcc58d7a7e939fc0493c006fff17d1d5789d314d7a43530725820ac6051aab9b68f68871774b599e697a400a98336a23075db99262f1d5e28d17a825840381bc4e03e170f96f0a0d5ff40a5c4544fed7f44d5da0970e5efe7ac6686e74faf7c655349ceab6b2306d5af201d7943e7dd026ca8e8c4d32bd7953566d29f8f585069cf8f936bb4eb58d67a70e9bdfd45cf8f9d85e0dc836347046217a43ea6c79ee10856ad39163490e30033ed57c847024365c85713319c7d1d18e21234d6271615930d4963f42fd280caa450e6d83d0b8258400006ce96fc4c0171d0478eca955a4fba452f93b2c09ffb85fbe78d5f2a40f017bdddd2dec6f11620aa54736226ff7731719ffdab4f0657ef777115559d375df25850c78ceafa9c9cbad538c13219807f2b9867672bbcc665268813025e6cbad72da40288bc4a7e96e29fa441827f801c6f804b121d6f3a99f7b660c2fe44f0ee1d402228ace7a5cfc5362d4de38b52498a0b1910125820867488a75d35cf4c06efb6d214697ad56b0237f956c75cc7e5f1ab89f5acef17582010f60a7519103220ab76085ca89609e229c60a39f200341675ac97c887287d640519010b584030e52646ec81ad60fc8cd7cf1813604dce4d7d9995621a2f5f7ffb82b1f1d2a8c21b18f0e732ac5da76790d2ac5a4da592da4d77708aec67868013e15673ab0b05005901c07ac5ad01d682b2abfcf6d2be5993a0b9d286e9723a853ebd7a64c973a70ed4c48f4bd644f4387ea9685be096df83e17bdb7b64f5f53019aef6b68d1164315b096e2809cdc43c7a3e83e68e49133209a4b035238940cd41a4211cd70ee8a1d289ed0037eeefca1926d48e6fdbe8ad069247b59c27f949656dfa3a7e155d6b704bdc1774fdb215f0680e109f51f2c302432fe8fa431c1e19b3cdcd5765a198d95cb80968b627ef000e5c7bfd836c1ac625fe318390241a2d78e7bf5c516284a5cf3569d3df6581b145d0391f7be2fa1a5f0ec6428f69b9919a46112ce26bc8db1098f1388c7708d3633bf7215fbbab9c1ea6186fc6a8a9016f567e2076a29310d4954230f0f00116b122867db4cdf59cf28b894d2b19dc547815c41b93359588ddb59f493ee86058bfdfa4c4dcbec705c6f8cdfb190ccd4a84381af7e2ad8995533bea20849aedcce82a7d1bb17919a883a9dfcd3bb0a02ebcbb9515d9ef1732097d9dbd0461df19b23640638b14d10142031af9f77e74839ad4f437d2aa8290f8b4b2e510a78c16722f50a2c71a2b9a4d0fc82ad0361d0aa1068f1f2cb8374abc17205e188d3876e6bb496ea123e8bbcf1e4287cb506db3d55013073c9425d4b786a60081825820400365b0ea683f94287d7c58f509389c4f2e39656add684ac9942e4e7c08bf260001828258390150ab9706fbb31e58d53f4610eedf75a0ee550eae0f7b0b907f063060073bea946b18925ce27b615763b440d09f5dbda0c68591dffbca0d361a0076def382583901c855701288beb1034be3309b2f800ffa9ff807cc247ca2ee003cb23f3d9678af79fc0cc7989ac5264514a78ecea067860cbfb37b8a711c45821a001e8480a1581c4b9c44c53a20cdfaec04f6a24dd6572037a54aed27a4647b400255f3a14c48617264466f726b3132393701021a0003330d031a02793d6007582037b25d6b3e994f68d24412f3843a7fffa50bb90661b276c7e7f46d21ce82d22509a1581c4b9c44c53a20cdfaec04f6a24dd6572037a54aed27a4647b400255f3a14c48617264466f726b3132393701a50081825820d9557efbf84ffa6dd363661c1b5e7313ed29e50823da16baedc1794f2f616207000181825839015d3c84a4ab34244ca865475c13eabf2e862d5a30c612360f4f0b7b2405fbcf0e74565278f93b2b82ab69bcb9f08706ddd4a00d225d5d678f1a00217dad021a00029d2d031a02613b8a0800a50081825820bc8bfc2527eb8008eb49c7c7cc65455163bb17fc957b75b9011a68a6a27e049700018182583901fc52227f756cc430dc9c81d104c78764b4f41626cb85b79c99cd4ccc5073f046e69026e6ff53e6023bc84b40eb0b1b14a09083af07050ebb1a596591d3021a00029d2d031a02613b8a0800a30082825820034d1a90b249fd422c1bfd4aee60878fc713f4f107a94b4776ea05c650d0347e00825820034d1a90b249fd422c1bfd4aee60878fc713f4f107a94b4776ea05c650d0347e01018282581d61fae5d68aa2cf16a8a1af57370839e04654f9e4548c9adef09cf386c01a0138eb0b82583901e021db8d4088cd7668488fb7d1989ac6fddb6ab695f3dd669f2bd1497486fbd43f3af8532c4850473fbef34ea23d0cb196441bae2d16e06e821a00172bb6a1581cc9db24a15a5a4a3686d6f50f1983a56e934acca586f6a98cc9523950a1514d65737361676566726f6d48656176656e01021a0002bbc5a400818258209a5c54484f77e4c177acd2c795276c5cf8ce6614a43dc8813ab21f97e0dd0fa601018282581d615427e52d1cd89142cbc658f2edf03057297ff08e2c16e6d3d397c5bd1a00989680825839017d8e50b38a7683a47ba4e9105d6ff89e9c162630e8b25c5dd16b9f806e96df67c956be4e6960168f929e627fb98e10cce9a0bf887885d95f821a2382fad1a1581c4b9c44c53a20cdfaec04f6a24dd6572037a54aed27a4647b400255f3a44c48617264466f726b31323433014c48617264466f726b31323531014c48617264466f726b31323537014c48617264466f726b3132363301021a00029bcd031a0261308da40082825820f1c340165805cdc0f2ef8a78761a2291a70ed82c648ababcd2919b5a3958b04301825820a0187465edb163de4b26e79e55daabfdb99021b1db0d9605b364e79a4062c28d01018282581d615427e52d1cd89142cbc658f2edf03057297ff08e2c16e6d3d397c5bd1a00989680825839015cef8d7f6eadbc136a46b4dddd59f25a75242b7736e0831ca8bfea40a2f8786501c13a4eca71f88eea12c2a87691836e21be6f20a06685ab821a076a3ee3b819581c093b80c2d0fca1e50d06e6fff5d22ea06c37a70a36fca1999cb34da8a1477374696b37333201581c0ab9242f9838e9f158c1d161c96805fcf4c54842bf763dc1aa852cd5a85147616c65615f666c616d655f7265645f3501581d496d706f737369626c65204f72625f4c6967687420426c75655f325f320156496e66696e6974792053776f72645f5265645f325f3101554a75737469636520426f775f477265656e5f325f3101581a5061736361616c5f666c616d655f677265656e5f6461726b5f32015450726f63615f666c616d655f79656c6c6f775f3301581853776565742044656c696768745f4f72616e67655f325f31014f57696c6c5f6e6f5f666c616d655f3201581c16a2a21a7ed8a67c5254eda1f8d6041021b53f49ef53e18e3e572546a14d456e7468656f7332333033363201581c1f02ffd171edc73021154e4103ad1240eb188751ecb035d12f231756a1464d4f4230383001581c201bcd6107da0f2ecd70e65b0eb042349873281c569de38178630388a148427566667942697409581c32b19fd9b447eb3d64d9f8c8a5a54ed699cd16a47db243ff82bf7515a14b4164614d696e657235303301581c33540028ad4ade822c82d61ed2d55388422c3db0bfcd11e5e1c92e2aa34c446f6269436f6d6d6f6e3239014a446f6269526172653431014c47756d69436f6d6d6f6e343301581c42e6416b9208aa03898a19ac94124282c041f1c7bf08c3e3f3006c06a14d43617264616e6f526f636b313501581c48766b78dbb52c7fc4617acf4503a9f40b2f0fb3448ba0ab0e1fda09a14c5374696b4672696b3030393301581c5bb7f3c67cb9bece3ae0f654ec5eed2f8c0b16ecd18e66157392eb3ca25543617264616e6f4b69647a30303631464330363432015543617264616e6f4b69647a3030363746433034333301581c63a1eb2af64f5915896fd3b5b25f1ead12f64a9b1dd4a06cb8a6ed2fa14b536f6c5661756c7435373001581c7e206036ca4345a7c45d37d2dff0d7280a0854ce26d279e06f7d94f1a14f4e696674795465646479303034343701581c9a6590ca273a1d0f67bb405717e8c2c245a4fe8935b2fdb7813c91eca1581b477265656e4d6f6e7374657258536572696573464952454d41534b01581ca5425bd7bc4182325188af2340415827a73f845846c165d9e14c5aeda349556e697431303730370149556e697432353136380149556e6974323533363301581cad6290066292cfeef7376cd575e5d8367833ab3d8b2ac53d26ae4ecca14a5a6f6d6269743334393701581cb3bd6c0ea238a4a28cc96bd9a360ee2d9f814023ee9a3d0ee58efdc9a44e4241524231303130314d30323836014e4457415232303130314d30313635014d454c4634303130314630333235014e4d41474533303130314d3031313301581cb4c58110c97910ea5fe392b7727f02abeb528261bfdf137b2a7db22aa14330303601581cb56bb25bcad83af33c40e529722ecb19e3a54046dae97105e36d7134a14a4369636164613839373601581cb7ef0cfb14f588740d02ce8a53879ff96ab03c7b21ec1c459ac2bddaa35048617368477561726469616e32383234014f48617368477561726469616e333339015048617368477561726469616e3932313501581cb81e5ffa08dbd35bf7ac7f9d7f0f58d3581444510b35ea4d098313b5a64d43727970746f50657431393834014d43727970746f50657432373930014d43727970746f50657434303137014c43727970746f506574343032014d43727970746f50657435333736014d43727970746f5065743631323601581cbd3602618dc1d4aec509e3532032ef204e0583ff6d5ad4ea81e96145a14b73656164696e6f3237383601581cc4c00fbd8fa227442a5e7cdecde33b24588494d05a2c50fda8938c6da1444b49445a18c8581cca3aeaa53c0b21fccf28c8c724141473d325fe9ea8d0314f7c3b4240a14f4269746c616e64733078303237333701581ce35a1412a23b10bab24f750a88c65aaae4ab3748863b78aeebcbb4c8a24f4869707079446f6767696532313036014f4869707079446f676769653435353701581ce5f5a081d5da6cb1842a944e6855d2d1c9d5537e0b6b33b58cd85ef4a35242494c4c414e444152414e44544544333230014a4a41524845414430303801494b4f49504f4e32383001021a0003b3f5031a0261305186a20082825820e28ba7c48a153434fff06660908467c4534d28f2300e35f0d779f036cb4c09f65840cd87212ba9882ebacc29c2f1069600cdfba14f8d02f6974a50c09ad61bbf2b756150be86302d4c57d6cce3ab59598b2789622da5106d00e2a70b48f55dc19b02825820e376d721acd5e6e18885c7bec9c7725b228dc7e2ac63d2486d645cf307db7a76584021cb598370011cc9a71436e376338afd2c4320fdcfd38cf310ed6de1e9c325c43083e25ccd3802a6d7416c25fbd97adc3a24b96336b1992ad7531f1849eaf00201818201828200581c7528c78f63dc6de1dc998e4ca9ea1f19829b0958cf916b72d480bf2582051a02793d60a100818258205f565a66dee8a092bd11e6196ce1f974195bc4183cc883699d3f04c87a603b6f58400354c4b89d6d2eacec89eb2b1cea400309edef1ed707b406455f8c405a2a7c7cfda44565c00dfbb8a35c3a9d7a804d6dfbea074ef197d0de7ad5f66c175db105a1008182582008d17aa2ee3c574d1ad9d6a1ccb3c2da53f2356110e5e4da5dbe59c0a3b0a30a58405186ecee50ff90f33ec0361501ec962bab34e6c0754d32a955fd551a994e47c75cbd5e0d407686aae41c44b4e64bddac0eeb25b9775b6d5172bc869069b92106a10081825820d5d20c965cf82e1bc0f61395d93ab82461406c826398caa57ec6fca3f4c052a5584017bebd385cd3f93255c251a90f6cde1656ac38fb77e8c37546f03e586bd1296b0e688f0491e1ba05cb357703e516b6021f8efa3474db40c035ae633cd2d4890ca10081825820ff627640b8a2299cc8605241316b259a2037bc6c7753eccdb336ae5d7818f31d5840c80294976aabde590ceebb98f97c0264a977cfe2b18df622a9c03408d68279033f2e4079df6f3cbf3de551b625d8ec47cca28d1ce125ed621fed840a6225ca0fa1008282582046f371ca0e6fe6ec2047310d943f1e4a17083f6c55cba236008e28123a902a725840bca7d02537231092e7044e60ad8642e710b5d003c537297729ee03b5f76c4365436cfd9c4e9fa4115d7cf9c2498764cdf683393d75c458204785ecb7ddba340d8258200cd1ce481d2bac11d09b374df34f58743806bdbabd996703394a4429f771374b5840a3977d3e2f15c7e80dcaf4f46fcaf76552b40d6bce73469a504b91ff40634abadb4b33457b3498a5be955decfdc5b94abd4dd27b21085344caa091dc4b87c103a10082a11902d1a178383462396334346335336132306364666165633034663661323464643635373230333761353461656432376134363437623430303235356633a16c48617264466f726b31323937a567416c666f6e7a6f8374436c61796d656d6f7261746976652070696563657829746f2063656c6562726174652074686520416c6f6e7a6f206861726420666f726b2075706772616465756f6e2053657074656d6265722031322c20323032316566696c657381a3696d656469615479706569766964656f2f6d7034646e616d65781b4861726420466f726b202d20436c6179204d617465732031323937637372637835697066733a2f2f516d5a6b6e6d4166384233445070535841665a69627a5655517a454c4d576347736a6e6262546d484b693666647265696d6167657835697066733a2f2f516d566a714a6345764e713179476b4a774d51577836395652776e5831786e5632414b766d4138533652795a5052646e616d65781b4861726420466f726b202d20436c6179204d6174657320313239376774776974746572782168747470733a2f2f747769747465722e636f6d2f5468655f436c61794d6174657380"
15
32
16
- func TestMaryBlockUtxorpc (t * testing.T ) {
33
+ func TestMaryBlock_CborRoundTrip_UsingCborEncode (t * testing.T ) {
34
+ hexStr := strings .TrimSpace (maryBlockHex )
35
+
36
+ // Decode the hex string into CBOR bytes
37
+ dataBytes , err := hex .DecodeString (hexStr )
38
+ if err != nil {
39
+ t .Fatalf (
40
+ "Failed to decode Mary block hex string into CBOR bytes: %v" ,
41
+ err ,
42
+ )
43
+ }
44
+
45
+ // Deserialize CBOR bytes into MaryBlock struct
46
+ var block mary.MaryBlock
47
+ err = block .UnmarshalCBOR (dataBytes )
48
+ if err != nil {
49
+ t .Fatalf ("Failed to unmarshal CBOR data into MaryBlock: %v" , err )
50
+ }
51
+
52
+ // Re-encode using the cbor Encode function
53
+ encoded , err := cbor .Encode (block )
54
+ if err != nil {
55
+ t .Fatalf (
56
+ "Failed to marshal MaryBlock using custom encode function: %v" ,
57
+ err ,
58
+ )
59
+ }
60
+ if encoded == nil || len (encoded ) == 0 {
61
+ t .Fatal ("Custom encoded CBOR from MaryBlock is nil or empty" )
62
+ }
63
+
64
+ // Ensure the original and re-encoded CBOR bytes are identical
65
+ if ! bytes .Equal (dataBytes , encoded ) {
66
+ t .Errorf (
67
+ "Custom CBOR round-trip mismatch for Mary block\n Original CBOR (hex): %x\n Custom Encoded CBOR (hex): %x" ,
68
+ dataBytes ,
69
+ encoded ,
70
+ )
71
+
72
+ // Check from which byte it differs
73
+ diffIndex := - 1
74
+ for i := 0 ; i < len (dataBytes ) && i < len (encoded ); i ++ {
75
+ if dataBytes [i ] != encoded [i ] {
76
+ diffIndex = i
77
+ break
78
+ }
79
+ }
80
+ if diffIndex != - 1 {
81
+ t .Logf ("First mismatch at byte index: %d" , diffIndex )
82
+ t .Logf (
83
+ "Original byte: 0x%02x, Re-encoded byte: 0x%02x" ,
84
+ dataBytes [diffIndex ],
85
+ encoded [diffIndex ],
86
+ )
87
+ } else {
88
+ t .Logf ("Length mismatch: original length = %d, re-encoded length = %d" , len (dataBytes ), len (encoded ))
89
+ }
90
+ }
91
+ }
92
+
93
+ func TestMaryBlock_Utxorpc (t * testing.T ) {
17
94
testBlockCbor , err := hex .DecodeString (maryBlockHex )
18
95
if err != nil {
19
96
t .Fatalf ("failed to decode test block hex: %v" , err )
0 commit comments