Farklı iki txt dosyasının kombinasyonu

Bana göre ilginç, ama verdiğin fonksiyonun çalışma mantığına göre mantıklı bir durum var.

Hata alıyoruz, çünkü;

9931101114120119

Mesela yukarıdaki sayı, compressed için anlamlı değil ve hata veriyor.

Yani böyle sıkıştırılmış bir key için hata oluşuyor. Neden sorma, bitcoin modülündeki ve fonksiyonu içindekiler için hiç zaman harcamak istemedim.

Yani her sayının sıkıştırılmış key ini vermiyor. Hexadecimal olarak 9931101114120119 çalışmıyo yani.

Başta düşündüğüm gibi, try except içine alıp, çıkaramazsa devam ediyor.

Böyle olabileceğini düşündüğüm için zaten iki fonksiyona bölmüştüm.

Fakat şu haliyle tek fonksiyon olarak hazırladığım kodu paylaşacağım. Çünkü except esnasında anahtar atlıyor olabilir dikkat etmedim denemedim.

Ama şu haliye çalışır durumda, en azından doğru yoldamıyız, istediğinizi karşılıyor mu bakmak adına paylaşıyorum.

from time import process_time
import bitcoin

filehandle1 = open('file1.txt', mode="r") # First file
filehandle2 = open('file2.txt', mode="r") # Second file
filehandle3 = open('file3.txt', mode="r") # Check for combine
filehandle4 = open('file4.txt', 'w') # Equal list file

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())
filehandle1.seek(0)

count =0
t1_start = process_time() 


def convert_key(kod) :
    valid_private_key = False

    while not valid_private_key:
        private_key = kod
        decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
        valid_private_key = 0 < decoded_private_key < bitcoin.N
        
    wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')
    compressed_private_key = private_key + '01'
    wif_compressed_private_key = bitcoin.encode_privkey(bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
    public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
    hex_encoded_public_key = bitcoin.encode_pubkey(public_key, 'hex')
    (public_key_x, public_key_y) = public_key
    if (public_key_y % 2) == 0:
        compressed_prefix = '02'
    else:
        compressed_prefix = '03'
    hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
    
    return  bitcoin.pubkey_to_address(public_key), bitcoin.pubkey_to_address(hex_compressed_public_key)

while True:
    line1 = filehandle1.readline()
    count = count+1
    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()

        if not line2:
            filehandle2.seek(0)
            break
        # Compressed Coin Check/   To check coin adress use coin_adress() here 
        
        try:
             compare_key, compare_key_compressed = convert_key(line1.strip()+line2.strip())
        except:
            continue
        
        while True:
            line3 =  filehandle3.readline()
         
            if not line3:
                filehandle3.seek(0)
                break
            
            if (line3 == compare_key) or (line3 == compare_key_compressed ) :
                filehandle4.write(line3)
     
    print("Processing: %"+"%0.4f"% ((count/filecount)*100))
    
t1_stop = process_time()
print("Elapsed time in seconds:", t1_stop-t1_start)

filehandle1.close()
filehandle2.close()
filehandle3.close()
filehandle4.close()

Mesela bana gönderdiğin dosyalarda bir tane yakaladı sadece;

1Hk9oEZj5mUYRCtq35QRVEj9oMfiMLsPjB

İnceleyin, üzerinde çalışalım.

2 Beğeni
from time import process_time
import bitcoin

filehandle1 = open('file1.txt', mode="r") # First file
filehandle2 = open('file2.txt', mode="r") # Second file
filehandle3 = open('file3.txt', mode="r") # Check for combine
filehandle4 = open('file4.txt', 'w') # Equal list file

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())
filehandle1.seek(0)

count =0
t1_start = process_time() 


