Search content
Sort by

Showing 17 of 17 results by kreosan
Post
Topic
Board Bitcoin Discussion
Topic OP
Code for searching beautiful addresses
by
kreosan
on 22/06/2025, 16:10:15 UTC
Python code performs brute-force search over Bitcoin private keys, generating and checking multiple types of Bitcoin addresses for matches against prefixes (masks). It supports the following address formats:

Legacy (uncompressed) – Base58 addresses starting with 1.
Legacy Compressed – Base58 addresses starting with 1 (using compressed public keys).
P2SH-P2WPKH – Base58 addresses starting with 3 (nested SegWit).
Bech32 (SegWit v0) – Addresses starting with bc1q

 Smiley

Code:
import ecdsa
import hashlib
import base58
import time
import re
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import Manager
import threading
import os

print(f"PID: {os.getpid()}\n")
print(f"Starting the search!")

# Parameters:
WORDS_FILE     = 'words.txt'  # File with masks
START_VALUE    = 7577381717558400147389304571969250473512863125367244766130873951541158995895  # Private key in DEC
NUM_TRIALS     = 100000000     # Number of checks in order
INTERVAL       = 5             # File write interval
CASE_SENSITIVE = True
STEP           = 1             # Search step
NUM_PROCESSES  = 1             # Number of processes
OUTPUT_FILE    = 'found_addresses.txt'

with open(WORDS_FILE, 'r', encoding='utf-8') as f:
    masks = [line.strip() for line in f if line.strip()]
if not CASE_SENSITIVE:
    masks = [m.lower() for m in masks]
pattern = re.compile(r'^(?:' + '|'.join(map(re.escape, masks)) + ')')

def hash160(data: bytes) -> bytes:
    return hashlib.new('ripemd160', hashlib.sha256(data).digest()).digest()

def base58_check(prefix: bytes, payload: bytes) -> str:
    data = prefix + payload
    checksum = hashlib.sha256(hashlib.sha256(data).digest()).digest()[:4]
    return base58.b58encode(data + checksum).decode()

CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'

def bech32_polymod(values):
    GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]
    chk = 1
    for v in values:
        top = chk >> 25
        chk = ((chk & 0x1ffffff) << 5) ^ v
        for i in range(5):
            if (top >> i) & 1:
                chk ^= GENERATORS[i]
    return chk

def bech32_hrp_expand(hrp: str):
    return [ord(x) >> 5 for x in hrp] + [0] + [ord(x) & 31 for x in hrp]

def bech32_create_checksum(hrp: str, data: list) -> list:
    values = bech32_hrp_expand(hrp) + data
    polymod = bech32_polymod(values + [0,0,0,0,0,0]) ^ 1
    return [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]

def convertbits(data: bytes, from_bits: int, to_bits: int, pad: bool=True):
    acc = 0
    bits = 0
    result = []
    maxv = (1 << to_bits) - 1
    for b in data:
        acc = (acc << from_bits) | b
        bits += from_bits
        while bits >= to_bits:
            bits -= to_bits
            result.append((acc >> bits) & maxv)
    if pad and bits:
        result.append((acc << (to_bits - bits)) & maxv)
    return result

def bech32_encode(hrp: str, data: list) -> str:
    combined = data + bech32_create_checksum(hrp, data)
    return hrp + '1' + ''.join([CHARSET[d] for d in combined])

def generate_addresses(dec: int) -> dict:
    priv = bytes.fromhex(format(dec, '064x'))
    sk = ecdsa.SigningKey.from_string(priv, curve=ecdsa.SECP256k1)
    vk = sk.get_verifying_key().to_string()
    pub_uncompressed = b"\04" + vk
    x = vk[:32]
    y = vk[32:]
    prefix = b'\x02' if y[-1] % 2 == 0 else b'\x03'
    pub_compressed = prefix + x

    addr_legacy = base58_check(b'\x00', hash160(pub_uncompressed))
    addr_legacy_c = base58_check(b'\x00', hash160(pub_compressed))
    redeem_script = b'\x00\x14' + hash160(pub_compressed)
    addr_p2sh = base58_check(b'\x05', hash160(redeem_script))
    witprog = hash160(pub_compressed)
    data = [0] + convertbits(witprog, 8, 5)
    addr_bech32 = bech32_encode('bc', data)

    return {
        'Legacy_UNC': addr_legacy,
        'Legacy_CMR': addr_legacy_c,
        'P2SH': addr_p2sh,
        'BECH32': addr_bech32
    }

