Bitcoin Forum
August 17, 2026, 01:35:23 AM *
News: Latest Bitcoin Core release: 31.1 [Torrent]
 
  Home Help Search Login Register More  
  Show Posts
Pages: [1] 2 3 4 »
1  Other / Off-topic / I built a privacy-first visual CAPTCHA and a bot-protected URL Shortener on: March 17, 2026, 08:20:29 PM
Hey everyone,

Like most of you, I got completely fed up with the current state of bot protection. We are constantly forced to train corporate AI models by clicking endless grids of crosswalks and traffic lights, all while these widgets track our cross-site cookies.

So, I built a lightweight, privacy-friendly alternative from scratch: CAPTCHAL.ink







Instead of object recognition, it relies on human spatial awareness. You get a 3x3 grid of images, and the instruction is simple: Click the images that are upside down. Human brains instantly understand gravity and lighting direction, while modern bots struggle with this abstract physics context. Plus, it uses zero third-party cookies (works perfectly in strict Incognito mode).

While developers can drop this widget into their forms for free, I realized that many people wants URL shortener that will block bots.

Introducing the Bot-Protected URL Shortener:
https://captchal.ink/shortener.php

How it works:

Paste any long URL into the generator.

We give you a compact, clean link that is easy to share anywhere (tweets, bios, QR codes).

When someone clicks it, they must complete the simple visual challenge (finding the upside-down images).

Once verified, they are instantly redirected to your destination.

Why use this?

Visual proof-of-work: It strictly protects your destination links from bots, scrapers, and automated abuse.

Completely frictionless: No sign-up required. You can create and share protected links in seconds.

Unique & Secure: Each short link is unique and tightly tied to your destination URL.

The project is currently in its Public Beta phase and is entirely free to use. I'm an indie developer running this solo, so I am looking for early adopters to test it out "in the wild."

Try to use it, try to break it, and let me know your honest feedback!
2  Bitcoin / Development & Technical Discussion / Re: 4 points with same doubling slope on: February 27, 2026, 09:36:09 AM
Yes, you are right, that is a standard beta lambda endomorphism in secp256k1...

But I found diferent relation between points. I found that if 4 points have the same doubling slope, they give 0 in total, and their private keys also give 0

Code:
Slope 16:
ff405d7729ed52aa591f7be3f59048c4d506fc28ff83f1b78c84f34c9ec19e50
a1f7ff943ae98653ce8e8b90ea104f1f9a669548bf0208a595810c0d526cb547
2fe5f2ec5aed03af8aae566b6a792fdf5ae94630ba878d2a0206ec505e7cd908
126fe8ebce7506e0868730589974711fc3e20bebbfd606b1bf814d375aff7748

So these points with correct Y give 0 because they all give same slope when doubling
3  Bitcoin / Development & Technical Discussion / Re: 4 points with same doubling slope on: February 25, 2026, 10:58:00 PM
I tried to modify the SageMath code, and I was looking for sets of 4 points where I know the difference between 2 points in the set on the big curve

Code:
# secp256k1 parameters
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
K = GF(p)
E = EllipticCurve(K, [0, 7])

# Standard Base Point G
Gx = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
Gy = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
G_base = E(K(Gx), K(Gy))

