Сравнение платформ для смарт-контрактов. Написание смарт контракта на эфириуме


Пишем смарт-контракт Ethereum — это просто: Часть 2 — визитка — mapping

Эта вторая статья уроков по написанию смарт-контрактов на Ethereum. Первую часть можно найти тут. Полный список уроков тут.

В сегодняшнем уроке мы напишем смарт-контракт визитку и познакомимся с двумя типами данных —  mapping и uint:

Пусть наша визитка хранит только имя и возраст. Т.е. внутри контракта будет две переменные.

  1. name — имя — переменная уже знакомого нам по первому уроку типа string
  2. age — возраст — переменная типа uint. uint — сокращенно от unsigned int — беззнаковое целое. Целое положительное число по русски.

Также в контракте будут функции для доступа к нашим переменным. Итак, наш контракт:

pragma solidity ^0.4.18; contract BusinessCard { string name; uint age; function getName() public constant returns (string) { return name; } function setName(string newName) public { name = newName; } function getAge() public constant returns (uint) { return age; } function setAge(uint newAge) public { age = newAge; } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

pragma solidity ^0.4.18;

 

contract BusinessCard {

    

    string name;

    

    uint age;

    

    function getName() public constant returns (string) {

        return name;

    }

    

    function setName(string newName) public {

        name = newName;

    }

    

    function getAge() public constant returns (uint) {

        return age;

    }

    

    function setAge(uint newAge) public {

        age = newAge;

    }

 

}

Запустите (как запускать контракт описано в первом уроке) контракт и поиграйтесь с ним. Установите и получите возраст и имя.

Теперь попробуйте самостоятельно добавить поле «год рождения». Внизу решение. Постарайтесь не подсматривать.

pragma solidity ^0.4.18; contract BusinessCard { string name; uint age; uint year; function getName() public constant returns (string) { return name; } function setName(string newName) public { name = newName; } function getAge() public constant returns (uint) { return age; } function setAge(uint newAge) public { age = newAge; } function getYear() public constant returns (uint) { return year; } function setYear(uint newYear) public { year = newYear; } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

pragma solidity ^0.4.18;

 

contract BusinessCard {

    

    string name;

    

    uint age;

    

    uint year;

    

    function getName() public constant returns (string) {

        return name;

    }

    

    function setName(string newName) public {

        name = newName;

    }

    

    function getAge() public constant returns (uint) {

        return age;

    }

    

    function setAge(uint newAge) public {

        age = newAge;

    }

    

    function getYear() public constant returns (uint) {

        return year;

    }

    

    function setYear(uint newYear) public {

        year = newYear;

    }

 

 

}

На данный момент наша визитка хранит три поля  — год рождения, имя и возраст. А что если нам потребуется добавить еще какую-нибудь информацию? Добавлять поля в код контракта как вы уже убедились очень просто. Но каждый раз когда мы меняем контракт его нужно заново заливать в блокчейн. И это уже будет новый контракт. Поэтому нам нужно как-то решить эту проблему.

На помощь нам придет тип данных — mapping. Записывается он так:

mapping (тип_ключей => тип_значений) имя_переменной;

mapping (тип_ключей => тип_значений) имя_переменной;

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

ключ значение
name Alexander
age 30
year 1987

Для нашей карточки ключи — это имена полей. Данные нашей визитной карточки разных типов. А в mapping значения иметь должны один общий тип. Проще всего все значения представить в виде строк. А выглядеть это будет так

mapping (bytes32 => string) data;

mapping (bytes32 => string) data;

Почему ключ типа bytes32? Дело в том что ключем не может быть строка, поэтому мы строку будем преобразовывать в тип bytes32 с помощью функции keccak256. Вдаваться в подробности пока не будем, просто примите это пока как данное.

Тогда добавление в mapping нового элемента в нашем случае будет выглядеть следующим образом:

data[keccak256("newFiled")] = "new value";

data[keccak256("newFiled")] = "new value";

а получение соответственно:

string returnedValue = data[keccak256("newField")];

string returnedValue = data[keccak256("newField")];

Таким образом мы можем записывать в mapping произвольное количество значений. Перепишем наш контракт-визитку:

pragma solidity ^0.4.13; contract BusinessCard { mapping (bytes32 => string) data; function setData(string key, string value) public { data[keccak256(key)] = value; } function getData(string key) public constant returns(string) { return data[keccak256(key)]; } }

pragma solidity ^0.4.13;

 

contract BusinessCard {

    

    mapping (bytes32 => string) data;

    

    function setData(string key, string value) public {

        data[keccak256(key)] = value;

    }

    

    function getData(string key) public constant returns(string) {

        return data[keccak256(key)];

    }

 

}

Запишем его в блокчейн (как это делать описано в первом уроке) и  попробуем записать электронную почту в нашу визитку. Обратите внимание как прописывать параметры функции при вызове, когда параметров несколько — через запятую:

Прописывает почту, нажимаем setData. А потом пробуем получить данные. Пишем что хотим получить «email» и вызываем getData.

Поиграйтесь с контрактом, попробуйте добавить другие поля, например телефон или город.

На этом второй урок заканчивается. Продолжение читать тут. Предыдущий урок тут.

Если у вас возникли вопросы то можете смело писать на электронную почту (раздел «контакты»). Также приветствуется критика.

Если статья показалась вам полезной и вы желаете отблагодарить автора, то это можно сделать отослав немного эфира на адрес 0xEA15Adb66DC92a4BbCcC8Bf32fd25E2e86a2A770.

Полный список уроков тут.

Может быть полезно:

inaword.ru

Сравнение платформ для смарт-контрактов

Как выбрать правильную платформу для работы со смарт-контактами и на что стоит обратить внимание в первую очередь? Майкл Малдерс, блокчейн-разработчик в компании The Ledger, ответил на эти и многие другие вопросы в своем анализе самых перспективных из существующих платформ для смарт-контрактов, а также рассмотрел будущие проекты, которые помогут не только разработчикам, но и обычным бизнесам в работе со смарт-контрактами.

Малдерс выбрал семь платформ: Ethereum, Hyperledger Fabric, NEM, iOlite, Neblio и Lisk, так как по мнению эксперта они представляют крипторынку инновационные решения, являются комплексным сервисом или же универсальны при использовании. Однако, стоит отметить, что на данный момент на рынке успешно развивается огромное количество подобных платформ.

Ethereum — проверенный выбор

Используя платформу Ethereum, можно не сомневаться в ее работе. Ethereum — это Золотой Стандарт мира смарт-контрактов, а платформа имеет самую крупную рыночную капитализацию среди конкурентов. Также большая часть токен-сейлов происходит на данной платформе с использованием токенов стандарта ERC-20.

Однако, у данного стандарта есть несколько серьезных недостатков, которые в прошлом уже приводили к масштабным потерям. Причиной тому служит тот факт, что стандарт ERC-20 предполагает два этапа проведения транзакции с токеном:

 transfer(): Отправка токенов на чей-то адрес.

 approve() + transferFrom(): Депозит токенов в смарт-контракт.

Но что если при выполнении команды transfer() токены случайно были отправлены в смарт-контракт? Данная транзакция пройдет и будет одобрена, однако смарт-контракт принимающей стороны ее не распознает.

«Например, если отправить токены на контракт децентрализованного обменника, то контракт получит эти токены, но обменник не добавит их на ваш баланс. Более того, если такой контракт не сможет реализовать функцию экстренного вывода токенов, то в таком случае будет невозможно вернуть свои средства, которые будут безвозвратно утеряны. Из-за этого бага экосистема Ethereum уже потеряла миллионы долларов».

О такой проблеме написал разработчик нового стандарта ERC223, известный на Reddit и GitHub как Dexaran. Именно он впервые известил криптосообщество Ethereum о вышеупомянутой проблеме и предложил стандарт ERC223 как ее решение. Также для разработчиков Ethereum в ноябре 2017 года был представлен стандарт ERC777. Краткое сравнение этих стандартов:

 ERC223 — данный улучшенный стандарт предлагает решение проблемы ERC20, где пользователи могут ошибочно использовать одну из двух функций для отправки монет и заменить ее единственной transfer(), которая в случае некорректной транзакции будет выдавать ошибку и отменять ее, таким образом защищая средства всех сторон. Фокусируется на безопасности.

 ERC777 — этот стандарт решает такие проблемы ERC20, как отсутствие механизмов обработки транзакций. Фокусируется на массовой адаптации.

Очевидно, что сообществу Ethereum еще только предстоит разработать и внедрить новые стандарты для безопасных и улучшенных токенов.

NEM

Одно из ключевых преимуществ платформы NEM — высокая масштабируемость сети. В то время как Ethereum проводит порядка 15 транзакций в секунду, блокчейн NEM может обрабатывать до 4000 транзакций за тот же промежуток времени. Фонд NEM приложил колоссальные усилия, чтобы пользователи платформы могли не волноваться о технических проблемах. Но несмотря на то, что NEM быстрее, надежнее и проще в использовании, Ethereum предлагает более широкие возможности для программирования и запуска DApps.

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

По словам Nemario, пользователя Reddit, код смарт-контракта можно обновить в любой момент, без внесения изменений в работу блокчейна. Но невозможно выполнить обратные транзакции, что делает платформу NEM менее децентрализованной. Однако право использования мультиподписей и смарт-активов минимизирует последствия данной проблемы.

Благодаря системе смарт-активов, представленной в виде приложений по управлению данными, на платформе NEM пользователи могут создать токены, информационные записи и системы голосования всего за пару кликов. В то время как целевая аудитория Ethereum — это компании, планирующие запуск собственных внутренних сетей в ближайшие 5−10 лет, клиенты NEM — это компании, которым нужно простое, быстрое и безопасное решение уже сейчас.

Hyperledger Fabric

Разработчики Hyperledger Fabric (HLF) любят называть смарт-контракты платформы «чейн-кодом». HLF — это проект, основанный Linux Foundation в 2015 году для разработки и внедрения блокчейн-сетей для корпоративных нужд. В связи с чем предлагаемые решения HLF отличаются гибкостью, необходимой для работы с бизнесами, чего не предлагают другие платформы.

В Hyperledger Fabric используется язык программирования Go, соответственно, и все смарт-контракты платформы поддерживают данный язык. Одним из ключевых преимуществ данного языка является высокая скорость компиляции. По мнению Малдерса, этот фактор существенно облегчает написание чейн-кодов.

Четыре наиболее важные функции чейн-кодов:

 PutState: Создание новых активов или обновление существующих.

 GetState: Возвращение актива.

 GetHistoryForKey: Запрос на историю внесенных изменений.

 DelState: Удаление актива.

Стоит отметить, что функция DelState не удаляет/редактирует блок. HLF используют базу данных состояний для хранения ключей и их значений. Функция DelState удаляет ключ и его значение из базы данных состояний, при этом не меняя блоки в цепочке. Сам процесс удаления ключа и его значения будет сохранен в виде транзакции на блокчейне.

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

Смарт-контракты Stellar

Смарт-контракты платформы Stellar (SSC) существенно отличаются от смарт-контрактов Ethereum. Они не являются полными по Тьюрингу и используются для осуществления договоренностей между несколькими сторонами, чьи действия подкреплены транзакциями. Для сравнения:

Так, в Stellar cреднее время подтверждения  транзакции — 5 секунд, а в Ethereum — 3.5 минуты. В Stellar незначительная цена транзакции — .00001 XLM ~= $0.0000002. 100,000 транзакций на Stellar стоят один цент, комиссия за вычисления не взимается. В то время как в Ethereum она зависит от сложности транзакции, ее скорости и курса ETH и сейчас составляет порядка $0.008. Что касается возможностей, то в Stellar для инструкции по разработке смарт-контрактов есть Stellar Developer Guide, описывающий возможности и абстракции. Ethereum имеет безграничные возможности. А безопасность децентрализованной сети Stellar обеспечивается любой нодой с Stellar Core, и каждый пользователь может подтверждать транзакции. Для повышения уровня безопасности пользователи могут сами выбирать валидаторов. Более того, атомарные транзакции Stellar состоят из простых и декларированных операций, что ведет к более высокому уровню безопасности и облегчает аудит. В Ethereum любой пользователь может подтверждать транзакции. Функций для выбора валидаторов не предусмотрено. А программирование полных по Тьюрингу контрактов затрудняет аудит кода и повышает уязвимость.

SSC могут быть написаны на любом языке, для которого сообщество Stellar предоставит API, — JavaScript, Python, Golang, PHP и так далее. Так, смарт-контракты Stellar на PHP выглядят следующим образом. SSC являются набором транзакций, объединенных и выполняемых благодаря разнообразным ограничениям. В открытой документации Stellar описывают все ограничения, которые могут быть использованы для создания SSC. Например:

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

 Группировка/ Атомарность — благодаря данной функции, транзакция может включать сразу несколько операций. Атомарность гарантирует, что если группа операций будет отправлена на включение в сеть и одна из операций будет отклонена, то все операции в группе будут отклонены.

 Последовательность — концепция последовательности представлена в сети Stellar в виде порядкового номера. Благодаря порядковому номеру можно гарантировать, что определенные транзакции не попадут в сеть, если до этого альтернативные ей транзакции были отправлены на рассмотрение.

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

iOlite — проект, позволяющий легко создавать смарт-контракты

Платформа iOlite стремится помочь в массовой адаптации смарт-контрактов, для чего пользователям будущей платформы будет доступен движок, умеющий распознавать естественный язык и преобразовывать его в код смарт-контракта. iOlite станет идеальным решением для тех, кто не хочет учить различные языки программирования, но стремится использовать смарт-контракты.

Проект iOlite основан на исследовании, проведенном в Стэнфордском университете, где был изобретен FAE (Fast Adaptation Engine), который позволяет преобразовывать обычный язык в любой желаемый программный код, используемый в смарт-контрактах. FAE — это не просто переводчик, это движок, нуждающийся в постоянном развитии и помощи контрибьюторов, в роли которых выступают разработчики и эксперты смарт-контрактов. Они помогают в определении структур языковых выражений. Более того, данные структуры привязаны к смарт-контрактам. Движок работает с огромной базой данных, содержащей эти структуры, и находит подходящую для составления смарт-контракта. Как только определенная структура использована в контракте, внесший ее в базу данных контрибьютор получает вознаграждение в токенах iOlite. Таким образом, развитие iOlite напрямую зависит от участия сообщества, которое поддерживает FAE. А FAE, в свою очередь, помогает им в применении машинного обучения, которое необходимо для быстрой адаптации новых структур.

На данный момент iOlite Labs фокусируется на смарт-контрактах Ethereum и языке программирования Solidity. Трэвис Бирн из команды iOlite объяснил:

«Не только программисты, знающие такие языки, как Python, C, JavaScript и другие, могут моментально использовать свои знания для того, чтобы написать смарт-контракты, но и обычные люди, без какого-либо специального образования могут использовать такие языки, как английский, для того чтобы приступить к разработке. iOlite сможет убрать существующие технические препятствия для работы со смарт-контрактами».

Neblio — блокчейн для бизнеса

Цель Neblio — интегрировать блокчейн-сети в существующие корпорации и компании посредством API восьми наиболее используемых программных языков. Таким образом, любой разработчик сможет работать с блокчейном, при этом не являясь экспертом распределенных сетей.

Для работы Neblio предоставляет пользователям кошелек на Raspberry Pi (одноплатный компьютер) для хранения и стейка токенов.

Сам кошелек может быть установлен одной командой после закачивания его исходного кода. Благодаря стейку и работе ноды пользователь повышает безопасность собственного кошелька через PoS-алгоритм, а взамен количество токенов в стейке возрастает на 10%. Однако нет необходимости постоянно держать Raspberry Pi включенным. Neblio позволяет уходить в оффлайн на 7 дней, в то время как токены все равно будут продолжать работать и повышать стейк. А благодаря технологии QuickSyncwhich, которая позволяет синхронизировать ноду с сетью в течение одной минуты, Raspberry Pi всегда будет оставаться обновленным и соответствовать последним версиям сети.

Lisk -сайдчейны

Платформа Lisk не занимается разработкой смарт-контрактов, вместо этого она обеспечит взаимодействие с системами смарт-контрактов, такими как Ethereum, через виртуальную машинную интеграцию. Lisk — это не система смарт-контрактов, а специализированная блокчейн-система.

Другим преимуществом платформы Lisk является алгоритм консенсуса Delegate PoS, который позволяет сети работать быстрее, одновременно с этим повышая ее уровень безопасности. Также вся экосистема Lisk построена на языке программирования  JavaScript, что значительно упрощает работу с платформой обычным разработчикам.

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

decenter.org

Как написать смарт-контракт Ethereum с нуля?

Как написать смарт-контракт Ethereum с нуля? cryptowiki.ru

Одной из наиболее востребованных функций Ethereum является смарт-контракт. Все больше людей хотят создавать и работать с этими децентрализованными приложениями или dApps. Конечно, создание смарт-контракта — задание не из простых. 

Сперва рассмотрим понятие смарт-контракта. Смарт-контракт — это простой компьютерный протокол, кодифицированный для обеспечения согласования контракта на платформе Ethereum.

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

Определение бизнес-идеи

Поскольку смарт-контракт  в основном используется для реализации бизнес-процессов, решите, в каком направлении будет работать ваш смарт-контракт. Вам нужно знать и точно определить, что вы хотите от своего смарт-контракта. Вы хотите использовать его в казино? Вы хотите построить его для рынка? Это может быть что угодно и все, но вам нужно иметь очень четкую картину.

После того, как вы определитесь с направлением использования, следующий шаг — это техническая часть. Самый первый шаг для вас изучить Solidity. Виртуальная машина Ethereum (EVM) работает на этом языке программирования. Его структура очень похожа на Javascript и C ++, и как только вы тщательно просмотрели свою документацию, изучили этот язык и поняли, как писать код в Solidity, только тогда вы сможете продолжить работу, чтобы получить доступ к требуемому инструментарию для полной работы вашего смарт-контракта. На просторах интернета есть ряд учебных пособий, который непременно помогут вам в изучении Solidity. Вы также можете получить доступ к официальному руководству Solidity от Ethereum по этой ссылке.

Базовые инструменты

Самое первое, что вам понадобится, это инструмент под названием Truffle. Вы можете получить к нему доступ в Github по этой ссылке. Truffle представляет собой основу разработки для Ethereum, в которой вы будете кодировать свою бизнес-идею, используя язык программирования Solidity. Для написания тестов и их развертывания вам нужно будет использовать Node.js. Теперь для большей эффективности вам понадобится то, что будет управлять вашими учетными записями и токенами, с этой целью был создан клиент Parity, который является быстрым и безопасным клиентом Ethereum. Последний должен иметь инструмент в этом списке Web3.js. Разумеется, вам потребуется что-то, что позволит преодолеть разрыв между вашим ноутбуком и сетью Ethereum. Web3.js делает это только путем создания протокола связи с сетью Ethereum с использованием Javascript API.

Написание смарт-контракта

Сначала напишите применимый автоматизированный модульный тест вашей бизнес-идеи в Javascript или даже в Solidity. Он понадобится вам для проверки работы вашего смарт-контракта.

Когда у вас есть хорошие теоретические и практические знания о том, как написать код в Solidity, и вы создали все остальные инструменты на своем ноутбуке, такие как Truffle, Node.js, Parity и Web3.js, вы можете начать кодировать собственный смарт-контракт. Поскольку вы уже определили бизнес-идею, для которой вы бы хотели создать смарт-контракт, вам понадобятся знания и понимание Solidity, чтобы закодировать свою бизнес-идею, реализовав ее в Truffle, используя язык Solidity.

Тестирование и развертывание

После того, как ваш смарт-контракт будет кодифицирован и готов, проверьте его на автоматическом модульном тесте. Скомпилируйте свой проверенный смарт-контракт в Truffle и разверните его в оригинальной сети Ethereum или в тестовой сети Ropsten. Оба этих варианта потребуют некоторое количество газа для оплаты обработки.

Следуйте этим простым шагам, и хотя это может занять немного больше времени, чем вам бы хотелось, наберитесь терпения и знайте, что конечном итоге вас ждет успех!

Источник: bit.news

cryptowiki.ru

Как я окунулся в смарт-контракты — Крипто на vc.ru

Июль, седьмой час утра, из окна наблюдаю десяток работников АвтоВАЗа, ожидающих на остановке свой автобус. Разработчику в провинции крайне непросто развлечься - тут нет митапов через день и живого комьюнити. Тут есть тщетность бытия и магическая спокойность - то ли от нехватки амбиций, то ли от сонных настроений окружающих.

В спринт добавляется задача разработки собственной криптовалюты на базе Ethereum. Тщетно роюсь в сети в поисках толковых гайдов, открываю и через мгновение закрываю один за другим. Теряя терпение, открываю почту, начинаю искать письма, содержащие слово "блокчейн" и нахожу ссылку на хакатон в Казани с крупными призами и Виталиком в роли хедлайнера. Регистрируюсь, бронирую хостел и блаблакар. Перечитываю кучу бесполезных ссылок, пытающихся втюхать мне что такое криптовалюта и блокчейн, пишу шпаргалку и деплою в сеть первые контракты.

Hello, <name>coin! или Постигая Solidity

Путей для создания своего токена у вас много. Самые простые:

  • Перейти на Waves/CryptonoteStarter(или аналоги) и прямо в интерфейсе за 10 минут выпустить свою монету;
  • Разобраться в Solidity, дебаге и деплое. Используя знания и/или стандарт написания смарт-монет ERC20(по факту исходник монеты с многими вариантами блекджеков) задеплоить контракт.

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

Для записи чего-либо в цепь тратятся ресурсы майнеров, поэтому с инициатора подобных действий берётся плата за выполнение этого действия. Случается, что внутри смарт-контракта происходит слишком много вычислений или происходит запись слишком больших данных, поэтому все блокчейн-разработчики обязаны стремиться к оптимальным и минималистичным контрактам.

Solidity - тьюринг-полный язык программирования смарт-контрактов в Ethereum. Внутри Bitcoin тоже есть свой язык, но он не тьюринг-полный, поэтому написать на нем серьёзный контракт сложно.

Remix - IDE для разработки и дебага смарт-контрактов.

Суть смарт-контракта легко объяснить на примере класса. Вы описываете класс, внутри которого могут задаваться определенные методы/храниться определенные данные. Обычно данные хранятся в структурах с жестким указанием типов данных. Этот класс вы выгружаете в сеть. Желающие могут выполнить определенные методы за Gas, необходимый для обработки метода.

Что стоит понять, что может быть не так очевидно с Solidity?

0) Смарт-контракт после деплоя имеет свой адрес. Любой юзер может что-то запросить у контракта по этому адресу или переслать средства на этот адрес.

1) Заданные переменные в "корне" вашего смарт-контракта будут храниться всегда там. При вызове функции вы можете к этим данным обратиться - прочитать или изменить.