def search_chunk(start, step, trials, queue):
    buffer = []
    last_dump = time.time()
    for i in range(trials):
        dec = start + i * step
        addrs = generate_addresses(dec)
        ts = time.strftime('%H:%M:%S', time.localtime())
        hex_priv = format(dec, '064X')
        for typ, addr in addrs.items():
            addr_to_check = addr if CASE_SENSITIVE else addr.lower()
            m = pattern.match(addr_to_check)
            if m:
                mask = m.group(0)
                msg = f"{hex_priv}\t{typ:<13}\t{mask:<15}\t{addr:<47}\t{ts}"
                queue.put(msg)
                buffer.append(msg + "\n")
        if buffer and time.time() - last_dump >= INTERVAL:
            with open(OUTPUT_FILE, 'a') as out:
                out.writelines(buffer)
            buffer.clear()
            last_dump = time.time()
    if buffer:
        with open(OUTPUT_FILE, 'a') as out:
            out.writelines(buffer)

def printer(queue, sentinel):
    while True:
        line = queue.get()
        if line == sentinel:
            break
        print(line)

def main():
    open(OUTPUT_FILE, 'w').close()
    manager = Manager()
    queue = manager.Queue()
    sentinel = "__DONE__"

    t = threading.Thread(target=printer, args=(queue, sentinel), daemon=True)
    t.start()

    block_size = NUM_TRIALS // NUM_PROCESSES
    with ProcessPoolExecutor(max_workers=NUM_PROCESSES) as exe:
        for i in range(NUM_PROCESSES):
            start = START_VALUE + i * block_size * STEP
            if i == NUM_PROCESSES - 1:
                trials = NUM_TRIALS - block_size * (NUM_PROCESSES - 1)
            else:
                trials = block_size
            exe.submit(search_chunk, start, STEP, trials, queue)

    queue.put(sentinel)
    t.join()

if __name__ == "__main__":
    main()

List of masks (words.txt) https://drive.google.com/file/d/1PPqfD6UETawVwqrf4TKx29CaRJZu-4B2

https://i.postimg.cc/nL5Qhxtm/1.jpg
Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 01/04/2025, 15:07:42 UTC
There is also the possibility to form the entire block based on a single private key (0.2 BTC per block) or any single public key without private keys (0.05 BTC per block).  

Demo (part of the block): ...

Why would one pay 50 BTC for a script that simply multiplies a scalar key by lambda endomorphism, and curve point field elements by beta endomorphism (for X) and subtracts Y from field prime / negates the key?

Sorry to ruin your secret.

Hi! Well, a full 50 BTC? That definitely wasn’t my offer )) I discovered Lambda myself without even realizing that it had already been discovered before me. )

I didn’t quite understand how you use the lambda endomorphism to obtain the entire group without private keys...Wink
How about this kind of block (full with private keys)?

Single block design:
k        x        y
-------------------
A         27       K
B         27       L
C         H         K
D         H        L
E         J         K
F         J         L
-------------------
27+H+J=p

https://e.radikal.host/2025/03/06/2999bdf922e54c1d3.png
Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 29/03/2025, 17:26:26 UTC
New block

pk (A): 000000000000000000000000000024E76D35C791FE725652FEF636EF9BE3C9E0
gx (G): 8C1EC1FA62ACEDDEF7F56692CAA89258A59D0B35F11964CFE65A724EE623BB54
gy (K): 62B197CFCDF317F02A66E397C23D4164EADCA6DCA7ED8263198585F608752CAA

