]> git.ardis.lu - 4-byte-gen/commitdiff
Update name calculation logic to make sense
authorArdis Lu <ardisglu@gmail.com>
Sat, 18 Mar 2023 06:08:55 +0000 (23:08 -0700)
committerArdis Lu <ardisglu@gmail.com>
Sat, 18 Mar 2023 06:08:55 +0000 (23:08 -0700)
index.html

index 286b8ba5d2e38f292e5156865fe28b7e6eadb86d..6cf47405582094f0f2d1a8fb77e88b02f16866d7 100644 (file)
       return { name, parametersTypes };
     }
 
+    function calculateOptimizedName(name, parametersTypes, minimum) {
+      let counter = 0;
+      function generate(name, parametersTypes) {
+        const functionName = `${name}_${counter.toString(36)}(${parametersTypes})`;
+        counter++;
+
+        const hash = validate(functionName);
+        if (!hash) {
+          return generate(name, parametersTypes);
+        }
+        else {
+          return { functionName, hash };
+        }
+      }
+
+      function validate(functionName) {
+        const byteArray = keccak256(encoder.encode(functionName)).slice(0, 4);
+        for (let i = 0; i < minimum; i++) {
+          if (byteArray[i] === 0) {
+            if (i + 1 === minimum) {
+              const hash = `0x${[...byteArray].map(b => b.toString(16).padStart(2, '0')).join('')}`;
+              return hash;
+            }
+          }
+          else {
+            return false;
+          }
+        }
+      }
+
+      return generate(name, parametersTypes);
+    }
+
     document.querySelector('form').addEventListener('submit', e => {
       e.preventDefault();
 
       const fns = data.get('functions').split('\n');
       const minimum = parseInt(data.get('minimum'));
 
-      // This is really dumb and is for a quick proof of concept only.
-      (function () {
-        for (const fn of fns) {
-          const { name, parametersTypes } = splitFunction(fn);
-          for (const a of validChars) {
-            for (const b of validChars) {
-              for (const c of validChars) {
-                for (const d of validChars) {
-                  for (const e of validChars) {
-                    const fn = `${name}_${a}${b}${c}${d}${e}(${parametersTypes})`;
-                    const byteArray = keccak256(encoder.encode(fn)).slice(0, 4);
-                    for (let i = 0; i < minimum; i++) {
-                      if (byteArray[i] === 0) {
-                        if (i + 1 === minimum) {
-                          const hash = `0x${[...byteArray].map(b => b.toString(16).padStart(2, '0')).join('')}`;
-                          console.log({ fn, hash });
-                          return;
-                        }
-                      }
-                      else {
-                        break;
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      })();
+      for (const fn of fns) {
+        const { name, parametersTypes } = splitFunction(fn);
+        const { functionName, hash } = calculateOptimizedName(name, parametersTypes, minimum);
+        console.log(functionName, hash);
+      }
     })
   </script>
 
This page took 0.043476 seconds and 4 git commands to generate.