2) Внутри смарт-контракта монет обычно хранится структура в виде адрес кошелька в сети = количество монет. Это и есть все данные, необходимые монете. В ERC20 уже описана эта и некоторые другие функциональности, например, отправка токенов от одного адреса другому. Не изобретайте велосипеды!

3) Для хранения таблиц данных существует структуры. Доступ к элементам таблиц в некоторых случаях приходится делать костылями. Связано это в первую очередь с оптимизацией работы контракта.

4) Вся прелесть блокчейна в том, что всё уже придумано за вас. В сети есть миллионы исходников смарт-контрактов. Более того, на etherscan.io вы можете посмотреть исходные коды публичных смарт-контрактов. Анализ, дебаг и копипейст делают блокчейн слишком простым для входа, что сказывается на качестве продуктов в том числе множестве ICO.

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

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

Деплой смарт-контракта

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

Деплой сделан максимально просто. Я заливал код прямо из Remix через расширение для браузера MetaMask, хотя десктопный клиент Ethereum деплоить умеет не хуже. Открываем Remix, в списке "Select execution environment" выбираем пункт "Injected Web3", нажимаем Create и подтверждаем загрузку в MetaMask.

Слишком легко для того, чтобы быть правдой. Но это работало именно так.

Первые впечатления

Осознав всю сущность смарт-бытия, я был шокирован порогом входа. Его по факту не было! Я сразу же реализовал несколько простейших контрактов - своя монета, голосование, лотерея, ICO, записная книжка. Любое решение не выходило за 500 строк. В ходе разработки приходилось регулярно размышлять над "ценой действия" и порой писать костыли, чтобы получить определнные данные из структур-реестров.