def find_quad_slopes_optimized(max_k=200):
    found_slopes = set() # Track (k, slope) to avoid l vs p-l duplicates
    print(f"Starting optimized search for k = 1 to {max_k}...")
    
    for k in range(1, max_k + 1):
        Gk = k * G_base
        print(f"Analyzing k = {k}...", end="\r")
        
        # 1. Setup polynomial ring and resultant
        R.<x> = PolynomialRing(K)
        dx = x - Gk[0]
        A = (x^3 + 7 + Gk[1]^2) - (x + Gk[0]) * dx^2
        B = -2 * Gk[1]
        D = dx^2
        
        Ry.<y_sym> = PolynomialRing(R)
        xr_num = A + B * y_sym
        xr_den = D
        
        # Tangent slope matching equation
        eq = x^4 * (xr_num^3 + 7 * xr_den^3) * xr_den - xr_num^4 * (x^3 + 7)
        final_poly = eq.resultant(y_sym^2 - (x^3 + 7))
        candidates = final_poly.roots(multiplicities=False)
        
        for r in candidates:
            if r == Gk[0]: continue
            try:
                for Q in E.lift_x(r, all=True):
                    l = (3 * Q[0]^2) / (2 * Q[1])
                    slope_val = int(l)
                    
                    # Avoid redundant processing of the same configuration
                    if (k, slope_val) in found_slopes or (k, int(p-l)) in found_slopes:
                        continue
                    
                    # 2. Check for 4 real x-roots for this slope
                    l2 = l^2
                    f_poly = 9*x^4 - 4*l2*x^3 - 28*l2
                    roots = f_poly.roots(multiplicities=False)
                    
                    if len(roots) == 4:
                        print(f"\n\n[!] UNIQUE CONFIGURATION FOUND: k = {k}")
                        print(f"Slope l:  {hex(slope_val)}")
                        print(f"Slope -l: {hex(int(p-l))}")
                        print("-" * 50)
                        
                        found_slopes.add((k, slope_val))
                        target_x_gk = (Q + Gk)[0]
                        
                        # Store all points for this slope to check other distances
                        all_points = []
                        for rx in roots:
                            pts = E.lift_x(rx, all=True)
                            # Pick the point that actually matches the slope l
                            for p_candidate in pts:
                                if (3 * p_candidate[0]^2) / (2 * p_candidate[1]) == l:
                                    all_points.append(p_candidate)
                                    break
                        
                        # Display roots and label Q / Q+kG
                        for root_x in roots:
                            label = "   "
                            if root_x == Q[0]: label = "-> Point Q_x:      "
                            elif root_x == target_x_gk: label = "-> Point (Q+kG)_x: "
                            print(f"{label} {hex(int(root_x))}")
                        
                        # Check if the OTHER two points also have a meaningful distance
                        # (Filtering out the Q and Q+kG we already know)
                        others = [p for p in all_points if p[0] != Q[0] and p[0] != target_x_gk]
                        if len(others) == 2:
                            diff = others[0] - others[1]
                            # This is a very basic way to check if it's a multiple of G
                            # In a real scenario, you'd use discrete log, but we can't do that easily
                            # We just check if it matches the current kG
                            if diff == Gk or diff == -Gk:
                                print(f"MATCH: The other two points are ALSO separated by {k}G!")
                        
                        print("-" * 50)
            except:
                continue
                
    print(f"\nSearch completed up to k = 200.")

# Call the correct function name
find_quad_slopes_optimized(200)

so the output is something like this

Code:
[!] UNIQUE CONFIGURATION FOUND: k = 6
Slope l:  0x54298434bf05d01607d4844e05bb73beb1531779d87308b47de9610a967fbb03
Slope -l: 0xabd67bcb40fa2fe9f82b7bb1fa448c414eace886278cf74b82169ef46980412c
--------------------------------------------------
-> Point Q_x:       0xd1fbc2f7e30cf9d9570835cccaa7a52bb2816f3ba1fcecb500f1de24245ee68d
    0x755c07402ab4ac9b4af7aff3e6fcdd56acfdb6521438624cecf78cef57188e56
    0x5d16a32cc453e65b7bc90a422c59c16f031cd3f92ff9d87bc9240f15b5c24a38
    0x65d82622606306c6c57829f5b1be80c007f602de96984e793800223337ac3b7
--------------------------------------------------
Analyzing k = 7...
Analyzing k = 8...

[!] UNIQUE CONFIGURATION FOUND: k = 8
Slope l:  0xa669f220232d12b868e0783478728b4c55bb6b0411d9520ece2e934ce5b9298d
Slope -l: 0x59960ddfdcd2ed47971f87cb878d74b3aa4494fbee26adf131d16cb21a46d2a2
--------------------------------------------------
-> Point Q_x:       0xbb8cef98f1b2fbb9395514aa2197f55cac650b32e179fbc3884dc87fdbef625e
    0x414977f5f5a599833b8b4eed3fc7d3fb9fe685051f79e1d582b407b228f2a3b2
