Содержание статьи
- Погружение
- Функции
- Заключение
- Сегодня в эфире. Краткий экскурс в Ethereum
- Интеpвью: Виталик Бутерин о себе и о создании Ethereum
- Внимание, это розыгрыш! Пишем простой смарт-контракт
- Ставим Ethereum на Raspberry Pi
- Распределенное автономное ограбление. Как хакер разорил автоматическую корпорацию DAO
А теперь разберем наш контракт по частям.
Погружение
Вот самое начало:
Код:
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
Код:
uint
Код:
int
Код:
address
Код:
string
Код:
lotteryName
Код:
lotteryDescription
Код:
mapping
Код:
participatnsIDs
Код:
struct
Код:
participantsProfiles
Код:
public
Код:
private
Теперь описываем модификаторы (
Код:
modifier
Код:
modifier noEther() { if (msg.value > 0) throw; _ } modifier onlyOwner() { if (msg.sender != owner) throw; _ }
Функции
Сначала идет функция-конструктор. Она носит то же имя, что и сам к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; }
Функция регистрации сохраняет в массиве
Код:
participantsProfiles
Код:
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
Далее определяем функции для изменения имени и описания лотереи (
Код:
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
Код:
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.