R-Puzzle, czyli bitcoin bez pytania "kim jesteś?"
Normalny Bitcoin jest strasznie grzeczny. Monety są przypięte do utxo, utxo do adresów, adresy do kluczy, klucze do właścicieli. Chcesz wydać środki? Proszę bardzo, pokaż klucz prywatny. Bitcoin (BSV) pozwala jednak zajrzeć głębiej pod maskę. Okazuje się, że podpis, który zwykle traktujemy jak czarną skrzynkę, składa się z konkretnych liczb. Jedna z nich nazywa się R; zwykle nikogo ona nie interesuje - jest jak numer seryjny śruby w silniku - musi być, ale nikt o niej nie rozmawia ale kiedyś, ktoś wpadł na pomysł: a gdyby zrobić z niej klucz do sejfu?

Zamiast więc mówić blockchainowi:
"Te monety należą do tego konkretnego klucza prywatnego"
mówimy:
"Te monety może wydać ten, kto zna sekret"
To trochę jak zostawienie szklanej skrzyni ze złotem na środku placu i kartki z napisem, że można sobie wziąć zawartość jeśli zna się kod do skrzyni. W poprzednich wpisach pythona i bsv-sdk, gdy wydawaliśmy nasze satoshi, zawsze wskazywaliśmy adres odbiorcy i tylko odbiorca mógł wydać środki.

W przypadku R-Puzzle, własność przestaje być przypisana do konkretnego adresu i klucza prywatnego. Tutaj nasze satoshi po wysłaniu transakcji po prostu czekają w skrypcie - naszym szklanym sejfie - nie na kogoś konkretnego, tylko na tego kto wie, jak go odblokować.

To otwiera drzwi do wielu nowych pomysłów, konkursów, gier, nagród dla pierwszego rozwiązującego, kontraktów, w których kontrolę przekazuje się sekretem, a nie kluczem prywatnym. Możesz nawet tak zaprojektować zagadkę, że Ty sam nie znasz wyniku rozwiązania, ale znasz jego ślad. Tak przy okazji tego wpisu, wpadł mi do głowy pewien przyziemny przykład, na zastosowanie R-Puzzle :)
Dzisiejszy świat gier jest ekonomicznie nudny. Kupujesz grę, przechodzisz ją w 100%, spędzasz godziny na eksploracji, pokonujesz bossów, zdobywasz wszystkie osiągnięcia.. i nic. Satysfakcja? Jakaś jest ale materialnej nagrody brak.
Wyobraź sobie grę, w której boss nie tylko "zrzuca loot" ale robi to naprawdę. Pokonujesz go po raz setny, w końcu wypada rzadka rzecz - miecz, artefakt, cokolwiek. Tylko że tym razem to nie jest kolejny piksel w ekwipunku. Gra automatycznie uruchamia skrypt w blockchainie. Skrypt mówi: jeśli istnieje transakcja, w której pojawi się dokładnie ta rzadka rzecz - to odblokuj dodatkowe środki. Na przykład część pieniędzy, które gracz zapłacił za grę, albo pulę nagród przygotowaną przez twórców. Gracz nie musi nic zgłaszać, nie musi pisać do supportu, nie musi udowadniać, że "naprawdę mu wypadło". Blockchain widzi fakt i spełniony warunek == nagroda wypłacona.
Python - skrypt nadawcy R-Puzzle
No dobra, to skoro wiemy jak działa R-Puzzle, to teraz przejdźmy do praktyki.
Szkielet naszego kodu jest taki sam jak ten z tego wpisu; dlatego jeżeli go nie masz, to skopiuj go sobie, nie zapomnij zamienić klucza prywatnego na własny (+ doładować adres testnet jeśli nie masz satoshi).
Musimy zaimportować dodatkowe klasy z naszego bsv-sdk; to wszystko co powinniśmy mieć:

W kolejnym kroku, musimy utworzyć nową klasę RPuzzle. Ja wziąłem gotowca z przykładu na githubie (bsv-sdk):

Teraz stworzymy transakcję w której wyślemy 777 satoshi na nasz "szklany sejf", gdzie tajnym hasłem odblokowującym będzie liczba "k", wyprowadzona z przypadkowego klucza prywatnego.

Teraz zapisujemy i uruchamiamy skrypt..

Widzimy poprawne rozgłoszenie w sieci oraz wypisaną tajną liczbę "k" (To jest do zapisania), którą posłużymy się przy odbiorze naszych 777 satoshi. Sprawdźmy w eksploratorze blockchain, jak wygląda zbudowana transakcja, na co tak naprawdę ją wydaliśmy, skoro nie podawałem adresu odbiorcy.

Kwota 777 satoshi siedzi sobie w skrypcie ScriptHash, a reszta wróciła do nas.
Python - skrypt odbiorcy R-Puzzle.
Teraz odbierzemy 777 satoshi. Wiedząc, że nie były wysłane na konkretny adres i nie są kontrolowane przez żaden klucz prywatny, wygeneruję losowo nowy pusty adres i odbiorę satoshi za pomocą naszego hasła (liczby "k").
Z poprzedniego kodu (nadawca) skopiuj sobie wszystkie importy i klasę RPuzzle i przepisz poniższy kod. Zastąp zmienną "tx_r" swoją transakcją a "k" - swoją tajną liczbą.


A teraz piszemy transakcję odbierającą:

Zapisuję i wykonuję kod:

Teraz sprawdźmy w blockchain, jak wygląda nasza odebrana transakcja:

Idealnie; wygenerowaliśmy sobie nowy adres i za pomocą sekretnej liczby "k", odebraliśmy środki na losowo wygenerowany adres. Nawet nie musieliśmy mieć środków na pokrycie tej transakcji - sama się pobrała z tego co odbieraliśmy.
Gdybym miał graficznie pokazać różnice takiej transakcji RPuzzle do klasycznej?
- Klasycznie wysyłamy środki na adres odbiorcy i tylko on może odblokować środki = tylko jego klucz prywatny.
- W R-Puzzle wysyłamy środki do sejfu i każdy kto zna lub odgadnie hasło, może odebrać środki.

**Gwarantuję Ci niezmienność moich treści**
Hash artykułu:
ID transakcji: sprawdź OP_RETURN i porównaj jego hash
Komentarze
Prześlij komentarz