Голова начала пытаться придумать что-то более сложное, но либо для новоявленных идей не был нужен блокчейн(а нужен был, скажем, IPFS), либо всё решалось слишком просто(и неинтересно).

И тут я понял - мне нужен обмен опытом.

Хакатон "Блокчейн - новая нефть России" в Казани

Малая часть современных больших компаний реально понимает как блокчейн можно применить в их сфере. Если не брать очевидные задачи, то для решения большинства проблем блокчейн не нужен вовсе.

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

Описание самого контракта заняло у большинства команд не более 3 часов с учетом дебага. Даже у новичков. Я не увидел ни у кого по-настоящему сложных контрактов(более 1000 строк).

Большую часть времени заняло как раз написание интерфейса для общения с контрактом - семиклассники делали интерфейс на базе телеграм-бота, профессиональные команды, заточенные под блокчейн, доставали из гитлабов исходники реализованных проектов на NodeJS. И именно написание интерфейсов заняло у команд большую часть времени.

Полагаю, что большинство приехало именно за подобными фотографиями. Не стал отрываться от коллектива.

Осознавая, что приехал я за комьюнити и знакомствами с серьезными матёрами "солидитистами", я был разочарован. Комьюнити настолько молодое, что примерно половина ребят впервые работало со смарт-контрактами. Оценив проекты коллег, мне стало грустно(в том смысле, что rocket-science не увидел). Смарт-контракт - это очень маленькая программа, решающая вполне конкретную задачу, чаще всего заключающаяся в записи в реестр какой-то информации и получение её из реестра.

