# Metamask

Metamask - браузерный кошелёк для работы с сетью Ethereum.
Позволяет принимать/отправлять монеты и токены.

В этой лабораторной работе мы:
- установим metamask
- произведём начальную настройку
- подключим кошелёк к нашей сети
- проведём транзакцию

### Установка

Если metamask ещё не установлен, то для его установки нужно перейти на сайт `metamask.io`

Нажать `Download now`

![screen_1](./res/Metamask/1.png)

Выбрать firefox и нажать `Install MetaMask for Firefox`

![screen_2](./res/Metamask/2.png)

В открывшемся сайте нажать `Add to Firefox`

![screen_3](./res/Metamask/3.png)

Нажать `добавить`

![screen_4](./res/Metamask/4.png)

Далее при настройке metamask будет предложено два варианта. Первый- вход в существующий кошелёк. Второй- создание нового кошелька. Выберем второй.

Придумываем пароль от восьми символов. Безопасность сейчас не нужна, поэтому введём восемь нулей.<br>
После подтверждения пароля будет предложено сохранить его. Вежливо откажемся.

Далее будет предложено сохранить seed фразу

![screen_5](./res/Metamask/5.png)

Seed фраза- это что-то вроде пароля от всех наших аккаунтов.<br> 
Она создаётся следующим образом:
- Берётся 128/256 случайно созданных бит (для длинны seed в 12/24 слова)
- Разбивается по 11 бит на слово
- Для последнего слова не будет хватать бит. Поэтому предыдущие биты хешируются, и недостающие биты доставляются из начала хеша в конец. Такая система позволяет контролировать целостность seed фразы
- Используя словарь в 2048 слов, наборы бит заменяются на соответствующие слова
- Seed фраза готова

От seed фразы поочерёдно создаются аккаунты. То есть, для создания первого аккаунта, к seed фразе в конце добавляется 0, хешируется, и из этого хеша создаётся аккаунт. Для второго аккаунта добавляется 1 и так далее.

В итоге, если мы находясь в глобальной сети Ethereum создадим seed фразу, и на аккаунт, образованный от этой фразы получим монеты, то используя эту же seed фразу на другом устройстве, подключённом к той-же сети Ethereum, и дойдя до аккаунта с тем-же номером, мы обнаружим, что на нём есть те же деньги.

Эту seed фразу можно записать, чтобы в будущем использовать те же аккаунты в ganache.

Нажимаем на поле с замком, копируем seed, и вставим его в файл.

```
$ vim ~/.ethereum/seed
```

Если папка .ethereum ещё не существует, то создайте её командой `mkdir ~/.ethereum`

Нажимаем `i` для входа в текстовый режим, `Ctrl + v`, `esc` для выхода из текстового режима, `:wq` для сохранения и выхода.

Теперь наш ключ хранится в файле ~/.ethereum/seed

Когда мы нажмём далее, от нас попросят восстановить порядок слов. Откроем файл той-же командой, и восстановим порядок.

После этого мы попадём на главный экран metamask.

![screen_6](./res/Metamask/6.png)

Если metamask закрыт, и вы хотите открыть его новой вкладкой, то нужно нажать на расширение metamask > три точки > развернуть

![screen_7](./res/Metamask/7.png)

### Подключение к сети

Нажмите на меню сетей (Основная сеть Ethereum) слева от авы и выберите `пользовательский rpc`

![screen_8](./res/Metamask/8.png)

Здесь заполните параметры в соответствии с созданной сетью. На скрине приведён пример случая, когда всё сделано по лабе `geth`

![screen_9](./res/Metamask/9.png)

Тут были указаны локальный адрес компьютера + порт пользовательского взаимодействия и id сети, заданные в genesis блоке и при запуске geth.

При работе с ganache эти данные можно будет узнать на его главной панели.

Сохраняем, и если всё верно, то мы будем подключены к нашей Ethereum сети.

### Транзакция

Теперь, если в сети идёт майнинг (в ganache он идёт по умолчанию, используя вид консенсуса Proof Of Authority. В geth его нужно запустить вручную командой `miner.start(2)` в `geth attach`, и дождаться начала майнинга), то можно создать несколько адресов, и перекидывать между ними деньги.

Давайте возьмём адрес geth, на который идёт майнинг. По лабе `geth` его ключ хранится в ~/.ethereum/priv/0. Откроем этот файл командой чтения файлов `less`, скопируем ключ, и закроем файл нажатием `q`.

Далее, нажав на аву в metamask, открываем импорт счёта

![screen_10](./res/Metamask/10.png)

Здесь должен быть выбран способ `закрытый ключ`. Вставляем ключ в поле и жмём `импортировать`.

Сразу получаем тот самый аккаунт, на который идёт майнинг.

Теперь можно передать деньги на наш первый аккаунт в metamask. Для переключения аккаунтов можно нажать на аву, и выбрать нужный аккаунт. Выбираем первый, где ничего нет. Наверху написано его название и часть адреса. Нажимаем туда, и таким образом копируем адрес.

![screen_11](./res/Metamask/11.png)

Теперь возвращаемся на аккаунт с кучей денег, и жмём `отправить` В поле поиска вставляем адрес получателя.

Указываем, сколько денег хотим передать. Передадим 20 ETH

![screen_12](./res/Metamask/12.png)

Нажимаем `далее` и `подтвердить`

Идём на первый аккаунт и видим, что деньги пришли.


# Если что-то не работает

Если вдруг metamask ведёт себя как-то неправильно, это может быть из-за того, что данные в сети и в metamask не совпадают. Это может вызвать например зависшие транзакции, или неверное кол-во монет. 

Такая беда может возникнуть например из-за пересоздания сети.

Чтобы исправить это, нужно зайти в настройки metamask (в меню авы) > продвинутый/advanced > сбросить аккаунт. После этого будет сброшена история, и всё должно работать правильно.