-> Point (Q+kG)_x:  0x2d8411d1ed601cb2fd1d9d986343e8249ed6ae389b01d604a1293beeab30c731
    0x1142e71cab32c8a124fb6f690686e2f9896b2c684f3df6394f46775b9f630e56
--------------------------------------------------
Analyzing k = 9...

[!] UNIQUE CONFIGURATION FOUND: k = 9
Slope l:  0x8414d976f81a3671be1ba4059af3b9d4969a8d220f2c5856d4995e2618cdc370
Slope -l: 0x7beb268907e5c98e41e45bfa650c462b696572ddf0d3a7a92b66a1d8e73238bf
--------------------------------------------------
    0xb4051c18ea232429480078deaf3ad783673cc537b83e1e67f1e6e44995688383
-> Point Q_x:       0x842bac1984576a04890780ab74f95ae26c63c7200477809a3a6092c9c9bacd62
-> Point (Q+kG)_x:  0x4c0e1cc708a1504c015988425ecc5cb664b37a8c924ce7ce7f4a8af31719a71c
    0x29194c48f2374e737b485557b4a526c7bd42e29f0b738c44392b9ebba033b316
--------------------------------------------------
Analyzing k = 10...
Analyzing k = 11...

k = 6 means we calculated 6G point and then the code gave us a set where 2 points have a difference of 6G, and together their private keys give 0, and all points have the same doubling slopes
So for that set the equation is 2k1 + k3 + k4 + 6 = 0
4  Bitcoin / Development & Technical Discussion / Re: 4 points with same doubling slope on: February 23, 2026, 01:52:48 PM
This code seems to be working but I added 1G

Code:
Slope   K1      K2      K3      K4
----------------------------------------
943     1       182     680     44       Check: 0
So I got this

And this are real K1 K2 K3 K4
943 1P (418, 442) 315P (85, 455) 503P (313, 102) 88P (407, 707)

How did you get these numbers  182 680 44 in the code?

Also for
Code:
47P (619, 24)
800 489P (288, 581) 695P (818, 701) 583P (248, 154) 47P (619, 24)

And in python I get
Code:
Slope   K1      K2      K3      K4
----------------------------------------
800     47      391     215     254      Check: 0
5  Bitcoin / Development & Technical Discussion / Re: 4 points with same doubling slope on: February 23, 2026, 12:11:14 PM
Quote
But having the sums is nice, I can imagine some scenario where this pairs sum property might help.

Well, maybe Igor Semaev's summation polynomials or index calculus or something like that
I mean this is an easier way to find 4 X to gives 0
Also, I am 100% sure that about 16% off all points have the other 3 with the same doubling slope, and together they give 0

I could not calculate scalars if I know 1 scalar. I even tried measuring the distances between those tangents

Also, the problem is if you have 1 set of 4 points, those points will not show in any other set (naturally). So there is no like colisions between sets

But if you have 1 point you can calculate 23 other points... For 1 slope, you get another 3
Then you move doubling slope with beta 2 more times and then 3 more times for p-slope, (p-slope)*beta mod p, (p-slope)*beta^2 mod p
6  Bitcoin / Development & Technical Discussion / 4 points with same doubling slope on: February 22, 2026, 10:36:58 PM
I found on secp256k1 that if 4 points have same doubling slope their private keys always gives 0
k1+k2+k3+k4=0

On smaller curve
P=967 N=907
β (cube root of 1): 142
λ (eigenvalue at P): 522
1G   (418, 442)


If I have 1st private key I can calculate 1st column.... and I can  calculate all slopes in 1 set of 24 points but I did not find the way to if I have k1 to calculate k2 k3 k4

Also on the big curve I found those sets

f(x) = 9x^4 - 4slope^2x^3 - 28slope^2 = 0

On this way I generated sets of 4 points 48 sets on this curve p=967
I tried other curves with Sagemath
p=1000003 - Number of points: 999006 Number of sets: 41886
p=1001023 - Points: 999066 - Sets:41466
p=1001527 - Points: 1000158 - Sets:41580
p=20000077 - Points: 19992876 - Sets:833040

