Bram24732
Member

Offline
Activity: 112
Merit: 14
|
 |
April 21, 2025, 06:06:20 AM |
|
-- Sim results
If you sum the number of checks over 10k simulations you get this : === FINAL RESULTS === Sequential: 495816995 Prefix: 496059807
|
|
|
|
WanderingPhilospher
Sr. Member
  
Offline
Activity: 1372
Merit: 268
Shooters Shoot...
|
 |
April 21, 2025, 06:06:25 AM |
|
one more data point added: === Configuration === Total numbers: 1,048,576 Block size: 4,096 Prefix: 3 characters (16^3 combinations) Simulations: 1000
=== FINAL RESULTS === Wins: Sequential: 375 (Average Win Margin: 43.34%) Prefix: 624 (Average Win Margin: 36.66%) Ties: 1
Total Checks: Sequential: 520,179,738 Prefix: 527,377,365
=== Configuration === Total numbers: 1,048,576 Block size: 4,096 Prefix: 4 characters (16^4 combinations) Simulations: 1000
=== FINAL RESULTS === Wins: Sequential: 25 (Average Win Margin: 37.39%) Prefix: 907 (Average Win Margin: 3.35%) Ties: 68
Total Checks: Sequential: 517,804,613 Prefix: 511,880,745
I dunno, maybe my code is messed up lol. import hashlib import random import multiprocessing as MP
TOTAL_SIZE = 2**20 RANGE_SIZE = 2**12 PREFIX_LENGTH = 4 SIMULATIONS = 1000
def generate_h160(data): return hashlib.new('ripemd160', str(data).encode()).hexdigest()
def shuffled_range(n): arr = list(range(n + 1)) random.shuffle(arr) return arr
def sequential_search(size, block, target_hash, order): checks = 0 for idx in order: start = idx * block end = start + block for num in range(start, end): checks += 1 if generate_h160(num) == target_hash: return {'checks': checks, 'found': True} return {'checks': checks, 'found': False}
def precise_search(size, block, prefix_len, target_hash, order): prefix_hash = target_hash[:prefix_len] checks = 0 ranges = [] for idx in order: start = idx * block end = start + block found_prefix = False for num in range(start, end): checks += 1 h = generate_h160(num) if h == target_hash: return {'checks': checks, 'found': True} if not found_prefix and h.startswith(prefix_hash): found_prefix = True ranges.append({'start': num + 1, 'end': end}) break for r in ranges: for num in range(r['end'] - 1, r['start'] - 1, -1): checks += 1 if generate_h160(num) == target_hash: return {'checks': checks, 'found': True} return {'checks': checks, 'found': False}
def single_simulation(_): blocks = TOTAL_SIZE // RANGE_SIZE order = shuffled_range(blocks - 1) target_num = random.randint(0, TOTAL_SIZE - 1) target_hash = generate_h160(target_num)
seq_result = sequential_search(TOTAL_SIZE, RANGE_SIZE, target_hash, order) pre_result = precise_search(TOTAL_SIZE, RANGE_SIZE, PREFIX_LENGTH, target_hash, order)
return seq_result['checks'], pre_result['checks']
def compare_methods_parallel(): print(f""" === Configuration === Total numbers: {TOTAL_SIZE:,} Block size: {RANGE_SIZE:,} Prefix: {PREFIX_LENGTH} characters (16^{PREFIX_LENGTH} combinations) Simulations: {SIMULATIONS} """)
cpu_count = max(MP.cpu_count() - 2, 1) print(f"Using {cpu_count} worker processes...\n")
with MP.Pool(cpu_count) as pool: results = pool.map(single_simulation, range(SIMULATIONS))
sequential_wins = 0 precise_wins = 0 ties = 0
sequential_win_percentages = [] precise_win_percentages = []
total_seq_checks = 0 total_pre_checks = 0
for i, (seq_checks, pre_checks) in enumerate(results): total_seq_checks += seq_checks total_pre_checks += pre_checks
if seq_checks < pre_checks: sequential_wins += 1 win_percent = ((pre_checks - seq_checks) / pre_checks) * 100 sequential_win_percentages.append(win_percent) elif seq_checks > pre_checks: precise_wins += 1 win_percent = ((seq_checks - pre_checks) / seq_checks) * 100 precise_win_percentages.append(win_percent) else: ties += 1
print(f"Simulation {i + 1}: Sequential = {seq_checks} | Prefix = {pre_checks}")
avg_seq_win_pct = sum(sequential_win_percentages) / len(sequential_win_percentages) if sequential_win_percentages else 0 avg_pre_win_pct = sum(precise_win_percentages) / len(precise_win_percentages) if precise_win_percentages else 0
print(f""" === FINAL RESULTS === Wins: Sequential: {sequential_wins} (Average Win Margin: {avg_seq_win_pct:.2f}%) Prefix: {precise_wins} (Average Win Margin: {avg_pre_win_pct:.2f}%) Ties: {ties}
Total Checks: Sequential: {total_seq_checks:,} Prefix: {total_pre_checks:,} """)
if __name__ == "__main__": MP.freeze_support() # Important for Windows compare_methods_parallel()
|
|
|
|
Akito S. M. Hosana
Jr. Member
Offline
Activity: 350
Merit: 8
|
 |
