Turns out I was lucky with my vanity text, not all characters are possible for the last character of the IPFS hash

This commit is contained in:
Suzanne Soy 2023-11-16 23:48:06 +00:00
parent 0a6bf8d8d5
commit 7a2de3edff
5 changed files with 54 additions and 18 deletions

View File

@ -1 +1 @@
jsonp_ipfs_directory_hashes({"vanity_text":"soy","vanity_number":4686,"tree":{"Links":[{"Name":".gitignore","Hash":"QmW9iMXzmPqLSnzL4p6DKsvsL3nC1xKS3teRB4SRdukfrz","Size":16},{"Name":".ipfsignore","Hash":"QmWMeSQQxuSYMddVwJGrnn12zrX1TTW7ueZbhZdaZ64Wr1","Size":14},{"Name":"directory_hashes.js","Hash":"","Size":0},{"Name":"find_vanity.js","Hash":"QmZVGHM7i74w275noxHhuLRWmJFTVjzTeXUdzamYaLTXAQ","Size":354},{"Name":"flake.lock","Hash":"QmV1UZtzknzjmyaJyvR7NHFCJ15FbFbS9bHBxTfyRMuNqg","Size":519},{"Name":"flake.nix","Hash":"QmZhzTNT98Z5z7MSJMUDo4A3AMtRFVEBx4paH5GJKharEL","Size":856},{"Name":"index.html","Hash":"QmZaXPFa47VxJNsNcaejw7R9GNPGCF5FjkSCDrvrmBAeP9","Size":553},{"Name":"ipfs-add.sh","Hash":"QmTptVSLh5gqRqUcHrKcv2fdVgY2UmPbwftwQHzSDeqACF","Size":173},{"Name":"lzw.js","Hash":"QmP2CsTDmyR9h5UrXJgXGswyMhiSHBZkQKLszdgh9Eb8Rk","Size":2034},{"Name":"micro_ipfs.js","Hash":"QmcMJvWL45dHLwaL36AeM2NG6xrzudtmTN7mCpt3cuKnnX","Size":15515},{"Name":"quine.js","Hash":"QmcHWTtgH53KkaSsWEvTxKDuuTNxipC3iJyebS3BBuF21B","Size":3099},{"Name":"result","Hash":"QmeG1ZJKGVenSC1VBx9D1nzv1bma7zHMHGMp6nUL5izs9i","Size":73},{"Name":"robots.txt","Hash":"QmSqhdBa5ryzgjN41hL8rM98hjunXashEuLRW8PnKLH5yq","Size":49},{"Name":"sha256.js","Hash":"QmRhgx5Fq4JqfCgsPcMxNSYwt8M9WRBkec9omPWzJ7gdwL","Size":8553},{"Name":"sitemap.txt","Hash":"QmWsbCRCFoLa7AKdHmx8Mt6nV1jxpqEjdbAxZp1pH7tZQr","Size":548},{"Name":"update_directory_hashes.sh","Hash":"QmbgPpzKC6vNxsnKUvZSjCtUmTofwRxJKdKQ6pJFpGWRgC","Size":1695},{"Name":"update_quine.sh","Hash":"QmVZY9bqdiopA4BaxNRwJr5AWLbE8ikb19dAJoKCNENNez","Size":3029}],"Data":"\b\u0001"}}); jsonp_ipfs_directory_hashes({"vanity_text":"soy","vanity_number":11763,"tree":{"Links":[{"Name":".gitignore","Hash":"QmW9iMXzmPqLSnzL4p6DKsvsL3nC1xKS3teRB4SRdukfrz","Size":16},{"Name":".ipfsignore","Hash":"QmWMeSQQxuSYMddVwJGrnn12zrX1TTW7ueZbhZdaZ64Wr1","Size":14},{"Name":"directory_hashes.js","Hash":"","Size":0},{"Name":"find_vanity.js","Hash":"QmVrVdE8TP4Di1h39LTtDCmDSFRgy7FQnZWrSBPdDHy8Hx","Size":358},{"Name":"flake.lock","Hash":"QmV1UZtzknzjmyaJyvR7NHFCJ15FbFbS9bHBxTfyRMuNqg","Size":519},{"Name":"flake.nix","Hash":"QmZhzTNT98Z5z7MSJMUDo4A3AMtRFVEBx4paH5GJKharEL","Size":856},{"Name":"index.html","Hash":"QmZaXPFa47VxJNsNcaejw7R9GNPGCF5FjkSCDrvrmBAeP9","Size":553},{"Name":"ipfs-add.sh","Hash":"QmPvQrob4PzEJXwxEVhBHEXjnESsMR2f7LJ1nbfAoo8A6G","Size":169},{"Name":"lzw.js","Hash":"QmP2CsTDmyR9h5UrXJgXGswyMhiSHBZkQKLszdgh9Eb8Rk","Size":2034},{"Name":"micro_ipfs.js","Hash":"QmeWPj4vzN66eCUwQkjjzTgfciBLBzNjQQdvqEBL8x1pmh","Size":16738},{"Name":"quine.js","Hash":"QmcHWTtgH53KkaSsWEvTxKDuuTNxipC3iJyebS3BBuF21B","Size":3099},{"Name":"result","Hash":"QmYaABXhasB9Vyn8Sk3KkixsKp4yvXxaCwmXGxFCHGCwwr","Size":73},{"Name":"robots.txt","Hash":"QmSqhdBa5ryzgjN41hL8rM98hjunXashEuLRW8PnKLH5yq","Size":49},{"Name":"sha256.js","Hash":"QmRhgx5Fq4JqfCgsPcMxNSYwt8M9WRBkec9omPWzJ7gdwL","Size":8553},{"Name":"sitemap.txt","Hash":"QmWsbCRCFoLa7AKdHmx8Mt6nV1jxpqEjdbAxZp1pH7tZQr","Size":548},{"Name":"update_directory_hashes.sh","Hash":"QmQLSE6rJCSeKfgM7U3hKanRMfdcaUWSxwXd1wa39iS6qC","Size":1780},{"Name":"update_quine.sh","Hash":"QmVZY9bqdiopA4BaxNRwJr5AWLbE8ikb19dAJoKCNENNez","Size":3029}],"Data":"\b\u0001"}});

