A nie jest tak, że wszystkie funkcje skrótu mają kolizje, mniej lub bardziej?
Tak, każda funkcja skrótu ma kolizje, ale nie każda funkcja skrótu ma znane kolizje łatwe do uzyskania.
I kolizja nie polega przypadkiem na tym, że dwa różne pliki dają identyczny skrót, ale bardzo trudno jest takie dwa sensowne pliki znaleźć?
Problem w tym, że w przypadku MD5 jesteś w stanie w ciągu kilkunastu sekund znaleźć kolizję na CPU, natomiast w przypadku SHA-1 możesz wykorzystać to, co zostało znalezione w 2017 i dokleić do tego swoje dane. Nagroda za znalezienie kolizji SHA-1 została zgarnięta na łańcuchu, co pokazuje wszem i wobec, że z tej funkcji należy się wycofywać, natomiast kolizje MD5 były znane już od dawna (poza tym Script nie zawiera OP_MD5 ani niczego podobnego używającego tej funkcji skrótu).
Co się nadaje w takim razie do NFT, bo chyba całych plików nie umieszcza się w łańcuchu?
Inna funkcja skrótu niż MD5 lub SHA-1. Choćby SHA-256 się nadaje, ale też SHA-512 obcięte do 256 bitów albo SHA-3, czy też coś jeszcze innego, co nie zostało dotąd złamane. Inna kwestia, że Script zawiera ileśtam funkcji skrótu, więc jeśli chcesz, aby każdy węzeł weryfikował skrót, to musisz użyć jednej z tych funkcji, które są tam zaimplementowane. Wybranie SHA-256 jest o tyle korzystne, że ma solidne wsparcie na poziomie protokołu, a wykopywane bloki pokazują wyraźnie, ile bitów tej funkcji może zostać odgadniętych przez sprawdzanie wszystkich możliwych kombinacji przez potencjalnego atakującego.
Taką funkcjonalność daje chyba każda podstawowa kryptowaluta, Bitcoin, Dash i całe mnóstwo innych?
Owszem, możesz nawet użyć sieci Bitcoin Testnet i wysłać sobie monety na "OP_SIZE 32 OP_EQUALVERIFY OP_SHA256 <jakiś_hash> OP_EQUALVERIFY <jakiś_klucz_publiczny> OP_CHECKSIG". Albo możesz umieścić hash danych w OP_RETURN, to jest jeszcze łatwiejsze.
To już nie lepiej umieścić taki zapis w łancuchu trwałym, który nie wymaga odświeżania?
Owszem, lepiej. Domeny mają termin ważności, podobnie jak nazwy użytkowników na IRC-u. Nie wiem, czemu tego typu rzeczy nie mogłyby być ważne bezterminowo, ale skoro NameCoin wprowadza takie reguły, to trzeba się do nich stosować, przy innych monetach nie ma tego problemu.
Nie łapię tego całego NFT niestety. Nie wiem czym to się różni od technologi, którą kryptowaluty oferują już od początku?
Technicznie rzecz biorąc jesteś w stanie utworzyć dowolne wyjście transakcji, które będzie unikalne. Nie widzę jakiejś szczególnej różnicy między nietypowym wyjściem transakcji o zerowej liczbie satoshi w testnecie, a NFT, i jedno i drugie jest równie niewymienialne.
Edit: Zresztą, co by nie być gołosłownym:
$ md5sum first_md5.bin
79054025255fb1a26e4bc422aef54eb4 *first_md5.bin
$ md5sum second_md5.bin
79054025255fb1a26e4bc422aef54eb4 *second_md5.bin
$ xxd first_md5.bin
00000000: d131 dd02 c5e6 eec4 693d 9a06 98af f95c .1......i=.....\
00000010: 2fca b587 1246 7eab 4004 583e b8fb 7f89 /....F~.@.X>....
00000020: 55ad 3406 09f4 b302 83e4 8883 2571 415a U.4.........%qAZ
00000030: 0851 25e8 f7cd c99f d91d bdf2 8037 3c5b .Q%..........7<[
00000040: d882 3e31 5634 8f5b ae6d acd4 36c9 19c6 ..>1V4.[.m..6...
00000050: dd53 e2b4 87da 03fd 0239 6306 d248 cda0 .S.......9c..H..
00000060: e99f 3342 0f57 7ee8 ce54 b670 80a8 0d1e ..3B.W~..T.p....
00000070: c698 21bc b6a8 8393 96f9 652b 6ff7 2a70 ..!.......e+o.*p
$ xxd second_md5.bin
00000000: d131 dd02 c5e6 eec4 693d 9a06 98af f95c .1......i=.....\
00000010: 2fca b507 1246 7eab 4004 583e b8fb 7f89 /....F~.@.X>....
00000020: 55ad 3406 09f4 b302 83e4 8883 25f1 415a U.4.........%.AZ
00000030: 0851 25e8 f7cd c99f d91d bd72 8037 3c5b .Q%........r.7<[
00000040: d882 3e31 5634 8f5b ae6d acd4 36c9 19c6 ..>1V4.[.m..6...
00000050: dd53 e234 87da 03fd 0239 6306 d248 cda0 .S.4.....9c..H..
00000060: e99f 3342 0f57 7ee8 ce54 b670 8028 0d1e ..3B.W~..T.p.(..
00000070: c698 21bc b6a8 8393 96f9 65ab 6ff7 2a70 ..!.......e.o.*p
No i jeszcze SHA-1:
$ sha1sum first_sha1.bin
f92d74e3874587aaf443d1db961d4e26dde13e9c *first_sha1.bin
$ sha1sum second_sha1.bin
f92d74e3874587aaf443d1db961d4e26dde13e9c *second_sha1.bin
$ xxd first_sha1.bin
00000000: 2550 4446 2d31 2e33 0a25 e2e3 cfd3 0a0a %PDF-1.3.%......
00000010: 0a31 2030 206f 626a 0a3c 3c2f 5769 6474 .1 0 obj.<</Widt
00000020: 6820 3220 3020 522f 4865 6967 6874 2033 h 2 0 R/Height 3
00000030: 2030 2052 2f54 7970 6520 3420 3020 522f 0 R/Type 4 0 R/
00000040: 5375 6274 7970 6520 3520 3020 522f 4669 Subtype 5 0 R/Fi
00000050: 6c74 6572 2036 2030 2052 2f43 6f6c 6f72 lter 6 0 R/Color
00000060: 5370 6163 6520 3720 3020 522f 4c65 6e67 Space 7 0 R/Leng
00000070: 7468 2038 2030 2052 2f42 6974 7350 6572 th 8 0 R/BitsPer
00000080: 436f 6d70 6f6e 656e 7420 383e 3e0a 7374 Component 8>>.st
00000090: 7265 616d 0aff d8ff fe00 2453 4841 2d31 ream......$SHA-1
000000a0: 2069 7320 6465 6164 2121 2121 2185 2fec is dead!!!!!./.
000000b0: 0923 3975 9c39 b1a1 c63c 4c97 e1ff fe01 .#9u.9...<L.....
000000c0: 7f46 dc93 a6b6 7e01 3b02 9aaa 1db2 560b .F....~.;.....V.
000000d0: 45ca 67d6 88c7 f84b 8c4c 791f e02b 3df6 E.g....K.Ly..+=.
000000e0: 14f8 6db1 6909 01c5 6b45 c153 0afe dfb7 ..m.i...kE.S....
000000f0: 6038 e972 722f e7ad 728f 0e49 04e0 46c2 `8.rr/..r..I..F.
00000100: 3057 0fe9 d413 98ab e12e f5bc 942b e335 0W...........+.5
00000110: 42a4 802d 98b5 d70f 2a33 2ec3 7fac 3514 B..-....*3....5.
00000120: e74d dc0f 2cc1 a874 cd0c 7830 5a21 5664 .M..,..t..x0Z!Vd
00000130: 6130 9789 606b d0bf 3f98 cda8 0446 29a1 a0..`k..?....F).
$ xxd second_sha1.bin
00000000: 2550 4446 2d31 2e33 0a25 e2e3 cfd3 0a0a %PDF-1.3.%......
00000010: 0a31 2030 206f 626a 0a3c 3c2f 5769 6474 .1 0 obj.<</Widt
00000020: 6820 3220 3020 522f 4865 6967 6874 2033 h 2 0 R/Height 3
00000030: 2030 2052 2f54 7970 6520 3420 3020 522f 0 R/Type 4 0 R/
00000040: 5375 6274 7970 6520 3520 3020 522f 4669 Subtype 5 0 R/Fi
00000050: 6c74 6572 2036 2030 2052 2f43 6f6c 6f72 lter 6 0 R/Color
00000060: 5370 6163 6520 3720 3020 522f 4c65 6e67 Space 7 0 R/Leng
00000070: 7468 2038 2030 2052 2f42 6974 7350 6572 th 8 0 R/BitsPer
00000080: 436f 6d70 6f6e 656e 7420 383e 3e0a 7374 Component 8>>.st
00000090: 7265 616d 0aff d8ff fe00 2453 4841 2d31 ream......$SHA-1
000000a0: 2069 7320 6465 6164 2121 2121 2185 2fec is dead!!!!!./.
000000b0: 0923 3975 9c39 b1a1 c63c 4c97 e1ff fe01 .#9u.9...<L.....
000000c0: 7346 dc91 66b6 7e11 8f02 9ab6 21b2 560f sF..f.~.....!.V.
000000d0: f9ca 67cc a8c7 f85b a84c 7903 0c2b 3de2 ..g....[.Ly..+=.
000000e0: 18f8 6db3 a909 01d5 df45 c14f 26fe dfb3 ..m......E.O&...
000000f0: dc38 e96a c22f e7bd 728f 0e45 bce0 46d2 .8.j./..r..E..F.
00000100: 3c57 0feb 1413 98bb 552e f5a0 a82b e331 <W......U....+.1
00000110: fea4 8037 b8b5 d71f 0e33 2edf 93ac 3500 ...7.....3....5.
00000120: eb4d dc0d ecc1 a864 790c 782c 7621 5660 .M.....dy.x,v!V`
00000130: dd30 9791 d06b d0af 3f98 cda4 bc46 29b1 .0...k..?....F).
Także cóż, jeśli jakieś NFT używają MD5 lub SHA-1, no to te przykłady wystarczą, aby zademonstrować brak unikalności. Oprócz tego istnieje potencjalnie nieskończona liczba kombinacji, gdyż do tych danych można odpowiednio podoklejać własne rzeczy, co spowoduje uzyskanie dwóch różnych plików dających identyczny skrót. Co więcej: ten przykład z SHA-1 nie jest losowy, to jest normalny kawałek pliku PDF, co oznacza, że można robić własne, prawidłowo skonstruowane PDF-y, które różnią się treścią, ale dają identyczny skrót.