Тут(в смарт-контрактах на базе Ethereum) нет никакой магии. Куда там уходят бюджеты государств, компаний, команд - для меня загадка. В сети(в 99,999999% случаев) уже есть необходимый вам шаблон смарт-контракта для ICO/вашей именной монеты и прочего, который допилит любой "тыжпрограммист", у которого черепашка Logo двигаться.

Прикладной Ethereum

Для своего прикладного решения я(и некоторые другие участники) выбрали Python. И это была реально боль. Мы сидели и матерились по очереди, перебегая друг к другу с надеждой в глазах, что всё заработает. В конце-концов оно заработало, но позже я узнал, что скорее всего проблема была в тестнете эфира, поднятом для хакатона.

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

Немного позже я пообщался с администраторами некоторых сервисов, связанных с эфиром, все плевались на сырые решения geth, обозначая parity как меньшее из зол, но далеко не предел мечтаний.

Короче, если прикладываете какую-то сервер-сайд логику своему контракту, лучше используйте NodeJS, там всё работает почти из коробки. Во всяком случае танцев с бубном будет на один меньше.

Битва за вузы

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

Если кратко: никто мне даже не ответил.

Я также задумывался над тем, чтобы начать проводить курсы по написанию смарт-контрактов, но, расписывая в десятый раз программу, понимал, что набирается информации на занятие длиной в 2-3 часа для людей, которым нужно еще объяснить как работает блокчейн. Не густо.