Finally I tried to search those sets on the big curve. I started with slope 1 and I was searching if current slope will give 4 solutions for that
This is the SageMath code I was using https://justpaste.it/k055b
and I got these Slopes and X values

Slope 5:
e5493c5e5ab1e25795a4f01f362ebc855d3c2611100bb0c24b401d5846f28f93
95b49d5352c6d6893771e5524aced66e9c163010d1cf0dcad80a77d786fc4681
91bfb02411f3bbb0e380f649f876e8692acbb596452df00277c846b1191017f5
817b59b8797719a732f66d2814c4683114c58280bc858a53f32607aac3abb2ec
--------------------
Slope 16:
ff405d7729ed52aa591f7be3f59048c4d506fc28ff83f1b78c84f34c9ec19e50
a1f7ff943ae98653ce8e8b90ea104f1f9a669548bf0208a595810c0d526cb547
2fe5f2ec5aed03af8aae566b6a792fdf5ae94630ba878d2a0206ec505e7cd908
126fe8ebce7506e0868730589974711fc3e20bebbfd606b1bf814d375aff7748
--------------------
Slope 47:
d8a0a502488cf53fe88a7b53b3b86021c151e59ef8df9f0f6fe54b821cef7ac6
6ced29459069a670d859aec16c1e85d426d1eaf84a1a14f8beab86e85934b74b
5b260613d299e1e19673ccf072afac0b94e843b73f24fe1f425f1e2ca885df5b
42da6487e2a865fbe18b97335107a6e2112ccf3fb6c4dc11729e484a8c0095df
--------------------
Slope 54:
f9c2e48f573115eddcbc132f9cf5979ac292e3918ecdec4458589501788f5b90
caeb00411e5011e845e8063c58749613f6e51a083896b935cab902a50815f9c2
217212301587cca0fb1387de3db81428cb7b5e95567786fee35fc43327ea2046
19e008ff74f70b88e2485eb5ccddbe287b0ca3d0e223d386f98ea424577087d6
--------------------
Slope 110:
f494b668f9c24a74dcced225e670cd6d9b343b9d8175354123281ab73564f74a
a3c5694b0a6cce2d90e5cfdc9f3bd9a5bad9fab3a0685ece8a5bd958802b979c
35fbd7fee43dafc765aeb3abe77c60fcaba79fbebd7d5b5ffddd70c9acc27109
15384130a5cc1b246580388a766530d38c830d7e59889ec9382cd4084857b888
--------------------
About 16% of all points on the curve have this property
Of course if you know 1 slope then you know p-slope so in the case of any kind of scanning we can just save the slope and we have info for 8 points
Do you think that those points can be used for solving secp256k1? What do you think about all of this?

7  Bitcoin / Development & Technical Discussion / Re: Legendre Symbol Oracle Breaks ECC on: January 29, 2026, 03:42:01 PM
I am confused how you are going to map points from the real curve to this anomaly curve when they have different P and N, and also they have different equations for points
Y^2 = X^3 + X + B mod P (anomaly)
Y^2 = X^3 + B mod P (secp256k1)
8  Bitcoin / Development & Technical Discussion / Re: Legendre Symbol Oracle Breaks ECC on: January 28, 2026, 11:33:21 PM
p=97
  order==p k'ları: [1, 3, 12, 85, 94, 96]
  singular: [5, 92]

I checked here
https://graui.de/code/elliptic2/

and I can not make 96 for order....
4 11 22 44 - that is what I get

Oh I see now you ment
y^2 = x^3 + 1x + 92 mod 97
y^2 = x^3 + 1x + 5 mod 97

Yeah they are singulars
Also this
y^2 = x^3 + 66x + 31 mod 97
And I think this is better because this curve has infinity point and 96 other points
9  Bitcoin / Development & Technical Discussion / Re: Bitcoin Puzzle Scanner on: January 23, 2026, 12:40:07 AM
Is this really the result of the test
~4.5 min for puzzle 40?
When I test my code on the puzzle, I always substract lower value for the range and then I start from 1G

I mean, I made some lame scanner in RUST, and RUST is using ICE DLL library, using 6 cores, random jumps