April 21, 2025, 06:13:07 AM |
|
No. In my case, I only verify whether the WIF (Wallet Import Format) is correct. The output displays only checksum-validated WIFs. The second script computes the corresponding public key and address.
How many verified WIFs do you have in the output generated by the GPU? 
|
|
|
|
nomachine
|
 |
April 21, 2025, 06:19:27 AM |
|
No. In my case, I only verify whether the WIF (Wallet Import Format) is correct. The output displays only checksum-validated WIFs. The second script computes the corresponding public key and address.
How many verified WIFs do you have in the output generated by the GPU?  It depends on how many characters are missing in the WIF and their exact positions. For example, if 10 characters are missing at the beginning, the recovery speed would be approximately 2,000 valid WIFs per minute.
|
BTC: bc1qdwnxr7s08xwelpjy3cc52rrxg63xsmagv50fa8
|
|
|
Bram24732
Member

Offline
Activity: 112
Merit: 14
|
 |
April 21, 2025, 06:22:41 AM |
|
one more data point added: === Configuration === Total numbers: 1,048,576 Block size: 4,096 Prefix: 3 characters (16^3 combinations) Simulations: 1000
=== FINAL RESULTS === Wins: Sequential: 375 (Average Win Margin: 43.34%) Prefix: 624 (Average Win Margin: 36.66%) Ties: 1
Total Checks: Sequential: 520,179,738 Prefix: 527,377,365
=== Configuration === Total numbers: 1,048,576 Block size: 4,096 Prefix: 4 characters (16^4 combinations) Simulations: 1000
=== FINAL RESULTS === Wins: Sequential: 25 (Average Win Margin: 37.39%) Prefix: 907 (Average Win Margin: 3.35%) Ties: 68
Total Checks: Sequential: 517,804,613 Prefix: 511,880,745
I dunno, maybe my code is messed up lol. import hashlib import random import multiprocessing as MP
TOTAL_SIZE = 2**20 RANGE_SIZE = 2**12 PREFIX_LENGTH = 4 SIMULATIONS = 1000
def generate_h160(data): return hashlib.new('ripemd160', str(data).encode()).hexdigest()
def shuffled_range(n): arr = list(range(n + 1)) random.shuffle(arr) return arr
def sequential_search(size, block, target_hash, order): checks = 0 for idx in order: start = idx * block end = start + block for num in range(start, end): checks += 1 if generate_h160(num) == target_hash: return {'checks': checks, 'found': True} return {'checks': checks, 'found': False}
def precise_search(size, block, prefix_len, target_hash, order): prefix_hash = target_hash[:prefix_len] checks = 0 ranges = [] for idx in order: start = idx * block end = start + block found_prefix = False for num in range(start, end): checks += 1 h = generate_h160(num) if h == target_hash: return {'checks': checks, 'found': True} if not found_prefix and h.startswith(prefix_hash): found_prefix = True ranges.append({'start': num + 1, 'end': end}) break for r in ranges: for num in range(r['end'] - 1, r['start'] - 1, -1): checks += 1 if generate_h160(num) == target_hash: return {'checks': checks, 'found': True} return {'checks': checks, 'found': False}
def single_simulation(_): blocks = TOTAL_SIZE // RANGE_SIZE order = shuffled_range(blocks - 1) target_num = random.randint(0, TOTAL_SIZE - 1) target_hash = generate_h160(target_num)
seq_result = sequential_search(TOTAL_SIZE, RANGE_SIZE, target_hash, order) pre_result = precise_search(TOTAL_SIZE, RANGE_SIZE, PREFIX_LENGTH, target_hash, order)
return seq_result['checks'], pre_result['checks']
def compare_methods_parallel(): print(f""" === Configuration === Total numbers: {TOTAL_SIZE:,} Block size: {RANGE_SIZE:,} Prefix: {PREFIX_LENGTH} characters (16^{PREFIX_LENGTH} combinations) Simulations: {SIMULATIONS} """)
cpu_count = max(MP.cpu_count() - 2, 1) print(f"Using {cpu_count} worker processes...\n")
with MP.Pool(cpu_count) as pool: results = pool.map(single_simulation, range(SIMULATIONS))
sequential_wins = 0 precise_wins = 0 ties = 0
sequential_win_percentages = [] precise_win_percentages = []
total_seq_checks = 0 total_pre_checks = 0
for i, (seq_checks, pre_checks) in enumerate(results): total_seq_checks += seq_checks total_pre_checks += pre_checks
if seq_checks < pre_checks: sequential_wins += 1 win_percent = ((pre_checks - seq_checks) / pre_checks) * 100 sequential_win_percentages.append(win_percent) elif seq_checks > pre_checks: precise_wins += 1 win_percent = ((seq_checks - pre_checks) / seq_checks) * 100 precise_win_percentages.append(win_percent) else: ties += 1
print(f"Simulation {i + 1}: Sequential = {seq_checks} | Prefix = {pre_checks}")
avg_seq_win_pct = sum(sequential_win_percentages) / len(sequential_win_percentages) if sequential_win_percentages else 0 avg_pre_win_pct = sum(precise_win_percentages) / len(precise_win_percentages) if precise_win_percentages else 0
print(f""" === FINAL RESULTS === Wins: Sequential: {sequential_wins} (Average Win Margin: {avg_seq_win_pct:.2f}%) Prefix: {precise_wins} (Average Win Margin: {avg_pre_win_pct:.2f}%) Ties: {ties}
Total Checks: Sequential: {total_seq_checks:,} Prefix: {total_pre_checks:,} """)
if __name__ == "__main__": MP.freeze_support() # Important for Windows compare_methods_parallel()
That looks ok, you have the same number of checks roughly with both methods, that's what I would expect
|
|
|
|
Akito S. M. Hosana
Jr. Member
Offline
Activity: 350
Merit: 8
|
 |