После хакатона

Я успел пообщаться со всеми участниками, обменяться контактами, во мне были заинтересованы как в блокчейн-разработчике, кидали White Paper'ы различных проектов, просили провести аудит контрактов, сделать review на проект, выходящий на ICO и многое другое. С одной стороны - ура, я в тусовке! С другой - все эти запросы можно разделить на несколько(часто пересекающихся между собой) категорий:

  • в большинстве случаев проект имел плохую на мой взгляд идею(например: утопия; что-то новое, не актуальное ни для кого; etc.) или был слишком прост в реализации;
  • заказчик не понимал зачем ему блокчейн или не понимал как он работает;
  • ребята просто хотят быстро заработать, а что там и как будет - не суть.

Выводы касательно смарт-контрактов на базе Ethereum

  • Смарт-контракты - это слишком просто и в какой-то степени скучно.
  • Скорее всего ваш проект entry-уровня, то есть реализовать его можно на коленке за несколько вечеров после работы
  • Блокчейн применим в очень малом количестве ситуаций. Чаще более актуальны централизованные хранилища/IPFS/etc.
  • Нужный вам смарт-контракт уже на 95% реализован, осталось его найти и допилить.
  • Большинство ICO - профанация чистой воды.
  • Сложность в проведении ICO только одна - маркетинг вашего продукта.
  • Скорее всего крутейшая идея вашего продукта - просто уныла, недееспособна и имеет место быть лишь у вас в голове. Без обид.

