Краудфандинг на Эфириуме
Краудфандинг для вашей идеи
Иногда хорошая идея требует много средств и коллективных усилий. Вы можете просить пожертвования. Но доноры хотят быть уверены в том, что проект в целом получит надлежащее финансирование и стартанет. В этом случае краудфандинг идеален: вы объявляете конечную сумму, которая нужна для осуществления проекта и сроки в течение которых вы планируете собрать. Если за предполагаемое время сумма не будет собрана, то деньги будут возвращены всем донорам и они ни чем не рискуют. Поскольку код открыт и проверяем, пропадает необходимость в какой-то особой централизованной платформе. Таким образом не придется платить посредникам. Только комиссия за газ.
Токены и ДАО (Демократические Автономные Организации)
В этот раз мы будем делать улучшенный краудфандинг, решая две важные проблемы: управление и хранение пожертвований, и как расходуются деньги после того, как средства будут собраны.
Награды в краудфандинге, как правило, отслеживаются центральной базой данных, которая фиксирует всех доноров: если проект не собрал требуемую сумму в срок, то донор награду, естественно, не получит. Мы поступи иначе и просто создадим жетон для отслеживания наград. Каждый, кто вносит свой вклад получает жетон. Который, кстати, можно перепродать, подарить или держать для следующего использования. Когда наступит время, чтобы получать материальную награду от производителя нужно будет просто поменять жетоны на реальные продукты. Доноры могут сохранить свои жетоны, даже если проект не наберет требуемую сумму, как сувенир.
Кроме того, обычно, те, кто финансировал проект не имеют никакого влияния на то, как расходуются деньги, после того, как сумма собрана. Из-за бесхозяйственности многие проекты так и не смогли произвести что либо ценное. В этом проекте мы будем использовать демократическую организацию, которая должна будет одобрить любые расходы. Это часто называют краудсэйл или crowd equity и это настолько ценно, что в некоторых случаях жетон уже сам по себе награда, особенно в проектах, где группа людей собирается вместе, чтобы трудиться для общественного блага.
Если вы просто тестируете, то переключите кошелек в тестовый режим и включите майнинг.
Во-первых, создайте токен. Для этого примера, мы собираемся создать 100 жетонов, которые будут называться “гаджеты”, а в качестве символа будем использовать смайлик с изображением коробки Emoji. Гаджеты будут целые, поэтому 0 знаков после запятой. Устанавливаем и сохраняем адрес.
Теперь создаем акционерное общество. В этом примере мы будем использовать адрес жетона, который мы только что создали, минимальный кворум 10 и 1500 минут (25 часов), на голосование. Устанавливаем этот смарт-контракт и сохраняем адрес.
Код
Теперь копируем этот код и начнем создавать краудсэйл: https://ethereum.org/crowdsale#the-code
contract token { function transfer(address receiver, uint amount){ } } contract Crowdsale { address public beneficiary; uint public fundingGoal; uint public amountRaised; uint public deadline; uint public price; token public tokenReward; Funder[] public funders; event FundTransfer(address backer, uint amount, bool isContribution); bool crowdsaleClosed = false; /* data structure to hold information about campaign contributors */ struct Funder { address addr; uint amount; } /* at initialization, setup the owner */ function Crowdsale( address ifSuccessfulSendTo, uint fundingGoalInEthers, uint durationInMinutes, uint etherCostOfEachToken, token addressOfTokenUsedAsReward ) { beneficiary = ifSuccessfulSendTo; fundingGoal = fundingGoalInEthers * 1 ether; deadline = now + durationInMinutes * 1 minutes; price = etherCostOfEachToken * 1 ether; tokenReward = token(addressOfTokenUsedAsReward); } /* The function without name is the default function that is called whenever anyone sends funds to a contract */ function () { if (crowdsaleClosed) throw; uint amount = msg.value; funders[funders.length++] = Funder({addr: msg.sender, amount: amount}); amountRaised += amount; tokenReward.transfer(msg.sender, amount / price); FundTransfer(msg.sender, amount, true); } modifier afterDeadline() { if (now >= deadline) _ } /* checks if the goal or time limit has been reached and ends the campaign */ function checkGoalReached() afterDeadline { if (amountRaised >= fundingGoal){ beneficiary.send(amountRaised); FundTransfer(beneficiary, amountRaised, false); } else { for (uint i = 0; i < funders.length; ++i) { funders[i].addr.send(funders[i].amount); FundTransfer(funders[i].addr, funders[i].amount, false); } } beneficiary.send(this.balance); // send any remaining balance to beneficiary anyway crowdsaleClosed = true; } }
(в английской версии приводится подробный разбор кода, для тех кто хочет научиться писать свои смарт-контракты)
Как пользоваться
Идем на вкладку “Контракты” и устанавливаем код.
Добавьте адрес только что созданного акционерного общества.
Заявим 250 эфиров, как требуемую сумму для сбора
Если это эксперимент или демонстрация, то срок сбора средств 3~10 минут. Если это реальный контракт, то можно поставить 45000 часов (31 день).
Сколько эфиров будет стоить одна награда, зависит от того какие параметры были введены выше. В этом примере стоимость будет 5 эфиров (= 250 / (100/2)).
Добавляем адрес жетона, который мы создали выше.
Выбирайте цену на газ, устанавливайте и ждите пока краудсэйл запустится. После того как страница краудсэйла будет создана, выставляем 50 гаджетов на продажу, чтобы получать за них эфир.
У меня есть 100 гаджетов. Почему бы не продать их все?
Это очень важный момент. Защита от рейдерства. Краудсэйл который мы строим будет полностью контролироваться акционерами, т.е. Владельцами гаджетов. Тот кто владет большей частью акций (50% + 1) сможет распоряжаться собранными деньгами по своему усмотрению. Можно усложнить код, чтобы избежать подобных проблем. Мы поступим проще: продадим только половину гаджетов, а остаток раздадим нескольким надежным организациям.
Вывести собранные средства
После того, как сумма будет собрана, можно просто перенаправить ее в свой кошелек.
Безымянная функция выполняется каждый раз когда контракт получает эфир. Если сбор средств еще не закрылся, то эта функция отправляет купленное количество жетонов, тому кто заплатил эфир. Если контракт уже закрылся или жетоны закончились, то эфир покупателя не будет принят (но газ будет потрачен).
Это предотвращает такие ситуации, когда кто-то потратит эфир но останется без жетонов. В предыдущей версии этого контракта мы использовали самоуничтожение контракта после того как сбор средств закончился: но это приводило к тому, что любая сумма отправленная с опозданием улетала в пустоту. Создав безымянную функцию мы предотвращаем потерю денег.
Контракт имеет единственную функцию, без каких-либо параметров, которая может быть выполнена любым, как только сбор средств закончен (и даже может быть выполнена автоматически по расписанию с помощью Эфириум-Будильника ethereum-alarm-clock.com). Функция будет видеть, что средства были собраны и распределит их должным образом.
Арсений Гужва 21 марта 2016 г.
Перевод с английского. Оригинал тут: ethereum.org/crowdsale
Источник: cryptoscope.blogspot.ru/2016/03/21-2016.html