Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2018. Светлана Русова (SmartContracts....

CodeFest 2018. Светлана Русова (SmartContracts.Engineer) — Смарт-контракты и оракулы —как верифицировать данные для блокчейна и смарт-контрактов

Посмотрите выступление Светланы: https://2018.codefest.ru/lecture/1330/

Блокчейн в проекте решает 3 задачи: защита данных от подделки, надёжность хранения и "оцифровка" данных из реального мира. Производить вычисления и хранить данные внутри блокчейна дороже, чем просто на сервере, поэтому для хранения и вычислений можно использовать другое ПО, а блокчейн становится защищённой базой данных. На большинстве проектов внутри блокчейна доступны только две операции запись и чтение. Но если помимо чтения и записи в блокчейне будут выполняться ещё какие-то операции непосредственно с данными, либо на их основе, то во-первых, это нужно учесть в архитектуре блокчейна (пример с архитектурой ethereum), а во-вторых, потребуется верифицировать не только данные, но и "сигналы" (события) из реального мира, которые могут приводить к изменениям состояния блокчейна и данных (пример работы с оракулами).

Уровень
Backend-разработчики, которые работают с технологиями блокчейна

CodeFest

April 09, 2018
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. Светлана Русова ПРЕДПРИНИМАТЕЛЬ, CEO SmartContracts.engineer - founder&CEO учебный центр «BESTRANK»

    - co-founder&CEO SmartContracts.engineer - c 2006 в ИТ-бизнесе (прошла путь от рядового программиста до генерального директора) - с апреля 2017 года занимается разработкой реализации проектов с использование blockchain - автор и ведущая курса для программистов «BlockChain и смарт-контракты», «Практикум по Solidity», «Разработка DApps для Ethereum» 2
  2. Тезисы 1. Задачи блокчейна в бизнесе 2. Верификация данных перед

    хранением в блокчейне 3. Защита от исполняемого кода внутри блокчейна 4. Работа со смарт-контрактами 1. Обработка входящих параметров 2. Запросы к внешним источникам из смарт-контракта 5. Выводы 3
  3. Задача блокчейна в бизнесе заменить бумажные носители для хранения данных,

    сохранив или улучшив следующие показатели: • уровень доверия, • надёжность хранения информации • сложность подделки (несанкционированного внесения изменений). 4
  4. Верификация данных перед записью 8 на клиенте при вводе данных

    на сервере перед записью верификация данных внутри блокчейна
  5. Вывод Если блокчейн используется для хранения данных, то верификация состоит

    из 3 этапов: 1. При вводе данных на стороне клиента (маски, проверка типов, длина сообщений и т.д) 2. Обработчик после получения данных (значения по дефолту, приведение типов, права доступа, дополнение данных) 3. Верификация данных внутри блокчейна (сравнение хеша новых данных с хешами данных, которые уже хранятся) 9
  6. Исполняемый код внутри блокчейна 10 • Идею умных контрактов предложил

    Ник Сабо ещё в 1994 году. • Инструментом для реализации стал Blockchain. • В биткоин возможности смарт- контрактов осознанно ограничены • Виталик Бутерин оценил перспективу и реализовал в Ethereum. Смарт-контракты
  7. 12

  8. Стоимость операций • Запись/изменение глобальных переменных (storage) — 20 000/5

    000 gas • Чтение глобальных переменных — 200 gas • Запись локальных переменных (memory) — 13
  9. Стоимость транзакции 14 (20000 + 21000) * 2 gwei =

    82 gwei 82 gwei = 0,00082 eth 0,00082 eth = 21.04 руб contract Example { uint k public; function setK(uint _k) public { k = _k; } } Кол-во газа * стоимость газа (фиксировано) (задаёт пользователь)
  10. Ethereum Virtual Machine 15 1. Memory 1. Storage 2. Memory

    3. Stack 2. Data location of complex types 3. Transactions and message calls 4. Visibility
  11. Storage 16 contract Test { // this variable is stored

    in storage uint some_data; // has default value for uint type (0) function set(uint arg1) { some_data = arg1; // some_data value was changed and saved in global } }
  12. Memory 17 contract Test { ... function (uint a, uint

    b) returns (uint) { // a and b are stored in memory uint c = a + b // c has been written to memory too return c } }
  13. Stack 18 • 1024 элемента по 256 бит • только

    верхние 16 элементов доступны для использования • лучше через компилятор :)
  14. Data location of complex types contract C { uint[] x;

    // the data location of x is storage // the data location of memoryArray is memory function f(uint[] memoryArray) { x = memoryArray; // works, copies the whole array to storage } 19
  15. Data location of complex types contract C { uint[] x;

    // the data location of x is storage // the data location of memoryArray is memory function f(uint[] memoryArray) { x = memoryArray; // works, copies the whole array to storage // var is just a shortcut, that allows us automatically detect a type // you can replace it with uint[] var y = x; // works, assigns a pointer, data location of y is storage } 20
  16. Data location of complex types contract C { uint[] x;

    function f(uint[] memoryArray) { x = memoryArray; var y = x; y[7]; // fine, returns the 8th element of x y.length = 2; // fine, modifies x through y delete x; // fine, clears the array, also modifies y } } 21
  17. Data location of complex types contract C { uint[] x;

    function f(uint[] memoryArray) { x = memoryArray; var y = x; // The following does not work; it would need to create a new temporary / // unnamed array in storage, but storage is "statically" allocated: y = memoryArray; // This does not work either, since it would "reset" the pointer, but there // is no sensible location it could point to. delete y; } } 22
  18. Transactions and message calls 23 внешняя учётная запись (external) —

    пользовательский аккаунт с публичным адресом и приватным ключом: может инициировать транзакции (transactions) контрактная учётная запись (internal) — код смарт-контракта с определёнными функциями и состояниями: не может инициировать транзакции, но может передавать сообщения (messages)
  19. Transactions and message calls 24 external account contract account external

    account contract account external account transaction messages transaction
  20. contract C { uint private data; function f(uint a) private

    returns(uint b) { return a + 1; } function setData(uint a) { data = a; } // default to public function getData() public returns(uint) { return data; } function compute(uint a, uint b) internal returns (uint) { return a+b; } } 26
  21. contract D { uint local; function readData() { C c

    = new C(); uint local = c.f(7); // error: member "f" is not visible c.setData(3); local = c.getData(); local = c.compute(3, 5); // error: member "compute" is not visible } 27
  22. contract C { uint private data; function f(uint a) private

    returns(uint b) { return a + 1; } function compute(uint a, uint b) internal returns (uint) { return a+b; } } contract E is C { function g() { C c = new C(); uint val = compute(3, 5); // acces to internal member (from derivated to parent contract) uint tmp = f(8); // error: member "f" is not visible in derived contracts } } 28
  23. contract Test { function test(uint[3] a) public returns (uint) {

    // a is copied to memory return a[2]*2; } function test2(uint[3] a) external returns (uint) { // a is located in calldata return a[2]*2; } } 29
  24. Выводы 30 Для хранения и верификации исполняемого кода в блокчейне

    реализовано: 1. газ 2. три вида памяти 3. два вида аккаунтов
  25. Вызов смарт-контракта из своего ПО 32 web3 = new Web3(new

    Web3.providers.HttpProvider("http://localhost:8545")); abi = JSON.parse('[{"constant":true,"inputs":[],"name":"wellcomeString","outputs":[{"name":"","type":"string"}],"paya ble":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newWellcomeString", "type":"string"}],"name":"setWellcomeString","outputs":[],"payable":false,"stateMutability":"nonpayable","type" :"function"}]'); WellcomeContract = web3.eth.contract(abi); contractInstance = WellcomeContract.at('0xc04d0c1bb4984b3a158a780ff3bfc0561484917f'); $(document).ready(function() { let val = contractInstance.wellcomeString.call().toString(); $("#wellcomeStringContainer").html(val); });
  26. oraclize.it 33 import "github.com/oraclize/ethereum-api/oraclizeAPI.sol"; contract ExampleContract is usingOraclize { string

    public EURGBP; function updatePrice() payable { if (oraclize_getPrice("URL") > this.balance) { LogNewOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee"); } else { LogNewOraclizeQuery("Oraclize query was sent, standing by for the answer.."); oraclize_query("URL", "json(http://api.fixer.io/latest?symbols=USD,GBP).rates.GBP"); }
  27. Выводы. 3 вида верификации данных 35 1. Обезопасить неисполняемый код

    перед записью в блокчейн 2. Архитектура виртуальной машины для записи в блокчейн исполняемого кода (внешние и внутренние аккаунты, газ, 3 вида памяти и т.д) 3. Обеспечение стабильной работы и стандартизации интерфейса оракулов для взаимодействия со смарт- контрактом.