Ergo и краудфандинг
6 сентября 2019 г.

Что такое краудфандинг?
Краудфандинг — это способ привлечения капитала через коллективные усилия отдельных лиц. Кампании в основном начинаются через всемирную паутину и позволяют проектам и бизнесу получать финансирование, собирая небольшие суммы денег от большого числа людей.
Одним из самых известных примеров успешных стартапов на краудфандинге является Oculus Rift, гарнитура виртуальной реальности. Компания Oculus VR начала свою кампанию в 2012 году и всего через два года была приобретена Facebook за 2 миллиарда долларов. Кроме обычных стартапов, существует также множество блокчейн-проектов, которые пошли по пути краудфандинга, например, Ethereum, Tron и EOS. Сегодня существует множество платформ, которые позволяют вам публиковать вашу кампанию. Некоторые из более крупных — это Indiegogo, Kickstarter и Gofundme, чтобы назвать лишь несколько.
Краудфандинг имеет много преимуществ: широкий охват, эффективность и маркетинговые аспекты являются наиболее убедительными... Но сейчас давайте перейдем к тому, что действительно важно!
Введение в краудфандинг на Ergo
Несколько дней назад, 28 августа, основной разработчик Kushti заявил на (форуме Ergo)[www.ergoforum.org], что ему удалось успешно написать и реализовать код, который позволяет пользователям запускать краудфандинговую кампанию на основе блокчейна Ergo (как упомянуто на странице 6 белой книги. Этот код даже работает с текущим API кошелька. Здесь есть краткое руководство о том, как настроить кошелек.
В этой статье вы узнаете, как сделать именно это: краудфандинг на основе Ergo! Она также проведет вас через предложение первой в истории кампании, целью которой является финансирование разработки скрипта краудфандинга post-EIP1.
Если вы хотите узнать все детали, пожалуйста, прочитайте следующий раздел "Скрипт". В противном случае вы можете просто пропустить чтение разделов "Как пожертвовать", "Как собирать пожертвования" и "Предложение проекта краудфандинга" ниже.
Скрипт
Самый простой скрипт краудфандинга, согласно белой книге ErgoScript (страница 6), это "скрипт для следующей ситуации краудфандинга: спонсор проекта (с ключом backerPubKey) желает дать деньги проекту (с ключом projectPubKey), но только если проект соберет достаточно денег (по крайней мере minToRaise) из других источников до установленного срока (выраженного в терминах HEIGHT).
Чтобы дать деньги проекту, спонсор создаст выходной бокс, защищенный следующим скриптом. Скрипт содержит два условия: одно для случая, когда срок истек (позволяющее спонсору вернуть деньги) и одно для случая, когда он успешен (позволяющее проекту потратить деньги, если сумма составляет хотя бы minToRaise до срока).
Чтобы убедиться, что достаточно денег было собрано, скрипт будет искать в коллекции выходов бокс с достаточной стоимостью, идущей к projectPubKey. Чтобы проверить, куда идет стоимость выходного бокса, скрипт будет читать скрипт, защищающий выходной бокс, и сравнивать его со скриптом, соответствующим proveDlog(projectPubKey); этот скрипт можно получить с помощью projectPubKey.propBytes.
Поскольку в настоящее время API не поддерживает встраивание пользовательских переменных окружения (только предопределенные, такие как HEIGHT), единственный способ скомпилировать скрипт — это заменить такие переменные в скрипте из белой книги конкретными значениями. Например, предположим, что краудфандинговая кампания успешна, если она собирает 500 Erg до номера блока 50,000. Для backerPubKey и projectPubKey мы можем использовать функцию PK(), которая в данный момент принимает только сериализованные ключи P2PK. Тогда модифицированный скрипт из белой книги становится следующим:
{
val backerPubKey = PK("9h7DHKSDgE4uvP8313GVGdsEg3AvdAWSSTG7XZsLwBfeth4aePG")
val projectPubKey = PK("9gBSqNT9LH9WjvWbyqEvFirMbYp4nfGHnoWdceKGu45AKiya3Fq")
val deadline = 50000
val minToRaise = 500L * 1000000000
val fundraisingFailure = HEIGHT >= deadline && backerPubKey
val enoughRaised = {(outBox: Box) =>outBox.value >= minToRaise
&& outBox.propositionBytes == projectPubKey.propBytes
}
val fundraisingSuccess = HEIGHT < deadline && projectPubKey && OUTPUTS.exists(enoughRaised)
fundraisingFailure || fundraisingSuccess
}
Как пожертвовать
Прежде всего, JSON не поддерживает многострочные строки, поэтому вам нужно заменить переносы строк на \n.
Также кавычки должны быть экранированы, поэтому используйте " вместо ". Получившийся JSON будет отправлен на /script/p2sAddress.
Чтобы пожертвовать проекту, сначала получите свой адрес из /wallet/addresses, возьмите, например, первый из них. Вставьте адрес в backerPubKey, так что запрос к /script/p2sAddress будет выглядеть следующим образом после этого шага:
{
"source": "{
val backerPubKey = PK(\"9...\")
val projectPubKey = PK(\"9gBSqNT9LH9WjvWbyqEvFirMbYp4nfGHnoWdceKGu45AKiya3Fq\")
val deadline = 50000
val minToRaise = 500L * 1000000000
val fundraisingFailure = HEIGHT >= deadline && backerPubKey
val enoughRaised = {
(outBox: Box) =>
outBox.value >= minToRaise && outBox.propositionBytes == projectPubKey.propBytes
}
val fundraisingSuccess = HEIGHT < deadline && projectPubKey && OUTPUTS.exists(enoughRaised)
fundraisingFailure || fundraisingSuccess
}"
}
с вашим адресом вместо "9…".
Отправьте строку на /script/p2sAddress, чтобы получить ответ, подобный:
{
"address": "GB3kh2izpWKvyZfMboQwsEscjPaZcz9WrzGqZB4ZrkzRreiFMV6HZYWXGMK3rqCjDCoPgWGNzfnYSUhivW4a1VRYPE7uZXwKnBcqWcRkiuTx6QW55EcPcWeELUsumwdtKoFtWY583nWnKZff"
}
Скопируйте строку адреса (GB3… в нашем примере) и отправьте деньги на него через /wallet/payment/send. Запрос к API-методу для отправки 10 Erg (10 миллиардов наноErg) будет выглядеть следующим образом:
[
{
"address": "GB3kh2izpWKvyZfMboQwsEscjPaZcz9WrzGqZB4ZrkzRreiFMV6HZYWXGMK3rqCjDCoPgWGNzfnYSUhivW4a1VRYPE7uZXwKnBcqWcRkiuTx6QW55EcPcWeELUsumwdtKoFtWY583nWnKZff",
"value": 10000000000
}
]
Вот и все!
Теперь кошелек автоматически найдет бокс в блокчейне, так как он содержит открытый ключ, который принадлежит кошельку в условии возврата. Кошелек затем периодически проверяет, можно ли потратить бокс, создавая самую простую транзакцию с боком в качестве входа и всего одним выходом (на тот же адрес). После высоты возврата (50,000 в нашем примере) кошелек сможет потратить бокс, и стоимость бокса будет добавлена к /wallet/balances.
Пожалуйста, обратите внимание, что это не будет так после реализации EIP-1, так как кошелек будет использовать узкие шаблоны распознавания к тому времени.
Как собирать пожертвования
Кошелек, связанный с открытым ключом проекта, найдет входящие боксы в блокчейне. Однако он не сможет убедиться, что боксы можно потратить, так как кошелек в настоящее время использует самую простую транзакцию для этого, и скрипт не проходит для такой транзакции на расход.
Перед реализацией метода /wallet/boxes/uncertain единственный способ для проекта найти входящие боксы. Затем /wallet/transaction/send с вручную предоставленными (в "inputsRaw") сериализованными боксами (используйте /utxo/byIdBinary, чтобы получить сериализованный бокс по его идентификатору).
Kushti сделал это сам и получил следующую транзакцию.
Пожалуйста, обратите внимание, что EIP-1 также нарушит этот рабочий процесс.
Kushti предлагает собрать 500 Erg до блока 50,000 для разработки скриптов командной строки (на Python) для организации и участия в краудфандинговых кампаниях после реализации EIP-1. Скрипты командной строки более подходят, чем ручные запросы, и также могут быть использованы для создания графических интерфейсов на их основе.
Казначейство предоставило половину средств, поэтому другим нужно коллективно внести недостающие 250 Erg. В случае неудачи кампании возвраты будут производиться автоматически. Поскольку сбор обещаний в данный момент не тривиален, Kushti возглавит проект, поэтому, пожалуйста, используйте следующий ключ, который контролируется им:
9gBSqNT9LH9WjvWbyqEvFirMbYp4nfGHnoWdceKGu45AKiya3Fq
Чтобы пожертвовать любую сумму денег, пожалуйста, следуйте разделу "Как пожертвовать" выше, заменив backerPubKey на ваш открытый ключ, а сумму пожертвования на соответствующее значение (пожалуйста, обратите внимание, что это в наноErg, 1 Erg = 1.000.000.000 наноErg).
Как всегда, если у вас есть дополнительные вопросы, предложения или вы хотите участвовать в движении, пожалуйста, присоединяйтесь к нашим каналам в социальных сетях или форуму.
Share post
13 августа 2025 г.
9 июля 2025 г.
12 мая 2025 г.






