Zagadki związane z BTC

Weteran
Posty: 2518
Rejestracja: 21 marca 2014
Reputacja: 1468
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: The Real McCoin » niedziela, 12 marca 2017, 11:01

rav3n_pl pisze: ./bitcoin-cli
A może by tak rozwiązać zagadkę bez opuszczania przeglądarki?
Tak żeby użytkownicy nie posiadający pełnego klienta, czy innych narzędzi (coś czuję, że zaraz zaczniesz pisać jakiś program w .Net ;)), mogli sobie sami zreprodukować wszystkie kroki, łącznie z ostatecznym zweryfikowaniem ułożonego scriptSig.

Dodano po 15 minutach 42 sekundach:
Natomiast jeżeli ktoś jest tak dobry, że taką zagadkę rozwiązuje w 5 minut, ale nie chciałby jeszcze jej palić dla innych, to może na razie podać tylko hasz rozwiązania, dowodząc, że już na dany moment je znał, a to co generuje podany hasz zweryfikujemy później.

pm7
Weteran
Posty: 7893
Rejestracja: 20 maja 2012
Reputacja: 969
Reputacja postu: 
1
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: pm7 » niedziela, 12 marca 2017, 11:43

The Real McCoin pisze: A może by tak rozwiązać zagadkę bez opuszczania przeglądarki?
Prawie wszystkie narzędzia da się znaleźć w wersji online, więc nie bardzo widzę powód, żeby się ograniczać. Jak ktoś chce odtworzyć kroki, może albo poszukać zamienników, albo spróbować sam znaleźć inną drogę do rozwiązania.
Np. skrypt można zdekodować tutaj: https://chainquery.com/bitcoin-api/decodescript
Ja spróbowałem Pythonem złamać pierwszy hash, ale niestety nic nie znalazłem :(
Można użyć jakiegoś Python online, ale po co jak ma się środowisko na komputerze?

Kod: Zaznacz cały

import hashlib

def hash256(x):
    x=str(x)
    x=hashlib.sha256(x).hexdigest()
    return hashlib.sha256(x).hexdigest()

wynik="f892622601e484bc3ed1ed952007843dc84a0af359007cb37e962376b0b70f87"
rang=25000

for i in range(rang):
    i-=rang/2
    i+=0x1935736832
    if hash256(i)==wynik:
        print i-0x1935736832
    i-=0x1935736832
    i+=1935736832
    if hash256(i)==wynik:
        print i-1935736832
Drugi hash przynajmniej znalazłem, choć to raczej żadne osiągnięcie :)

Kod: Zaznacz cały

import hashlib
import binascii

x="04edaa381322ca65ad5f6e333d488b92c42af363f00125241571fe70715b832763f4050c4f664e7a3b3aa702182470e03590c52a4153a0f30657ef0937e4e323e0"
x=binascii.unhexlify(x)
x=hashlib.sha256(x).hexdigest()
x=binascii.unhexlify(x)
h = hashlib.new('ripemd160')
h.update(x)
print h.hexdigest()
Pewnie pierwszy kod trzeba poprawić, by używał unhexlify i zdekodować 0x1935736832 z little endian (o ile nie zostało to wykonane podczas dekodowania skryptu), ale mi się na razie nie chce.

Weteran
Posty: 2518
Rejestracja: 21 marca 2014
Reputacja: 1468
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: The Real McCoin » poniedziałek, 13 marca 2017, 12:41

pm7 pisze:

Kod: Zaznacz cały

rang=25000
Skąd ta dziwna liczba?
pm7 pisze:

Kod: Zaznacz cały

i+=0x1935736832

Kod: Zaznacz cały

i+=1935736832
Dlaczego raz robisz tak, a później inaczej?

pm7
Weteran
Posty: 7893
Rejestracja: 20 maja 2012
Reputacja: 969
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: pm7 » poniedziałek, 13 marca 2017, 21:09