I start from positions

1G 2G 3G 4G 5G and Public Key - that is 6 cores...
Then I generate 1.000.000 random jumps, but all jumps are mod 5=0
Then I use the last 7 digits of the X value to determine which jump will be used
I enter how many "00000" I want to be stored as DP points

I get like 400.000 jumps per sec per core

I solve puzzle 40 in
🎯 Private key found: 0x701110000f
⏱ Time: 1.7 seconds
10  Bitcoin / Development & Technical Discussion / Re: ECDSA: Square roots, cube roots, clock (12th root), and other roots on: January 03, 2026, 06:14:17 PM
I was using this code to check that

Code:
n = int("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", 16)
T = int("155555555555555555555555555555553a393d1339460d5a4ffc328bbc04857", 16)

k = int("10", 16)
print(hex((k * pow(2, T, n)) % n))

And I have starting point 0x10 * G
Code:
04e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0af7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821

After executing the code I got 0xc9c52b33fa3cf1f5ad9e3fd77ed9ba573d36fec6139d59d88ec4cf8b2f09b056 * G
Code:
04b971ba5ca9245fffb45cd864c8e6727ad0fc2a2d0c7708101e315c6c2f44440bf7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821

Maybe something is not good, but I tested for many points
11  Bitcoin / Development & Technical Discussion / Re: ECDSA: Square roots, cube roots, clock (12th root), and other roots on: January 03, 2026, 04:25:02 PM
I just found that if you double one point

Q = P * 2^155555555555555555555555555555553a393d1339460d5a4ffc328bbc04857

You get the point with the same Py=Qy value and different X | Qx != Px....

(I know this is old thread but I had to say)
12  Other / Off-topic / Re: Johnsboard.com - I was inspired by the guy that sold homepage on: November 21, 2025, 08:52:51 PM
Well, I am looking for webmasters and website owners to put their banner on my website for free... That is how I am going to get initial traffic...
13  Other / Off-topic / Johnsboard.com - I was inspired by the guy that sold homepage on: November 20, 2025, 12:07:43 AM


https://www.johnsboard.com/

So my nickname is John (my real name is similar), and I created this website where you can submit your banner, and my homepage will link to your website (follow the link - opened in new tab). I saw the story about that guy who sold pixels, and I saw that the website is not working anymore. It is not updated... Most of the links are not working....

...so I wanted to make something new, similar but not the sam,e and basically my list will update regularly by itself...

Below my 10x20 banners grid (banners can be 100x50, so in total it is 1.000.000 pixels), you will find a detailed explanation of how my board works.

Please if you find any bugs, send me a message here or send me email at admin@johnsboard.com
(I am one man show so the bugs are possible to happen)

Thank you, and I am calling you to submit your website or any kind of "normal link", links to your projects, you can put refferal links just no adult torrent illegal - no links that redirects to something different

Thank you <3
14  Bitcoin / Development & Technical Discussion / Re: Solving ECDLP with Kangaroos: Part 1 + 2 + RCKangaroo on: April 15, 2025, 09:37:57 AM
I am not sure how Kangaroo algorithm is functioning but for example I run JeanLucPons/Kangaroo a few time...

I saw that it creates about 2^19 Kangaroos at the start (I have Nvidia 1070ti - it sucks) and then it finds solutions for small ranges really fast

So my question is, how are the starting points for those Kangaroos created or selected?

If it is not already working in this way, I thought maybe it would be good to make it like this

So from a lower position of range, you create 2^19 kangaroos and those Kangaroos are consecutive - one by one.... from 1G to 2^19G

Then you create a jumps and all jumps are random but those jumps must be "jump_value % 2^19 = 0" and the same jumps we use for the public_key we are searching. because jumps are "jump_value % 2^19 = 0" then all starting Kangaroos will not collide with themselves because it is not possible. Public key is jumping with those jumps and save points where X is starting with (I do not know) 0000 for example

Then we move each kangaroo with those jumps and we move public_key with those jumps UP so we are adding points basically

A collision will happen when 1 of the starting kangaroos hits the path of public_key...

The starting Kangaroo that is going to hit the path of public_key will basically follow this rule

