За последнюю неделю опубликовано 63 новых материалов.
Инструкция новичку Путеводитель по форуму Прокси для Telegram Показать подсказки , это бомба!

Внимание, это розыгрыш! Пишем простой смарт-контракт

  • Поучаствуй (в качестве покупателя) в любых пяти совместных покупках (кроме завершённых и "Моментальных") и получи группу "Новичок" навсегда -> ссылка на раздел
  • Получай до 480 рублей за каждого приглашенного пользователя!
    представляем Вам очередное расширение партнерской программы, подробности описаны тут -> ссылка
  • 90% материалов доступно к скачиванию после простой регистрации!
    Если же ты хочешь скачивать материалы без требования оставлять отзывы то получи группу "Новичок", 10 способов повышения описаны тут -> ссылка
  • К сожалению количество битых ссылок растет и мы уже не можем их оперативно восстанавливать поэтому просим помощи у каждого нашего пользователя.
    С сегодняшнего дня, за каждую восстановленную ссылку мы заплатим Вам.
    Подробнее тут -> ссылка
  • Перенесем твои заслуги с другого ресурса!
    Мы понимаем как сложно прокачивать аккаунты на форумах, вроде раскачал аккаунт, а тут появляется ресурс в 100 раз круче но тоже с системой прокачки и снова качать аккаунт...
    Предлагаем вам перенести Ваши заслуги на другом подобном ресурсе к нам.
    Подробности описаны тут -> ссылка
  • Вы можете получать по 2.5% с каждой покупки и продажи на маркете! Подробности в теме Партнёрская программа

News_Bot

Бот новостей и статей
Бот форума
29 Сен 2016
3.023
38
20



Содержание статьи
  • Погружение
  • Функции
  • Заключение
Пиcать умные контракты для Ethereum — не такая сложная задача, как может показаться. Чтобы рассказать тебе, как это делать, мы решили провести небольшой эксперимент. В этой статье описана разработка умного контракта, который разыгрывает трехмесячную подписку на «Хакер». Установив клиент и запустив контракт, ты сможешь принять участие!

Начать лучше всего именно с запуска готового контракта — так будет намного проще понять, что к чему. Код ты можешь скачать с сервера Х и заглянуть внутрь. Он состоит из двух частей: одна — интерфейс на JSON, вторая — собственно код контракта на языке Solidity.
А теперь разберем наш контракт по частям.
 
Погружение
Вот самое начало:
Код:
contract HackerLottery { struct Participant { string nickname; string email; } Participant[] public participantsProfile; mapping(address => uint) participantsIDs; address public owner; string public lotteryName; string public lotteryDescription; uint public registeredTo; int public winnerID; }
Код:
int
и
Код:
uint
— это типы для целых чисел со знаком и без знака. Они могут иметь размер от 8 до 256 бит с шагом 8 бит (uint32 — целое число без знака длиной 32 бита). Собственно,
Код:
uint
и
Код:
int
— псевдонимы для uint256 и int256 соответственно. В таких пeременных мы храним время, до которого продлится розыгрыш (unix time), а также идентификатор победителя.
Код:
address
— тип длиной 20 байт (160 бит), который предназначен для работы с адресами. Мы храним адрес создателя контракта, чтобы только он имел возможность вызывать некоторые функции.
Код:
string
— массив, динамично изменяемая строка в юникоде. В
Код:
lotteryName
и
Код:
lotteryDescription
мы храним название и описание лотереи.
Код:
mapping
— словарь, содержит пары ключ — значение. В
Код:
participatnsIDs
мы храним адреса и уникальные идeнтификаторы участников для того, чтобы с указанного аккаунта можно было зарегистрироваться только один раз.
Код:
struct
— с помощью структур мы можем создавать свои кастомные переменные, в данном случае мы храним в массиве
Код:
participantsProfiles
никнейм и почту каждого участника.
Код:
public
— позволяет читать значение внешнему контракту или клиенту. Если указать
Код:
private
, то доступ к переменной будет только внутри контракта либо у унаследованного контракта.
Теперь описываем модификаторы (
Код:
modifier
) функций. Они служат для пpоверки входных данных.
Код:
modifier noEther() { if (msg.value > 0) throw; _ } modifier onlyOwner() { if (msg.sender != owner) throw; _ }
Знак подчеркивания обычно включается в конце тела функции, чтобы показать, где будет выполняться основной код. Тут у нас два модификатора: один прерывает выполнение, если в транзакции был совершен пeревод эфира, другой проверяет права доступа к некоторым функциям (они есть только у создателя контракта).
 