pk (B): FFFFFFFFFFFFFFFFFFFFFFFFFFFFDB174D791554B0D649E8C0DC279D34527761[/b]
gx (G): 8C1EC1FA62ACEDDEF7F56692CAA89258A59D0B35F11964CFE65A724EE623BB54
gy (L): 9D4E6830320CE80FD5991C683DC2BE9B1523592358127D9CE67A7A08F78ACF85

pk (C): 000000000000000000000000000042CB78C4E2A2A699BB6D5E7601EFDB714950
gx (H): 7554E357693B95B3825235CA10DCBE52E0BEC4A676C7EC2CFA850903809E6513
gy (K): 62B197CFCDF317F02A66E397C23D4164EADCA6DCA7ED8263198585F608752CAA

pk (D): FFFFFFFFFFFFFFFFFFFFFFFFFFFFBD3341E9FA4408AEE4CE615C5C9CF4C4F7F1
gx (H): 7554E357693B95B3825235CA10DCBE52E0BEC4A676C7EC2CFA850903809E6513
gy (L): 9D4E6830320CE80FD5991C683DC2BE9B1523592358127D9CE67A7A08F78ACF85

pk (E): 000000000000000000000000000067B2E5FAAA34A50C11C05D6C38DF77551330
gx (J): FE8C5AAE34177C6D85B863A3247AAF5479A43023981EAF031F2084AB993DD7F7
gy (L): 9D4E6830320CE80FD5991C683DC2BE9B1523592358127D9CE67A7A08F78ACF85

pk (F): FFFFFFFFFFFFFFFFFFFFFFFFFFFF984BD4B432B20A3C8E7B626625AD58E12E11
gx (J): FE8C5AAE34177C6D85B863A3247AAF5479A43023981EAF031F2084AB993DD7F7
gy (K): 62B197CFCDF317F02A66E397C23D4164EADCA6DCA7ED8263198585F608752CAA

Single block design:
pk     gx     gy
------------------
A      G      K
B      G      L
C      H      K
D      H      L
E      J       K
F      J       L
------------------
Post
Topic
Board Bitcoin Technical Support
Merits 3 from 2 users
Re: Bitcoin Core Stuck at Block 623950
by
kreosan
on 14/03/2025, 09:50:15 UTC
⭐ Merited by philipma1957 (2) ,nc50lc (1)
Just take note that "combo" descriptor is pointless on a WIF private key without the compressed flag byte since the other two SegWit output scripts wont be derived from it.
Otherwise, it'll be non-standard.

You don't have to re-import it as 'pkh' though since it basically did that already, it just skipped the 'wpkh' and 'sh(wpkh)' scripts of the combo descriptor.

I have both a compressed and an uncompressed WIF private key. On the latest version of Bitcoin Core, no matter what commands I tried Smiley, I was only able to add Legacy (Compressed), P2SH-P2WPKH, SegWit, and Taproot... But I couldn't manage to add a Legacy uncompressed address!

I took extreme measures and decided to install version 20.1, where I was able to add a Legacy uncompressed address, but I ran into a synchronization issue.

With 'combo,' it worked right away.
Post
Topic
Board Bitcoin Technical Support
Re: Bitcoin Core Stuck at Block 623950
by
kreosan
on 13/03/2025, 13:25:40 UTC
Thanks everyone for the help! I installed version 26, and using 'combo', the legacy address was added!
As for the glitchy block, I still have a bad aftertaste – spent 4 days dealing with it.
Post
Topic
Board Bitcoin Technical Support
Merits 1 from 1 user
Re: Bitcoin Core Stuck at Block 623950
by
kreosan
on 12/03/2025, 20:20:00 UTC
⭐ Merited by NotFuzzyWarm (1)
I'd start by upgrading Bitcoin Core to a more recent version. Maybe not the latest, so you're not forced to switch to a descriptor wallet, but 0.26 for instance is a lot newer and still supports legacy wallets.

Thank u for the reply! As far as I know, version 20.1 is the last version that supports Berkeley DB, allowing the addition of legacy uncompressed addresses to the wallet...
And even if I import a wallet created with version 20.1 with legacy addresses (non-descriptor) into the latest version of Bitcoin Core, problems arise and there are a lot of workarounds!
I would prefer to stick with a version that supports Berkeley DB...