View File

@ -2,4 +2,4 @@ const fs = require("fs");
const micro_ipfs = require('./micro_ipfs.js'); const micro_ipfs = require('./micro_ipfs.js');
const jsonp = fs.readFileSync(process.argv[2], 'utf-8'); const jsonp = fs.readFileSync(process.argv[2], 'utf-8');
const directory_hashes = JSON.parse(jsonp.substring('jsonp_ipfs_directory_hashes('.length, jsonp.length - ');\n'.length)); const directory_hashes = JSON.parse(jsonp.substring('jsonp_ipfs_directory_hashes('.length, jsonp.length - ');\n'.length));
console.log(micro_ipfs.ipfs_self_hash.find_vanity_node(null, process.argv[3], 0, directory_hashes)); console.log(micro_ipfs.ipfs_self_hash.find_vanity_node(process.argv[3], 0, directory_hashes));

2
ipfs-add.sh Normal file → Executable file
View File

@ -1,3 +1,3 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euET -o pipefail set -euET -o pipefail
ipfs cid base32 "$(ipfs add --ignore-rules-path result/www/.ipfsignore --pin=false --hidden -Qr "$(dirname "$0")/www")" ipfs cid base32 "$(ipfs add --ignore-rules-path result/www/.ipfsignore --pin=false --hidden -Qr "$(dirname "$0")")"

View File