The Real McCoin pisze: Skąd ta dziwna liczba?
Na początku 25, żeby po podzieleniu na dwa zakresy (ujemne i dodatnie), było pełne -10 do +10 z zapasem. Liczba zer się wzięła z tego ile mój laptop jest w stanie sprawdzić natychmiast, żebym mógł szybko sprawdzać kolejne wersje programu. Niby mógłbym ograniczyć się na podstawie OP_SIZE, ale tak mi było prościej.
The Real McCoin pisze: Dlaczego raz robisz tak, a później inaczej?
Wydaje mi się, że ta liczba jest szesnastkowa, z drugiej strony ponoć niektóre OP z Bitcoin mają ograniczenie przyjmowanego rozmiaru liczb (ciekawe, czy zmienna się przekręca w Bitcoin i dlatego nie znalazłem odpowiedniego wejścia do funkcji skrótu) i nie chciało mi się sprawdzać jak mocno jest dekodowany skrypt (do liczby dziesiętnej? szesnastkowej? szesnastkowej Little endian?), kiedy przeszukanie możliwości było prostsze.

Coś mi się zdaje, ze spytamy się o rozwiązanie zamiast samemu znaleźć :)

Weteran
Posty: 2518
Rejestracja: 21 marca 2014
Reputacja: 1468
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: The Real McCoin » wtorek, 14 marca 2017, 10:31

pm7 pisze: Wydaje mi się, że ta liczba jest szesnastkowa
Już na pierwszy rzut oka widać, że client podczas deasemblacji zinterpretował pushowany ciąg bajtów jako liczbę, bo na początku scriptPubkey nigdzie nie ma ciągu "1935736832" a jest push czterech bajtów:

Kod: Zaznacz cały

0400006173
Po zamianie 1935736832 w kalkulatorze na hex od razu widać, że interpreter używa Little Endian.
pm7 pisze: ponoć niektóre OP z Bitcoin mają ograniczenie przyjmowanego rozmiaru liczb (ciekawe, czy zmienna się przekręca w Bitcoin
Z wiki:
When used as numbers, byte vectors are interpreted as little-endian variable-length integers with the most significant bit determining the sign of the integer
Note: Arithmetic inputs are limited to signed 32-bit integers, but may overflow their output.
pm7 pisze:i dlatego nie znalazłem odpowiedniego wejścia do funkcji skrótu
A może zapomniałeś o zerze ujemnym :)

Weteran
Awatar użytkownika
Posty: 8157
Rejestracja: 1 marca 2015
Reputacja: 1069
Reputacja postu: 
0
Napiwki za post: 0 BTC
Lokalizacja: WLKP/Dolny Śl./Lubus

Zagadki związane z BTC

Postautor: adam1226 » wtorek, 14 marca 2017, 10:53

Hmm a czy są jakieś kursy jak się nauczyć tego co robicie od podstaw?:)
:arrow: [Binance]- Giełda kryptowalut bez weryfikacji
[Algory.io] - Agregator newsów i Skaner tradingowy

pm7
Weteran
Posty: 7893
Rejestracja: 20 maja 2012
Reputacja: 969
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: pm7 » wtorek, 14 marca 2017, 12:44

The Real McCoin pisze: Już na pierwszy rzut oka widać, że client podczas deasemblacji zinterpretował pushowany ciąg bajtów jako liczbę, bo na początku scriptPubkey nigdzie nie ma ciągu "1935736832" a jest push czterech bajtów:
W ogóle nie patrzyłem na zakodowany skrypt. Ciekawe, że tak inteligentnie zadziałał (skrót zostawił szesnastkowo).
The Real McCoin pisze: Z wiki:
Wiem, czytałem oczywiście. 1935736832 się mieści w 32 bitowej liczbie, jakby to był zapis szesnastkowy, to już nie bardzo.
The Real McCoin pisze: A może zapomniałeś o zerze ujemnym :)
Zero ujemne plus liczba dodatnia da liczbę dodatnią, a ona miała inne wyjście funkcji skrótu, więc raczej nie.
adam1226 pisze: Hmm a czy są jakieś kursy jak się nauczyć tego co robicie od podstaw?:)
Są kursy, ale nie wiem, czy znajdziesz taki obejmują dokładnie to, co chcesz.
Ponoć niezła książka o programowaniu to "Zrozumieć programowanie" - Gynvael Coldwind.
W tym wypadku użyłem Google'a, głównie wpisów na wiki Bitcoin i podstawowej znajomości Pythona.
Do podstawowej nauki Pythona się często poleca https://www.codecademy.com/learn/python.

@The Real McCoin, może podpowiedz coś? :)

Weteran
Posty: 2518
Rejestracja: 21 marca 2014
Reputacja: 1468
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: The Real McCoin » wtorek, 14 marca 2017, 15:41

