Jak stworzyć prosty smart kontrat do obsługi aukcji ?

Paulina Lewandowska

07 gru 2022
Jak stworzyć prosty smart kontrat do obsługi aukcji ?

W poprzednim tutorialu dowiedziałeś się, jak stworzyć smart contract, który jest walletem. W tym tutorialu postaramy się utrwalić wiedzę z poprzedniego poradnika oraz poszerzyć ją o nową. 

Przejdźmy więc do dalej. Wszystkie rzeczy, których możesz nie rozumieć wyjaśnimy Ci w dalszej części tekstu.

Zdefiniowanie zmiennych 

Zacznijmy od zdefiniowania zmiennych, które będą nam potrzebne do funkcjonowania smart kontraktu. Na pewno potrzebujemy :

  • adres osoby do której zostanie przesłana najwyższa oferta,
  • czas, kiedy dana aukcja się zakończy,
  • adres osoby, która wystawiła najwyższą ofertę,
  • ile wei to najwyższa oferta,
  • tablicę adresów i ilość pieniędzy jaką przelali do smart kontraktu, aby osoby, które nie wygrały aukcji, mogły wypłacić swoje pieniądze,
  • zmienną czy aukcja jest zakończona lub nie.
pragma solidity 0.8.11;

contract Auction {

    address payable public beneficiary;

    uint public auctionEndTime;

    address public highestBidder;

    uint public highestBid;

    mapping(address => uint) pendingReturns;

    bool ended;

}

Czego możesz nie zrozumieć z powyższego kodu?

Mapping w solidity to tablica klucz-wartość, odpowiednik dictionary w innych językach.

Jeśli nie wiesz czemu zmienna auctionEndTime jest podana w zwykłym uintcie, to jest to z tego powodu, że czas kiedy aukcja się zakończy będzie podany w czasie unixowym.

Stwórzmy sobie constructor, który będzie przyjmował adres do którego zostanie przesłana najwyższa oferta oraz ile czasu będzie trwała aukcja.

constructor(

        uint biddingTime,

        address payable beneficiaryAddress

    ) {

        beneficiary = beneficiaryAddress;

        auctionEndTime = block.timestamp + biddingTime;

    }

Na co warto zwrócić uwagę ?

  • block.timestamp to zmienna, która oznacza po prostu jaki jest teraz czas podany oczywiście jako czas unixowy.

Funkcja do składania ofert

Teraz stwórzmy sobie funkcję, która będzie służyła do składania swojej oferty. Funkcja ma zwracać błąd jeśli :

  • aukcja się zakończyła,
  • nasza oferta będzie niższa niż najwyższa oferta.

Na zakończenie wykonywania funkcji, funkcja wyemituje event, mówiący o tym że najwyższa oferta się zmienia. Aplikacja frontendowa może nasłuchiwać emitowanych eventów na smart contracie, dzięki czemu, gdy tylko najwyższa oferta się zmieni, może ona ją zaktualizować w interfejsie użytkownika.

event HighestBidIncreased(address bidder, uint amount);

    event AuctionEnded(address winner, uint amount);

    error AuctionAlreadyEnded();

    error BidNotHighEnough(uint highestBid);

    error AuctionNotYetEnded();

    error AuctionEndAlreadyCalled();

    function bid() external payable {

        if (block.timestamp > auctionEndTime)

            revert AuctionAlreadyEnded();

        if (msg.value <= highestBid)

            revert BidNotHighEnough(highestBid);

        if (highestBid != 0) {

            pendingReturns[highestBidder] += highestBid;

        }

        highestBidder = msg.sender;

        highestBid = msg.value;

        emit HighestBidIncreased(msg.sender, msg.value);

    }

Jak widzisz w powyższym kodzie definiowane są eventy z parametrami, które możemy wyemitować na blockchainie. Aby wyemitować event w solidity wpisujemy 

emit  + nazwa eventu i parametry

Zdefiniowaliśmy sobie swoje własne errory, które jeśli chcemy wywołać wpisujemy

revert + nazwa naszego erroru i parametry.

Zapewne domyśliłeś się już, że zamiast ifów i custom errorów mogliśmy użyć requiera.

Ta funkcja sprawdza czy aukcja się już nie zakończyła, czy msg.value jest wyższy niż najwyższa oferta, jeśli tak aktualizujemy mapping pendingReturns, żeby osoba, która złożyła wcześniej najwyższą ofertę mogła dostać z powrotem swoje pieniądze. Przypisujemy najwyższą ofertę do msg.value oraz highestBidder do msg.sender, na końcu wykonywania funkcji emitujemy event, który informuje, że najwyższa oferta została zwiększona.

Funkcja do zakończenia aukcji, oraz przelania najwyższej oferty do beneficiera

Teraz stwórzmy funkcję dzięki, której po zakończonej aukcji adres beneficiary, będzie mógł przesłać do swojego portfela pieniądze.

