fbpixel

Solidity programowanie inteligentnych kontraktów

Cześć,
Dzisiaj przedstawię podstawy Solidity, czyli jednego z języków do pisania oprogramowania(smart contracts) na blockchainie Ethereum 😉

Solidity

Jest to jeden z języków używanych do pisania oprogramowania działającego w blockchain. Jakbym miał go porównać do jakiegoś innego języka to najbliżej mu do języka javascript (także hurra frontendowcy!). To powiedziawszy zaczynajmy 🙂

Typy danych

W Solidity mamy kilkanaście różnych typów danych. Począwszy od tych standardowych: uint, string, bool, tablice(array) zarówno te o dynamicznej wielkości jak i stałej, oprócz tych standardowych mamy też struct oraz mapping.
Te dwie ostatnie są najciekawsze:
struct – reprezentuje obiekt z polami
mapping – jest to tablica hash-y lub można to porównać do dictionary(czyli tablica klucz wartość) z innych języków takich jak np. C#.
address – adres portfela w sieci Etheureum

Instrukcje warunkowe i pętle

Instrukcje warunkowe dostępne w Solidity z przykładami użycia:

  • if
    Rekomendowane jest aby pojedyncza instrukcja zapisywana była bez nawiasów “wąsatych”
    if(...)
        kod do wykonania; 
  • else if
    Jak w reszcie języków
    if(...) {
    ...
    } else if(...) {
    ...
    }
  • else
    if (...) {
    ...
    } else {
    ...
    }

Pętle:

  • for
    for (uint i =0; i < jakas_liczba; i++) {
    ...;
    }
  • while
    while (...) {
    ...;
    }

Constructor

Jest to metoda która zostanie odpalona jednorazowo przy deploy-mencie naszego smart contract-u do sieci Ethereum używany do ustawiania wartości początkowych (default values).

constructor(parametry) {
...
}

Deklaracje metod i widoczność

Mamy kilka poziomów widoczności metod:

  • external – metoda nie może być użyta wewnątrz smart contract-u
  • public
    Obie flagi widoczności służą do wystawienia metody jako publiczna. Różnica jest w sposobie przetwarzania danych wejściowych np. tablic przekazanych jako argument do metody. External działa bezpośrednio na przekazanych danych, a public najpierw kopiuje dane do wewnętrznej pamięci smart contract-u. Może to mieć znaczenie przy wyliczonej opłacie za przetworzenie danej metody (gas).
    tutaj pełen wywód jaka jest konkretna różnica: wyjaśnienie
  • internal
    Oznacza, że metoda będzie dostępna w danym smart contract-cie jak i we wszystkich dziedziczących.
  • private
    Metoda będzie dostępna tylko w tym konkretnym smart contract-cie.
  • view i pure
    Te dwie flagi oznaczają metody, które będą mogły być wywołane bez tworzenia nowej transakcji.

Skoro wiemy już jakie flagi widoczności są dostępne to czas na opisanie jak można deklarować metody i jaka jest poprawna i rekomendowana składnia:

function nazwa_metody( parametry np. uint paramter1) public {
...
}

Oprócz tego w języku Solidity są wbudowane specjalne metody, które pozwalają np. usunąć smart contract z blockchaina, przy czym należy pamiętać, że wszystkie transakcje wykonane w ramach smart contractu nie znikną z historii transakcji. Po prostu nie będzie możliwości korzystania dalej z metod udostępnionych w ramach tego kontraktu.

Wspomniana metoda to selfdestruct(adres_portfela_eth_na _ktory_maja_byc_przeslany_pozostaly_balans lub 0x0 jeżeli na kontrakcie nie ma żadnych środków). No dobrze ale można by zapytać jak to przecież wywołanie takiej metody mogłoby być wywołane przez kogokolwiek w sieci. Jeżeli zadałeś to pytanie to nie jesteś w błędzie jest możliwość blokady, aby tylko adres, który zdeploy-ował smart contract mógł wywołać daną metodę, ale o tym napiszę w kolejnym wpisie.

Ale dobra koniec z tymi opisami czas trochę pokodować. Jak na pierwszy wpis przystało napiszemy sobie hello world-a na blockchainie 😉

Najszybszą możliwą opcją programowania jaką znalazłem jest IDE dostępne z okna przeglądarki, które posiada wbudowany kompilator, testową sieć, założone na starcie 5 kont z czego każde z nich ma 100 ETH w sieci testowej(bezwartościowe tylko te z Main network Ethereum są warte $$$).

Otiweramy http://remix.ethereum.org w przeglądarce. Na początku usuwamy utworzone tam defaultowe pliki z rozszerzeniem *.sol. Ja stworzyłem plik o nazwie Hello.sol i dodałem kod jak na screenie:

rinkeby site ui
1. zakładka w której skompilujemy utworzony kontrakt
2. Przycisk do kompilacji
3. Zakładka, w której mamy możliwość zrobić deploy wcześniej skompilowany kontrakt do sieci testowej i przeprowadzić podstawowe ręczne testy.

Stworzony smart contract ma metodę send i get. Pierwsza odpowiada za dodanie transakcji z napisem, a druga zwraca wartość z ostatniej dodanej transakcji. Po sprawdzeniu czy nie ma błędów przy kompilacji czas na deploy.

rinkeby ui
1. Przycisk do deploy-owania kontraktu do testowej sieci
2. W tym polu możemy wpisać swoje słowo powitania. Ważne: aby wpisać tekst musimy wprowadzić go w cudzysłowach.
3. metoda do pobrania ostatniej przesłanej wartości.
4. po rozwinięciu transakcji tekst wpisany w polu nr.2

I to by było na tyle w tym wpisie 😉 Jeżeli zainteresował Cię temat programowania aplikacji na blockchain z użyciem Solidity, a może już programujesz i o czymś zapomniałem(pominąłem) to daj znać w komentarzu. Jeżeli nie chcesz przegapić kolejnych wpisów (które nie ukazują się regularnie za co przepraszam) to zapraszam do zapisania na newsletter.

Ps. Standardowo za każdy share publiczny w social mediach (fb, linkedin, twitter itp.), który będzie dostępny przez 24h płacę 1 CHAR (mój token personalny) 😉

Do przeczytania gdzieś kiedyś!
Łukasz