def convert_key(kod) :
    valid_private_key = False

    while not valid_private_key:
        private_key = kod
        decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
        valid_private_key = 0 < decoded_private_key < bitcoin.N
        
    wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')
    compressed_private_key = private_key + '01'
    wif_compressed_private_key = bitcoin.encode_privkey(bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
    public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
    hex_encoded_public_key = bitcoin.encode_pubkey(public_key, 'hex')
    (public_key_x, public_key_y) = public_key
    if (public_key_y % 2) == 0:
        compressed_prefix = '02'
    else:
        compressed_prefix = '03'
    hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
    
    return  bitcoin.pubkey_to_address(public_key), bitcoin.pubkey_to_address(hex_compressed_public_key)

while True:
    line1 = filehandle1.readline()
    count = count+1
    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()

        if not line2:
            filehandle2.seek(0)
            break
        # Compressed Coin Check/   To check coin adress use coin_adress() here 
        
        try:
             compare_key, compare_key_compressed = convert_key(line1.strip()+line2.strip())
        except:
            pass
        
        while True:
            line3 =  filehandle3.readline()
         
            if not line3:
                filehandle3.seek(0)
                break
            
            if (line3 == compare_key) or (line3 == compare_key_compressed ) :
                filehandle4.write(line3)
     
    print("Processing: %"+"%0.4f"% ((count/filecount)*100))
    
t1_stop = process_time()
print("Elapsed time in seconds:", t1_stop-t1_start)

filehandle1.close()
filehandle2.close()
filehandle3.close()
filehandle4.close()

Bu tek fonksiyon ile continue yerine pass geçip decam etsin şeklinde 1. Düzenlemem.

Alttaki de fonksiyonu iki kere tanımlayıp ayrı ayrı kullanabilmek için tanımlamam.

İki fonksiyonu da ayrı ayrı incelemeniz gerekirse birini çağırırsınız diye yaptım. Sanırım çıktı formatında düzenleme isteyebilirsin onu için bu da bulunsun bakalım.

from time import process_time
import bitcoin

filehandle1 = open('file1.txt', mode="r") # First file
filehandle2 = open('file2.txt', mode="r") # Second file
filehandle3 = open('file3.txt', mode="r") # Check for combine
filehandle4 = open('file4.txt', 'w') # Equal list file

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())
filehandle1.seek(0)

count =0
t1_start = process_time() 