pm7 pisze: może podpowiedz coś?
Jest prosta robota do wykonania więc trzeba wyłączyć mózg i myślenie.
Przestrzeń rozwiązań, którą trzeba przeszukać, jest jasno zdefiniowana.
Bitcoin przy operacjach matematycznych wrzuca na stos i zabiera z niego liczby w Little Endian, więc w języku, którym się użyje, trzeba dopilnować, żeby na wejście sha256 dane wchodziły w odpowiedniej kolejności i formacie.
Skrypt PHP zajmuje 3 linijki.
Zdecydowanie nie używaj już liczby 25000 ;)

Dodano po 5 minutach 28 sekundach:
Gdybyś miał rozwiązanie, to na tych stronach się je sprawdzi:

http://bitcoin-script-debugger.visvirial.com musi pokazać: Result: OK
http://n.bitcoin.ninja/checkscript musi pokazać: Valid

pm7
Weteran
Posty: 7893
Rejestracja: 20 maja 2012
Reputacja: 969
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: pm7 » wtorek, 14 marca 2017, 16:52

The Real McCoin pisze: Bitcoin przy operacjach matematycznych wrzuca na stos i zabiera z niego liczby w Little Endian, więc w języku, którym się użyje, trzeba dopilnować, żeby na wejście sha256 dane wchodziły w odpowiedniej kolejności i formacie.
Nie mów, naprawdę hash jest wykonywany z liczby zakodowanej w Little Endian?

Weteran
Posty: 2518
Rejestracja: 21 marca 2014
Reputacja: 1468
Reputacja postu: 
0
Napiwki za post: 0.0001 BTC

Zagadki związane z BTC

Postautor: The Real McCoin » wtorek, 14 marca 2017, 20:31

pm7 pisze: Nie mów, naprawdę hash jest wykonywany z liczby zakodowanej w Little Endian?
Pytasz serio?
Weźmy liczbę dziesiętną: 1144201745 (od lewej najstarsze cyfry).
Ta sama liczba w postaci heksadecymalnej: 0x44332211 (od lewej najstarsze cyfry).
Żeby z niej obliczyć SHA256, trzeba wrzucić na stos ciąg bajtów w odwróconej kolejności: 11223344.
Hasz tego ciągu to: 1a835ed8734f86355ca5b835d824d486993aabf1913cd3a011b7446c0514b7c9.

Bardzo Zły Moderator
Awatar użytkownika
Posty: 14380
Rejestracja: 16 kwietnia 2012
Reputacja: 2659
Reputacja postu: 
0
Napiwki za post: 0 BTC
Lokalizacja: Polska/Wwa/GW

Zagadki związane z BTC

Postautor: rav3n_pl » wtorek, 14 marca 2017, 22:59

Tak :P https://en.bitcoin.it/wiki/Script
The stacks hold byte vectors. When used as numbers, byte vectors are interpreted as little-endian variable-length integers with the most significant bit determining the sign of the integer. Thus 0x81 represents -1. 0x80 is another representation of zero (so called negative 0). Positive 0 is represented by a null-length vector. Byte vectors are interpreted as Booleans where False is represented by any representation of zero, and True is represented by any representation of non-zero.
Piffko: PLC/BTC 1Rav3nkMayCijuhzcYemMiPYsvcaiwHni
BIP39 Mnemonic z talii kart
Bitcoin Core 0.26.1
Linki do YT, TT, LI i reszty

Początkujący
Posty: 114
Rejestracja: 8 lutego 2015
Reputacja: 12
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: wargo » wtorek, 14 marca 2017, 23:23

To rav3n!

Weteran
Posty: 2518
Rejestracja: 21 marca 2014
Reputacja: 1468
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: The Real McCoin » piątek, 2 czerwca 2017, 20:54

Prosta transakcja z jednym wejściem i jednym wyjściem to 250 bajtów, z czego 150 to opis wejścia, a wyjście i inne rzeczy to 100 bajtów.
Do zweryfikowania tej transakcji węzeł musi sprawdzić podpis cyfrowy wejścia. W tym celu musi przehaszować łącznie 250 bajtów.
Teraz zwiększamy maksymalny rozmiar bloku (przestrzeni na transakcje) do 4 MB, czyli 4 000 000 bajtów. Taki też ustawiamy maksymalny dopuszczalny rozmiar pojedynczej transakcji (innych ograniczeń nie ma).
Pytanie: do przehaszowania jakiej maksymalnej ilości danych można zmusić węzeł w celu weryfikacji transakcji zawartych w bloku, wg przyjętych powyższych założeń?
ok. 4 MB?
ok. 8 MB?
ok. 1 GB?
ok. 100 GB?
ok. 1 TB?
ok. 100 TB?
Jak to zrobić?