starting_value_of_that_Kangaroo % 2^19 = private_key_of_public_key % 2^19

So if you can create more starting Kangaroos with more GPUs then you can jump larger jumps and collision will occur faster... right?

Thank you (sorry for such a bad English)
15  Bitcoin / Development & Technical Discussion / Re: Pollard's kangaroo ECDLP solver on: April 14, 2025, 07:11:41 PM
Can someone explain to me (or send me a link) like I am 5 years old.... How does the scanner choose the jump values for jumps?
16  Bitcoin / Development & Technical Discussion / Re: BSGS + Kangaroo Hybrid on: February 27, 2025, 02:58:47 AM
I think it is possible on this way

For example you define jumps like you have a starting points

Code:
300DF8475800 * G = 035e7ee2416496d46b6be9f20acd95ce922333dba658cf6d1d9da570a79b38b556
and then you have other points
300DF8475801 * G = 030264c5072d186570623d1b8346c3e1cebccbdddd1b63e6fb310d1481f060f6f8fb
300DF8475802 * G = 02239e98430c54ee569cf81d39b518ed7c321778429fde49953497285d3283711e
300DF8475803 * G = 03cda37e3633f55b043cf7d4ee148fa44baa50d8925571469d617eb72cc75b0648
300DF8475804 * G = 031b6349e3953558ed1561b69652ccce70eb92bd7c9b93f3082d0d7e563cfebdb7
.
.
.
you make a rule of jumps where you take |last 6 digits of X +1G|

after 5.000.000 of those iterations, I guarantee that all nearby points will go to the same point...

I already did that I mean proved that to myself ( Smiley )

But what you can do for example...

In case of puzzle 135

You can start jumping from
Code:
7fffffffffffffffffffffffffffffffff * G = 02699adca27ea4ce71af1a9b27f767988a8a0d6af792ce33104f45de740d7d1519
|last 6 digits of X +1G|
and put in "babystep" file every 1.000.000th iteration point and you put I do not know 200.000.000 points... and you calculate G added from starting point to 6th last point... This will be a BIG number and it will basically be you BIG GIANT JUMP

Then you start scan from
02145d2611c823a396ef6712ce0f712f09b9b4f3135e3e0aa3230fb9b6d08d1e16
With the same rule... after 6.000.000 iteration if you did not find point from the babystep file you can jump BIG GIANT JUMP

If you find the point then

private key = 7fffffffffffffffffffffffffffffffff + G added in line of babystep file - G added in scan at the moment of collision Wink

So this should be a hybrid kangaroo and bsgs

I do not know I am just a guy that is trying something Smiley
17  Bitcoin / Development & Technical Discussion / Re: I created smaller secp256k1 just for testing on: February 22, 2025, 11:50:49 AM
I was using this website
https://asecuritysite.com/ecc/ecc_points_mult

I was putting random p-prime numbers, then "manually" Smiley bruteforce X value to get valid point
Then if you get rule (n-1)mod 6 = 0 then you basically got the smaller version of standard secp256k1 - you will get the sets of 2 Y values with 3 X values just like in regular curve
The smallest example is  p = 7 G=(1, 1)

Code:
P (1,1)   Point is on curve
2P (2,1)   Point is on curve
3P (4,6)   Point is on curve
4P (4,1)   Point is on curve
5P (2,6)   Point is on curve
6P (1,6)   Point is on curve
7P=0

18  Bitcoin / Development & Technical Discussion / Re: I created smaller secp256k1 just for testing on: February 20, 2025, 01:32:45 PM
I do not want to create a new thread I just want to continue here...

I tried to figure out how BSGS works for scanning points and how it maybe can be improved...

Many BSGS scanners makes babystep file where you take starting point and the add +G+G+G+G+G+G to get for example 300.000.000 consecutive points

Then scanner will jump 300M per iteration and check if the current point is on the list...

But I think that there is no need for all points to be consecutive. You can spread them all over the range just make sure that when you generating the babystep file have the rule where

Code:
iteration * 300.000.000 * (some fixed number) + Iteration....
For example