April 21, 2025, 06:31:41 AM |
|
No. In my case, I only verify whether the WIF (Wallet Import Format) is correct. The output displays only checksum-validated WIFs. The second script computes the corresponding public key and address.
How many verified WIFs do you have in the output generated by the GPU?  It depends on how many characters are missing in the WIF and their exact positions. For example, if 10 characters are missing at the beginning, the recovery speed would be approximately 2,000 valid WIFs per minute. So you need 30 - 50 GPUs to have 1000 valid WIfs/s ? 
|
|
|
|
Bram24732
Member

Offline
Activity: 112
Merit: 14
|
 |
April 21, 2025, 06:33:04 AM |
|
Thanks, there is still one flaw : By counting only "wins" you miss one very important piece of data : how fast was a method compared to the other on each simulation ? A win 5x faster does not have the same value as a win 1.2x faster. This can be changed by summing the number of checks made over all the simulations, like this : results = {"sequential": {"wins": 0, "checks": 0}, "precise": {"wins": 0, "checks": 0}, "ties": 0} ... results["sequential"]["checks"] += seq_result["checks"] results["precise"]["checks"] += pre_result["checks"] ..... Sequential: {results['sequential']['checks']} Prefix: {results['precise']['checks']}
Just as the script commonly handles it, it's fine, because the important thing here was to demonstrate that prefixes are more efficient in the majority of attempts. It does not include computational load, because that's unfair, as we omit the entire Bitcoin process, and besides, it's not the same to omit 1000 keys out of 5000 as to use a 16**12 setup to give an example... but the basic aspect has already been demonstrated, which was the probabilistic success rate. I think being first without taking into account how much faster you are is not reflecting the stastistical reality. But it's ok to disagree 
|
|
|
|
nomachine
|
 |
