hopeless:
Scanning 23,298,085,122,481 Electrum v1 seed combinations using 8 cores...
[5.0s] Checked: 5,108,500 | Speed: 1,021,699/s | Progress: 0.000022%
It does not look like your code is actually doing its job. It does not even try to search for the address, this is why the speed is for doing basically nothing.
you did not even try.
import time
import itertools
from multiprocessing import Pool, cpu_count
import hashlib, struct, base58
from ecdsa import SigningKey, SECP256k1
# === Configuration ===
TARGET_ADDRESS = "1ATUAMkg2y9mFB2fEJCmovt53bsgaiG5Ug"
# breathe black tower truth food liberty moon mask subject proof vote real
position_words = {
1: ["food","this", "subject", "breathe", "black", "order", "vote"],
2: ["food","this", "subject", "real", "black", "order", "vote"],
3: ["food","this", "subject", "breathe", "tower", "order", "vote"],
4: ["truth"],
5: ["food","this", "subject", "real", "black", "order", "vote"],
6: ["liberty"],
7: ["moon"],
8: ["food","this", "subject", "mask", "black", "order", "vote"],
9: ["food","this", "subject", "real", "black", "order", "vote"],
10: ["food","this", "subject", "real", "black", "order", "proof"],
11: ["food","this", "subject", "real", "black", "order", "vote"],
12: ["food","this", "subject", "real", "black", "order", "vote"]
}
REPORT_INTERVAL = 5 # seconds
# === Private key to P2PKH address ===
def private_to_address(priv):
sk = SigningKey.from_string(priv, curve=SECP256k1)
pub = b'\x04' + sk.verifying_key.to_string()
sha = hashlib.sha256(pub).digest()
ripe = hashlib.new('ripemd160', sha).digest()
prefixed = b'\x00' + ripe
checksum = hashlib.sha256(hashlib.sha256(prefixed).digest()).digest()[:4]
return base58.b58encode(prefixed + checksum).decode()
# === Electrum v1 seed to address ===
def electrum_seed_to_addr(seed_words):
phrase = ' '.join(seed_words)
seed = hashlib.sha512(phrase.encode('utf-8')).digest()
priv_key = seed[:32]
return private_to_address(priv_key)
# === Combination checker ===
def check_combination(combo):
if len(set(combo)) < len(combo): # enforce unique words
return None
try:
address = electrum_seed_to_addr(combo)
if address == TARGET_ADDRESS:
return combo
except:
return None
return None
# === Parallel combination scanner ===
def scan_combinations_parallel():
word_lists = [position_words[i + 1] for i in range(12)]
total = 1
for lst in word_lists:
total *= len(lst)
print(f"Scanning {total:,} Electrum v1 seed combinations using {cpu_count()} cores...")
start = time.time()
last_report = start
pool = Pool(cpu_count())
generator = itertools.product(*word_lists)
for i, result in enumerate(pool.imap_unordered(check_combination, generator, chunksize=1000)):
now = time.time()
if now - last_report >= REPORT_INTERVAL:
elapsed = now - start
speed = i / elapsed
progress = (i / total) * 100
print(f"[{elapsed:.1f}s] Checked: {i:,} | Speed: {speed:,.0f}/s | Progress: {progress:.6f}%")
last_report = now
if result:
print("\nSUCCESS! Valid Electrum seed found:")
print(" ".join(result))
print(f"Address: {TARGET_ADDRESS}")
pool.terminate()
return
print("\nDone. No matching Electrum-style mnemonic found.")
# === Main ===
if __name__ == "__main__":
scan_combinations_parallel()
Scanning 40,353,607 Electrum v1 seed combinations using 8 cores...
[5.0s] Checked: 6,381,000 | Speed: 1,276,035/s | Progress: 15.812713%
[10.0s] Checked: 12,892,272 | Speed: 1,289,032/s | Progress: 31.948252%
[15.0s] Checked: 18,649,000 | Speed: 1,242,677/s | Progress: 46.213961%
SUCCESS! Valid Electrum seed found:
breathe black tower truth food liberty moon mask subject proof vote real
Address: 1ATUAMkg2y9mFB2fEJCmovt53bsgaiG5Ug
actual range goes very small when you think list is shorter after each position,
like lottery balls in certain order.
count invalid seed or not, i dont care when it is impossible
just with 12 words 479001600, 24 is 620448401733239439360000