Search content
Sort by

Showing 20 of 28 results by VinIVaderr
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 19/03/2025, 02:34:18 UTC
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 19/03/2025, 02:18:12 UTC
Here are the two sides to your argument.

Probability builds over repeated attempts. vs. Exponential decay towards certainty.
Because keys are deterministic 0-1,000,000 are the same.
Ranges reduce time complexity.
It only appears that each key is independent over a distributed field but they are repeatable.
Every key maps to a public key and is used to sign messages or transactions and only that key will move these bitcoins.
By the way when did it become 'OK" to post private keys online>FUD
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 18/03/2025, 19:53:10 UTC
~ offtopic ~

No one said prefixes aren't rare, but seems the ignorance is on your side, because:

- no one is gonna waste a ton of power to find the exceptional case where two sequential keys result in a very long common prefix; that's a waste of time. Having infinitely small chances of a collision is the main reason why you don't see two near keys colliding, not because you've just found some prefix and that would somehow mean it has any sort of relevance for the very next hash, be it the next one or 500 billion keys later.


I believe you are correct. We know 10k gpu's can find one of these keys. But that's for other people, not me, for sure. This also isn't, in my opinion, testing the strength of ecdsa or bitcoin. I look at this from a technicality perspective; is there a weakness in math, random, or a code exploit. For a long time I've chatted with the GPT's and there is consensus that ecdsa and elliptic curve algorithms are elegant and no vulnerabilities are expected. The only error is human in poor entropy or coding. I've pressed Ctrl + c so many times. But I enjoy the "think tank" collaboration in this thread.
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 18/03/2025, 14:34:50 UTC
Saving it to file is an extra method and you're right it's not useful.
Others are posting code and I wanted to get feedback.
Searching in steps in this large key space is also not useful.

What do you think is the set it and forget it best method?
I think it's four terminal windows(0x4, 0x5, 0x6, 0x7).
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 18/03/2025, 12:30:45 UTC
The x-coordinate for puzzle 135 is 76 digits and the y-coordinate is 77 digits?
This may help with searching a sub-range of keys. My terminal process killed running 1E32 but I only have 4GB of RAM.
Try 1E21 and be sure to check the length of the x_values on output they range from 75-77.
Good Luck!

Code:
from ecdsa import SigningKey, SECP256k1
import ecdsa

# Define Puzzle #135 x-coordinate
p = 9210836494447108270027136741376870869791784014198948301625976867708124077590

# Define private key search range
k_lower = 21778071482940061661655974875633165533184 # + 10**26 
k_upper = 43556142965880123323311949751266331066367 # - 10**26

# Define a threshold to check for x-values near p
threshold = 10**76  # Adjust based on how "near" to p we want

def private_key_to_public_x(private_key):
    """Computes the x-coordinate of the public key from a given private key."""
    sk = SigningKey.from_secret_exponent(private_key, curve=SECP256k1)
    vk = sk.verifying_key
    x_coord = int.from_bytes(vk.to_string()[:32], 'big')  # Extract x-coordinate
    return x_coord

# Reduce step size to scan more precisely
step_size = int(1e35)  # Smaller step size for finer detail

print("Scanning for private keys that generate x-values close to p...")

matches = []

for k in range(k_lower, k_upper, step_size):
    x_value = private_key_to_public_x(k)
   
    if abs(p - x_value) < threshold:
        matches.append((k, x_value))

# Sort matches by x_value
matches.sort(key=lambda item: item[1])

# Print sorted results
for k, x in matches:
    print(f"Potential match: Private Key = {k}, x = {x}")

print("Scan complete.")
print(f"Found {len(matches)} potential matches.")

# Save sorted results to a file
with open("possible_matches.txt", "w") as f:
    for k, x in matches:
        f.write(f"Private Key: {k}, x: {x}\n")

Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 22/12/2024, 01:19:04 UTC
Each bag of popcorn has about 700 kernels (GPU Threads.)

We divide the total key space by the number of kernels per bag.
1.48 x 10^20 / 700

That's 211 quadrillion bags.