For every point in theory if you do mod 300.000.000 of distance between start point and any generated point you will get all posible remainings for 300.000.000... so that means when you scan you can still jump regular jumps even if there is huge gap between points and you will find a solution sooner because points are not at the same place

I think this can be improved more....

--------------------------------------------------------

Also, for example, in puzzle 135 we have our goal point

X: 145D2611C823A396EF6712CE0F712F09B9B4F3135E3E0AA3230FB9B6D08D1E16
Y: 667A05E9A1BDD6F70142B66558BD12CE2C0F9CBC7001B20C8A6A109C80DC5330

From this point we can do subtraction 0x4000000000000000000000000000000000 * G

we will get some point and then we take simetrical point - the point in upper region


Then we make a list (babystep file) of all X values from 1G to 300.000.000G

So we can start scanning from a symmetrical point and we go UP... but then we can jump 600.000.000 keys per jump so we can double the speed - when we hit some X value we have 2 solutions and one of them is correct




I am not sure about the method where we put gaps between points in the babystep file because there is infinity point so after infinity point all points are moved by 1 so if you jump 600.000.000 keys per jump and you have only 300.000.000 points in BS file I am not sure that it will find a solution because other half of points are moved by 1

In regular BSGS that must work - it does not work only in case if you hit the infinity point when you jump for 600.000.000 keys... But I think the chances for that are small

I have only this code for generating lines
When I generate 300.000.000 keys I take only first 16 characters for matching. It is a simple code and can be improved on many ways. I am not so good at python I was working with PHP like 15 years

Code:
import secp256k1 as ice
import os

# Starting point
P = ice.pub2upub('02145d2611c823a396ef6712ce0f712f09b9b4f3135e3e0aa3230fb9b6d08d1e16')

batch_size = 30_000_000
max_lines = 300_000_000
babystep_file = "babystep.txt"

if os.path.exists(babystep_file):
    with open(babystep_file, "r") as f:
        line_count = sum(1 for _ in f)
else:
    line_count = 0

with open(babystep_file, "a") as f:
    while line_count < max_lines:
        print(f"Generating {batch_size} BSGS points...")
        bsgs_batch = ice.point_sequential_increment(batch_size, P)
       
        for i in range(batch_size):
            hex_string = bsgs_batch[i * 65: i * 65 + 65].hex()
            x_hex = hex_string[2:18] 
            f.write(f"{x_hex}\n")
            line_count += 1
           
            if line_count >= max_lines:
                break
       
        P = ice.pub2upub(bsgs_batch[-65:].hex())
        print(f"Current generating: {line_count}/{max_lines} lines.")

print("Generating of 300.000.000 lines completed.")



my idea is to create ONE babystep file and count that file twice because you can double the number of consecutive X values because they are going in one direction then in the reverse direction (with 0 point in the middle)

Our goal point
02145d2611c823a396ef6712ce0f712f09b9b4f3135e3e0aa3230fb9b6d08d1e16

I have this code for subtraction of points so I used it

Code:
import secp256k1 as ice

def ECsubtract(Q1,Q2):# compressed or uncompressed pubkey
    Q1=ice.pub2upub(Q1)
    Q2=ice.pub2upub(Q2)
    sub=ice.point_negation(Q2)# -Q2
    return (ice.point_addition(Q1,sub).hex()) #Q1 - Q2


public_key=ECsubtract('02145d2611c823a396ef6712ce0f712f09b9b4f3135e3e0aa3230fb9b6d08d1e16','02cbb434aa7ae1700dcd15b20b17464817ec11715050e0fa192ffe9c29a673059f')
print(public_key)

02cbb434aa7ae1700dcd15b20b17464817ec11715050e0fa192ffe9c29a673059f = 4000000000000000000000000000000000 * G

I got this point
Code:
04a8c204d9e0cd0e7f6da825d55b5c2b9d0093f96650bf37e67bc802189b3bc47837bbe3fd17f83a190242af1da9673c468f504b37ba276554a9724ea479124d87
Upper region point is
Code:
04a8c204d9e0cd0e7f6da825d55b5c2b9d0093f96650bf37e67bc802189b3bc478c8441c02e807c5e6fdbd50e25698c3b970afb4c845d89aab568db15a86edaea8
From this point we can start. Make babystep file from 1G to XG (how much RAM do you have) and then start scanning...



