Kiedy blockchain spotyka AI – czyli jak wykorzystać ChatGPT
Ostatnie miesiące to istny boom na technologie związane z AI, a wszystko to dzięki narzędziu zwanemu ChatGPT. Dzisiaj trudno znaleźć osobę, której choć raz nie obiła się ta nazwa o uszy, i nic w tym dziwnego. Chociaż niektórzy zbyt przesadnie oceniają obecne możliwości tego rozwiązania, trzeba przyznać, że ma ono, a będzie miało jeszcze większy, wpływ na ogromną ilość branży, w tym IT. Nie inaczej jest w przypadku tworzenia rozwiązań opartych na blockchainie. Dlatego dzisiaj przyjrzymy się kilku sposobom, z pomocą których ChatGPT może ułatwić nam życie..
Żółtodziób

(źródło: https://www.facebook.com/NewPlayerHasJoined/photos/a.1822763981387214/1848059932190952/)
Niezależnie, czy jesteś osobą techniczną czy raczej trzymasz się z daleka od technologicznych spraw, ChatGPT może Ci pomóc na samym początku przygody z blockchainem. Co więcej, jeśli nie znasz języka angielskiego, to w tym wypadku nie będzie to problemem, ponieważ narzędzie to świetnie radzi sobie z językiem polskim. Dlatego, dla spójności tekstu, wszystkie zapytania oraz odpowiedzi uzyskane od Chata będą w naszym ojczystym języku.
ChatGPT możemy traktować jako narzędzie, które ułatwi i przyśpieszy proces uczenia się. Oczywiście, możemy wszystko “googlać” i wciąż jest to dobra metoda, jednak z Chatem w wielu sytuacjach będzie to szybsze.
Załóżmy, że nie wiesz jeszcze nic o blockchainie i chcesz wykorzystać wspomniane narzędzie, aby się z nim zapoznać. Pierwsze pytanie, jakie możesz zadać, to na przykład “Czym jest blockchain?”, na co w odpowiedzi uzyskasz:
“Blockchain to technologia, która umożliwia przechowywanie danych w sposób zdecentralizowany i bezpieczny. Jest to rodzaj rozproszonej bazy danych, która składa się z łańcucha bloków (ang. blocks), z których każdy zawiera zapisane dane oraz kod kontrolny (hash) poprzedniego bloku. Dzięki temu każdy blok jest bezpośrednio powiązany z poprzednim i następnym blokiem, tworząc łańcuch bloków. Ponieważ każdy blok zawiera hash poprzedniego bloku, zmiana danych w dowolnym bloku spowoduje zmianę hasha bloku i przekłamanie całego łańcucha, co jest trudne do wykonania. Ta technologia znana jest głównie z kryptowalut, ponieważ służy do bezpiecznego przechowywania i przesyłania danych o transakcjach. Jednakże blockchain może być wykorzystywany do przechowywania i przesyłania dowolnych danych, które wymagają bezpiecznej i zdecentralizowanej archiwizacji.”
Muszę przyznać, że jest to dosyć dobra odpowiedź, ale możliwe, że nie wiesz co to hash. W takim wypadku możesz o to dopytać, i otrzymać odpowiedź:
“Hash, zwany również funkcją skrótu, to algorytm matematyczny, który przetwarza dowolnie długi ciąg danych wejściowych na stałej długości ciąg znaków wyjściowych. W kontekście blockchain, hash jest używany do zabezpieczania integralności danych. Każdy blok w łańcuchu blockchain zawiera hash poprzedniego bloku, co oznacza, że zmiana danych w jednym bloku spowoduje zmianę hasha bloku i przekłamanie całego łańcucha. W ten sposób hash jest używany do utrzymania niezmienności i bezpieczeństwa danych w blockchainie. Hash jest również powszechnie stosowany do przechowywania haseł i innych poufnych informacji. W tym przypadku, zamiast przechowywać oryginalną wartość, taką jak hasło, przechowuje się jedynie jej hash. Gdy użytkownik próbuje się zalogować, system pobiera wprowadzone hasło, przetwarza je na hash i porównuje z zapisanym hashem. Jeśli są one takie same, to hasło jest poprawne.”
W ten sposób, korzystając z jednego miejsca, możesz wiele się nauczyć. Jeśli opis jest niezrozumiały, zawsze możesz poprosić Chata, aby wytłumaczył coś prostszymi słowami. Ponieważ ten artykuł nie jest sam w sobie instrukcją, jak dobrze korzystać z tego narzędzia, polecam zapoznanie się z wieloma materiałami, które są dostępne w Internecie. Możesz również wykorzystać sam Chat do tego celu :).
Jednak istnieje jedna ważna kwestia, którą należy tutaj wspomnieć i dotyczy ona każdego z opisanych zastosowań. Musimy pamiętać, że ChatGPT ma dostępne aktualne dane tylko do września 2021 roku. Oznacza to, że nie będzie w stanie wyjaśnić nam zagadnień, które powstały po tej dacie. Oczywiście w przyszłości jego baza danych będzie rozszerzana, ale zawsze należy pamiętać, że nowych informacji tam nie znajdziemy. Z tą myślą możemy wrócić do tematu.
Adept programowania