Bardzo Zły Moderator
Awatar użytkownika
Posty: 14380
Rejestracja: 16 kwietnia 2012
Reputacja: 2659
Reputacja postu: 
0
Napiwki za post: 0 BTC
Lokalizacja: Polska/Wwa/GW

Zagadki związane z BTC

Postautor: rav3n_pl » sobota, 3 czerwca 2017, 08:30

"Zwykłą" transakcją możemy obciążyć przez zrobienie jednej transakcji zawierającej maksimum wejść i jedno wyjście.
Daje to transakcję o (4`000`000-100)/150=26`666 wejść i zmusza do haszowania 26`666*250=6`666`500 bajtów.
Piffko: PLC/BTC 1Rav3nkMayCijuhzcYemMiPYsvcaiwHni
BIP39 Mnemonic z talii kart
Bitcoin Core 0.26.1
Linki do YT, TT, LI i reszty

Weteran
Posty: 2518
Rejestracja: 21 marca 2014
Reputacja: 1468
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: The Real McCoin » sobota, 3 czerwca 2017, 10:46

Obrazek

Bardzo Zły Moderator
Awatar użytkownika
Posty: 14380
Rejestracja: 16 kwietnia 2012
Reputacja: 2659
Reputacja postu: 
0
Napiwki za post: 0 BTC
Lokalizacja: Polska/Wwa/GW

Zagadki związane z BTC

Postautor: rav3n_pl » sobota, 3 czerwca 2017, 11:38

Znaczy że co? Źle policzyłem?
Piffko: PLC/BTC 1Rav3nkMayCijuhzcYemMiPYsvcaiwHni
BIP39 Mnemonic z talii kart
Bitcoin Core 0.26.1
Linki do YT, TT, LI i reszty

pm7
Weteran
Posty: 7893
Rejestracja: 20 maja 2012
Reputacja: 969
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: pm7 » sobota, 3 czerwca 2017, 14:25

Zdaje się, że przy transakcjach używających wielu wejść, podpisy cyfrowe są z całej transakcji, więc trzeba sprawdzić koło 4MB*26666=100MB. Może mniej jeżeli część danych się pomija, może więcej (np. niestandardowe transakcje może mogą wymusić przetworzenie olbrzymich ilości danych).

Weteran
Posty: 2518
Rejestracja: 21 marca 2014
Reputacja: 1468
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: The Real McCoin » sobota, 3 czerwca 2017, 14:47

Było 6 MB, teraz jest 100 MB.
Po minie Picarda widzę, że trzeba czekać dalej.

Bardzo Zły Moderator
Awatar użytkownika
Posty: 14380
Rejestracja: 16 kwietnia 2012
Reputacja: 2659
Reputacja postu: 
0
Napiwki za post: 0 BTC
Lokalizacja: Polska/Wwa/GW

Re: Zagadki związane z BTC

Postautor: rav3n_pl » sobota, 3 czerwca 2017, 15:08

Głowy nie dam, ale w którymś changelogu było coś w stylu "hasz transakcji musi być wykonany tylko raz". Aż poszukam jak będę przy kompie.
Piffko: PLC/BTC 1Rav3nkMayCijuhzcYemMiPYsvcaiwHni
BIP39 Mnemonic z talii kart
Bitcoin Core 0.26.1
Linki do YT, TT, LI i reszty

pm7
Weteran
Posty: 7893
Rejestracja: 20 maja 2012
Reputacja: 969
Reputacja postu: 
0
Napiwki za post: 0 BTC

Zagadki związane z BTC

Postautor: pm7 » sobota, 3 czerwca 2017, 17:02

Rzeczywiście pytanie było o hash, nie o sprawdzanie podpisu. W takim przypadku jednak, jak wyszło Ci że jednorazowe wyliczenie hasha z całej 4MB transakcji wymaga wyliczenia hasha z 6MB danych? :)

Wróć do „Bitcoin”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 21 gości