May I suggest you learn to use the code tag # in the future to reduce text walls down to a scrollable window that is easier to look at.
....


Sorry... I will do it like that in the future
Post
Topic
Board Bitcoin Technical Support
Merits 9 from 3 users
Topic OP
Bitcoin Core Stuck at Block 623950
by
kreosan
on 12/03/2025, 18:55:52 UTC
⭐ Merited by LoyceV (4) ,pooya87 (4) ,ABCbits (1)
Bitcoin Core 20.1 https://bitcoincore.org/bin/bitcoin-core-0.20.1 (bitcoin-0.20.1-x86_64-linux-gnu.tar.gz // ubuntu 24.04) with Berkeley DB (prune=14000) stops syncing at block 623950 with the following error:
ERROR: ConnectBlock: CheckQueue failed 
InvalidChainFound: invalid block=0000000000000000000b1efa2e2c7e7dfa9800dfd66e90e5efbe5530c803da43 height=623951 

Tried:

-reindex-chainstate
reconsiderblock
Connecting to different peers
Deleting chainstate
-assumevalid=0
A full -reindex .... Sad

2025-03-12T15:05:55Z UpdateTip: new best=00000000000000000008ab700bbd8c0413ebeb3ac9c67c620bf0310c2f7ca10e height=623944 version=0x37ffe000 log2_work=91.817949 tx=517174209 date='2020-04-01T17:26:54Z' progress=0.500669 cache=444.9MiB(2882282txo)
2025-03-12T15:05:55Z UpdateTip: new best=0000000000000000000706d6f7f39581ff16d31cb9e58082cd78a9c2b05278e8 height=623945 version=0x27ffe000 log2_work=91.817968 tx=517176653 date='2020-04-01T17:35:58Z' progress=0.500671 cache=445.1MiB(2883850txo)
2025-03-12T15:05:55Z UpdateTip: new best=000000000000000000122ec39ee5adcd79e8f247993dc70a90842dfbc3037f0d height=623946 version=0x3fffe000 log2_work=91.817988 tx=517179261 date='2020-04-01T17:37:26Z' progress=0.500673 cache=445.2MiB(2884582txo)
2025-03-12T15:05:56Z UpdateTip: new best=0000000000000000000742f52cba2bec3a1a5b555e4bd04b6d320d39b586c662 height=623947 version=0x20800000 log2_work=91.818008 tx=517181422 date='2020-04-01T17:40:17Z' progress=0.500676 cache=445.2MiB(2884644txo)
2025-03-12T15:05:56Z Pre-allocating up to position 0x800000 in rev02019.dat
2025-03-12T15:05:56Z UpdateTip: new best=0000000000000000000ba251bf6b2f9eb9f12f7db7092f3f7b394733d631d9ec height=623948 version=0x2fffe000 log2_work=91.818028 tx=517182999 date='2020-04-01T17:42:23Z' progress=0.500677 cache=445.5MiB(2887183txo)
2025-03-12T15:05:56Z UpdateTip: new best=000000000000000000113b44d51deb2224807c4afc1badfe92909b4bd328ca9f height=623949 version=0x3fffe000 log2_work=91.818047 tx=517184268 date='2020-04-01T17:46:43Z' progress=0.500678 cache=446.0MiB(2890983txo)
2025-03-12T15:05:56Z UpdateTip: new best=0000000000000000000f2adce67e49b0b6bdeb9de8b7c3d7e93b21e7fc1e819d height=623950 version=0x2000e000 log2_work=91.818067 tx=517186863 date='2020-04-01T18:13:31Z' progress=0.500681 cache=446.4MiB(2894549txo)
2025-03-12T15:05:57Z ERROR: ConnectBlock: CheckQueue failed
2025-03-12T15:05:57Z InvalidChainFound: invalid block=0000000000000000000b1efa2e2c7e7dfa9800dfd66e90e5efbe5530c803da43  height=623951  log2_work=91.818087  date=2020-04-01T18:25:42Z
2025-03-12T15:05:57Z InvalidChainFound:  current best=0000000000000000000f2adce67e49b0b6bdeb9de8b7c3d7e93b21e7fc1e819d  height=623950  log2_work=91.818067  date=2020-04-01T18:13:31Z
2025-03-12T15:05:57Z ERROR: ConnectTip: ConnectBlock 0000000000000000000b1efa2e2c7e7dfa9800dfd66e90e5efbe5530c803da43 failed, block-validation-failed
2025-03-12T15:05:57Z InvalidChainFound: invalid block=0000000000000000000fbc14816a32e9b27495cddf75ac2b7299012bcc0068ae  height=623982  log2_work=91.818699  date=2020-04-01T23:28:09Z
2025-03-12T15:05:57Z InvalidChainFound:  current best=0000000000000000000f2adce67e49b0b6bdeb9de8b7c3d7e93b21e7fc1e819d  height=623950  log2_work=91.818067  date=2020-04-01T18:13:31Z
2025-03-12T15:05:57Z Disconnecting and discouraging peer 16.162.137.92:8333!
2025-03-12T15:05:57Z Pre-allocating up to position 0x3000000 in blk02022.dat
2025-03-12T15:05:58Z Pre-allocating up to position 0x4000000 in blk02022.dat
2025-03-12T15:05:58Z New outbound peer connected: version: 70016, blocks=887484, peer=329 (block-relay)
2025-03-12T15:05:59Z Pre-allocating up to position 0x5000000 in blk02022.dat
2025-03-12T15:05:59Z Pre-allocating up to position 0x6000000 in blk02022.dat
2025-03-12T15:06:00Z Pre-allocating up to position 0x7000000 in blk02022.dat
2025-03-12T15:06:01Z Pre-allocating up to position 0x8000000 in blk02022.dat
2025-03-12T15:06:02Z Leaving block file 2022: CBlockFileInfo(blocks=115, size=133417269, heights=623589...624392, time=2020-03-30...2020-04-04)
2025-03-12T15:06:02Z Pre-allocating up to position 0x1000000 in blk02023.dat
2025-03-12T15:06:03Z Pre-allocating up to position 0x2000000 in blk02023.dat
2025-03-12T15:06:04Z Pre-allocating up to position 0x3000000 in blk02023.dat
2025-03-12T15:06:04Z Pre-allocating up to position 0x4000000 in blk02023.dat
2025-03-12T15:06:05Z Pre-allocating up to position 0x5000000 in blk02023.dat
2025-03-12T15:07:32Z ERROR: AcceptBlockHeader: prev block invalid
2025-03-12T15:07:32Z Disconnecting and discouraging peer 109.224.244.192:8333!
2025-03-12T15:07:32Z ERROR: AcceptBlockHeader: prev block invalid
2025-03-12T15:07:32Z Disconnecting and discouraging peer 188.214.129.26:8333!
2025-03-12T15:07:32Z ERROR: AcceptBlockHeader: prev block invalid
2025-03-12T15:07:32Z Disconnecting and discouraging peer 95.217.160.34:8333!
2025-03-12T15:07:33Z ERROR: AcceptBlockHeader: prev block invalid
2025-03-12T15:07:33Z Disconnecting and discouraging peer 209.237.133.54:8333!

