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
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
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
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
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
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!