Portfele w Ethereum

7 lat temu
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](https://github.com/ethereum/meteor-dapp-wallet). Jego instancję utworzymy dzięki klienta [Mist](https://github.com/ethereum/mist/releases), 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.

![mist-wallet-1.webp](/uploads/mist_wallet_1_7465283775.webp)


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.

![mist-wallet-2.webp](/uploads/mist_wallet_2_9ff9201627.webp)


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.

![mist-wallet-3.webp](/uploads/mist_wallet_3_b8cac3ecee.webp)


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.

![mist-wallet-4.webp](/uploads/mist_wallet_4_37ab897be7.webp)


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

![mist-wallet-5.webp](/uploads/mist_wallet_5_b2ad243a7c.webp)


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.

![mist-wallet-6.webp](/uploads/mist_wallet_6_fc447de95a.webp)


## 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ą, o ile limit zostanie przekroczony wymagana będzie akceptacja przez co najmniej jednego (w naszym przykładzie) z pozostałych właścicieli.

![mist-wallet-7.webp](/uploads/mist_wallet_7_c3a6bc6571.webp)


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

![mist-wallet-8.webp](/uploads/mist_wallet_8_097fa52f18.webp)


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.

![mist-wallet-9.webp](/uploads/mist_wallet_9_57e60f31b8.webp)


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](https://github.com/paritytech/parity), stał się w lipcu obiektem ataku. O tym jakie były jego przyczyny i skutki napiszę w kolejnym odcinku.
Idź do oryginalnego materiału