Chomping at every comment will weigh you down.

Here is a visual example of public key distribution for 65536 keys. Read or ask about the value of Mod P in public key generation.
Good Luck!

Code:
import numpy as np
import matplotlib.pyplot as plt

# Parameters for secp256k1
p = 2**256 - 2**32 - 977

# Function to check if a point is on the secp256k1 curve
def find_y_for_x(x, p):
    rhs = (x**3 + 7) % p
    # Check if there exists a y such that y^2 = rhs (mod p)
    if pow(rhs, (p - 1) // 2, p) == 1:  # Checks if rhs is a quadratic residue
        y = pow(rhs, (p + 1) // 4, p)  # Compute y as sqrt(rhs) mod p
        return y
    return None

# Sample x values in range 65536 and collect valid (x, y) pairs
x_vals = []
y_vals = []

for i in range(65536):
    x = (i * 1) % p
    y = find_y_for_x(x, p)
    if y is not None:
        x_vals.append(x)
        y_vals.append(y)

# Convert values to float for logarithmic scaling
x_vals_scaled = np.log(np.array(x_vals, dtype=np.float64) + 1)  # Log scale for visualization
y_vals_scaled = np.log(np.array(y_vals, dtype=np.float64) + 1)

# Plotting
plt.figure(figsize=(60, 58)) #10,8
plt.scatter(x_vals_scaled, y_vals_scaled, color='blue', s=1)
plt.title("Scatter Plot of secp256k1 Curve Points (Log-Scaled)")
plt.xlabel("log(x)")
plt.ylabel("log(y)")
plt.grid(True)
plt.show()
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 24/10/2024, 01:30:35 UTC
Puzzle #60 with a MacBook M1 Max
4.01e+03 seconds is 4010 seconds. So 1 hour and 11 minutes
I'm curious how much would it be with multithreading.

Code:
Ops: 1640142848 Table size: 25626624 Speed: 408909 ops/s
Ops: 1640964096 Table size: 25639463 Speed: 408910 ops/s
Private Key: 0xfc07a1825367bbe
Ops: 1641142272 Stored: 25642283
Speed: 408885 ops/s
Finished in 4.01e+03 s


What's the point of all of this ?  You will never solve puzzle #135 with consumer class CPU.  Lower ranges can be solved with currently existing tools much faster  than python script...

Code:
Google Colab 2 CpU modify r += 7
Private Key: 0xade6d7ce3b9b
Ops: 1068032 Stored: 66716
Speed: 84669 ops/s
Finished in 12.6 s
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 26/08/2024, 02:50:19 UTC
The idea for the code was obviously a slot machine type rotating wheel. In this case we need a starting string.
Adjusting each 'column' up and potentially wrapped around so that all 16 hex chars are iterated thru per column.


in this case '22b7c5a' is adjusted to '32b7c5a', '42b7c5a', '52b7c5a', '62b7c5a' - '12b7c5a'

then direction adjusts to the next column  '23b7c5a', 24b7c5a', '25b7c5a', '26b7c5a' - '21b7c5a'

This is more visually representative.
22
32
42
52
62
72
82
92
a2
b2
c2
d2
e2
f2
02
12
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 25/08/2024, 21:05:11 UTC
I am using linux python3.11.2 and it works just fine on my machine.
I was hoping someone could add to it or offer some suggestions.
I realize it is python code and very slow, impossible even but it does work.

Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 25/08/2024, 03:18:26 UTC
This code will generate a random string.
Then it will adjust each column range(1, 16)
If column 1 is 0x2 then the next string is 0x3, 0x4, 0x5 - 0x1
It will do this for each column.


Code:
from bitcoin import privtopub, pubtoaddr
import random
import string
import multiprocessing
import time
import os
import secrets
def create_random_slider_field(columns):
    return [random.choice(string.hexdigits.lower()) for _ in range(columns)]

def adjust_slider(slider, column, direction):
    hex_chars = string.hexdigits.lower()
    current_index = hex_chars.index(slider[column])
    new_index = (current_index + direction) % len(hex_chars)
    slider[column] = hex_chars[new_index]
    return slider

def check_address(private_key, target_address):
    try:
        address = pubtoaddr(privtopub(private_key))
        return address == target_address
    except Exception as e:
        print(f"Error generating address: {e}")
        return False

def search_process(target_address, process_attempts, result_queue):
    byte_values = list(range(256))
    random_bytes = [secrets.choice(byte_values) for _ in range(8)]
    random.seed(int.from_bytes(random_bytes))

    slider_columns = 19 
    attempts = 0
    hex_chars = string.hexdigits.lower()

    while attempts < process_attempts:
        slider = create_random_slider_field(slider_columns)
       
        for column in range(slider_columns):
            original_value = slider[column]
            original_index = hex_chars.index(original_value)
           
            # Check original value
            private_key = '0' * 46 + '1' + ''.join(slider)     # Updated prefix, adjust leading zeros.
            if check_address(private_key, target_address):
                result_queue.put((private_key, attempts))
                return
            attempts += 1

            # Optimized range checking
            for i in range(1, 16):
                # Check increasing values
                new_index = (original_index + i) % 16
                slider[column] = hex_chars[new_index]
                private_key = '0' * 46 + '1' + ''.join(slider)   # Updated prefix, adjust leading zeros.
                if check_address(private_key, target_address):
                    result_queue.put((private_key, attempts))
                    return
                attempts += 1
 
   # Reset to original value before moving to next column
            slider[column] = original_value

        if attempts % 1000 == 0:
            print(f"Process {multiprocessing.current_process().name} Attempts: {attempts}, Current slider: {''.join(slider)}")

    result_queue.put((None, attempts))

def multiprocessing_search(target_address, max_attempts=1000000, num_processes=4):   #max_attempts / 4 cores
    processes = []
    result_queue = multiprocessing.Queue()
    attempts_per_process = max_attempts // num_processes

    start_time = time.time()

    for i in range(num_processes):
        p = multiprocessing.Process(
            target=search_process,
            args=(target_address, attempts_per_process, result_queue)
        )
        processes.append(p)
        p.start()

    total_attempts = 0
    for _ in range(num_processes):
        result, attempts = result_queue.get()
        total_attempts += attempts
        if result:
            # Stop all processes
            for p in processes:
                p.terminate()
            return result, total_attempts

    # Wait for all processes to complete
    for p in processes:
        p.join()

    end_time = time.time()
    print(f"Total time: {end_time - start_time:.2f} seconds")
    return None, total_attempts

# Main program
if __name__ == "__main__":
    target_address = "19vkiEajfhuZ8bs8Zu2jgmC6oqZbWqhxhG"    #  puzzle address
    print(f"Target Bitcoin Address: {target_address}")

    result, attempts = multiprocessing_search(target_address)

    if result:
        f = open("keys.txt", "a")
        f.write(result + '\n')
        f.close()
        print(f"Matching private key found: {result}")
        print(f"Total attempts: {attempts}")
        f = open("keys.txt", "a")
        f.write(result + '\n')
        f.close()
    else:
        print(f"No match found after {attempts} attempts")
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 05/04/2024, 22:55:33 UTC
Total number of addresses that start with the same 11 characters = 2^66 / 58^(11 * log2(58))

First, calculate 58^(11 * log2(58)):

58^(11 * log2(58)) ≈ 58^42.614 ≈ 1.2107 × 10^74 (approximately)

Then, divide 2^66 by this result:

2^66 / 1.2107 × 10^74 ≈ 460708775.52

So, the approximate number of addresses that start with the same 11 characters from a key length of 2^66 bits is about 460,708,775.
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 07/03/2024, 03:26:42 UTC
For a month I have been trying this idea for generating the key/address for puzzle #69 as it has a single leading character.
I call it the Hex Slider Concatenator. update: you will have to add tk . TK for the Suspicious link removed, remove the spaces and [].

Code:
import tkinter as tk
from bitcoin import *
import sys

class HexSliderConcatenator([Suspicious link removed]):
    def __init__(self):
        super().__init__()

        self.hex_values = ['0'] * 17  #set all values.

        self.title("Hex Slider Concatenator")

        self.sliders = []
        for i in range(17):    # number of slider bars
            slider = tk.Scale(self, from_=0x0, to=0xf, orient="vertical", command=lambda value, i=i: self.update_hex_string(value, i))
            slider.pack(side=tk.LEFT)
            self.sliders.append(slider)
            slider.config(bg="lightblue", bd=5, relief="ridge", sliderlength=30, width=20)


        self.result_label = tk.Label(self, text="".join(self.hex_values))
        self.result_label.pack()

    def update_hex_string(self, value, index):
        self.hex_values[index] = format(int(value), 'x')
        result = "1" + "".join(self.hex_values)  #change to "1" for leading character.
        self.result_label.config(text=result)
#        print(result)
        expected_address = "19vkiEajfhuZ8bs8Zu2jgmC6oqZbWqhxhG"  #puzzle 69
        private_key = '0' * 46 + result + '22'
        public_key = privtopub(private_key)
        btc = pubtoaddr(public_key)
        print(private_key)
        print(public_key)
        print(btc)
        if btc == expected_address:
            self.match_found = True
            print("Key Found!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:" + private_key)


if __name__ == "__main__":
    app = HexSliderConcatenator()
    app.mainloop()


Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 07/03/2024, 00:30:42 UTC
For a month I have been trying this idea for generating the key/address for puzzle #69 as it has a single leading character.
I call it the Hex Slider Concatenator.

Code:
import tkinter as tk
from bitcoin import *
import sys

class HexSliderConcatenator([Suspicious link removed]):
    def __init__(self):
        super().__init__()

        self.hex_values = ['0'] * 17  #set all values.

        self.title("Hex Slider Concatenator")

        self.sliders = []
        for i in range(17):    # number of slider bars
            slider = tk.Scale(self, from_=0x0, to=0xf, orient="vertical", command=lambda value, i=i: self.update_hex_string(value, i))
            slider.pack(side=tk.LEFT)
            self.sliders.append(slider)
            slider.config(bg="lightblue", bd=5, relief="ridge", sliderlength=30, width=20)


        self.result_label = tk.Label(self, text="".join(self.hex_values))
        self.result_label.pack()

    def update_hex_string(self, value, index):
        self.hex_values[index] = format(int(value), 'x')
        result = "1" + "".join(self.hex_values)  #change to "1" for leading character.
        self.result_label.config(text=result)
#        print(result)
        expected_address = "19vkiEajfhuZ8bs8Zu2jgmC6oqZbWqhxhG"  #puzzle 69
        private_key = '0' * 46 + result + '22'
        public_key = privtopub(private_key)
        btc = pubtoaddr(public_key)
        print(private_key)
        print(public_key)
        print(btc)
        if btc == expected_address:
            self.match_found = True
            print("Key Found!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:" + private_key)


if __name__ == "__main__":
    app = HexSliderConcatenator()
    app.mainloop()


Post
Topic
Board Bitcoin Discussion
Re: To any Bitcoin holder who lost their seed: How did you lose it?
by
VinIVaderr
on 30/01/2024, 05:39:21 UTC
I haven't lost any seed phrases. Download iancoleman.io/bip39 generate 3 words and add your favorite password.
I keep multiple copies of the webpage for offline use.
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 29/01/2024, 21:19:29 UTC
update: the window =

should be   = [Suspicious link removed]()
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 29/01/2024, 21:11:13 UTC
In the spirit of trying and testing new ideas I have created a gui slider bar with the min:max decimal representations of puzzle #66. You can slide the bar and it will print numbers to the terminal. I also created a simple code to read the input and convert it to key/address. This idea doesn't really work and I imagine it's because of memory and cpu limitations.

problem 1   every number printed to the terminal is a multiple of 2. ie 2,4,6,8,

problem 2   the only way to get a key/address output is when you close the slider window.
                  and you can see it seems to have a max limit.

usage:   python3 slider_code.py | python3 key_conversion.py


slider_code.py
Code:
import tkinter
import random
window = [Suspicious link removed]()
def change(val):
    print (str(val))
slider = tkinter.Scale(window, from_=(36893488147419103232), to=(73786976294838206463), orient=tkinter.VERTICAL, length=500, command=change)
slider.pack()
window.mainloop()

key_conversion.py
Code:
import sys
from bitcoin import privtopub, pubtoaddr

data_a = sys.stdin.readline()
data_b = data_a.strip()
data_c = hex(int(data_b))[2:]

priv_key = "00000000000000000000000000000000000000000000000" + data_c + "a0"
pubkey = privtopub(priv_key)
btc = pubtoaddr(pubkey)
print(priv_key)
print(pubkey)
print(btc)
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 01/12/2023, 01:40:42 UTC
So this is my attempt at searching key sub-ranges. If you know the key begins with 0x20 then I was searching for "13zb" and keys that printed 0x20-0x3f are noted. I went through various puzzles, some already solved and broke the key ranges down into sub-ranges. Hopefully you will find this useful.

import multiprocessing
import base58
import secrets
from bitcoin import privtopub, pubtoaddr

def vint():
    puzzle_66 = "13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so"
    btc = ""

    while btc[:len(puzzle_66)] != puzzle_66:
        alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
        untext = "".join(secrets.choice(alphabet) for i in range (12))
        text = '11111111111111111111111' + 'C' + untext                  #23 1's  'C' is the parameter you can change.
        base58Str = base58.b58decode(text).hex()
        pubKey = privtopub(base58Str)
        btc = pubtoaddr(pubKey)

    f = open("keys.txt", "a")
    f.write(base58Str + "\n")
    f.close()
    b = open("btc.txt", "a")
    b.write(btc + "\n")
    b.close()

    print(base58Str)
    print(pubKey)
    print(btc)

processes = []
for _ in range(1):
    p1 = multiprocessing.Process(target=vint)
    p1.start()
    processes.append(p1)
for process in processes:
    process.join()

LINK to text files with key sub-ranges.
https://drive.google.com/drive/folders/176gIM6ACTyZg5Ux5Adsu-kP5S3LspLcU?usp=drive_link

Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 18/07/2023, 18:14:38 UTC
I haven't found any previous posts about brute forcing the base58 compressed key. So I thought I would share a simple code example.
The prefix in the code below is hexadecimal "1"  with address 1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH
If you delete the last character 'n' and run the script you will see the correct output. It may take a few tries. From puzzle 65 it can be determined that the base58 compressed key changes at Y. If you delete everything up to q you can search a range(19) and with much brute forcing we could create the key for puzzle 66.

Python3 Code:
import secrets
from bit import Key, PrivateKey

address = "1"
addr = ""

while addr[:len(address)] != address:
    prefix = "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn"
    base58_char = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
    text = ''.join(secrets.choice(base58_char) for i in range(1))
    data = prefix + text
    key = Key(data)
    addr = key.address


f = open("key.txt", "a")
f.write(data)
f.close()

print(data)
print(key)
print(addr)
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 07/06/2023, 03:17:12 UTC
I was trying to figure out a good way to break the key search into ranges.
I decided to use columns, ie. 17 columns. And group them into 4.

group 1  2000 - 2fff
group 2  0000 - ffff
group 3  0000 - ffff
group 4  0000 - ffff
group 5  0123456789abcdef

output:    group 1 has 4096 lines
      group 2 has 65536 lines
      group 3 has 65536 lines
      group 4 has 65536 lines
      group 5 is 16 lines.
         
My idea is to create 2000 0000 0000 0000 0
But I'm still not sure how to bring them together in a string.

Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
VinIVaderr
on 02/04/2023, 23:05:48 UTC
The code can potentially find an address after replacing hexadecimal characters in the string generated from the secrets module. It may find the address or key in the 7th or 8th while loop, for example.
Running the code with "1" as to generate output I got 0.065 execution time.
Calculating the additional range that it searches is very small compared to the overall bits.

I have no good reply to "why should we use it?" I had mentioned the idea and felt I should share the code for example.