Ta funkcja powinna:

  • zwracać błąd jeśli aukcja się jeszcze nie skończyła,
  • zwracać błąd jeśli ta funkcja została już wywołana,
  • zmieniać zmienna ended na true,
  • wyemitować event świadczący o tym, że aukcja się zakończyła,
  • przesłać ilość Ethereum równoważną do najwyższej oferty do beneficiera.

  

function auctionEnd() external {

        if (block.timestamp < auctionEndTime)

            revert AuctionNotYetEnded();

        if (ended)

            revert AuctionEndAlreadyCalled();

        ended = true;

        emit AuctionEnded(highestBidder, highestBid);

        beneficiary.transfer(highestBid);

    }

Funkcja dla osób, które nie wygrały aukcji i chcą odzyskać swoje pieniądze

Teraz, ostatnia funkcja, której potrzebujemy, aby nasz kontrakt był gotowy! Będzie ona dla adresów, które nie wygrały aukcji, a chcą odzyskać swoje pieniądze. Zastanówmy się co powinna mieć w sobie taka funkcja :

  • powinna sprawdzać ile należy ci się ethereum w mappingu pendingReturns oraz przypisać tą wartość do zmiennej,
  • powinna zmienić ile ci się należy na 0,
  • powinna przesłać tyle Ethereum ile zapisaliśmy w zmiennej.

No to do dzieła !

  function withdraw() external{

        uint amount = pendingReturns[msg.sender];

        pendingReturns[msg.sender] = 0;

        payable(msg.sender).transfer(amount);

    }

To już koniec dzisiejszego tutorialu ! Nasz smart contract jest gotowy. W celu poćwiczenia oraz utrwalenia sobie wiedzy, jako zadanie możesz spróbować zamienić custom errory na requiry. Jeśli to jednak dla ciebie za mało możesz również ulepszyć ten kontrakt, aby dało się w nim prowadzić kilka aukcji na raz.

Tagi

Most viewed


Never miss a story

Stay updated about Nextrope news as it happens.

You are subscribed

Blockchain dla twórców: Bezpieczna i zrównoważona infrastruktura

Miłosz Mach

07 lis 2025
Blockchain dla twórców: Bezpieczna i zrównoważona infrastruktura

W świecie cyfrowej twórczości, gdzie granice między sztuką a technologią coraz bardziej się zacierają, projekty takie jak MARMALADE stają się symbolem nowej ery – ery, w której twórcy mogą chronić swoje prace i zachować nad nimi kontrolę dzięki blockchainowi. Dla Nextrope udział w MARMALADE to nie tylko implementacja narzędzi ochrony, takich jak blokowanie zrzutów ekranu czy watermarking. To przede wszystkim praca nad architekturą zaufania – tworzeniem infrastruktury, która pozwala twórcom działać w cyfrowym świecie bez obaw o utratę własności i bezpieczeństwo.

Nowy typ wyzwania dla blockchaina

Projekty kulturalne i edukacyjne mają zupełnie inne wymagania niż klasyczne rozwiązania DeFi. Tu nie chodzi o maksymalizację stóp zwrotu czy skomplikowane kontrakty finansowe.
W centrum znajduje się człowiek – artysta, ilustrator, edukator.

Dlatego jednym z największych wyzwań było stworzenie bezpiecznej, ale intuicyjnej infrastruktury. Systemy blockchain musiały być lekkie, energooszczędne i przyjazne użytkownikom, którzy często po raz pierwszy stykają się z technologią Web3.

„Naszym celem nie było zbudowanie kolejnego protokołu finansowego. Chcieliśmy stworzyć infrastrukturę zaufania dla twórców cyfrowych." - zespół Nextrope

Bezpieczeństwo, które nie przeszkadza

Najlepsze zabezpieczenia to te, których użytkownik… nie zauważa.
W MARMALADE położyliśmy nacisk na niewidoczne technologie bezpieczeństwa, które nie psują doświadczenia korzystania z platformy.

  • Blokowanie zrzutów ekranu chroni prace publikowane w przeglądarce.
  • Dynamiczny watermarking pozwala wykryć nieautoryzowane kopie.
  • Rejestr blockchain gwarantuje, że każdy dowód własności jest trwały i transparentny.

„Twórcy nie powinni martwić się o szyfrowanie czy klucze prywatne. Naszym zadaniem jest sprawić, by bezpieczeństwo działało w tle.”

Zrównoważony rozwój w DNA

MARMALADE to również odpowiedź na pytanie, jak łączyć innowacje z troską o środowisko.
Nextrope buduje rozwiązania, które korzystają z niskoemisyjnych sieci, a sama architektura jest modularna i łatwa do ponownego wykorzystania w innych projektach sektora kreatywnego.

Dzięki temu efekty prac MARMALADE mogą posłużyć nie tylko artystom, ale również instytucjom kultury czy uczelniom, które chcą w prosty sposób wprowadzać blockchain do swoich działań.

Więcej niż technologia