April 21, 2025, 06:41:06 AM |
|
So you need 30 - 50 GPUs to have 1000 valid WIfs/s ?  Yes, but you'll need much more if you want to solve it in a reasonable amount of time—though still less than what's required for Puzzle 69. 
|
BTC: bc1qdwnxr7s08xwelpjy3cc52rrxg63xsmagv50fa8
|
|
|
Akito S. M. Hosana
Jr. Member
Offline
Activity: 350
Merit: 8
|
 |
April 21, 2025, 06:57:57 AM |
|
So you need 30 - 50 GPUs to have 1000 valid WIfs/s ?  Yes, but you'll need much more if you want to solve it in a reasonable amount of time—though still less than what's required for Puzzle 69.  What will you do if you solve this? 
|
|
|
|
nomachine
|
 |
April 21, 2025, 07:02:01 AM |
|
So you need 30 - 50 GPUs to have 1000 valid WIfs/s ?  Yes, but you'll need much more if you want to solve it in a reasonable amount of time—though still less than what's required for Puzzle 69.  What will you do if you solve this?  Hahaha, take it easy... It’s not that simple... But... Every member in this topic will get 0.2 BTC—if they have a BTC address in their signature. Satisfied? 
|
BTC: bc1qdwnxr7s08xwelpjy3cc52rrxg63xsmagv50fa8
|
|
|
fantom06
Jr. Member
Offline
Activity: 49
Merit: 1
|
 |
April 21, 2025, 07:02:34 AM |
|
=== FINAL RESULTS === Wins: Sequential: 2105 Prefix: 2688 Ties: 207
|
|
|
|
Bram24732
Member

Offline
Activity: 112
Merit: 14
|
 |
April 21, 2025, 07:09:55 AM |
|
-- Sim results
If you sum the number of checks over 10k simulations you get this : === FINAL RESULTS === Sequential: 495816995 Prefix: 496059807 This is a bias since the prefix method wins most of the time, meaning it is the best choice. When the prefix method loses, it obviously generates more keys because it is assumed that the target was omitted. And the goal is to find your best option to win and not who loses worse. I think being first without taking into account how much faster you are is not reflecting the stastistical reality. But it's ok to disagree  The times when the prefix method wins, it traverses fewer keys than the sequential method; therefore, by common sense, it saves computational power. Statistically, prefixes are the best option most of the time. Similarly, the overall statistics are more or less equal when considering total traversals, both won and lost. However, prefixes still yield the highest success rate. There's no need to overcomplicate it. It not complicated. Nor is it a bias. Those are actual numbers out of your script. On average, both methods require the same number of steps to reach a solution.
|
|
|
|
Akito S. M. Hosana
Jr. Member
Offline
Activity: 350
Merit: 8
|
 |
