Poznaliśmy już niektóre możliwości inteligentnych kontraktów w blockchain Ethereum. W tym wpisie dokładniej przedstawię jedno z ich zastosowań jakim jest portfel (ang. wallet), którego zadaniem jest przechowywanie i zarządzanie Etherami. Portfel jest kontraktem, który może na przykład pilnować dziennego limitu transferu środków, mieć kilku właścicieli oraz wymagać zatwierdzania transakcji przez określoną liczbę z nich. Utworzymy dwa rodzaje portfela, zarówno z jednym jak i z wieloma właścicielami.
Pilnowanie wydatków
Jednym z popularnych portfeli jest Ethereum Wallet. Z kodem kontraktu można zapoznać się przeglądając plik Wallet.sol
z repozytorium pod tym adresem. Jego instancję utworzymy za pomocą klienta Mist, którego używałem w poprzednich wpisach. Po uruchomieniu węzła oraz procesu kopania w prywatnym blockchain możemy włączyć aplikację kliencką Mist i utworzyć konta Agnieszki, Grzegorza i Piotra, które posłużą do obserwacji działania portfela.
Po uruchomieniu procesu kopania i uzyskanych dzięki temu Etherów możemy zasilić konto Agnieszki. Wykorzystamy je do utworzenia portfela z jednym właścicielem. W sekcji Wallet contracts wybieramy Add wallet contract. Pojawi się okno, w którym możemy zdefiniować nazwę tworzonego portfela, jego głównego właściciela (czyli konto, z którego zostanie utworzony kontrakt) oraz typ portfela. Wybieramy konto z jednym właścicielem i tworzymy kontrakt.
Kiedy kontrakt zostanie utworzony na ekranie zobaczymy wygenerowany adres z informacją, żeby zachować go w bezpiecznym miejscu. Utrata adresu to w pewnym sensie zgubienie portfela w gąszczu innych kontraktów, dlatego warto zastosować się do wyświetlonej rady.
Utworzony portfel widoczny jest w sekcji Wallet contracts. Wyświetlenie jego szczegółów pozwala na zapoznanie się z informacjami takimi jak aktualne saldo czy adres właściciela portfela.
Zasilmy portfel Agnieszki z jej prywatnego konta przelewając na przykład 50 Etherów na adres kontraktu. Od tej pory będziemy mogli przelewać Ethery z kontraktu, natomiast opłata za wykonanie transakcji będzie pobierana z konta, z którego ją zlecimy. Pozwala to na czytelne rozdzielenie kosztów transakcji od ich wartości. Klikając na zakładce portfela w przycisk Show contrcat info możemy zobaczyć funkcje jakie udostępnia kontrakt. Jedną z nich jest Set Daily Limit. Pozwala ona na ustalenie limitu dziennych wydatków. Kwotę podajemy w wei. Zatem ustalając limit na 10 Etherów musimy wpisać 10000000000000000000 (10 i osiemnaście zer).
Pozostałe funkcje tego kontraktu umożliwiają:
- Change Owner - zmianę jednego z właścicieli na innego,
- Remove Owner - usunięcie jednego z właścicieli portfela,
- Is Owner - sprawdzenie czy dany adres jest właścicielem,
- Reset Spent Today - reset licznika wydanych Etherów,
- Add Owner - dodanie współwłaściciela,
- Confirm - zatwierdzenie transakcji (jeśli wymaga zatwierdzenia przez kilku właścicieli, argumentem będzie adres zleconej transakcji),
- Execute - zlecenie transakcji,
- Revoke - usunięcie potwierdzenia transakcji (argumentem jest identyfikator transakcji potwierdzenia),
- Change Requirement - zmiana liczby wymaganych potwierdzeń transakcji,
- Kill - usunięcie portfela, Ethery zostaną przelane do jednego z właścicieli.
Większość z funkcji stosowanych dla portfela z wieloma właścicielami będzie wymagało zgody wydanej przez ustaloną, minimalną ich liczbę.
Po ustaleniu limitu na 10 Etherów spróbujmy wykonać przelew z konta kontraktu. Możemy wykonać go na dwa sposoby: poprzez wywołanie funkcji Execute oraz poprzez Transfer Ethers and Tokens. Druga z metod jest graficzną nakładką dla metody Execute i wykonywana jest zawsze z konta właściciela kontraktu. Po zleceniu przelewu o wartości 6-ciu Etherów z portfela Agnieszki na adres konta Piotra w zakładce portfela zobaczymy informacje o pozostałym limicie wypłat. Warto spróbować go przekroczyć. Limit ten zostanie zresetowany następnego dnia.
Współdzielony portfel
Podczas tworzenia współdzielonego portfela podajemy liczbę właścicieli, dzienny limit wypłat niewymagający potwierdzeń oraz minimalną liczbę właścicieli do zatwierdzania transakcji powyżej ustalonego limitu. Zlecenia do wartości limitu może zlecać każdy właściciel portfela. Zlecenia się sumują, jeżeli limit zostanie przekroczony wymagana będzie akceptacja przez co najmniej jednego (w naszym przykładzie) z pozostałych właścicieli.
Wyświetlając informacje o utworzonym Funduszu możemy zobaczyć aktualny dzienny limit, liczbę wymaganych potwierdzeń oraz informacje o właścicielach portfela.
Zlecając transakcję o wartości przekraczającej limit tuż po jej wykopaniu pojawi się notyfikacja kierująca do funkcji Confirm lub Revoke, odpowiednio zatwierdzającej lub odwołującej zatwierdzenie transakcji.
Zachęcam do eksperymentów z różnymi metodami kontraktu portfela zarówno na jego instancji z jednym jak i wieloma właścicielami. W prywatnym blockchain transakcje możemy zlecać do woli nie przejmując się zakupem Etherów.
Podsumowanie
Omówiony kontrakt to nie jedyna implementacja portfela w Ethereum. Każdy może zaimplementować własny, dostępne są również inne popularne portfele. Jeden z nich, wbudowany w aplikację Parity, stał się w lipcu obiektem ataku. O tym jakie były jego przyczyny i skutki napiszę w kolejnym odcinku.