В любом случае буду рад ответить на ваши вопросы в комментариях или в чате t.me/chainchain.

Хотя блокчейн прост, сфер, нуждающихся в его внедрении, довольно много. И нам, энтузиастам, либо не дают его внедрить(в госсфере, например, дядьки, пилящие кормушки), либо не знают о нашем существовании.

#блокчейн

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать

vc.ru

Как создать смарт-контракт: Инструкция для начинающих | Обучение

Рассказываем, с чего надо начать, если вы решили попробовать свои силы в разработке смарт-контрактов. Для тех, кто хоть немного разбирается в веб-разработке, это не составит никакого труда.

Смарт-контракты — это способ вести бизнес в новой децентрализованной экономике. Большинство смарт-контрактов заключаются на платформах децентрализованных приложений ( DApp), например, Ethereum, Lisk или Cardano, а крупные технологические компании вроде IBM начинают создавать собственные предприятия в этой области. И действительно, многим заказчикам спокойнее иметь дело со всемирно известной компанией со столетней историей, нежели самостоятельно пробовать совершенно новую технологию.

Таким образом, если разработчик умеет создавать смарт-контракты, это повышает его рыночную стоимость. Как ни удивительно, но смарт-контракты довольно просты в разработке — DApp-платформы и сопутствующий инструментарий сильно упрощают их создание, как и создание собственного блокчейна.