Any help would be greatly appreciated!
Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 10/03/2025, 10:18:42 UTC
up
Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 08/03/2025, 19:52:46 UTC
up
Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 07/03/2025, 17:24:43 UTC
up
Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 06/03/2025, 19:00:11 UTC
There is also the possibility to form the entire block based on a single private key (0.2 BTC per block) or any single public key without private keys (0.05 BTC per block).  

Demo (part of the block): ...

Why would one pay 50 BTC for a script that simply multiplies a scalar key by lambda endomorphism, and curve point field elements by beta endomorphism (for X) and subtracts Y from field prime / negates the key?

Sorry to ruin your secret.

Hi! Well, a full 50 BTC? That definitely wasn’t my offer )) I discovered Lambda myself without even realizing that it had already been discovered before me.

I didn’t quite understand how you use the lambda endomorphism to obtain the entire group without private keys...
How about this kind of block?

Single block design:
pk   gx   gy
----------------
A   27   K
B   27   L
C   U   K
D   U   L
E   Y   K
F   Y   L
----------------

Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 05/03/2025, 08:24:09 UTC
up
Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 04/03/2025, 08:21:12 UTC
up
Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 03/03/2025, 08:49:20 UTC
up
Post
Topic
Board Bitcoin Discussion
Re: SECP256K1 Bitcoin - Fully formed sequential group of blocks curve
by
kreosan
on 02/03/2025, 09:43:09 UTC
up
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
kreosan
on 01/03/2025, 16:10:31 UTC

