Skip to content

Commit 8c9e1cc

Browse files
committed
rm loop versions
1 parent afb34d7 commit 8c9e1cc

File tree

3 files changed

+23
-42
lines changed

3 files changed

+23
-42
lines changed

src/CidCbor.sol

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,6 @@ library CidCbor {
4747
}
4848

4949
function readCidBytes32(bytes memory cborData, CidIndex idx) internal pure returns (CidBytes32) {
50-
return readCidBytes32_assembly(cborData, idx);
51-
}
52-
53-
function readCidBytes32_loop(bytes memory cborData, CidIndex idx) internal pure returns (CidBytes32) {
54-
uint cidIdx = CidIndex.unwrap(idx);
55-
bytes memory cidBytes = new bytes(32);
56-
for (uint i = 0; i < 32; i++) {
57-
cidBytes[i] = cborData[cidIdx + i];
58-
}
59-
return CidBytes32.wrap(bytes32(cidBytes));
60-
}
61-
62-
function readCidBytes32_assembly(bytes memory cborData, CidIndex idx) internal pure returns (CidBytes32) {
6350
uint cidIdx = CidIndex.unwrap(idx);
6451
require(cidIdx != 0, "Can't read a CID hash at index 0");
6552

src/TreeNodeCbor.sol

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ library TreeNodeCbor {
2424
CidCbor.CidIndex t; // tree
2525
}
2626

27-
function readNodeE(bytes memory cborData, uint byteIdx) internal pure returns (TreeNodeE[] memory ret, uint) {
27+
function readNodeE(bytes memory cborData, uint byteIdx) internal pure returns (TreeNodeE[] memory, uint) {
2828
uint arrayLen;
2929
(arrayLen, byteIdx) = cborData.readFixedArray(byteIdx);
3030

31-
ret = new TreeNodeE[](arrayLen);
31+
TreeNodeE[] memory ret = new TreeNodeE[](arrayLen);
3232
for (uint i = 0; i < arrayLen; i++) {
3333
(ret[i], byteIdx) = readE(cborData, byteIdx);
3434
}
@@ -58,28 +58,25 @@ library TreeNodeCbor {
5858
(t, byteIdx) = CidCbor.readNullableCidIndex(cborData, byteIdx);
5959
} else if (mapKey == "v") {
6060
(v, byteIdx) = CidCbor.readNullableCidIndex(cborData, byteIdx);
61+
} else {
62+
revert("unexpected node entry field");
6163
}
6264
}
6365

6466
return (TreeNodeE(p, k, v, t), byteIdx);
6567
}
6668

6769
function buildEntryKeys(TreeNodeE[] memory e) internal pure returns (TreeNodeEntry[] memory) {
68-
return buildEntryKeys_assembly(e);
69-
}
70-
71-
function buildEntryKeys_assembly(TreeNodeE[] memory e) internal pure returns (TreeNodeEntry[] memory) {
7270
TreeNodeEntry[] memory entries = new TreeNodeEntry[](e.length);
7371
bytes memory previousKey = new bytes(0);
7472
for (uint i = 0; i < e.length; i++) {
7573
uint8 p = e[i].p;
7674
bytes memory k = e[i].k;
7775
bytes memory key = new bytes(p + k.length);
78-
//console.log("i=%s", i);
79-
//console.log("before assembly p=%s k.length=%s key.length=%s", p, k.length, key.length);
8076
// Calculate number of words needed
8177
uint pWords = (p + 31) / 32; // ceil(p/32)
8278
uint kWords = (k.length + 31) / 32; // ceil(k.length/32)
79+
// init loop variable
8380
uint j;
8481

8582
assembly {
@@ -91,26 +88,6 @@ library TreeNodeCbor {
9188
mstore(add(add(key, 0x20), add(p, mul(j, 32))), mload(add(k, add(0x20, mul(j, 32)))))
9289
}
9390
}
94-
//console.log("after assembly key=%s key.length=%s", string(key), key.length);
95-
entries[i] = TreeNodeEntry(string(key), e[i].v, e[i].t);
96-
previousKey = key;
97-
}
98-
return entries;
99-
}
100-
101-
function buildEntryKeys_loop(TreeNodeE[] memory e) internal pure returns (TreeNodeEntry[] memory) {
102-
TreeNodeEntry[] memory entries = new TreeNodeEntry[](e.length);
103-
bytes memory previousKey = new bytes(0);
104-
for (uint i = 0; i < e.length; i++) {
105-
uint8 p = e[i].p;
106-
bytes memory k = e[i].k;
107-
bytes memory key = new bytes(p + k.length);
108-
for (uint j = 0; j < p; j++) {
109-
key[j] = previousKey[j];
110-
}
111-
for (uint j = p; j < p + k.length; j++) {
112-
key[j] = k[j - p];
113-
}
11491
entries[i] = TreeNodeEntry(string(key), e[i].v, e[i].t);
11592
previousKey = key;
11693
}
@@ -130,6 +107,8 @@ library TreeNodeCbor {
130107
TreeNodeE[] memory e;
131108
(e, byteIdx) = readNodeE(cborData, byteIdx);
132109
node.entries = buildEntryKeys(e);
110+
} else {
111+
revert("unexpected node field");
133112
}
134113
}
135114
return (node, byteIdx);

test/TreeCbor.t.sol

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,24 @@ contract TreeTest is Test {
2020
CommitCbor.Commit private rootCommit;
2121
CidCbor.CidBytes32 private rootCid;
2222
CidCbor.CidBytes32 private wrongRootCid;
23-
bytes[] private nodeCbors;
23+
bytes[] private nodeCbors = [
24+
bytes(
25+
hex"a2616584a4616b58236170702e62736b792e67726170682e666f6c6c6f772f336b77767473726366736332346170006174d82a58250001711220232061c4165ce246d7f0b997b4a4212a0355faadf93fdecd64fca89db1d7bd9e6176d82a58250001711220181c3cddd15732e2a37c4455038c71ba75c1d5ca1850f78086d7bf29b490f7cba4616b487470346b797332346170181b6174d82a5825000171122096273e2ef4796b720c8e9f12292dfde8ce593a898ddd3c4c8d6d94c292736d1b6176d82a58250001711220783771b7cd8110221784049f5a1aba5ca85f660433233adb67f2045f1c05af72a4616b47773332356332346170181c6174d82a58250001711220f597936ae0b3636bcd64599dce397d33bcd1d0983af996b5ed02bdad5a6234156176d82a5825000171122009a988e6d9558a6e503e6f3194693953308be2fcbbb8831147b062b308cb291aa4616b497533366f62716332346170181a6174d82a58250001711220d5aa58f18245f4332affc4ce8fad050370013160f764027ea5897184caeb62446176d82a582500017112208e3047b78dad736d03697eedf8f49570c614c4e49cb89d86bd85d8351436e15d616cd82a58250001711220876175f10e6458ab735dbacf697d9caacec33486bc4a633be553fd43531012f5"
26+
),
27+
bytes(
28+
hex"a261658fa4616b58206170702e62736b792e666565642e6c696b652f336b77793265767961626b32346170006174d82a58250001711220d79485e9d78c6b5c611c46352eb43d09283262efc7d7330cca0192501780e4716176d82a58250001711220d07a75d28a5f05f06bbc624a7778713cb26a7a3d275f246c0522e2a2372885d0a4616b4b78353561707135656332346170156174d82a5825000171122071ba1a031bb8ccc7989b028a58555667bb0ac797e43dc79cf3beae00c6b7d8626176d82a58250001711220f06d947dab3e4a53246d64ca139cf697b97cf78477e9dce60c70a017a86f4cdda4616b4968356d6679776b32346170176174d82a58250001711220372be56299a081d7b4f32a6b096664c447d9ebe4459dcdcbaca7ab39c7eebf7c6176d82a582500017112202ebf1579b239e9f86c419af518cd566c14f9a1ca401517739d5f46c51857d840a4616b4a617036773771747332346170166174d82a58250001711220e8a95c55c128235a019ea71f487e19964ac190a7e7cad848d30c6d8b0392e6cd6176d82a582500017112204017a8f3a2f7ed915fb39c1ea353b50ec9a21596de2f7df29158c2b29452dc7ca4616b4a626374633478726b32346170166174d82a582500017112204841e142038dd36a42f7f7eda2815ee89b6d76ff6e7655072c4a71e05a7820466176d82a58250001711220c5b7810955b7ad9fe798613400d49853b02e4dea47568d29c83fd1589485ff42a4616b4a6478796e7432627332346170166174f66176d82a58250001711220bf06915e9710d746cebd939b08d1b7e144a92caf4fa9aecf6219340f148c4019a4616b497a78657a6f363232346170176174d82a58250001711220689b68944b3a6218c5805b663557ef71e51f72757253d7caa745e0045c34cf3a6176d82a582500017112205cbe591b994b30ebab1fba98eeed1c8ec38f5539cd8ff5ccad2d6066bd9a8f4fa4616b4a6a686963716b676332346170166174d82a5825000171122008ef90a042740a2704cf7661737c0f2a617b3c42f8453303718ca793ee2438206176d82a58250001711220867b815f5eba606a9a0c1978c2a96e814392d1b14d15be9194e4051f6a9e2147a4616b52706f73742f336c376665787a6e677432326f61700e6174d82a58250001711220f4b863bcbfe27980f02288eeeb45ae58b4083c1926827e2815bc523ab889309f6176d82a58250001711220d86efe1c0f93f8a04db7e336d3d57557bea2411bb0abf744ef18afe3ff4aaab3a4616b581a67726170682e666f6c6c6f772f336b77767472636237727332346170096174d82a58250001711220e8b3d1b92fd9faab603dfd905ac0991d6e6b8663e66e7dbecc1ed289dd79a8396176d82a58250001711220808017e4fb3917a300958db284b978eb62fa35fa445b5e6eab212137f3426b40a4616b47696e6f717332346170181c6174d82a5825000171122024e82389757936fd12c1d3741ebde9aea376ddf842d5d6b5d9fa48e69ce0554d6176d82a58250001711220e3769648c8205b8455e00bee4b7572e4ff92406f271d73ab8e101a4cb7524780a4616b47706b64636332346170181c6174d82a58250001711220f333dcd40a9195dedee3014aef64c76be9eeccf6ee419e891b1a2e13256286566176d82a58250001711220e71cb47506907a81d7a80d52bc117db1e077d4aa698f564db9fa747cee0215b3a4616b47736377623232346170181c6174d82a58250001711220910498efc865b41baa1b39b3001dd81f5552663a7bc0f22847b0a8ce90d51b106176d82a582500017112202fd0be4a7f0bf991b4e76b25ccc0c08b04a1643d205862054752c5b726c9f9dda4616b47797872727332346170181c6174d82a5825000171122025a005ff217b66a70fc32d473fbb5ed7213f172e74c38982cc964e3d504cda686176d82a582500017112206e8e4b3e410d0f6950bd12a6a2df3a969ac595942cd21ea7bd20a2c1f4ce8fc6a4616b487361346a346b32346170181b6174d82a5825000171122071ef0339b2effbb272173feaca40d8ba7f7d424bdbec7964d9b7a0ff18f7f62c6176d82a5825000171122088a7a7cbbde346911b14a8e8b4304013fdc67a9cda03077f7134edbbbf614e08616cd82a5825000171122046ec1d42dc9317f90ac865a065c8053e9d656d475831bb7bb3640a992b8a95f0"
29+
),
30+
bytes(
31+
hex"a2616586a4616b58206170702e62736b792e666565642e706f73742f336c61793263706777353232766170006174f66176d82a58250001711220f12c9d56de3c2455a4588a818489b7b29125dcbf8312eee31d49082092ec80c2a4616b496475336d67616332766170176174f66176d82a582500017112206d51f125727763752e073d9301892fbddaa4cc6090d5fff9af7d49106b92d457a4616b547265706f73742f336b777736773779706173323461700e6174f66176d82a58250001711220ba7e5a8635be6208ea13c2ce09f81ab27feb6690740342a994117ad11d13f553a4616b4a793276667663666b3234617018186174d82a58250001711220bd95f96f2f1ae89f33cd79eec6ce8f7a036cda26c476f779bd602ce84219196e6176d82a58250001711220d5c48e2b88b3f26c98ffddb7d5c9d4f8e65aaa8a33c2cb43f666706f49bfdfb3a4616b4b78373678333479343232346170176174d82a58250001711220aed62b3da09961d039f3e14c1cf3648a44fb77a94653224d0045fe07d1f3052c6176d82a58250001711220659d834ba9a882e5af0a8e5aceb5573f1a139e5e0f14c809f3206f833c80eca8a4616b581a67726170682e666f6c6c6f772f336b7776746a773564703232346170096174d82a58250001711220793ff8bce08a2771b092f6e37b8ca895741e8e6726558a0325e380390a74259a6176d82a58250001711220834ebbe3926bd86293e298a8c86ba65cd569431403810336626268290cad43f2616cf6"
32+
),
33+
bytes(
34+
hex"a2616585a4616b58236170702e62736b792e67726170682e666f6c6c6f772f336b77767534737665647332346170006174d82a58250001711220b000383f1466f65b0a02da763f46cf0e4510d832f6c609a9df56db73b81259376176d82a582500017112205cd7382608fb47afda979840cf0024b3d2d2e9e43448713909e998b6a1849490a4616b486679656a776332346170181b6174d82a58250001711220b295211bc0bfc8a6c8404f4877e96c37b25272c85e4942a29b178d26803f13996176d82a5825000171122017428f68c9c19f59b08b4b2d71ce96e04cdaf6139b94baf0a2c5ee51aa74493fa4616b486d77686f6e3232346170181b6174d82a58250001711220752be9d63155323fc5ce8753bdb5832fc7f5ad762c4e37944a6de84bbb9516876176d82a582500017112200fe8a27c597fcc6059888660b321e473bdaa94b45d0a702f3bd05e013ff17564a4616b486e337667376332346170181b6174d82a58250001711220ff7f6bd81b38a383101aec250c290ec6cd33555baf1e644f4b6d9b60a2e1fb856176d82a58250001711220a9f192fea504ecf8ae900d2a4f9f37551865132ae50bf680ac1687636afee7e1a4616b486f797875373232346170181b6174d82a582500017112204afcab072750efa8755714ca8477b35e871b71856a329c9973c4b94b7a4c98986176d82a58250001711220c46c805c774dcd3eaf4f90cef5e63f1f2a53f9c6bdb14b7397e736678b54dc97616cd82a582500017112206e7335ed248edae3ed49d47b88a5fcad2985e15f416f8ae23a49dfc1231aeb91"
35+
)
36+
];
2437
TreeCbor.Tree private tree;
2538

2639
function setUp() public {
40+
/*
2741
nodeCbors = new bytes[](4);
2842
nodeCbors[0] =
2943
hex"a2616584a4616b58236170702e62736b792e67726170682e666f6c6c6f772f336b77767473726366736332346170006174d82a58250001711220232061c4165ce246d7f0b997b4a4212a0355faadf93fdecd64fca89db1d7bd9e6176d82a58250001711220181c3cddd15732e2a37c4455038c71ba75c1d5ca1850f78086d7bf29b490f7cba4616b487470346b797332346170181b6174d82a5825000171122096273e2ef4796b720c8e9f12292dfde8ce593a898ddd3c4c8d6d94c292736d1b6176d82a58250001711220783771b7cd8110221784049f5a1aba5ca85f660433233adb67f2045f1c05af72a4616b47773332356332346170181c6174d82a58250001711220f597936ae0b3636bcd64599dce397d33bcd1d0983af996b5ed02bdad5a6234156176d82a5825000171122009a988e6d9558a6e503e6f3194693953308be2fcbbb8831147b062b308cb291aa4616b497533366f62716332346170181a6174d82a58250001711220d5aa58f18245f4332affc4ce8fad050370013160f764027ea5897184caeb62446176d82a582500017112208e3047b78dad736d03697eedf8f49570c614c4e49cb89d86bd85d8351436e15d616cd82a58250001711220876175f10e6458ab735dbacf697d9caacec33486bc4a633be553fd43531012f5";
@@ -33,6 +47,7 @@ contract TreeTest is Test {
3347
hex"a2616586a4616b58206170702e62736b792e666565642e706f73742f336c61793263706777353232766170006174f66176d82a58250001711220f12c9d56de3c2455a4588a818489b7b29125dcbf8312eee31d49082092ec80c2a4616b496475336d67616332766170176174f66176d82a582500017112206d51f125727763752e073d9301892fbddaa4cc6090d5fff9af7d49106b92d457a4616b547265706f73742f336b777736773779706173323461700e6174f66176d82a58250001711220ba7e5a8635be6208ea13c2ce09f81ab27feb6690740342a994117ad11d13f553a4616b4a793276667663666b3234617018186174d82a58250001711220bd95f96f2f1ae89f33cd79eec6ce8f7a036cda26c476f779bd602ce84219196e6176d82a58250001711220d5c48e2b88b3f26c98ffddb7d5c9d4f8e65aaa8a33c2cb43f666706f49bfdfb3a4616b4b78373678333479343232346170176174d82a58250001711220aed62b3da09961d039f3e14c1cf3648a44fb77a94653224d0045fe07d1f3052c6176d82a58250001711220659d834ba9a882e5af0a8e5aceb5573f1a139e5e0f14c809f3206f833c80eca8a4616b581a67726170682e666f6c6c6f772f336b7776746a773564703232346170096174d82a58250001711220793ff8bce08a2771b092f6e37b8ca895741e8e6726558a0325e380390a74259a6176d82a58250001711220834ebbe3926bd86293e298a8c86ba65cd569431403810336626268290cad43f2616cf6";
3448
nodeCbors[3] =
3549
hex"a2616585a4616b58236170702e62736b792e67726170682e666f6c6c6f772f336b77767534737665647332346170006174d82a58250001711220b000383f1466f65b0a02da763f46cf0e4510d832f6c609a9df56db73b81259376176d82a582500017112205cd7382608fb47afda979840cf0024b3d2d2e9e43448713909e998b6a1849490a4616b486679656a776332346170181b6174d82a58250001711220b295211bc0bfc8a6c8404f4877e96c37b25272c85e4942a29b178d26803f13996176d82a5825000171122017428f68c9c19f59b08b4b2d71ce96e04cdaf6139b94baf0a2c5ee51aa74493fa4616b486d77686f6e3232346170181b6174d82a58250001711220752be9d63155323fc5ce8753bdb5832fc7f5ad762c4e37944a6de84bbb9516876176d82a582500017112200fe8a27c597fcc6059888660b321e473bdaa94b45d0a702f3bd05e013ff17564a4616b486e337667376332346170181b6174d82a58250001711220ff7f6bd81b38a383101aec250c290ec6cd33555baf1e644f4b6d9b60a2e1fb856176d82a58250001711220a9f192fea504ecf8ae900d2a4f9f37551865132ae50bf680ac1687636afee7e1a4616b486f797875373232346170181b6174d82a582500017112204afcab072750efa8755714ca8477b35e871b71856a329c9973c4b94b7a4c98986176d82a58250001711220c46c805c774dcd3eaf4f90cef5e63f1f2a53f9c6bdb14b7397e736678b54dc97616cd82a582500017112206e7335ed248edae3ed49d47b88a5fcad2985e15f416f8ae23a49dfc1231aeb91";
50+
*/
3651

3752
uint byteIdx;
3853
(rootCommit, byteIdx) = CommitCbor.readCommit(TreeTest.rootCborWithoutSig, 0);

0 commit comments

Comments
 (0)