Разбор кода EasyInvest5
По всем вопросам писать @alexkirsanoffКонтракт: 0x6519d6Dfd11363CF0821809b919B55F794fe0cb5
Исходный код: https://etherscan.io/address/0x6519d6Dfd11363CF0821809b919B55F794fe0cb5#code
В данном статье объясняется как работает код смартконтракта EasyInvest5
Первой строкой мы объявляем версию компилятора для solidity, в данном случае это версия 0.4.24
![](/file/10cda99c353d8183b4065.png)
Далее идет описание смартконтракта. Это комментарии, они никак не влияют на код
![](/file/94add80c53d952dda6a45.png)
Следующей строчкой, по аналогии с классами, идет название контракта - EasyInvest5. В фигурных скобках заключено тело смартконтракта
![](/file/e2a412eb0b2c39f60b8c9.png)
Далее идет объявление маппингов (ассоциативных массивов), где ключ - это адрес пользователя. У invested значением является инвестированная сумма в wei (1 wei = 0.000000000000000001 ETH), а у atBlock номер блока транзакции, в которой была совершена прошлая инвестиция.
UPD: Маппинги invested и atBlock стали публичными. Теперь можно легко будет смотреть статистику по своим вкладам через вкладку "Read Contract" в etherscan.
![](/file/bfefc8c4bc85840b968c1.png)
На 29 строчке мы объявляем fallback функцию c публичной областью видимости (external), которая будет вызываться когда кто-то просто переводит ETH на счет контракта (даже если ETH равны нулю). Далее идет тело данной функции
![](/file/b7ce6dcf66969f4d68593.png)
Если инвестор уже инвестировал в контракт, то выполняется этот блок кода (условие проверки на 31 строчке).
На 35 строчке идет подсчет суммы для выплаты инвестору:
Сумма для выплаты = [инвестированный баланс пользователя] * 5 / 100 * ([текущий номер блока] - [номер блока прошлой инвестиции]) / 5900
5900 - Это среднее количество блоков, которые добавляются в блокчейн Ethereum за день
На 38 строчке отправляется выплата инвестору, которую ее запросил (msg.sender = адрес инвестора)
UPD: Метод для отправки транзакций вкладчикам был изменен с send на transfer. В отличии от send, transfer выбрасывает исключение, когда не хватает газа для отправки Ваших дивидентов, а не возвращает false и продолжает выполнение кода. Теперь потенциальный риск потерять свои отчисления при недостаточном gas отсутствуют.
![](/file/eb826b93821fee8feb5ae.png)
Далее идет запись в маппинги:
В маппинг atBlock по ключу адреса инвестора записываем текущий блок
К маппингу invested по ключу адреса инвестора прибавляем новую инвестированную сумму (msg.value) к текущей (по умолчанию текущая сумма равна нулю)
На 44 строчке закрывается тело fallback функции. На 45 же строчке закрывается тело контракта EasyInvest5
![](/file/8e8233876efe65f1ff6c6.png)
Конец кода