CodeFest 2018. Никита Баксаляр (MaidSafe) — Блокчейн с человеческим лицом: децентрализованные приложения на базе Ethereum

CodeFest 2018. Никита Баксаляр (MaidSafe) — Блокчейн с человеческим лицом: децентрализованные приложения на базе Ethereum

Посмотрите выступление Никиты: https://2018.codefest.ru/lecture/1295/

Блокчейн прочно входит в нашу жизнь и находит практическое применение в децентрализованных приложениях (DApps), но многие разработчики скептично относятся к этой технологии и зачастую не знают, какие возможности скрываются у нее под капотом.

В этом докладе мы не будем говорить о трейдинге, токенах, ICO и других набивших оскомину темах.

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

Темы доклада:
— Вводная: как работают смарт-контракты и что они дают
— Как устроена P2P-сеть Ethereum и чем это лучше обычных серверов
— Деплой и применение DApps в частных сетях (private blockchain)
— API для блокчейна и контрактов в сети Ethereum
— Немного про создание пользовательского интерфейса для DApps (JavaScript/web, desktop).
— Примеры приложений, которые можно создавать на базе Ethereum.

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 05, 2018
Tweet

Transcript

  1. Ethereum ÐApps Или блокчейн с человеческим лицом

  2. Немного про Ethereum • «Мировой компьютер» и база данных •

    Платежное средство • Платформа для децентрализованных приложений (ÐApps)
  3. Как устроен Ethereum • Децентрализованная P2P-сеть в основе • Виртуальная

    машина EVM • «Машинный» код и высокоуровневые языки
  4. Особенности P2P-сети • DHT-подобный протокол • Все участники сети равны

    • У всех хранятся одинаковые данные
  5. Платежи • Встроенные «коины» — Ether
 или ETH. Текущая цена:

    ~410$ • Полноценная замена Bitcoin
  6. Транзакции • Машина состояний • Группируются в блоки • Подтверждаются

    майнингом
  7. Блокчейн • Средство достижения консенсуса • Подтверждает корректность транзакций •

    Использует Proof of Work: алгоритм подтверждения выполненной работы • Все данные публичны
  8. Аккаунты • Каждый аккаунт имеет 160-битный адрес • Хранят состояние

    и коины (Ether) • Делятся на два типа: контролируемые пользователями и контракты
  9. Смарт-контракты • Специальный тип аккаунтов • Не могут быть изменены

    • Хранят код и данные • Запускают код в ответ на сообщения
  10. Создание транзакций • Создаются только контролируемыми пользователями аккаунтами • …

    но есть внутренние транзакции: передача сообщений другим смарт-контрактам в сети
  11. Цена транзакций • Gas — «топливо» для исполнения транзакций •

    Каждая выполняемая EVM инструкция
 отнимает gas • У каждой транзакции — лимит числа выполняемых инструкций (gas limit)
  12. Цена транзакций • Вознаграждение за выполнение транзакции
 уходит майнерам •

    Майнеры выбирают из очереди наиболее выгодные для себя транзакции (gas price) • Средняя цена транзакции — ~0.002 ETH или ~60 ₽
  13. Выполнение кода • Ethereum VM интерпретирует байткод • Майнеры соревнуются

    за добавление транзакции в блокчейн • Первый майнер успешно добавивший блок получает ~3 ETH
  14. Хранение состояния • Состояние хранится у всех участников сети и

    доступно всем • Ключ → значение (данные связываются с аккаунтами) • Реализовано через специальные деревья Меркла
  15. Разработка

  16. Solidity • Язык высокого уровня • Похож на JavaScript, но

    не является им
  17. Контракты contract Counter { uint counter; function Counter(uint start) public

    { counter = start; } }
  18. contract Counter { uint counter; function Counter(uint start) public {

    counter = start; } } Контракты uint counter;
  19. contract Counter { uint counter; function Counter(uint start) public {

    counter = start; } } Контракты function Counter(uint start) public { counter = start; }
  20. Функции function increment() public { counter += 1; }

  21. Функции function getVal() public constant returns(uint) { return counter; }

  22. [{
 "constant": false,
 "inputs": [],
 "name": "increment",
 "outputs": [],
 "payable":

    false,
 "type":"function"
 }, { … }] Application Binary Interface • Скомпилированное описание контракта, с адресами функций в байткоде
  23. Типы данных • Строки (string), числа (int, uint), адреса (address)

    • Структуры: 
 struct Deposit { address addr; uint amount; }
  24. Вызов функций • Могут быть вызваны любым пользователем, все контракты

    общедоступны • Можно ограничить пользователей определенными адресами
  25. Тип mapping • Почти как хэш-таблицы, но не совсем •

    Ключ → значение • Хранит только значение, поэтому нет перечисления и итерации
  26. mapping (address => uint) funding; funding[0xCAFEbA...] = 100; return funding[0xCAFEbA...]

    // 100
  27. Интерфейсы interface Token { function transfer(address recipient, uint amount) public;

    } • Позволяют создавать контракты с предсказуемым поведением
  28. Среда разработки Remix IDE (remix.ethereum.org)

  29. Просмотр транзакций Etherscan (etherscan.io)

  30. Отладка контрактов • Виртуальная машина EVM на JavaScript • Локальный

    сервер (geth) • Тестовая сеть Ethereum
  31. Деплой • Truffle — инструмент для
 тестирования, разработки и
 развертывания

    контрактов
  32. Web3.js • Взаимодействие с сетью Ethereum из браузера и JavaScript

    • Доступны все клиентские функции • Позволяет создавать интерфейс для приложений
  33. Токены и ERC20 interface ERC20Interface { <…> function balanceOf(address tokenOwner)


    constant returns (uint balance); function transfer(address to, uint tokens)
 returns (bool success); <…> }
  34. mapping (address => uint) balances;
 function balanceOf(address tokenOwner) public
 constant

    returns (uint balance)
 { return balances[tokenOwner]; }
  35. function transfer(address to, uint tokens) public
 returns (bool success)
 {

    balances[msg.sender] -= tokens; balances[to] += tokens; }
  36. function transfer(address to, uint tokens) public
 returns (bool success)
 {

    balances[msg.sender] -= tokens; balances[to] += tokens; } balances[msg.sender]
  37. Заключение

  38. Реальные проекты? • «Умный» банкинг • P2P-кредитование • Логистика •

    DNS без централизации • Голосование и прямая демократия &
  39. Проблемы Ethereum • Скорость выполнения транзакций • Безопасность смарт-контрактов

  40. Будущее Ethereum • Plasma • Proof of Stake • Sharding

  41. Подведение итогов • Децентрализованные приложения можно создавать уже сейчас •

    Существуют некоторые нерешенные проблемы • Проект продолжает активно развиваться
  42. Спасибо. Вопросы?