You are creating Babystep file from 1G to 10G in babystep file you only put X values (or part of it or I do not know)

You are jumping from 264G ----> inverse point n - 264

And you can jump 20G in one jump and try to match X values of the point...

number of line you hit is for example 3... you have 2 solutions ...

private key = n - nuber of jumps * 20 - 3

private key = n - nuber of jumps * 20 - 3 * 2 - 1(because of infinity point)

I mean this is something I am thinking about not sure




I also have another Idea like a Kangaroo that will use the infinity point as a referent point so the kangaroo will jump from the public key up and we will save X values of those points when the code jumps over the infinity point then the kangaroo will basically start jumping back because X values now have order in backward... and then when you find collision with itself you can calculate the private key

Code:
priv_key = (n - (G_added - G_at_collision) // 2 - G_at_collision) % n

So in my code I was looking for private key of

03440daba3905488f1b5ad2186f6ce2e9a9fe69327ac975dba1a93f8ed60d7813d

I know that private key is < n/2 so I took the even Y value to have a point > n/2

here is the code

Code:
import ecdsa
from ecdsa.ellipticcurve import Point
import time

# Parameters of the secp256k1 elliptic curve
curve = ecdsa.curves.SECP256k1.curve
G = ecdsa.curves.SECP256k1.generator
n = ecdsa.curves.SECP256k1.order

# Initial point
X = 0x440daba3905488f1b5ad2186f6ce2e9a9fe69327ac975dba1a93f8ed60d7813d
Y = 0x9d656a2ee1049d7bf9c4b48c4df47e92115b0a479c60ba1034c9c2e7a39d2f0c

P = Point(curve, X, Y)

visited_x = {}  # Store X coordinates in RAM
G_added = 0  # Total G added
start_time = time.time()  # Start time
last_print_time = start_time  # Track last print time
iteration = 0  # Track current iteration

while True:
    last5 = X & 0xFFFFF  # Last 5 digits of X-axis
    step = last5 + 1  # Step size
    P = P + step * G  # Jump forward
    X = P.x()
    G_added += step
    iteration += 1
   
    current_time = time.time()
    if current_time - last_print_time >= 5:
        print(f"Total G added: {hex(G_added)}, Current Iteration: {iteration}, Current step: {step}", end="\r")
        last_print_time = current_time
   
    if X in visited_x:
        G_at_collision = visited_x[X]
        priv_key = (n - (G_added - G_at_collision) // 2 - G_at_collision) % n
        end_time = time.time()
        elapsed_time = end_time - start_time
        hours, rem = divmod(elapsed_time, 3600)
        minutes, seconds = divmod(rem, 60)
        print(f"\nPrivate key found: {hex(priv_key)}")
        print(f"Time taken: {int(hours)}h {int(minutes)}m {int(seconds)}s")
        break
    else:
        visited_x[X] = G_added

I know that the code is slow but it finds a solution

Code:
Total G added: 0x11a4b3bb783, Current Iteration: 2312884, Current step: 699786
Private key found: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25d8a18d30c97
Time taken: 0h 3m 19s

So original private key is
Code:
n - fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25d8a18d30c97
hex 102B76334AA
dec 1111178294442

[moderator's note: consecutive posts merged]
19  Bitcoin / Development & Technical Discussion / Re: A probabilistic prefix search - puzzle btc 32 on: February 16, 2025, 01:20:59 AM
I was making a similar thing for puzzle 135... I put in babystep file only public keys that starts with "145d" and sometimes I had 2000 keys between 2 "145d" points and sometimes I had 120.000 keys between 2 "145d"...

So in average it will be 65.000 but I can not skip 65.000 keys each time when I find "145d" point
20  Bitcoin / Development & Technical Discussion / Re: A probabilistic prefix search - puzzle btc 32 on: February 15, 2025, 02:07:54 PM
I just can not understand what this code represent... And how to use it
Pages: [1] 2 3 4 »
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!