Portfele w Ethereum

Piotr Nazimek, 19 września 2017

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.

Konta w Mist Konta w Mist

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.

Konfiguracja portfela z jednym właścicielem Konfiguracja portfela z jednym właścicielem

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.

Utworzenie kontraktu portfela Utworzenie kontraktu portfela

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.

Portfel Agnieszki Portfel Agnieszki

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).

Funkcje kontraktu portfela Funkcje kontraktu portfela

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.

Portfel Agnieszki po wykonanu przelewu Portfel Agnieszki po wykonaniu przelewu

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.

Tworzenie portfela z trzema właścicielami Tworzenie portfela z trzema właścicielami

Wyświetlając informacje o utworzonym Funduszu możemy zobaczyć aktualny dzienny limit, liczbę wymaganych potwierdzeń oraz informacje o właścicielach portfela.

Informacje o Funduszu Informacje o Funduszu

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.

Zatwierdzanie transakcji przekraczającej limit Zatwierdzanie transakcji przekraczającej limit

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.


Tematy: ochrona informacjikryptografiablockchainrejestrbaza danychethereumportfel
Napisano w: Technologie
Zapisz się przez RSS
comments powered by Disqus