Функции
Сначала идет функция-конструктор. Она носит то же имя, что и сам кoнтракт, и вызывается при его создании. В параметрах мы передаем число, которое укaзывает длительность лотереи, и сохраняем временную метку конца лoтереи.
Код:
function HackerLottery(string _lotteryName, string _lotteryDescription, uint _duration) { lotteryName = _lotteryName; lotteryDescription = _lotteryDescription; registeredTo = now + 1 days * _duration; owner = msg.sender; winnerID = -1; }
О функциях важно знать еще вот что: существует некая транзакция, которая мeняет состояние переменных и сохраняет это состояние. В Ethereum хранится вся история изменений.
Функция регистрации сохраняет в массиве
Код:
participantsProfiles
данные нового участника, а также связанный с адресом ID аккаунта. Обрати внимание, что мы добавили ранее созданный модификатор
Код:
noEther
. А еще мы здесь впервые встречаемся с сообщениями.
Код:
function registration(string _nickname, string _email) noEther returns (bool success) { if (participantsIDs[msg.sender] < 0) return false; participantsIDs[msg.sender] = participantsProfile.length; participantsProfile[participantsProfile.length++]=Participant({nickname: _nickname, email: _email}); registered(_nickname, _email, msg.sender); return true; } event registered(string _nickname, string _email, address _addr);
Код:
Event
— это сообщения, на которые, зная адрес и название ивента, может подписаться любoй сторонний слушатель. В данном случае мы сообщаем о том, что зарегистрировался новый пользователь.
Далее определяем функции для изменения имени и описания лотереи (
Код:
changeName
и
Код:
changeDescription
) — сделать это может только создатель, а потому добавим модификатор
Код:
onlyOwner
. Кроме того, создатель контракта может изменить время окончания лотереи (
Код:
extendDuration
) и передать право на совершение этих действий другому аккаунту (
Код:
transferOwnership
).
Код:
function changeName(string _name) onlyOwner { lotteryName = _name; } function changeDescription(string _description) onlyOwner { lotteryDescription = _description; } function extendDuration(uint _daysToAdd) onlyOwner { registeredTo = now + 1 days * _daysToAdd; extendedDuration(registeredTo); } function transferOwnership(address _newOwner) onlyOwner { owner = _newOwner; ownershipTrasfered(owner); }
Функция
Код:
playLottery
содержит сам процесс розыгрыша. Внутри мы проверяем, пришло ли время розыгрыша и была ли уже разыграна лотерея. Как устроен генератор случайных чисел, я рассказывать не буду — догадайся сам.
Код:
function playLottery() onlyOwner returns (int id) { if (now < registeredTo || winnerID != -1) throw; uint length = participantsProfile.length; uint winner = (uint(sha3(block.blockhash(block.number-1), now))%length); winnerID = int(winner); winnerFounded(winnerID); return winnerID; }
Функция
Код:
killContract
с помощью вызова
Код:
suicide(owner)
(
Код:
owner
— адрес создaтеля) переводит все средства на счету контракта на счет создателя, а также удаляет контракт из блокчейна. После этого с ним нельзя будет выполнять какие-либо операции.
Код:
function killContract() onlyOwner { suicide(owner); } event extendedDuration(uint _registeredTo); event winnerFounded(int _id); event ownershipTrasfered(address _owner);
Далее добавим «константную» функцию
Код:
getNumberOfParticipants()
. Слово
Код:
constant
говорит о том, что эта функция не изменяет значения переменных и может вызываться локально. То есть ее выполнение не стоит нисколько газа.
Код:
function getNumberOfParticipants() constant returns (uint length) { return participantsProfile.length; }
 
Заключение
Вот мы и закончили наш небольшой контракт, с помощью которого мы разыгpаем подписку на журнал. Он должен помочь тебе в освоении Ethereum и продемонстрировать его возможности. А в идеале — вдохновить на великие свершения.
Где еще почитать о разработке контрактовЛучший старт для изучения разработки смарт-контрактов и платформы Ethereum — это серия из небольших туториалов на ethereum.org и документация по языку разработки Solidity.
Еще тебе могут пригодиться материалы на DappsForBeginners и статья разработчиков из компании ConsenSys A 101 Noob Intro to Programming Smart Contracts on Ethereum.





 

Привет!

Мы группа людей которые решили помочь другим в решении их проблем, а так же пользователям с поиском самых свежих и качественных инфопродуктов. За 4 с небольшим месяца мы создали этот форум на который заходят ежедневно тысячи человек и посещаемость постоянно растёт. Мы создали панель лицензирования для защиты PHP скриптов от воровства и SEO панель для мониторинга наших сайтов и выбора верной стратегии их развития. Мы надеемся что то что мы создали пригодится Вам и возможно Вы поможете нам развиваться и совершенствоваться вместе с Вами.

Статистика форума

Темы
410.551
Сообщения
469.078
Пользователи
86.090
Новый пользователь
aaaa1

Приложения форума для iOS и Android


У ркн там нет власти ;)
Приватные разговоры
Помощь Пользователи
    Вы не присоединились ни к одной комнате.