@ -336,16 +336,31 @@ var ipfs_self_hash = (function() {
var expected_vanity_attempt = 32*32*32; var expected_vanity_attempt = 32*32*32;
var max_vanity_attempt = expected_vanity_attempt*10; var max_vanity_attempt = expected_vanity_attempt*10;
function find_vanity_node(old_root, vanity_text, vanity_attempt, ipfs_directory_hashes) { function find_vanity_node(vanity_text, vanity_attempt, ipfs_directory_hashes) {
if ((! (typeof vanity_text == 'string' || vanity_text instanceof String)) || vanity_text.length != 3) {
throw 'find_vanity_node(vanity_text, ...) : expected a string of length 3';
}
var offset = 1;
switch (vanity_text[2]) {
case '4':
case 'a':
case 'e':
case 'i':
case 'm':
case 'q':
case 'u':
case 'y':
offset = 0;
}
while (true) { while (true) {
if (vanity_attempt > max_vanity_attempt) { if (vanity_attempt > max_vanity_attempt) {
// give up: // give up:
return null; throw 'Failed to brute-force a number that generates the desired vanity text.';
} else { } else {
var root = get_root_with_vanity(vanity_attempt, ipfs_directory_hashes); var root = get_root_with_vanity(vanity_attempt, ipfs_directory_hashes);
if (root.hash[root.hash.length-1] == vanity_text[2] && root.hash[root.hash.length-2] == vanity_text[1]) { if (root.hash[root.hash.length-1-offset] == vanity_text[2] && root.hash[root.hash.length-2-offset] == vanity_text[1]) {
console.error(vanity_attempt + ' (' + Math.floor(100*vanity_attempt/expected_vanity_attempt) + '%)'); console.error(vanity_attempt + ' (' + Math.floor(100*vanity_attempt/expected_vanity_attempt) + '%)');
if (root.hash[root.hash.length-3] == vanity_text[0]) { if (root.hash[root.hash.length-3-offset] == vanity_text[0]) {
return vanity_attempt; return vanity_attempt;
} }
} }
@ -354,25 +369,44 @@ var ipfs_self_hash = (function() {
} }
}; };
function find_vanity_browser(old_root, vanity_text, vanity_attempt, callback, ipfs_directory_hashes) { function find_vanity_browser_(offset, old_root, vanity_text, vanity_attempt, callback, ipfs_directory_hashes) {
var root = get_root_with_vanity(vanity_attempt, ipfs_directory_hashes); var root = get_root_with_vanity(vanity_attempt, ipfs_directory_hashes);
if (vanity_attempt > max_vanity_attempt) { if (vanity_attempt > max_vanity_attempt) {
// give up: // give up:
root = get_root_with_vanity(ipfs_directory_hashes.vanity_number, ipfs_directory_hashes) root = get_root_with_vanity(ipfs_directory_hashes.vanity_number, ipfs_directory_hashes)
callback(root, 'timeout', false); callback(root, 'timeout', false);
} else { } else {
if (root.hash[root.hash.length-1] == vanity_text[2]) { if (root.hash[root.hash.length-1-offset] == vanity_text[2]) {
callback(old_root, '… ' + vanity_attempt + ' (' + Math.floor(100*vanity_attempt/expected_vanity_attempt) + '%)', false); callback(old_root, '… ' + vanity_attempt + ' (' + Math.floor(100*vanity_attempt/expected_vanity_attempt) + '%)', false);
if (root.hash[root.hash.length-2] == vanity_text[1] && root.hash[root.hash.length-3] == vanity_text[0]) { if (root.hash[root.hash.length-2-offset] == vanity_text[1] && root.hash[root.hash.length-3-offset] == vanity_text[0]) {
callback(root, vanity_attempt, true); callback(root, vanity_attempt, true);
} else { } else {
window.setTimeout(function() { find_vanity_browser(old_root, vanity_text, vanity_attempt + 1, callback, ipfs_directory_hashes); }, 0); window.setTimeout(function() { find_vanity_browser_(offset, old_root, vanity_text, vanity_attempt + 1, callback, ipfs_directory_hashes); }, 0);
} }
} else { } else {
window.setTimeout(function() { find_vanity_browser(old_root, vanity_text, vanity_attempt + 1, callback, ipfs_directory_hashes); }, 0); window.setTimeout(function() { find_vanity_browser_(offset, old_root, vanity_text, vanity_attempt + 1, callback, ipfs_directory_hashes); }, 0);
} }
} }
}; };
var find_vanity_browser = function(old_root, vanity_text, vanity_attempt, callback, ipfs_directory_hashes) {
if ((! (typeof vanity_text == 'string' || vanity_text instanceof String)) || vanity_text.length != 3) {
throw 'find_vanity_node(vanity_text, ...) : expected a string of length 3';
}
var offset = 1;
switch (vanity_text[2]) {
case '4':
case 'a':
case 'e':
case 'i':
case 'm':
case 'q':
case 'u':
case 'y':
offset = 0;
}
return find_vanity_browser(offset, old_root, vanity_text, vanity_attempt, callback, ipfs_directory_hashes)
};
var debug = function(show_link) { var debug = function(show_link) {
var root = get_root_with_vanity(ipfs_directory_hashes.vanity_number, ipfs_directory_hashes); var root = get_root_with_vanity(ipfs_directory_hashes.vanity_number, ipfs_directory_hashes);

View File

@ -2,14 +2,14 @@
set -euET -o pipefail set -euET -o pipefail
vanity_text="${1:-xyz}" directory="${1:-.}"
directory="${2:-.}" vanity_text="${2:-}"
temp_file="$(mktemp)" temp_file="$(mktemp)"
hexdump="$(mktemp)" hexdump="$(mktemp)"
if test -z "$vanity_text" -o "$vanity_text" = "-h" -o "$vanity_text" = "--help"; then if test -z "$vanity_text" -o "$vanity_text" = "-h" -o "$vanity_text" = "--help"; then
echo 'Usage: ./update-hashes.sh vanity-text [path/to/directory]' echo 'Usage: ./update-hashes.sh [path/to/directory] [vanity-text]'
echo 'The given directory should contain a file named meta.js, which will be overwritten.' echo 'The given directory should contain a file named meta.js, which will be overwritten.'
echo 'The vanity text should be three letters, which will appear at the end of your website'\''s hash' echo 'The vanity text should be three letters, which will appear at the end of your website'\''s hash'
exit 1 exit 1
@ -33,9 +33,11 @@ write_directory_hashes() {
} }
write_directory_hashes "0" write_directory_hashes "0"
vanity_number="$(node "$(dirname "$0")/find_vanity.js" "$directory/directory_hashes.js" "$vanity_text")" if test -n "$vanity_text"; then
printf 'Found vanity number: %s\n' $vanity_number >&2 vanity_number="$(node "$(dirname "$0")/find_vanity.js" "$directory/directory_hashes.js" "$vanity_text")"
write_directory_hashes "$vanity_number" printf 'Found vanity number: %s\n' $vanity_number >&2
write_directory_hashes "$vanity_number"
fi
echo "The hash given by the page should be:" >&2 echo "The hash given by the page should be:" >&2
printf 'ipfs://%s\n' "$(ipfs cid base32 "$(ipfs add --ignore-rules-path "$directory/.ipfsignore" --hidden -Qr "$directory")")" printf 'ipfs://%s\n' "$(ipfs cid base32 "$(ipfs add --ignore-rules-path "$directory/.ipfsignore" --hidden -Qr "$directory")")"