Javascript-разработчиков модное слово «блокчейн» пугать не должно — если разобраться, то блокчейн похож на многие другие фреймворки, с которыми вы обычно работаете.

Проектирование смарт-контракта

Создавая смарт-контракт, важно установить, каким он должен быть.

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

Одной строчкой кода в контракте мы можем повысить стоимость перепродажи билетов. После этого покупать сразу много билетов станет незачем, поскольку их невыгодно перепродавать. Кроме того, каждый билет можно представить в виде уникального токена, который нельзя будет подделать.

Выбор DApp-платформы

Теперь нужно определиться с тем, на какой децентрализованной платформе будет выполняться наш смарт-контракт.

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

Однако у нее есть и недостаток: для написания смарт-контрактов там используется собственный язык под названием Solidity.

Есть другой вариант, Lisk — на этой DApp-платформе используется Javascript, поэтому новый синтаксис учить не придется. Кроме того, здесь есть собственный DApp-магазин (что-то вроде Google Play или iTunes), где вы можно опубликовать готовое приложение.

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

Тем не менее пока ограничим наш выбор Ethereum и Lisk.

Javascript-разработчику более логичным решением может показаться выбор Lisk — действительно, ведь вы уже знаете язык, на котором предстоит писать.

Но не стоит списывать Ethereum со счетов. У этой платформы такое обширное сообщество разработчиков, что новизна Solidity будет с избытком компенсирована легкостью получения нужной информации. Кроме того, для Ethereum есть фреймфорк Truffle от Consensys, позволяющий интегрировать и тестировать смарт-контракты.

