Spartan PoC v2 уже на Substrate
Оригинал статьи:
https://medium.com/subspace-network/spartan-poc-v2-now-on-substrate-64d8feb914fd
Мой Дискорд: useless_dorozhkina#1394
Мы рады сообщить, что Subspace Labsвыполнили второй этап для нашего Web 3 Foundation Open Grant, чтобы обеспечить консенсус Proof-of-Capacity (PoC) для Substrate! Для получения дополнительной информации о цели этого гранта и консенсусе PoC, пожалуйста, обратитесь к нашей прошлой статье.
На предыдущем этапе мы продемонстрировали возможность запустить цепочку разработки с одной нодой, используя наш новый модуль консенсуса Spartan PoC, который поддерживал только одного фармера с плотом постоянного размера. На новом этапе мы обновили Spartan до поддержки нескольких фармеров с плотами разного размера, которые могут совместно фармить новые блоки в локальной тестовой сети. Кроме того, Spartan также поддерживает синхронизацию с другими полными нодами и пользовательскими узлами с минимальной нагрузкой и приложение для браузера, которое отображает текущий объем дискового пространства, выделенного сети всеми фармерами.
Диапазон Динамических Решений
Ключевой технической задачей для данного этапа было внедрение алгоритма динамической корректировки диапазона решений для обеспечения постоянной скорости производства блоков, аналогичной динамической корректировке сложности работы в блокчейнах Proof-of-Work (PoW), таких как Bitcoin.
Spartan, как и BABE, основан на Ouroboros Praos, который делит время на дискретные временные интервалы и более крупные эпохи. В настоящее время мы имеем односекундные временные интервалы и 32 x 6 = 216 временных интервалов в эпохе. В идеале мы хотели бы видеть один блок каждые шесть секунд, чтобы гарантировать, что (в среднем) любой блок сможет полностью распространиться по сети до того, как будет найден следующий блок, уменьшая вероятность появления честных форков, которые снижают безопасность сети.
Согласно консенсусу Spartan PoC, каждому новому временному интервалу мы выдаем новую задачу. Затем каждый фармер запрашивает свой плот, чтобы найти фиксации кодировок, которые удовлетворяют текущему диапазону решений. Любой фармер, который находит фиксацию в пределах указанного диапазона (диапазона решения) задачи, может затем сгенерировать PoC и создать новый блок. Для получения более подробной информации, пожалуйста, обратитесь к design document. Чтобы убедиться, что мы поддерживаем в среднем шесть секунд (шесть временных интервалов) между блоками, мы должны убедиться, что протокол автоматически регулирует диапазон решений на основе наблюдаемой скорости производства блоков, которая будет меняться по мере роста и сокращения дискового пространства, выделенного в сеть.
Для этого мы дополнительно группируем временные интервалы в эры по 6 x 2016 = 12 096 интервалов, или примерно 3,4 часа. Это имитирует сброс сложности работы Bitcoin, который происходит каждые 2016 блоков. В каждой эре мы подсчитываем количество произведенных блоков, а затем вычисляем поправочный коэффициент на основе цели в 2016 блоков. Если поправочный коэффициент меньше единицы, это означает, что заложенное пространство уменьшилось, а блоки расположены слишком далеко друг от друга, что требует увеличения диапазона решения. Если поправочный коэффициент больше единицы, это означает, что заложенное пространство увеличилось, а блоки расположены слишком близко друг к другу, что требует уменьшения диапазона решения.
Чтобы увидеть это в действии, вы можете запустить новую ноду Spartan от генезиса и просто удвоить размер ее плота с дефолтного 1 ГБ до 2 ГБ, что приведет к созданию нового блока примерно каждые три секунды, пока не будет произведено первое изменение эры. Чтобы упростить наблюдение за этим при тестировании, мы изменили стандартные настройки таким образом, чтобы смена эр происходила каждые 32 блока.
Примечание: В этих инструкциях предполагается, что вы запустили фармер в одном терминале, а клиент — в другом.
Для начала установите Docker.
Инициализируйте Фармер (Терминал 1)
Создайте объем для плота, извлеките последней образ и инициализируйте плот размером 2 ГиБ (это должно занять несколько минут):
Примечание — Если вы ранее запускали фармер spartan, вам нужно будет стереть старый плот, прежде чем создавать бóльший, или изменить имя фармера.
docker volume create spartan-farmer
docker pull subspacelabs/spartan-farmer
docker run --rm -it \
--name spartan-farmer \
--mount source=spartan-farmer,target=/var/spartan \
subspacelabs/spartan-farmer plot 512000 spartan
Запустите Клиент (Терминал 2)
Это создаст виртуальную сеть, достанет последний образ из docker и запустит цепочку разработки с одной нодой (только клиентом):
docker network create spartan
docker pull subspacelabs/node-template-spartan
docker run --rm --init -it \
--net spartan \
--name node-template-spartan \
--publish 127.0.0.1:30333:30333 \
--publish 127.0.0.1:9944:9944 \
--publish 127.0.0.1:9933:9933 \
subspacelabs/node-template-spartan \
--dev \
--tmp \
--ws-external \
--node-key 0000000000000000000000000000000000000000000000000000000000000001
Запустите Клиент (Терминал 1)
Когда клиент запущен, вы можете подключить к нему фармер, запустив в первом терминале следующее:
docker run --rm --init -it \
--net spartan \
--name spartan-farmer \
--mount source=spartan-farmer,target=/var/spartan \
subspacelabs/spartan-farmer \
farm \
--ws-server ws://node-template-spartan:9944
Теперь вы должны увидеть производство блоков в Терминале 2 сначала каждые три секунды, и, в конце концов, каждые шесть секунд (после вступления в силу смены эры).
Синхронизация Полного Клиента
Полный клиент, также известный как полная нода, поддерживает полную базу данных аккаунта, или состояние блокчейна, а также последние несколько блоков. Он не участвует в консенсусе, если к нему не присоединен фармер.
Запустите Полный Клиент (Терминал 3)
Теперь мы можем запустить еще один полный клиент и синхронизировать цепочку с первым клиентом, который мы запустили ранее:
BOOTSTRAP_CLIENT_IP=$(docker inspect -f "{{.NetworkSettings.Networks.spartan.IPAddress}}" node-template-spartan)
docker run --rm --init -it \
--net spartan \
--name node-template-spartan-full \
subspacelabs/node-template-spartan \
--dev \
--tmp \
--ws-external \
--bootnodes /ip4/$BOOTSTRAP_CLIENT_IP/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
Синхронизация Ноды с Минимальной Нагрузкой
Нода с минимальной нагрузкой не поддерживает базу данных аккаунта, или состояние блокчейна. Вместо этого она лишь отслеживает заголовки блоков, чтобы быть удостовериться, что она действительно находится в самой длинной цепочке или, в нашем случае, в цепочке с наибольшим пространством.
Запустите Легкий Клиент (Терминал 4)
Мы также можем запустить легкий клиент и синхронизировать цепочку с клиентом, который мы запустили ранее:
Запустите Ноду с Минимальной Нагрузкой (Терминал 4)
Мы также можем запустить пользовательский узел с минимальной нагрузкой и синхронизировать цепочку с клиентом, который мы запустили ранее:
BOOTSTRAP_CLIENT_IP=$(docker inspect -f " {{.NetworkSettings.Networks.spartan.IPAddress}}" node-template- spartan) docker run --rm --init -it \ --net spartan \ --name node-template-spartan-light \ subspacelabs/node-template-spartan \ --dev \ --tmp \ --light \ --ws-external \ --bootnodes /ip4/$BOOTSTRAP_CLIENT_IP/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
Браузерный Клиент
Мы также расширили шаблон substrate-frontend-template, чтобы он вычислял и отображал общее пространство, выделенное сети всеми фармерами, которое может быть получено из качества самого proof-of-space.
Установите и Запустите Браузерный Клиент (Терминал 5)
Кодовая база устанавливается с помощью git и yarn. Этот шаг предполагает, что вы установили yarn глобально перед установкой его в поддиректориях. Чтобы узнать самую последнюю версию и о том, как установить yarn, обратитесь к документации yarn и руководствам по установке.
git clone -b w3f-spartan-ms-2 https://github.com/subspace/substrate-front-end-template.git
cd substrate-front-end-template
yarn install
yarn start
Это должно автоматически открыть новую вкладку браузера, на которую указывает:
http://localhost:8000/substrate-front-end-template
Теперь вы должны увидеть текущие характеристики блокчейна, включая объем пространства, выделенного в сеть, который будет обновляться при каждой смене эры, или же каждые 32 блока.
Запуск Локальной Тестовой Сети
Теперь мы можем добавить больше фармеров для создания локальной тестовой сети, и диапазон решений будет автоматически корректироваться каждые 32 блока.
Вы можете использовать скрипт ./ run-node-farmer-pair.sh test
, чтобы запустить больше полных нод в сети, каждую со своим фармером. Здесь test
— это имя пары. Вы можете создать столько пар, сколько необходимо, все они будут подключаться к одной и той же локальной тестовой сети.
# Сначала вы должны дублировать или удалить последнюю версию из # нашего форка substrate: git clone -b w3f-spartan-ms-2 https://github.com/subspace/substrate.git # или, если вы уже локально дублировали cd ../substrate git pull git checkout w3f-spartan-ms-2 # Теперь разверните столько фармеров, сколько хотите (три в данном # примере) # Терминал 6 (второй фармер) cd substrate/bin/node-template-spartan ./run-node-farmer-pair.sh farmer-1 # Терминал 7 (третий фармер) cd substrate/bin/node-template-spartan ./run-node-farmer-pair.sh farmer-2 # Терминал 8 (четвертый фармер) cd substrate/bin/node-template-spartan ./run-node-farmer-pair.sh farmer-3
Используйте Ctrl+C
чтобы остановить каждую пару, все будет остановлено и очищено автоматически.
Следующие шаги для Spartan
Для нашего следующего и последнего этапа мы расширим Spartan, чтобы он был защищен от всех известных атак против протоколов консенсуса proof-of-space, чтобы мы могли гарантировать безопасность и жизнеспособность против любого экономически рационального противника, который контролирует менее половины ресурсов памяти всей сети. Сюда входят:
- Двусмысленность, или построение на обеих ветвях форка.
- Симуляция, более известное как атака nothing-at-stake.
- Фарминг Сивиллы, или использование нескольких идентификаторов для одного и того же плота диска.
- Фарминг со Сжатием, худший тип атаки компромисса между временем и памятью для Spartan.
- Переписывание Истории, также известное как атака дальнего действия.
Мы также готовимся к запуску начальной тестовой сети без наград, чтобы мы могли начать создание нашего сообщества фармеров и проверить надежность нашего протокола в реальных условиях. Позже, когда мы сможем расширить Spartan до Subspace с консенсусом, основанным на proofs-of-useful-storage, мы перейдем к стимулируемой тестовой сети в рамках подготовки к запуску нашей основной сети.