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:
parent
0a6bf8d8d5
commit
7a2de3edff
|
@ -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"}});
|
||||||
|
|
|
@ -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
2
ipfs-add.sh
Normal file → Executable 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")")"
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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")")"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user