(źródło: https://memegenerator.net/instance/61246775/star-wars-emperor-good-good-my-young-apprentice)
Jeśli blockchain interesuje Cię bardziej, a w głowie pojawiają się myśli związane z tworzeniem własnych rozwiązań, możesz wykorzystać ChatGPT do nauki języka Solidity.
Załóżmy, że właśnie zapoznałeś się z dokumentacją Solidity, co zdecydowanie polecam, ale nie do końca rozumiesz, czym jest funkcja fallback. W takim wypadku możesz zapytać o to Chata.
“Fallback function w języku Solidity to funkcja, która jest wywoływana, gdy nie ma pasującej funkcji w danym kontrakcie lub gdy wystąpił błąd podczas wywoływania innej funkcji. Funkcja fallback jest domyślną funkcją w każdym kontrakcie Solidity i ma następującą sygnaturę: Funkcja ta jest oznaczona jako "external", co oznacza, że może być wywoływana tylko z zewnątrz kontraktu. Jest także oznaczona jako "payable", co oznacza, że może przyjmować wartości ether, co jest przydatne, gdy chcemy umożliwić użytkownikom wpłacanie środków do naszego kontraktu. function () external payable { // kod funkcji fallback } Funkcja fallback może być używana do obsługi nieprzewidzianych sytuacji, które nie zostały obsłużone przez inne funkcje w kontrakcie. Na przykład, jeśli użytkownik wywoła funkcję, która nie istnieje w kontrakcie lub przekaże niewłaściwe argumenty, to funkcja fallback zostanie wywołana, a my możemy zwrócić odpowiedni komunikat o błędzie lub obsłużyć sytuację w inny sposób. Ważne jest, aby pamiętać, że jeśli nie zdefiniujemy funkcji fallback w naszym kontrakcie, to w przypadku wywołania nieistniejącej funkcji lub błędnych argumentów, wywołanie to zakończy się niepowodzeniem i ether, który został przesłany, zostanie zwrócony do nadawcy.”
Możemy następnie poprosić o podanie kilku przykładów, aby lepiej zrozumieć jego zastosowanie. Nie będę ich tutaj przedstawiał, aby nie rozciągać zbytnio tego tekstu, ale polecam sprawdzić to samemu :).
Kolejnym krokiem w nauce programowania smart kontraktów może być zapoznanie się i zrozumienie znanych protokołów. W tym celu również warto skorzystać z czatu.
Załóżmy, że interesujesz się DeFi i chcesz poznać, jak działa protokół Aave. W takiej sytuacji wystarczy, że zadasz odpowiednie pytania. Co więcej, w tym przypadku nie musisz wklejać całego kodu, a jedynie podać link do pliku na GitHubie.
“Oczywiście, postaram się wytłumaczyć kod LendingPool, który jest głównym smart kontraktem protokołu Aave v2 LendingPool. Poniżej przedstawiam skrócony opis działania LendingPool: LendingPool jest głównym smart kontraktem protokołu Aave v2 i służy do zarządzania pożyczkami i depozytami użytkowników. Kontrakt umożliwia użytkownikom depozytowanie swoich kryptowalut w puli i otrzymywanie odsetek za ich depozyty…”.
Uzyskana odpowiedź jest o wiele dłuższa i zawiera masę szczegółów dotyczących tego kontraktu. Ponownie możemy dopytywać o lepsze wytłumaczenie oraz kolejne detale. W ten sposób ChatGPT pomoże nam nauczyć się wielu rzeczy.
Szybsza praca

(źródło: https://fictionhorizon.com/sonic-vs-the-flash-who-is-faster/)
Nauka to jedno, ale ChatGPT przyda się również bardziej doświadczonym osobom. Możemy go wykorzystać do szybkiego wygenerowania kodu, np. do stworzenia kolejnego tokenu ERC20. W rezultacie otrzymamy taki wynik:
pragma solidity ^0.8.0;
contract MyToken {
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor(string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalSupply) {
name = _name;
symbol = _symbol;
decimals = _decimals;
totalSupply = _totalSupply;
balanceOf[msg.sender] = _totalSupply;
}
function transfer(address _to, uint256 _value) public returns (bool success) {
require(balanceOf[msg.sender] >= _value, "Not enough balance");
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) public returns (bool success) {
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(_value <= balanceOf[_from], "Not enough balance");
require(_value <= allowance[_from][msg.sender], "Not enough allowance");
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
allowance[_from][msg.sender] -= _value;
emit Transfer(_from, _to, _value);
return true;
}
}
Otrzymana implementacja jest ok, ale lepiej byłoby użyć standardu dostarczonego przez OpenZeppelin. Dlatego prosimy ChatGPT o poprawkę i w rezultacie wynik wygląda następująco:
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(string memory _name, string memory _symbol, uint256 _initialSupply) ERC20(_name, _symbol) {
_mint(msg.sender, _initialSupply);
}
}
Całkiem nieźle! Możemy teraz dalej modyfikować ten kod i dostosowywać go do naszych potrzeb. Oczywiście początkujący też mogą używać tego narzędzia w opisany poniżej sposób, jednak polecałbym na samym początku poświęcić więcej czasu na samodzielne zdobycie odpowiednich umiejętności. Dzięki temu będziemy w stanie zadawać bardziej precyzyjne pytania, co przełoży się na lepsze odpowiedzi.
Należy jednak pamiętać, że baza wiedzy ChatGPT nie jest w pełni aktualna, więc nie wszystkie najnowsze rozwiązania będą tam dostępne. Niemniej jednak, takie podejście znacznie może przyspieszyć proces tworzenia samego kodu.
Kopiuj wklej

(źródło: https://spece.it/wklejanie-bez-formatowan-i-stylow-czysty-tekst-wprost-ze-schowka/)
Pomimo, że Solidity obecnie jest najpopularniejszym językiem używanym do tworzenia smart kontraktów na blockchainach EVM, może się zdarzyć, że natkniemy się na kod napisany w innym języku, na przykład Vyper. Niestety, nie zawsze mamy czas ani chęć, aby poświęcać kolejne godziny na naukę nowego języka tylko po to, żeby go raz wykorzystać. W takiej sytuacji ponownie na ratunek przychodzi ChatGPT, który pozwala łatwo konwertować kod między tymi językami. Nie ma potrzeby przepisywania wygenerowanego kodu – polecam zrobić to samodzielnie.
Nawet jeśli Twoja praca opiera się wyłącznie na kontraktach stworzonych w Solidity, nie unikniesz czasem niskopoziomowego kodu napisanego w języku YUL. I tutaj znowu ChatGPT może pomóc, zarówno w zrozumieniu kodu, który pojawia się przed nami, jak również w konwersji Solidity na YUL i odwrotnie.
Tworzenie dobrego kodu to jedno, ale zdecydowanie ważniejsze – szczególnie w przypadku smart kontraktów, które przechowują ogromne ilości środków – jest przetestowanie go. Powiedzmy sobie szczerze, mało który programista lubi to robić. Większość woli tworzenie nowych funkcjonalności i po ukończeniu jednego projektu przechodzi od razu do kolejnego. Niestety, pisane testy są nieodłącznym elementem programowania. Na szczęście ChatGPT nie ma oporów i może okazać się bardzo przydatny również w tej kwestii. Wystarczy poprosić go o napisanie testów dla podanego kodu, a on z łatwością to zrobi. Co więcej, możemy precyzyjnie określić, którą bibliotekę należy użyć. To także może pomóc, gdy chcemy przenieść nasz projekt np. z Truffle na framework Hardhat.
W tym przypadku również możemy współpracować z Chatem przy tworzeniu ostatecznego rozwiązania. Nawet jeśli wynik nie będzie w 100% zadowalający, zdecydowanie przyspieszy to cały proces pisania testów.
Taniej i bezpieczniej

(źródło: https://www.rosepallet.com/blog/cheaper-pallet-worth-it/)
Wspomniałem już temat testów, które są niezbędnym elementem tworzenia bezpiecznych rozwiązań. Jednak nic nam po nich jeśli kod naszego kontraktu posiada dziury. Testy, nawet najlepiej napisane, zwrócą poprawne rezultaty zgodnie z tym, co znajduje się w kontrakcie. Dlatego jeżeli stworzona implementacja zawierać będzie podatności, to możliwe, że zwykły test tego nie wykryje. Istnieją oczywiście różne metody wykrywania i radzenia sobie z takimi sytuacjami, ale także tutaj ChatGPT może odegrać istotną rolę.
Jako przykład sprawdzi, czy narzędzie wykryje podatność znajdującą się w tym kontrakcie.
pragma solidity ^0.8.0;
contract BankWithProblem {
mapping(address => uint) public balances;
function deposit() external payable {
balances[msg.sender] += msg.value;
}
function withdraw() external {
uint balance = balances[msg.sender];
require(balance >= 0, "There are no founds for you");
(bool success, ) = payable(msg.sender).call{value: balance}("");
require(success, "Failed to send ether");
balances[msg.sender] = 0;
}
function getBalance() external view returns(uint) {
return address(this).balance;
}
}
ChatGPT od razu zasugerował, że powyższy kod jest narażony na atak zwany “reentrancy”. Podano też kilka innych sugestii, jednak niektóre z nich były nieprawdziwe. Niemniej jednak wykryto błąd, który doprowadził już niejednokrotnie do wielomilionowych kradzieży.
Kolejną rzeczą, w której ChatGPT może się sprawdzić, jest optymalizacja kodu pod kątem zużycia gazu. Wystarczy poprosić o narzędzie, a ono zaproponuje poprawki. Sprawdźmy to w działaniu na poniższym kontrakcie.
contract Simple {
event Counted(uint256 index);
uint256 private counter;
constructor(uint256 _counter) {
counter = _counter;
}
function count() external {
for(uint256 i = 0; i<counter; i++) {
emit Counted(i);
}
}
}
Chat podał kilka usprawnień, które mogą wpłynąć na optymalizowanie zużycia gazu dla danego kontraktu. Jednakże, szczerze mówiąc, część z nich była błędna. Na przykład, stwierdził, że funkcję “count()” należy oznaczyć jako “pure” lub “view”, co jednak spowodowałoby błąd kompilacji kodu. Natomiast inne porady, które podał, były w miarę sensowne.
ChatGPT jest bez wątpienia bardzo potężnym narzędziem, które, jeśli będzie umiejętnie wykorzystane, może pomóc w szybszym i łatwiejszym tworzeniu bezpiecznych rozwiązań blockchainowych. W tym poście przedstawiłem tylko kilka pomysłów na wykorzystanie tej technologii, ale na pewno jest ich znacznie więcej. Dlatego gorąco zachęcam do zapoznania się z ChatemGPT. Jeśli nie nauczysz się go dobrze wykorzystywać, to prawdopodobnie w krótkim czasie zostaniesz w tyle za osobami, które będą z niego korzystać. Jednakże, pamiętaj o jego ograniczeniach wynikających z bazy danych, na której został wytrenowany oraz o tym, że czasem może się pomylić i sugerować złe rozwiązania :).
Dziękuję za podzielenie się swoją wiedzą w tym poście. Było to niezwykle korzystne i poszerzyło moją wiedzę na ten temat. Twój wysiłek włożony w stworzenie tak pomocnego zasobu jest godny pochwały!
Chciałem tylko wpaść i powiedzieć, że Twój post jest świetny! Jest jasny, zwięzły i pełen praktycznych wskazówek. Dziękuję za dostarczenie tak wartościowych treści!
Dziękuję za ten dobrze skonstruowany i wnikliwy post. Widać, że masz dogłębne zrozumienie tematu, a Twoje wyjaśnienia są jasne i zwięzłe. Tak trzymać!
Chciałem wyrazić moje uznanie dla tego wpisu. Jest on zwięzły, a jednocześnie pouczający, a po jego przeczytaniu zyskałem cenne spostrzeżenia. Dziękuję za podzielenie się z nami swoją wiedzą!
Chciałem wyrazić moje uznanie dla Twojej wyjątkowej pracy. Ten post był niezwykle pomocny i zyskałem dzięki niemu wiele wiedzy. Dziękuję za zaangażowanie w tworzenie wysokiej jakości treści!