Создание смарт-контракта

Не пугайтесь новизны Solidity. Да, здесь используются хеш-функции, а в конце строки нужно ставить точку с запятой, но это не страшно. Хеш-функции используются для создания уникальных ключей и сопоставления их с другими переменными — в нашем примере мы используем их для создания уникальных билетов и их привязки к учетным записям покупателей.

При создании первого Ethereum-контракта рекомендуем использовать среду разработки, расположенную по адресу remix.ethereum.org — у вас будет удобная площадка для развертывания контракта и взаимодействия с ним от имени разных учетных записей Ethereum, причем переключаться между разными учетными записями и использовать любые вызовы функций контракта можно просто нажимая на кнопки в меню.

На что обратить внимание

Уникальность Solidity — в адресации. Все учетные записи Ethereum имеют уникальные адреса, и эти адреса представляют стороны, заключающие контракт.

В нашем примере контракта на продажу билетов организатор мероприятия будет

связан с ним своим адресом учетной записи, и всякий раз при покупке билета он будет получать деньги — без всяких посредников. Клиент делает покупку, средства списываются с его учетной записи, идентифицируются по их адресу и передаются продавцу.

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

Также стоит отметить, что в Solidity не все контракты бесплатны. За любое изменение информации в контракте, например, покупку или использование билета, сеть, обеспечивающая его выполнение, возьмет плату в специальной валюте под названием газ — это компенсация за использование вычислительной мощности в сети.

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

Интеграция с JavaScript

Самая сложная часть работы с Solidity — интеграция контракта с Javascript. Это делается с помощью фреймворка Truffle.

Сначала нужно выполнить развертывание контракта и перенести его в тестовую сеть. Truffle предоставляет для этого собственную отдельную тестовую сеть Ethereum, которая называется Ganache. Теперь мы получаем версию контракта в JSON-представлении, и можем вызывать ее с помощью адресов тестовой сети из Javascript-приложения.

Если будете искать дополнительную информацию, имей в виду, что у Truffle отличная документация с примерами.

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

Поскольку блокчейн все же похож на базу данных, нам нужно подключить контракт к своему серверу, и, поскольку у системы развитый API, получить доступ к информации с клиентской стороны не сложнее, чем совершить AJAX-запрос — на сайте Truffle есть хороший пример.

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

И здесь снова приходит на помощь огромное сообщество разработчиков Ethereum — вероятнее всего, на любой ваш вопрос уже есть ответ на Ethereum Stack Exchange, а если его нет, другие разработчики с готовностью помогут вам с вашим смарт-контрактом.

Подготовила Тая Арянова

ru.ihodl.com