def convert_key(kod) :
    valid_private_key = False

    while not valid_private_key:
        private_key = kod
        decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
        valid_private_key = 0 < decoded_private_key < bitcoin.N
        
    wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')
    compressed_private_key = private_key + '01'
    wif_compressed_private_key = bitcoin.encode_privkey(bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
    public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
    hex_encoded_public_key = bitcoin.encode_pubkey(public_key, 'hex')
    (public_key_x, public_key_y) = public_key
    if (public_key_y % 2) == 0:
        compressed_prefix = '02'
    else:
        compressed_prefix = '03'
    hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
    
    return  bitcoin.pubkey_to_address(public_key)
    
def convert_key_compressed(kod) :
    valid_private_key = False

    while not valid_private_key:
        private_key = kod
        decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
        valid_private_key = 0 < decoded_private_key < bitcoin.N
        
    wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')
    compressed_private_key = private_key + '01'
    wif_compressed_private_key = bitcoin.encode_privkey(bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
    public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
    hex_encoded_public_key = bitcoin.encode_pubkey(public_key, 'hex')
    (public_key_x, public_key_y) = public_key
    if (public_key_y % 2) == 0:
        compressed_prefix = '02'
    else:
        compressed_prefix = '03'
    hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
    
    return bitcoin.pubkey_to_address(hex_compressed_public_key)


while True:
    line1 = filehandle1.readline()
    count = count+1
    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()

        if not line2:
            filehandle2.seek(0)
            break
        # Compressed Coin Check/   To check coin adress use coin_adress() here 
        compare_key = convert_key(line1.strip()+line2.strip())
        
        try:
            compare_key_compressed = convert_key_compressed(line1.strip()+line2.strip())
        except:
            pass
        
        while True:
            line3 =  filehandle3.readline()
         
            if not line3:
                filehandle3.seek(0)
                break
            
            if (line3 == compare_key) or (line3 == compare_key_compressed ) :
                filehandle4.write(line3)
     
    print("Processing: %"+"%0.4f"% ((count/filecount)*100))
    
t1_stop = process_time()
print("Elapsed time in seconds:", t1_stop-t1_start)

filehandle1.close()
filehandle2.close()
filehandle3.close()
filehandle4.close()

1 Beğeni

Abi dediğiniz gibi bende kaç defadır deneme yapıyorum
ilginç bir şekilde sadece 1Hk9oEZj5mUYRCtq35QRVEj9oMfiMLsPjB adresini buluyor halbuki adres listesindeki 10 adresinde bulunabilmesi gerekiyor çünkü geriye kalan 9 adresi de yine aynı dosyadan örnek olsun diye ürettik

Abi şimdi biraz daha kurcalayınca şunu fark ettim
1Hk9oEZj5mUYRCtq35QRVEj9oMfiMLsPjB adresinin hex kodu 993110112712011D
Ama diğer adreslerin hex kodları sıralamada bundan sonra oluşuyor
Demek ki birincinin ilk adresini üretip bulduktan sonra görevi tamamladığını sanıp işlemi bitiriyor

Takipteyim, konu ilginç bir şekilde gelişmiş :laughing:

2 Beğeni

Bi noktada byte yerine string yollandigi icin hata vardi ama resim icinde; cevaplamaya usendim. Duzeldi mi acaba…

1 Beğeni
from time import process_time
import bitcoin

filehandle1 = open('file1.txt', mode="r") # First file
filehandle2 = open('file2.txt', mode="r") # Second file
filehandle3 = open('file3.txt', mode="r") # Check for combine
filehandle4 = open('file4.txt', 'w') # Equal list file

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())
filehandle1.seek(0)

count =0
t1_start = process_time() 


def convert_key(kod) :
    valid_private_key = False

    while not valid_private_key:
        private_key = kod
        decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
        valid_private_key = 0 < decoded_private_key < bitcoin.N
        
    wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')
    compressed_private_key = private_key + '01'
    wif_compressed_private_key = bitcoin.encode_privkey(bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
    public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
    hex_encoded_public_key = bitcoin.encode_pubkey(public_key, 'hex')
    (public_key_x, public_key_y) = public_key
    if (public_key_y % 2) == 0:
        compressed_prefix = '02'
    else:
        compressed_prefix = '03'
    hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
    
    return  bitcoin.pubkey_to_address(public_key)
    
def convert_key_compressed(kod) :
    valid_private_key = False

    while not valid_private_key:
        private_key = kod
        decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
        valid_private_key = 0 < decoded_private_key < bitcoin.N
        
    wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')
    compressed_private_key = private_key + '01'
    wif_compressed_private_key = bitcoin.encode_privkey(bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
    public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
    hex_encoded_public_key = bitcoin.encode_pubkey(public_key, 'hex')
    (public_key_x, public_key_y) = public_key
    if (public_key_y % 2) == 0:
        compressed_prefix = '02'
    else:
        compressed_prefix = '03'
    hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
    
    return bitcoin.pubkey_to_address(hex_compressed_public_key)


while True:
    line1 = filehandle1.readline()
    count = count+1
    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()

        if not line2:
            filehandle2.seek(0)
            break
        # Compressed Coin Check/   To check coin adress use coin_adress() here 
        compare_key = convert_key(line1.strip()+line2.strip())
        
        try:
            compare_key_compressed = convert_key_compressed(line1.strip()+line2.strip())
        except:
            pass
        print("Concat Data:", line1.strip()+line2.strip())
        print("compare_key Data:", compare_key)
        print("comparet_key_compressed", compare_key_compressed)
        
        while True:
            line3 =  filehandle3.readline()
         
            if not line3:
                filehandle3.seek(0)
                break
            
            if (line3 == compare_key) or (line3 == compare_key_compressed ) :
                filehandle4.write(line3)
     
    print("Processing: %"+"%0.4f"% ((count/filecount)*100))
    
t1_stop = process_time()
print("Elapsed time in seconds:", t1_stop-t1_start)

filehandle1.close()
filehandle2.close()
filehandle3.close()
filehandle4.close()

Karşılaştırmada kullandığı hex, oluşan key ve sıkışıtırılmış key datalarını print ile ekrana bastırdım.

Sizi fonksiyon bir şeyler yapıyor ama ne yapıyor bir şey diyemem.

Datayı azaltıp bakın bir şey bulursanız kodu ona göre düzenleriz.

Fonksiyon haline getirdiğim kısımda bitcoin modülü ne yapıyorsa o, dediğim gibi tüm modülün çalışma şeklini incelememi beklemeyin. :slight_smile:

Sayın @aib hocam, ben de sizin gibi hata mesajı üzerinden gittim. byte yerine string girdiğinden hata olabilir diye.

Kullandıkları ilk kod parçası input ile raw input alıyor.

Fonksiyon haline getirirken ben variant bıraktım.

    while not valid_private_key:
        private_key = kod
        decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
        valid_private_key = 0 < decoded_private_key < bitcoin.N

bitcoin.decode.privatekey() fonksiyonu,

UTF-8 stringi çevirip byte vs nerede ne işleme tabi tutuyor devamını takip etmedim.

UTF-8 olarak dosyaları ve veriyi formatlayıp gönderdim değişen bir şey olmadı.

valid_private_key = 0 < decoded_private_key < bitcoin.N

satırında geçerli kabulü, bitcoin.N dahi nedir bakmak gerekiyor.

Fonksiyon yada kod satırı olarak modülü öğrenmek istemedim. :slight_smile:

Yani çözüldü diyemem.

Mesela “9931101114120118” den bir şeyler döndürürken, “9931101114120119” hata veriyor.

Sıkıştırılmış anahtar oluşturma algoritması ile alakalı, normal key oluşturulurken sorun oluşmuyor.

Bu kısımda kendi algoritmaları ile alakalı, kesin bir nedeni vardır ama ben ne o kısmını merak ettim ne de nasıl çalıştığına dair fikir edinmek niyetinde değilim.

Sadece fonksiyona her formatta veri yolladım, değişen hiç bir durum yok. Söz konusu kendi kodlarının “9931101114120119” ve üzeri sayılara alerjisi var.

Okusak onun da mantığı vardır, bit coin için adres anahtarları şu aralıktadır gibi ama hiç oralara giremem, block chain, token , coin sever biri değilim :slight_smile: Ön yargılarım var. Ama ben ne sevmesem tutmaz desem alır başını gider o da ayrı mevzu.

Ha sorunu nasıl düzelttik dersek,

Tahminde bulundum.

Sıkıştırılmış bir anahtar arıyorsak, muhtemelen sıkıştırma her sayıya tekabül etmez.

Bu durumda yaklaşım doğru mudur tartışmaya açık.

Her verdiğimiz hex yada string, sıkıştırılmış anahtara dönüştürülemez (bu benim teorim)

Aklıma CRC, checksum gibi konular gelince.

Bırak fonksiyon dağınık kalsın dedim.

try:

except:

pass:

Üçlüsüyle fonksiyonu hata yaptığında sal gitsin yaptım.

1 Beğeni

İlginç olmaz mı? Siz bir de bana sorun.

Aslında konu çok basit.

9931101114
9931101116
9931101117

Gibi verileri var birinci dosyada.

120111
120112
120113

ikinci dosyada da böyle veriler.

“9931101114” + “120111” = 9931101114120111
“9931101114” + “120112” =9931101114120112

Gibi birinci dosyadaki ile ikinci dosyadakilerin kombinasyonunu oluşturttular.

Neden 16 basamaklı bir veri 10 ve 6 basamak halinde parçalar halinde ben de bilmiyorum.

Birleştiğinde 16 basamaklı veri muhtemelen anahtar.

Bunları bitcoin, key ve compressed key oluşturmak için kullanıyorlar.

Oluşan anahtarları da, sahip oldukları üçüncü bir dosyada arıyorlar.

Ben neden kodu while döngüsü ile yaptım.

C ve türevi diller ile pascal da olduğu gibi, dosyanın sonuna kadar git mantığıyla seviyorum.

Python güzel bir çözüm bulmuş, with ile çözüyor olayı.

Ama belleğe ne yükledi nasıl çalıştı arka planına bu kadar büyük dosyada kafa yormamak için iç içe iki while döngüsü ile anahtar varyasyonlarını oluşturdum.

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())

gibi bir kodla dosyadaki kayıt sayısını almak için bile ciddi bir süre bekleme yaptığını görünce. while döngüsünü tercih ettim. Sonunu düşünen kodu bitiremez deyip, sonu gelince durursun zaten mantığına döndüm.

üçüncü bir döngü ile de üçüncü dosyada oluşan anahtar var mı diye kontrol ettirdim.

Yani aslında, öğrenciye ödev sorusu olacak kadar basit.

Velakin asıl benim de merak ettiğim.

Bu anahtarlar neden iki parça, neden bitcoin modülü ile keyler oluşturuyoruz, bu üçüncü dosyadaki verileri bulunca ne yapacağız ve nereden bulduk.

Tabi ben bu kısımdan vaz geçtim. Akışa bıraktım, kafalarına göre takılıyorlar.

Ben sadece, kod emekçisi oldum bu başlıkta.

Ne yapacakları ve ne sonuca ulaştığı belli olsun.

Tüm kodu baştan aşağı optimize ederiz.

Ne isteyecekleri belli olmadığından, bu şekilde kodu dağınık her yöne açık bıraktım.

Bu arada iki tür katılımcı var, öğrenmek isteyen bir de işini görüp gitmek isteyen.

Bu işini görüp gitmek isteyen gurubu.

İşleri biterse pek kodun bu kısımlarını öğrenme dertleri olmadığı için ihtiyaçlarına göre kodu şekillendiriyorum.

Katkılara ve eleştiriye açığım.

Şu an şuursuzca ne yaptığımızı bilmeden kod yazıyoruz.

C ve türevlerini kullanan birinin şuursuzca varyant, string ve bytler ı bu kadar kontrolsüz çevirmesinin ızdırabını anlayabilir misiniz bilmiyorum. :slight_smile:

4 Beğeni

Arkadaşlar kodumuzu Semtex beyin çok büyük desteği ve Then_Shiffmanında yardımıyla tamamladık her ikisinede çok teşekkür ederim

Yalnız şöyle bir problemimiz daha var
bu defa veriler büyük olduğu için işlemesi günlerce sürmektedir.

Bilgisayarımız Hp Omen i7 7g
8 çekirdekli ve 16gb ram
C sürücüsü 120gb ssd (windows 10 burada yüklü)
D sürücüsü 1tb hdd

Kodumuzu Visual Studio Code - Python üzerinden çalıştırıyoruz
Lakin dikkat ettik ki program cpu’nun sadece %10 kullanıyor

Sistem ayarlarından 8 çekirdeği aktif ettik
ama hiçbir değişiklik yok hala 1 çekirdek kullanılıyor gibi

Biraz araştırma yapınca bunun için Multi Thread ve/veya Multi Process kullanmamız gerektiğini öğrendik
Ama bunları kodumuza uygulayamadık
Yardımcı olabilecek varsa müteşekkir oluruz.

from time import process_time
import bitcoin

 # Bu sadece compressed adresleri buluyor

filehandle1 = open('file1.txt', mode="r") # First file
filehandle2 = open('file2.txt', mode="r") # Second file
filehandle3 = open('file3.txt', mode="r") # Check for combine
filehandle4 = open('file4.txt', 'w') # Equal list file

print("Wait for counting records first file...")
filecount = len(filehandle1.readlines())
filehandle1.seek(0)

count =0
t1_start = process_time() 


def convert_key(kod) :
    valid_private_key = False

    while not valid_private_key:
        private_key = kod
        decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
        valid_private_key = 0 < decoded_private_key < bitcoin.N
        
    
    compressed_private_key = private_key + '01'
    wif_compressed_private_key = bitcoin.encode_privkey(bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
    public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
    
    (public_key_x, public_key_y) = public_key
    if (public_key_y % 2) == 0:
        compressed_prefix = '02'
    else:
        compressed_prefix = '03'
    hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
    
    return  bitcoin.pubkey_to_address(public_key)
    
def convert_key_compressed(kod) :
    valid_private_key = False

    while not valid_private_key:
        private_key = kod
        decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
        valid_private_key = 0 < decoded_private_key < bitcoin.N
        
    
    compressed_private_key = private_key + '01'
    wif_compressed_private_key = bitcoin.encode_privkey(bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
    public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
    
    (public_key_x, public_key_y) = public_key
    if (public_key_y % 2) == 0:
        compressed_prefix = '02'
    else:
        compressed_prefix = '03'
    hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
    
    return bitcoin.pubkey_to_address(hex_compressed_public_key)


while True:
    line1 = filehandle1.readline()
    count = count+1
    if not line1:
        break
    
    while True:
        line2 = filehandle2.readline()

        if not line2:
            filehandle2.seek(0)
            break
        # Compressed Coin Check/   To check coin adress use coin_adress() here 
        
        
        try:
            compare_key_compressed = convert_key_compressed(line1.strip()+line2.strip())
        except:
            pass
             
        while True:
            line3 =  filehandle3.readline()
         
            if not line3:
                filehandle3.seek(0)
                break
            #print(line3, compare_key, compare_key_compressed)
            #input()
            if (line3.strip() == compare_key_compressed.strip() ) :
                filehandle4.write(line1.strip()+line2.strip()+' : ')
                filehandle4.write(line3.rstrip()+'\n')
     
    print("Processing: %"+"%0.6f"% ((count/filecount)*100))
    
t1_stop = process_time()
print("Elapsed time in seconds:", t1_stop-t1_start)

filehandle1.close()
filehandle2.close()
filehandle3.close()
filehandle4.close()