April 21, 2025, 07:19:06 AM |
|
Hahaha, take it easy... It’s not that simple... But... Every member in this topic will get 0.2 BTC—if they have a BTC address in their signature. Satisfied?  I'm not a full member yet. 
|
|
|
|
fantom06
Jr. Member
Offline
Activity: 49
Merit: 1
|
 |
April 21, 2025, 07:28:15 AM |
|
-- Sim results
If you sum the number of checks over 10k simulations you get this : === FINAL RESULTS === Sequential: 495816995 Prefix: 496059807 This is a bias since the prefix method wins most of the time, meaning it is the best choice. When the prefix method loses, it obviously generates more keys because it is assumed that the target was omitted. And the goal is to find your best option to win and not who loses worse. I think being first without taking into account how much faster you are is not reflecting the stastistical reality. But it's ok to disagree  The times when the prefix method wins, it traverses fewer keys than the sequential method; therefore, by common sense, it saves computational power. Statistically, prefixes are the best option most of the time. Similarly, the overall statistics are more or less equal when considering total traversals, both won and lost. However, prefixes still yield the highest success rate. There's no need to overcomplicate it. Wins: Sequential: 39 (Average Win Margin: 55.95%) Prefix: 899 (Average Win Margin: 3.37%) Ties: 62 Total Checks: Sequential: 494,958,197 Prefix: 502,727,060
|
|
|
|
fantom06
Jr. Member
Offline
Activity: 49
Merit: 1
|
 |
April 21, 2025, 07:48:10 AM |
|
Simulation 10000: Sequential = 132246 | Prefix = 122826
=== FINAL RESULTS === Wins: Sequential: 321 (Average Win Margin: 48.81%) Prefix: 9033 (Average Win Margin: 3.21%) Ties: 646
Total Checks: Sequential: 5,216,987,277 Prefix: 5,224,672,888
|
|
|
|
White hat hacker
Newbie
Offline
Activity: 23
Merit: 0
|
 |
April 21, 2025, 07:48:41 AM |
|
Can you tell me the difference between the prefix method and the random method? At the end of the day, the code is still random—there’s no magic to it and it's not surprising..
It's better to use both random and sequencial.
|
|
|
|
Bram24732
Member

Offline
Activity: 112
Merit: 14
|
 |
April 21, 2025, 07:52:32 AM |
|
It not complicated. Nor is it a bias. Those are actual numbers out of your script. On average, both methods require the same number of steps to reach a solution.
Noo, If we take these metrics into account, it only means that, approximately within that key range, the prefix method achieved a higher success rate, which is highly significant. dividing keys(avg) by wins, you'd determine the average success rate. keys(avg)/wins = success_rate(avg) I'm not sure what's unclear. Over 10000 attempts, sequential method had to make 5,216,987,277 checks before finding 10000 solutions Over 10000 attempts, prefix method had to make 5,224,672,888 checks before finding 10000 solutions The average number of checks is similar for both methods ?
|
|
|
|
fantom06
Jr. Member
Offline
Activity: 49
Merit: 1
|
 |