Dla Nextrope MARMALADE to coś więcej niż projekt – to dowód, że blockchain może być narzędziem społecznym, nie tylko finansowym.
Tworząc narzędzia dla artystów, pomagamy nie tylko chronić ich prace, ale też zrozumieć, że technologia może wspierać twórczość, a nie ją ograniczać.

Plasma (XPL). Architektura, kluczowe funkcje i znaczenie

Miłosz Mach

21 paź 2025
Plasma (XPL). Architektura, kluczowe funkcje i znaczenie

Czym jest Plasma?

Plasma (XPL) to blockchain warstwy 1 zaprojektowany specjalnie pod infrastrukturę stablecoinów łączy bezpieczeństwo Bitcoina z kompatybilnością EVM oraz ultraniskimi opłatami za transfery tokenów takich jak USDT.

To nowa generacja blockchaina, która ma umożliwić szybkie, tanie i skalowalne płatności w stablecoinach, eliminując ograniczenia znane z Ethereum czy Layer-2.

Dlaczego powstała Plasma?

Większość obecnych blockchainów nie została stworzona z myślą o stablecoinach w roli głównej. Wraz z ich rosnącą adopcją pojawiły się problemy: wysokie opłaty, zatłoczone sieci i ograniczona interoperacyjność.

Plasma rozwiązuje te problemy, oferując infrastrukturę dedykowaną do stablecoinów i przepływów finansowych.
Jej najważniejsze cechy to:

  • Brak opłat transakcyjnych (zero-fee) dla transferów USDT,
  • Własne tokeny gas – elastyczny model opłat,
  • Most Bitcoin (BTC bridge) – umożliwia wykorzystanie BTC jako zabezpieczenia,
  • Pełna kompatybilność z EVM – łatwe wdrożenia smart kontraktów z Ethereum.

Architektura i mechanizmy działania Plasmy (XPL)

Kompatybilność EVM i smart kontrakty

Deweloperzy korzystający z Solidity, Hardhat czy Foundry mogą bez problemu wdrażać swoje projekty na Plasmie. Migracja z Ethereum czy Polygon wymaga minimalnych zmian w kodzie, podobnie jak inne blockchain zgodne z EVM, które zostały omówione w niniejszym artykule: „Web3 Backend Przewodnik: Odblokuj Superszybką Skalowalność DApps Dzięki API!"

Model opłat (Gas Model)

Plasma wspiera niestandardowe tokeny gas, co oznacza, że użytkownik nie musi posiadać natywnego XPL, by opłacić transakcję. Dla stablecoinów (np. USDT) transfery mogą być całkowicie darmowe.

Most Bitcoin (BTC Bridge)

Dzięki wbudowanemu mostowi Plasma pozwala używać BTC jako zabezpieczenia w smart kontraktach. To połączenie bezpieczeństwa Bitcoina z elastycznością Ethereum dlatego często nazywa się ją „Bitcoin-secured blockchain for stablecoins”.

Bezpieczeństwo i finalność

Konsensus Plasmy został zoptymalizowany pod kątem finalności transakcji i ochrony przed reorganizacjami bloków.
Według danych z raportu The Block, sieć osiągnęła ponad 2 miliardy USD wartości stablecoinów (TVL) już w fazie beta mainnetu.

Czym Plasma (XPL) wyróżnia się na tle innych blockchainów?

FunkcjaPlasma (XPL)Inne L1 / L2
Dedykowana stablecoinom✅ Tak❌ Nie
Transfery USDT bez opłat✅ Tak⚠️ Rzadko
Most Bitcoin (BTC bridge)✅ Tak⚠️ Nieliczne przypadki
Kompatybilność z EVM✅ Tak✅ Tak, ale często z ograniczeniami
Płynność i adopcja stablecoinów✅ >2 mld USD⚠️ W fazie rozwoju

Przykładowe zastosowania Plasma (XPL)

Plasma jest idealna dla firm fintechowych, emitentów stablecoinów, projektów DeFi i startupów, które chcą tworzyć produkty oparte na tokenach powiązanych z walutami fiducjarnymi.

Możliwe zastosowania:

  • Portfele i aplikacje płatnicze (zero-fee),
  • Cross-border payments i remittance,
  • Skarbce (treasury management) i rozliczenia między firmami,
  • DeFi – rynki pożyczek, yield farming, AMM-y,
  • Tokeny zabezpieczone Bitcoinem (BTC-backed stablecoins).

Ropzpocznij budowę projektu na Plasma (XPL)

  1. Migracja smart kontraktów – sprawdź kompatybilność i dostosuj parametry gazu,
  2. Wybór modelu opłat – zdecyduj, czy użyjesz USDT, osobnych tokenów gas lub hybrydy,
  3. Audyt bezpieczeństwa – skup się na logice mostu, reentrancy, oracle’ach,
  4. Onboarding płynności – zbuduj pierwsze pule stablecoinów,
  5. Zgodność z regulacjami – szczególnie przy emisji stablecoinów,
  6. Wdrożenie MVP i skalowanie – testuj UX, koszty i bezpieczeństwo.