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