From 9861bd5e9f62dbb20bba70269bf65c26937deaf2 Mon Sep 17 00:00:00 2001 From: Hugh Cunningham Date: Fri, 5 May 2023 16:54:47 -0700 Subject: [PATCH] creates spend witnesses using confirmation range supports creating spends with a confirmation range. if a spend is created with the chain head at some block A and the chain reorgs to block B, then the spends created at block A will be invalid because the commitment won't match the root hash of the notes tree at that note size. using the note tree size from a confirmed block instead of the current chain head will reduce the likelihood that a reorg will render a spend invalid. --- .../__fixtures__/wallet.test.ts.fixture | 66 +++++++++---------- ironfish/src/wallet/wallet.test.ts | 8 +-- ironfish/src/wallet/wallet.ts | 23 ++++++- 3 files changed, 57 insertions(+), 40 deletions(-) diff --git a/ironfish/src/wallet/__fixtures__/wallet.test.ts.fixture b/ironfish/src/wallet/__fixtures__/wallet.test.ts.fixture index ae88428384..ccf18018ee 100644 --- a/ironfish/src/wallet/__fixtures__/wallet.test.ts.fixture +++ b/ironfish/src/wallet/__fixtures__/wallet.test.ts.fixture @@ -5969,24 +5969,24 @@ "Accounts createTransaction should create transactions with spends valid after a reorg": [ { "version": 2, - "id": "ec8564f7-f717-42b3-b08b-98c873eba3bc", + "id": "fcbd3064-d5c0-4532-a31e-71a7a2056e42", "name": "a", - "spendingKey": "73882782b43a9cbf53a3c36c37d6713619faaf2392b5aa8b3c7af4412d2a30f1", - "viewKey": "d02dea9f3000828f7736e5877ce3ef88f2ccdda58fae885ca207fbe8f9c62d489055119fd07e960ffbdb14d9a8c5501fce1144bdc4b6b9ae7df7ad26c6f23941", - "incomingViewKey": "44ccb3af615ec75854970e6185857c33a5caafa0d5644de9d5bbd56aac169b00", - "outgoingViewKey": "b1d23bd84b2f85620f0646f50ddcb3beeb8f98352b039c8aa268e37fd453f646", - "publicAddress": "9475c8e4293497032478e704810c15416b74999dd8e7eae9e9c7410afff38e2a", + "spendingKey": "eda14c428da8ca6f4b5e75f5e8a5551be13157d06f63cb48b3bb66cb13e66599", + "viewKey": "7dd6d4f500f1795863f7cd2d19ee3bb015aa5a1a03fafb3095eac2525ad982ca2e2cf6e76d1145f9f3a469bb29d90292719352f30bb2e7faf7120f0e9773c317", + "incomingViewKey": "d143158c6e768b0ec8570cb2d04395fab26bed9d04f622509335fe6d2d788003", + "outgoingViewKey": "7405f0ecf9d32a8779378a2c6408be05ef6ba7c4b85974f332954c964159e1e3", + "publicAddress": "c973581f9e214d12e2535fb0b566b566578f505a9ff64f1bbec04e7030cfa7cb", "createdAt": null }, { "version": 2, - "id": "6b553bf6-fe1a-49e3-9207-9e15300c753e", + "id": "7a9503ff-4cb7-43ba-ae34-9ec98c7dfe15", "name": "b", - "spendingKey": "aa73216ce28308d3ab025293d08616432f08b63241bf7d8cc02730f0ab1f6f3b", - "viewKey": "55b2627ece5591879a4e9f24a20573ab0c72f265332987d392884acdb201e6bbf6ac1aa3525f8f2b78bc2af011b97714e8d6cbea93e8632d534a731756094882", - "incomingViewKey": "c30cba3a2aab6ab396e2243f9363dc76eb51fd1d69489db3a43adab847361504", - "outgoingViewKey": "d9176eb7a25f452c46483207eeba6671b004a9bfdebcdb2160af1847cc6e6997", - "publicAddress": "8bdd70976763c663c69049eec29ce689970867105fb347c03f3af24a2666f51d", + "spendingKey": "30639cd4e1c0d96363344f9ca097d311ac7a2aee503b7a58ffd6848d9753ba3b", + "viewKey": "5c6e8b1a2a7cd641e31fe256be8ff1e3d9a3b2ecc85fe38ded86a8563362438334bbc1fce04dd4b9ea03ac2a6562b21359f4a4e1644eccc8a57bc4c3b9f9ef98", + "incomingViewKey": "f68705bd1e0f2a8960aa030e04d001de004ce7864375fa66e330bd47193bac02", + "outgoingViewKey": "c6cdc3dba9dba6f08eca20fd5dd38d7b2843b09c9714687c1565a1e0b8cb827b", + "publicAddress": "d7ca857e743f54b17979153bdac8c09a7c26d5a8d7f79e4360423520e2a7098e", "createdAt": null }, { @@ -5995,15 +5995,15 @@ "previousBlockHash": "88B6FA8D745A4E53BDA001318E60B04EE2E4EE06A38095688D58049CB6F15ACA", "noteCommitment": { "type": "Buffer", - "data": "base64:BITU3rMb3G/vLi37leUQ21b9gsEBMa4nQDXf1Wbt01w=" + "data": "base64:NyaZgZTVJO7W1Nwt7lWPpQa4yMBL/f4V4kCpNImITBo=" }, "transactionCommitment": { "type": "Buffer", - "data": "base64:R50u9Zm5no1iDee+hhQNyBr/wgEl4m5KW3epo+1hB8U=" + "data": "base64:dN0NcGhJ6XIoFp6VLzcspXIHXQdgkmaDEqtyWAyU69k=" }, "target": "883423532389192164791648750371459257913741948437809479060803100646309888", "randomness": "0", - "timestamp": 1683317542054, + "timestamp": 1683330813994, "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", "noteSize": 4, "work": "0" @@ -6011,25 +6011,25 @@ "transactions": [ { "type": "Buffer", - "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAlmjoNTXwkI7l5CSHjJrorIsSBA1eMVGc2osw7FK7FWOPFUYw0AhpR7oHQiqxZVOdvqRVIXzNwD7Zj0YR/G/9xP7kLXoTNqlNbRCmgdyjjR2jd8s2Y3KPQ7nlRHyD7QqOoP6gttKUEchPMpoAg3EB7OIwTLSRJpQNOzmAvzm1Am4ME67EKr4eDaUsW77k22G68jeLOKKDD9OoYAdKIPip89uQmwZlc1gB/wT8AAwZynWlnfJwbRK0JnSuDbQQUvqPB+vt7RDNCXuIQFaBlYltLsm8tT0bIPdmb2X9tuppFVoYM1N2F5yS5ltlR9KU/0L7ovdAIQa+F37ZgMIFulT3XOwWYWuzUjJISuAugcNh8sPjYDI/6TnXyWFU2L+yAM8B2bzMBs7Bjn2Z2docC5F3Sy75rGDHbKxi5bO7HSMVtR4evU8YkqnzNSu9iZI4YIb4tqunlgOynb4EbDD8WyNsrYfp4PY79bBpTXKNWcM/Bkl/sIstLWMokVJIySc7AehN1nhXZul43kVNXczS5XTVA7TMddL/0QoULT+4rKbq8ooW59S9xgWxAfjAU2zZMnYkWUkAMozOmKhIBP8EDzNUWQ3O0d1o2EA706OwSLxat9/AQIi5Q/zn/Ulyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwG9OZ0L8H9bfRA4E7mwKRFzBpNoLVZkiiHDD9OgBaNNzgyvC6e/HLMTOPGDwbkoBpbbcZJE756pe9Jb2sPaHmCw==" + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAtlpZLxo2ZiZbVQiXUMjBqscV51B6Mkb7YC6Tc9OFTiy25EzCQXhM4HRDaqv9uVe/hw5addVBZvyVltA8KsDlPy97CShb8jG5gSq+QLGj+QyYOpEmqNPbGz+WjiX1VS8kdbB0hat/iQOGEfeClLJcOtNtXmSgWV4N1H9KssKyrhQVOFvGRn2A1puPJ5HPvZ3y1gSkZAXgsa+4yRwx+Pa4P5wSW0oDsfHWNWTfUQcT6zmQAoqK6EYNqzq+Ljt7oNtf51wSuTcpaTD34W29H20WjDGOBqODlzEs8NNjqP3umsJjox5oSwl1XTaVW7FVEE7O6hfwby/KZu+is75KxmKQg976Pp1BS4Y4Wsf15DKOw+uaDISofWBp3877s16f2I1O3ye9eOoNwXYKc5eSN7bcFUSILB2Wap6TM7ZPF2zTlVsfCffwReBSm6swvmxXdRTKdH+lVTA7KlcSgHCq34Su0dYlGI25vsL0SVRhNEda4gwbcGI4RRnDcEELMYE32og9cfwGOBi1I9cGjH77KgPir9hbltbSq810gZH9faPKSulNszTVfg+DShpK+qyoSCuzIVDC6lmdxIH7WYX5Ki2+HgxBRSFEjJvLqBn2XeHtf/jSaEdIddiaIklyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXAF5Z/joiWBeDozEpfxb4zRcdf4bFr50L2VH0yPyIRFj9BN+ow6giYd3eBh5KhtXOeXSW5vaOSHVJBVwILaiCQ==" } ] }, { "header": { "sequence": 3, - "previousBlockHash": "508C9B9CACEB1AD3C16B1EB10C846B7A1027B2AA9B2B0888690C70209D8FE933", + "previousBlockHash": "23C2BD27A18BE4B01DF01C53F7C0BB086E84D463A8F1E9A11732D765DBAF3EBE", "noteCommitment": { "type": "Buffer", - "data": "base64:NA3kfeUDndehImVtGz9pxH+sQYOXqzxRWVLoQLlDqyY=" + "data": "base64:IMBLY39yhZEA/BmKrOd8u0x2JqplcI95KNMnGVGvu1A=" }, "transactionCommitment": { "type": "Buffer", - "data": "base64:m0VEiCLea43USgB7EDN+69HyZQTVA6P3A4BJUM5zz3k=" + "data": "base64:6Hpr0Wu7BUr7G4ex/QIs3YQJvZky/adGROFHarv7/lw=" }, "target": "880842937844725196442695540779332307793253899902937591585455087694081134", "randomness": "0", - "timestamp": 1683317542712, + "timestamp": 1683330814632, "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", "noteSize": 5, "work": "0" @@ -6037,29 +6037,29 @@ "transactions": [ { "type": "Buffer", - "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAHj0ItvTnrFQ1Z4aVD/iK6ktagiJecRY9OourG3Q3K7usMfY99Eyaj+hOgk/eXZ8S5c58Y2X936yPCMEt1p/KAjetiGNtgquX7SXTyIuxq72A3OHn1g6O8A+zlnxl1GAZFMw7IBUTA40GjRfmVe93SwxfS8jDHkgICVSRfN0ik98TrB3x0WSf5R3TZwZoauenVi7G92/8tBfvops6rmWM5TQa38THsOi3f0jiEmJCgb2AppYWU8/YoeDy19TPYNH1EM27DvHojmXJSFbKAbsCZ7GexElCP1d2NMd+lDEyc8wS0RznXXWpWz8+unGXq5WIMw1PJ2zAZRGvUxSkt0pY4e+9J2SxDy/EMuVfrAYohEVPTNKJHt1bA0OGfZt0XrFGDGIv7WxobzcAG5kwQXVzTykQ1pRvVTlKJVmfW7oHVJu4HzKqSbvkUvwMZRW9IqhZZtu2j+SfSTpyxW/UOFLl50AlogeIcGBUPS1jpdgbN+eQeG19Jd4aOg0PHgRFfGIvaVqSTywhwrgxMCJWhhKfjvPH27ZuesRN++OiYGteRPgbTY5cQPtnCoxjowop5ve8ON8xAmMMEK/v6fM8Mdki2SwPAaI8piBKYmnmNQ+y/+hsPUVAOVVlL0lyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwSHw5zj0ElnA3wXj8nupJbq4e6Q/QGpG8DhYbnnVwrEfsU7sR4k6nKJN+nhpqvdSvfzEYoXne/QmvkuS33SEjAw==" + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAj7Dgz53bMPtl3jnreH7DNkdHdaN1HOZyIu8adcopJu62xp+4HH3hiHHeLezEpJy0bLialVzdjmvCg5gxqzkVWvIq2cJeObYCriCcZS00fgOSM7NhpG4bJDynBC2rSe1skAImFn7LUXdIEHQ66Br/8AjfS2z66eJYLSjqyHLIIWUQE1/pa8ESSFRgb3G3rV39voeDKXK0e/0UJo1cvRrt7mhjKZCTnVDzOlR5+/38QQCoQIraDYahvpKib+0T4X6WhHtjm6fUp+v80/jLBC/l8axnzMKv7nWx0r2n8/cn+0u7wmNThGr1yIgG4JVStaNrBNzfkEK0mJy6UlV59qoW0Oweemo4uwOFdMSTCjUy0666OpYrMV/HUTkHiiffrTZR9ydpZ4sKX3ev/CykBp7ZwrNT5Q9QpBowOMLLObHgoNbRSHCNZm6pH09J7Y41FXOCaELkGGujSP2XDpYA9HLzBu9zxLskU8wOuXGkSDjLSvbQlsW3lmwRdPL4b2Q3GfoLhhMk0PY3REkTtPqNHWQKS+INcHkFo2sar0U+DKG7m8JGANp9Dkt9VWduF8a2AAM1j4TzziA6ypw43LpOwjXYc+qrkvuuL9nlRD/c334ZC3FGqeWvsA7UBUlyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAws4PJBG2hm4g+UN+txEkJUDCF2Q/y5TNT94T1eHX6k7bkAiq1loM/mgQtgO+GKO1Kparg09SjU3M9KmITFLw2Bg==" } ] }, { "type": "Buffer", - "data": "base64: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" + "data": "base64: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" }, { "header": { "sequence": 3, - "previousBlockHash": "508C9B9CACEB1AD3C16B1EB10C846B7A1027B2AA9B2B0888690C70209D8FE933", + "previousBlockHash": "23C2BD27A18BE4B01DF01C53F7C0BB086E84D463A8F1E9A11732D765DBAF3EBE", "noteCommitment": { "type": "Buffer", - "data": "base64:edK0xJ1TVfBP8WA6iZL/Ux+kBFWbXVVqYIJnVH3fW1Q=" + "data": "base64:b47NUd9ymBELH2bLq8DAzqc4Ff0qhX6ZmR5R+XsrrSk=" }, "transactionCommitment": { "type": "Buffer", - "data": "base64:/uuV4kQVJzoI/xgS1e0SF+r06+UYTbjMmpf72YX1W44=" + "data": "base64:UzQ+lI7S1pheS9n3IOGDrf3r4Q5o2MgyW39NbFH+Dh8=" }, "target": "880842937844725196442695540779332307793253899902937591585455087694081134", "randomness": "0", - "timestamp": 1683317545792, + "timestamp": 1683330817445, "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", "noteSize": 5, "work": "0" @@ -6067,25 +6067,25 @@ "transactions": [ { "type": "Buffer", - "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAd7g3RsSf8JZCmqYp+oymZq7EfsgYdOskoT4E+eZtK+qU1x0OunQSHjqtDeulrKRKjTkxdQD/WCEbSI/egyJUON3kPymRccFcii9qLtqnpXewgmXcUkp5wRi0V/pNHnxYYorFIabTWSw+VAdWymtx+I4TZyt/nUPJ7WNK5AnbqQ0FPo4r4ikD/dk8edSJoa1UT6rmVQkw8qpIA8ZqDPv2BGScfbCAkZTRRv6VS9wg2IyJ+k4/wO2Bp2stDXN8yTQKpywwHR47mBOIWvwZV/kLDqouljXUuzNN0LYoGHwblsiStg+N44md9ziTlXS4vaNx2lITsEwfCrKFRmt3/LkuPdaDRnykOfmSoyJQnQLraX1XHJs994PEULYahevDB+hJtqztAIHVGd+uylpqZ1H26BlxmYp5n4fIUgiL8Fl/D7fJJ4gb1KabUpKBkj8/T8JTwReg2b5HRiSCkAAsYw62fQrQF1a09OKjlGiHhoMH+7Vq8DIRKH9MSBvI5qi2cSF0Q/adIR0G8+MSxxCJmIIyjGVKcsV5MQEWlQ3pzIpL2i5V+e5FyXED3enMVPsU3a5bcMXIIUFQvsd1lHguL8tV9C6mUQBWC5UoCx5JGQIqlSyYkyH2/imkXklyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwvGixdKf6TsOekTuhS/FXRkIo0q5mTuvG7LO90VzYOgWIUdpyIFLsm09eehzN/9RidtbG7WSVl5OrUO/myjgwBw==" + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAUIHVgfuaAdmjxFBsp7F/gzItAzVsnAQf26LxqNZRVhqVzqLMvqF563i+jzn+9xpgDknfM4KNllJmSkrZeYy+QheMOkNQngP8adw1jiGkeTG4dSdJyYXBnQIOhXd0W5LQBbaQyxA6nolzhXJTJduLk1O2rOS5UZ8jJjVv6ob0Iv4SFiHVUaacUwS3IsU94Ms3h82VJPtf0z1K0aQCFCtOFpjfkhlGyBN7CWLdySJTehyY5WpjgIKAL3yv8J/AV57yHNJPQjPvLkVgBhh3i/9PDfyXwkrDVyExyQueIQV2JHxdj0sRucxXyuk0K32AJAed8DkaPkWc/cNkdT44nskW7yCMWEyYaOamm6Kr1xyAfg0nIsoo/tWh0GveNQDvmbJqc2BSDotue9ZvUfbdfSrht+qlSRd1F9u4DRkbmKZIfVrkrXZYNYrwewGi6bQpjGGlRQ9FMrThwe6WAwHeLunlJIQHASPXBZYm2BNbg1iK2XS4BXA4HA55l9IRjA82JOHMCf1jdv6j4N9t07seKtdYXnpYaQupq6QfrY1c3Sz/vEmhp+YuQL+LnoTtPzS81KrQuH1YPprR+f796zDAro3/ArBoUZ0m/sWJOJLhAO/5hFCNFxC7DZFO5Elyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwk25Pj59jz8gJqJ9rfy43BIQH9J1H7Dz+dPWTy4nYy41iN+R926IX7ElVLRF2mkCdKzrYcYExq1F0nRTb1vgaAg==" } ] }, { "header": { "sequence": 4, - "previousBlockHash": "DD71ED9D2436747BF9EFB36037FEA50374A030C6C61930BB09E238A6E16266E6", + "previousBlockHash": "3FA4972FE6BEBE1F107E80809F0B696935B4CB374708831B49B8C3104F6E72DE", "noteCommitment": { "type": "Buffer", - "data": "base64:E7nMe62sjyk3tGIryFTLWvnnrZlkwL9htUqPCFkt720=" + "data": "base64:e2y375DHxWByJ0eENZdlNW/P9j4O8b0GK9V192n+SkE=" }, "transactionCommitment": { "type": "Buffer", - "data": "base64:BAftMxv0KXMJCzJSpKXpVm//b1jEKRUyv5KIrhBZbck=" + "data": "base64:BobTQslcNBtYGLVF5wBcZKAx8KpLxrVX8kEk+kFTHgc=" }, - "target": "879558286015102359500873427691175770640419791152471469672593461411590982", + "target": "878277375889837647326843029495509009809390053592540685978895509768758568", "randomness": "0", - "timestamp": 1683317577230, + "timestamp": 1683330818058, "graffiti": "0000000000000000000000000000000000000000000000000000000000000000", "noteSize": 6, "work": "0" @@ -6093,7 +6093,7 @@ "transactions": [ { "type": "Buffer", - "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAcBf4JWUdGhaKpxkErJEds2C8RKSDA75Cq4iK51apHmyQ69UovOhb0tHl+nSTHkcUvhwism8m2jgi4GWhKjEe1D+D+kVcq89Nybx+F1NIg2GM5xy00JEiD81AIWFQ2OE4FhKfJj/YB/A/ZzDoCNIbRfoliZcuyLKBxMMiOPLax+sFYJyIJmIrvYMv/7xg5uxSbEhLd3TboeDAZFvhhsRSxXEW28mFANvHpVr7LymL+6GH8IRx7k4Vov4QpB4P87TO7G2euV+2AGfssFt7phi06nScYgUVmgAZY2wMapVD9Ysp+GRrbE2TpUXP6gbmlxSjH7nsLkWFvgOYMHUrUCC8uJDlsd3UQRnCDLRW9osl8MEPqyFK3yc0HiSu7QAITvRLvrjL9judNX+EI3UVMu8beVu1gSCrGbJ8R32Hlfa8BTreY8lC/kTEFRw11Dwjc9cFLCBvSQ7j6OeXPaOQVJXAS2gWhs8lUnuSP20zS1T3PeRSqYj53QFyFseDN54za0DCVcTX0PyNJ7QK4OYRiokBN91gQcILzx4/dm7O7mRpIv1x5OiXou7aLhWwMTXd4lvlwN/XRDBIC9q0Eva4qBaf1p2I4E+czKRj60n4en2nZs8e6rWBC4rjIElyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYgHx59Gd19p4qlk7d2+hi1UMYLs6z+18zaiLMzJheGwqHRz0GgTumm2Zo46NYkKGY3gIe0u7inTCvzsi7mT7Cw==" + "data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAd+e9hPmOtS2sfg3qyzRcqHSYJ1f8RsREp1+C3tvEzi2HqpT2acxV+bR69fewC8gEJi0YrVxnN98RpT1KofC5WMQcGbbH0NUPWQAX9sWuYVmyrcRIe0/Yif7hlh3cEDyHV1BKaX/cF0ytBpxy4PqahZz3qwuaSHeKExAyQwneLw8Mp76C5p9JTdvLXQRq4bAaqHZJN/NlR5xQ82UeKk+9/8qCpfFssb0yzCFNSkGLVYWvRyy821vtrD9WFXlxfATMqFyJCpgtKGa2kPzIJEOpW1QohMh81HczWu4qv/HTt/mpvlIvWbJGniBVD1jB61pXHw0kH4ooKel9xK3PfpVkHcdBygA/AZ1lpFZ+0R5izNbuNZ83xV1qxXVzXjfWHwsMCnLYFhPzHEVKGnbCmUXGy/m9cXpZl1aUNxnuFhLnimxAAqa3cBhIzs2jOqJpeLY+c/ZTyMmT7p++WDbBjZUTEUj/laVrScXc9oJfQgAtjYRRxgu7FeX7tk9tyExW49lnI0Rw/hCwpS9vV66wwV7VN4fXXtET8Mxiua5cbpFTYY2F3uykhoBgzhJCkM/v5ChGVhz7WGF+NhBJUxr5phZDYQI3issBTzOtMICn6QRFh/uNs0rhq+hlR0lyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwTw3yG4l3ZuNFrW0HPHLVI3DMP2xWcdAU7riQxVj/hkdop2xOBoZvPKIorUeC8p1KCkaZnLpPt7nEgZZocc0ABA==" } ] } diff --git a/ironfish/src/wallet/wallet.test.ts b/ironfish/src/wallet/wallet.test.ts index 2b7d9c4252..a4cf94c664 100644 --- a/ironfish/src/wallet/wallet.test.ts +++ b/ironfish/src/wallet/wallet.test.ts @@ -1061,6 +1061,9 @@ describe('Accounts', () => { await expect(nodeA.chain).toAddBlock(blockA3) await nodeA.wallet.updateHead() + // set confirmations so that witness will use confirmed tree size at blockA2 + nodeA.config.set('confirmations', 1) + // create a transaction from accountA to accountB const transaction = await useTxFixture(nodeA.wallet, accountA, accountB) @@ -1081,11 +1084,8 @@ describe('Accounts', () => { expect(nodeA.chain.head.hash.equals(blockB4.header.hash)).toBe(true) await nodeA.wallet.updateHead() - // spend is now invalid because notes tree has changed since spend creation const reorgVerification = await nodeA.chain.verifier.verifyTransactionAdd(transaction) - - expect(reorgVerification.valid).toBe(false) - expect(reorgVerification.reason).toEqual(VerificationResultReason.INVALID_SPEND) + expect(reorgVerification.valid).toBe(true) }) }) diff --git a/ironfish/src/wallet/wallet.ts b/ironfish/src/wallet/wallet.ts index 08fa98719c..f5885d17d8 100644 --- a/ironfish/src/wallet/wallet.ts +++ b/ironfish/src/wallet/wallet.ts @@ -868,6 +868,17 @@ export class Wallet { const confirmations = options.confirmations ?? this.config.get('confirmations') + const maxConfirmedSequence = Math.max( + heaviestHead.sequence - confirmations, + GENESIS_BLOCK_SEQUENCE, + ) + const maxConfirmedHeader = await this.chain.getHeaderAtSequence(maxConfirmedSequence) + + Assert.isNotNull(maxConfirmedHeader) + Assert.isNotNull(maxConfirmedHeader.noteSize) + + const notesTreeSize = maxConfirmedHeader.noteSize + const expirationDelta = options.expirationDelta ?? this.config.get('transactionExpirationDelta') @@ -925,6 +936,7 @@ export class Wallet { account: options.account, notes: options.notes, confirmations: confirmations, + notesTreeSize: notesTreeSize, }) if (options.feeRate) { @@ -935,6 +947,7 @@ export class Wallet { account: options.account, notes: options.notes, confirmations: confirmations, + notesTreeSize: notesTreeSize, }) } @@ -978,6 +991,7 @@ export class Wallet { account: Account notes?: Buffer[] confirmations: number + notesTreeSize: number }, ): Promise { const needed = this.buildAmountsNeeded(raw, { fee: raw.fee }) @@ -993,7 +1007,7 @@ export class Wallet { }`, ) - const witness = await this.getNoteWitness(decryptedNote) + const witness = await this.getNoteWitness(decryptedNote, options.notesTreeSize) const assetId = decryptedNote.note.assetId() @@ -1023,6 +1037,7 @@ export class Wallet { assetAmountSpent, assetNotesSpent, options.confirmations, + options.notesTreeSize, ) if (amountSpent < assetAmountNeeded) { @@ -1033,6 +1048,7 @@ export class Wallet { async getNoteWitness( note: DecryptedNoteValue, + treeSize: number, ): Promise> { Assert.isNotNull( note.index, @@ -1041,7 +1057,7 @@ export class Wallet { .toString('hex')} is missing an index and cannot be spent.`, ) - const witness = await this.chain.notes.witness(note.index) + const witness = await this.chain.notes.witness(note.index, treeSize) Assert.isNotNull( witness, @@ -1081,6 +1097,7 @@ export class Wallet { amountSpent: bigint, notesSpent: BufferSet, confirmations: number, + notesTreeSize: number, ): Promise { for await (const unspentNote of sender.getUnspentNotes(assetId, { confirmations, @@ -1089,7 +1106,7 @@ export class Wallet { continue } - const witness = await this.getNoteWitness(unspentNote) + const witness = await this.getNoteWitness(unspentNote, notesTreeSize) amountSpent += unspentNote.note.value()