April 21, 2025, 08:15:53 AM Last edit: April 21, 2025, 04:23:47 PM by mprep |
|
=== Configuration === Total numbers: 1,048,576 Block size: 4,096 Prefix: 4 characters (16^4 combinations) Simulations: 10000
=== FINAL RESULTS === Wins: Sequential: 343 (Average Win Margin: 51.00%) Prefix: 9054 (Average Win Margin: 3.23%) Ties: 603
Total Checks: Sequential: 5,283,346,262 Prefix: 5,306,416,800
=== Configuration === Total numbers: 2,097,152 Block size: 4,096 Prefix: 3 characters (16^3 combinations) Simulations: 10000
=== FINAL RESULTS === Wins: Sequential: 3736 (Average Win Margin: 42.57%) Prefix: 6244 (Average Win Margin: 36.55%) Ties: 20
Total Checks: Sequential: 10,472,126,509 Prefix: 10,548,477,557
Simulation 10000:
Range= 0x7783106664cade9ef313deb9c088f05841f3c274a4661258f96e00da053d8d4e:0x7783106664cade9ef313deb9c088f05841f3c274a4661258f96e00da053f13ee
Target= 4f27af87ce608fbb0a02b8c601ec9e8a9e44db86 Checks: Sequential = 66881 | Prefix = 41959
=== FINAL RESULTS === Wins: Sequential: 4085 Prefix: 5484 Ties: 431
[moderator's note: consecutive posts merged]
|
|
|
|
zahid888
Member

Offline
Activity: 329
Merit: 24
the right steps towerds the goal
|
 |
April 21, 2025, 09:53:00 AM |
|
Hahaha, take it easy... It’s not that simple... But... Every member in this topic will get 0.2 BTC—if they have a BTC address in their signature. Satisfied?  Are you talking about that key? KyDi5tDzUCEN5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KyDi5tFNbmN45bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KyDi5tJzYm5M5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KzDiBk1GeGqp5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KzDiBk2nLZCk5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KzDiBk377UHr5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob L2Die4KeEMng5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob L3DiBgEqot9K5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob That’s probably a scam. I’ve bunch of WIFs with partial matches in sequence, be careful not to waste your time there.  For those who think searching for WIF has some magical twist—let me tell you, it's much slower compared to generating an address directly from a private key (hex, bytes or dec). @nomachine, maybe let the curious minds DM you directly -: this thread’s starting to feel like a rerun marathon.  Let’s save the scrolls for fresh stuff!
-- Sim results
If you sum the number of checks over 10k simulations you get this : === FINAL RESULTS === Sequential: 495816995 Prefix: 496059807 WHICH IS ALMOST 50-50! And maybe I have conducted the most experiments on prefixes, whether it be in the form of base58 or hash160. Through these experiments, I have consistently encountered a 50-50 probability of outcomes.
but the basic aspect has already been demonstrated, which was the probabilistic success rate.
Well done! But let’s be real—if we’re talking probabilities, I Still remember, how you got yourself stuck in this argument when you trying to defend someone. Your heroic moment, huh? Maybe now’s a good time to snap out of that mess and chase some actual probability breakthroughs. === Configuration === Total numbers: 2,097,152 Block size: 4,096 Prefix: 3 characters (16^3 combinations) Simulations: 10000
=== FINAL RESULTS === Wins: Sequential: 3736 (Average Win Margin: 42.57%) Prefix: 6244 (Average Win Margin: 36.55%) Ties: 20
Total Checks: Sequential: 10,472,126,509 Prefix: 10,548,477,557
Bro demonstration is over now! lets reduce the talk in this forum that we can easily read important posts  And thanks for searching all 10 digit seeds for me
|
1BGvwggxfCaHGykKrVXX7fk8GYaLQpeixA
|
|
|
nomachine
|
 |
April 21, 2025, 10:20:45 AM |
|
Are you talking about that key? KyDi5tDzUCEN5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KyDi5tFNbmN45bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KyDi5tJzYm5M5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KzDiBk1GeGqp5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KzDiBk2nLZCk5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob KzDiBk377UHr5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob L2Die4KeEMng5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob L3DiBgEqot9K5bCRZhiS5sEGMpmcRZdpAhmWLRfMmutGmPHtjVob That’s probably a scam. I’ve bunch of WIFs with partial matches in sequence, be careful not to waste your time there. It's possible... but I have a match like '1PfNh5' in the address, for example, so I’m not sure what to think. The problem is that the range is huge—larger than life 
|
BTC: bc1qdwnxr7s08xwelpjy3cc52rrxg63xsmagv50fa8
|
|
|
|