..........

Seriously..

1.Chose whatever range, like I said, for the moment I have tested until puzzle 130, generate Yourself a hex private key in between chosen range and get the address.
2 Convert the hash160 of that address to decimal string.
3.Convert the hexadecimal private key to decimal as well,
4 Now using a big integer calculator for example http://www.javascripter.net/math/calculators/100digitbigintcalculator.htm ( I am also using it ) divide the decimal string of hash160 by decimal version of private key
5.The resulting string now You have to multiply times decimal private key.
6 That multiplication will result with a long string of course but quite similar with the first digits like so basically that string will be required by me.

Tested your theory... There's something to it, but very insignificantly. And with additional tests, it tends to ordinary chaos... Wink

----
PK (hex): 000000000000000000000000000000020000000000000000000000E8D4A50FFF
ADR: 13qD8Bs6Kx8gQmuH7hWVfWTHPBXRGJ94aW
hash160 (hex): 1f0e5698f426c93197f6fe4561913d2dca7b0f56
hash160 (dec): 177298468032361376284751942974563620350777298774
PK (dec): 680564733841876926926749215863536422911
Quotient from division: 260516684
Result of quotient * private_key_dec: 177298467707828357339067016616368705409995347124

hash160: 177298468032361376284751942974563620350777298774
Prod: 177298467707828357339067016616368705409995347124
Post
Topic
Board Bitcoin Discussion
Topic OP
Fully formed sequential group of blocks curve
by
kreosan
on 01/03/2025, 09:50:51 UTC
A fully formed sequential group of blocks secp is for sale, where A...F are private keys, G...J are public keys part 1 (gx), and K...L are public keys part 2 (gy). 
Group of blocks are formed sequentially with odd 'A' at an interval of 1.
Total number of blocks: 50. Price: 10 BTC. 

I can also generate block of public keys (without private keys) based on any initial public key. Price: 0.05 BTC. 

For questions, send a private message!

Demo (part of the block):
pk: 4bb7b36f21ecb0d1f022e94a4cbc0447fc8d38ecc2bcfedfbb0074f3651641bb
gx: bfb810ded91b7b6b7b75d16d77bdaea9c058b2221581feaeb7b0e709cbc79ae3
gy: 6a07eb895682e6fdb724888516f6bf469d9159e5f1b76a33b404dd58ddbd3bd5

pk: b369c959cdee340a885c4c47ef198513537f28a32be2c3799e3b42c4f5fac1c1
gx: f2e25c0854a08991bf91dae028a38dbe4e35341ab8c037915f2bdd8529df8299
gy: 6a07eb895682e6fdb724888516f6bf469d9159e5f1b76a33b404dd58ddbd3bd5

pk: b4484c90de134f2e0fdd16b5b343fbb6be21a3f9ec8ba15c04d1e9996b1fff86
gx: bfb810ded91b7b6b7b75d16d77bdaea9c058b2221581feaeb7b0e709cbc79ae3
gy: 95f81476a97d190248db777ae90940b9626ea61a0e4895cc4bfb22a62242c05a

pk: 4c9636a63211cbf577a3b3b810e67aeb672fb4438365dcc221971bc7da3b7f80
gx: f2e25c0854a08991bf91dae028a38dbe4e35341ab8c037915f2bdd8529df8299
gy: 95f81476a97d190248db777ae90940b9626ea61a0e4895cc4bfb22a62242c05a

Single block design:
pk   gx   gy
------------------
A   G   K
B   G   L
C   H   K
D   H   L
E   J   K
F   J   L
------------------