COSMOS
September 6

Story Protocol

🪓 Telegram канал UTSA 🪓 Telegram чат UTSA

Web Discord Github

Details

STORY PROTOCOL

Story Protocol - проект, который может перевернуть мир интеллектуальной собственности (IP) с ног на голову. Это блокчейн-платформа, которая помогает защищать, управлять и монетизировать ИС (IP). Давайте разберёмся, как это работает и почему за проектом стоит понаблюдать!

Story Protocol — это блокчейн 1 уровня, который для совместимости с другими блокчейн-сетями использует EVM и Cosmos SDK

Это новая экосистема, где авторы могут защищать, отслеживать и монетизировать свои произведения - будь то книги, музыка или даже фильмы. Ключевая идея заключается в том, чтобы дать создателям полное управление своими работами, используя децентрализованные технологии

Story Protocol решает важные проблемы для создателей контента с помощью блокчейн и смарт-контрактов, которые превращают контент в цифровые активы, так:

  • проще лицензировать свои работы. Введение программируемых лицензий IP решает этот вопрос
  • проще автоматизировать выплаты за использование контента. Смарт контракты обеспечивают справедливые роялти
  • проще получать справедливое вознаграждение за использование их произведений в любых медиа

Во главе Story Protocol стоит опытная команда, возглавляемая “S.Y. Lee” Seung Yoon Lee (Сын Юн Ли), соучредителем и генеральным директором компании PIP Labs, создавшей Story Protocol. Lee активно продвигает идеи защиты прав создателей контента в эпоху цифровизации

Ещё один ключевой участник команды — Jason Zhao (Джейсон Чжао), соучредитель и главный директор по продукту (CPO). Он сыграл центральную роль в разработке платформы, сравнивая её с "IP Legoland", потому что с помощью Story Protocol создатели могут строить и комбинировать свои идеи и получать за это справедливую долю прибыли. Идея токенизации интеллектуальной собственности делает проект настоящим прорывом в мире ИС


Story Protocol уже получил поддержку серьёзных инвесторов в размере $140млн, включая фонд a16z - один из самых влиятельных венчурных фондов в мире. Одной из ключевых фигур в этом является Крис Диксон, генеральный партнёр и руководитель крипто фонда a16z. Он известен своими инвестициями в крупные блокчейн-проекты и Web3, такие как Coinbase и OpenSea. Крис Диксон на платформе Story Protocol ведущий инвестор из a16z. Платформа Story Protocol получила $80млн в раунде серии B под руководством a16z, что подчеркивает сильную поддержку компании со стороны Криса Диксона и его команды. Story Protocol нацелен на согласование интересов создателей, фанатов и даже AI-моделей, использующих этот контент


Для защиты прав создателей платформа внедряет несколько модулей:

  1. Модуль лицензирования, который помогает автоматизировать создание и продажу лицензий
  2. Модуль роялти, который обеспечивает справедливое распределение прибыли
  3. Модуль разрешения споров, который позволяет оперативно решать конфликты между участниками системы

Story Protocol не просто платформа для лицензирования, это целая финансовая экосистема для авторов!

Story Protocol - это платформа, которая не только защищает ваш труд, но и даёт возможность его монетизировать!

Обновления

Genesis стартует с версий:

  • story: v0.12.0
  • story-geth: v0.10.0

UPD story 🕊 на v0.12.1 (Высота обновления: 322000)

cd $HOME/story
git pull
git checkout v0.12.1
go build -o story ./client

$HOME/story/story version
# Version       v0.12.1-stable
# Git Commit    20fed5e

# ПОСЛЕ ОСТАНОВКИ СЕТИ НА НУЖНОМ БЛОКЕ!!!

systemctl stop story
mv $HOME/story/story $HOME/go/bin/
story version
# 

systemctl restart story && journalctl -u story -f -o cat

UPD story-geth 🕊 на v 0.10.1-stable

cd
wget -O story-geth https://github.com/piplabs/story-geth/releases/download/v0.10.1/geth-linux-amd64
chmod +x story-geth
$HOME/story-geth version
# Version: 0.10.1-stable
# Git Commit: b60a3ba8d47e60a6c78ca0570f7dac66e8976d93
# Git Commit Date: 20241119

mv story-geth $(which story-geth)

systemctl restart story-geth && journalctl -u story-geth -f -o cat

UPD story 🕊 на v0.13.0 (Высота обновления: 858000)

cd $HOME/story
git pull
git checkout v0.13.0
go build -o story ./client

$HOME/story/story version
# Version       v0.13.0-stable
# Git Commit    daaa395

# ПОСЛЕ ОСТАНОВКИ СЕТИ НА НУЖНОМ БЛОКЕ!!!
systemctl stop story
mv $HOME/story/story $(which story)
story version
# 

systemctl restart story && journalctl -u story -f -o cat

Подготовка сервера

# обновляем репозитории
apt update && apt upgrade -y

# устанавливаем необходимые утилиты
apt install curl iptables build-essential git wget jq make gcc nano tmux htop nvme-cli pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev -y

File2Ban - подробнее здесь и здесь

# устанавливаем и копируем конфиг, который будет иметь больший приоритет
apt install fail2ban -y && \
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local && \
nano /etc/fail2ban/jail.local
# раскомментировать и добавить свой IP: ignoreip = 127.0.0.1/8 ::1 <ip>
systemctl restart fail2ban

# проверяем status 
systemctl status fail2ban
# проверяем, какие jails активны (по умолчанию только sshd)
fail2ban-client status
# проверяем статистику по sshd
fail2ban-client status sshd
# смотрим логи
tail /var/log/fail2ban.log
# останавливаем работу и удаляем с автозагрузки
#systemctl stop fail2ban && systemctl disable fail2ban

Устанавливаем GO

ver="1.23.1" && \
wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz" && \
sudo rm -rf /usr/local/go && \
sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz" && \
rm "go$ver.linux-amd64.tar.gz" && \
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile && \
source $HOME/.bash_profile && \
go version
ufw allow 30303 comment story_geth_p2p_port
ufw allow 26656 comment story_p2p_port
ufw allow 26660 comment story_prometheus_port
ufw allow 6060 comment story_geth_prometheus_port

Автоматическая установка

wget -O installer_story.sh https://raw.githubusercontent.com/lesnikutsa/story/refs/heads/main/installer_story.sh && chmod +x installer_story.sh && ./installer_story.sh

Новая установка ноды

ВАЖНО — в командах ниже все, что в <> меняем на свое значение и убираем сами <>

В настоящее время для работы ноды необходимо запустить два отдельных клиента:

  • story-geth, который является forked version geth
  • story, который является consensus client
# при необходимости создаем каталог go/bin/
mkdir -p $HOME/go/bin/

Устанавливаем story-geth

cd
wget -O story-geth https://github.com/piplabs/story-geth/releases/download/v0.10.1/geth-linux-amd64
chmod +x story-geth
mv story-geth $HOME/go/bin/story-geth

story-geth version
# Version: 0.10.1-stable
# Git Commit: b60a3ba8d47e60a6c78ca0570f7dac66e8976d93
# Git Commit Date: 20241119

Устанавливаем story

cd
git clone https://github.com/piplabs/story && cd story
git checkout v0.13.0
go build -o story ./client
mv $HOME/story/story $HOME/go/bin/

story version
# Version       v0.13.0-stable
# Git Commit    daaa395

Инициализируем ноду, чтобы создать необходимые файлы конфигурации

story init --moniker "UTSA_guide" --network odyssey

Genesis

# Проверим генезис
sha256sum ~/.story/story/config/genesis.json
# d332e9082222cc0dd6fe4e9943eafc89b2ce5e118a75ffa01b77e549fdd12587

Скачиваем Addr book

wget -O $HOME/.story/story/config/addrbook.json "https://share102.utsa.tech/story/addrbook.json"

Настраиваем конфигурацию ноды

# добавляем seeds/bpeers/peers в config.toml
external_address=$(wget -qO- eth0.me)
sed -i.bak -e "s/^external_address *=.*/external_address = \"$external_address:26656\"/" $HOME/.story/story/config/config.toml

peers="[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:23656,[email protected]:3610,[email protected]:26656,[email protected]:33556,[email protected]:26656,[email protected]:26656"
sed -i -e "s|^persistent_peers *=.*|persistent_peers = \"$peers\"|" $HOME/.story/story/config/config.toml
seeds="434af9dae402ab9f1c8a8fc15eae2d68b5be3387@story-testnet-seed.itrocket.net:29656"
sed -i.bak -e "s/^seeds =.*/seeds = \"$seeds\"/" $HOME/.story/story/config/config.toml

# настраиваем фильтрацию "плохих" peers
sed -i -e "s/^filter_peers *=.*/filter_peers = \"true\"/" $HOME/.story/story/config/config.toml

(ОПЦИОНАЛЬНО) Вкл индексацию вconfig.toml

indexer="kv"
sed -i -e "s/^indexer *=.*/indexer = \"$indexer\"/" $HOME/.story/story/config/config.toml

(ОПЦИОНАЛЬНО) State Sync

# добавляем пир
peers="[email protected]:26656"
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.story/story/config/config.toml
SNAP_RPC=https://t-story.archive.rpc.utsa.tech:443

LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)

echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"| ; \
s|^(seeds[[:space:]]+=[[:space:]]+).*$|\1\"\"|" $HOME/.story/story/config/config.toml

Создаем сервисный файл story-geth

tee /etc/systemd/system/story-geth.service > /dev/null <<EOF
[Unit]
Description=Story Geth Client
After=network.target

[Service]
User=$USER
ExecStart=$HOME/go/bin/story-geth --odyssey --syncmode full --http --http.api eth,net,web3,engine --http.vhosts '*' --http.addr 127.0.0.1 --http.port 8545 --ws --ws.api eth,web3,net,txpool --ws.addr 127.0.0.1 --ws.port 8546
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

Создаем сервисный файл story

tee /etc/systemd/system/story.service > /dev/null <<EOF
[Unit]
Description=Story Consensus Client
After=network.target

[Service]
User=$USER
WorkingDirectory=$HOME/.story/story
ExecStart=$HOME/go/bin/story run
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

Запускаем сервисный файлы

systemctl daemon-reload
systemctl enable story
systemctl enable story-geth

# запускаем story-geth
systemctl restart story-geth && journalctl -u story-geth -f -o cat

# запускаем story
systemctl restart story && journalctl -u story -f -o cat

Snapshot Archive

type: archive | time: every 3 days | pruning: nothing | indexer: kv

🌐 https://share102.utsa.tech/story/

systemctl stop story
systemctl stop story-geth

cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/story/priv_validator_state.json.backup

rm -rf $HOME/.story/story/data
rm -rf $HOME/.story/geth/odyssey/geth/chaindata

# скачиваем story
curl -o - -L https://share102.utsa.tech/story/story_testnet.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/story/

# скачиваем story_geth
curl -o - -L https://share102.utsa.tech/story/story_geth_testnet.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/geth/odyssey/geth/

mv $HOME/.story/story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json

systemctl restart story
systemctl restart story-geth

Snapshot Pruned

type: pruned | time: every 3 hours | pruning: nothing | indexer: null

🌐 https://share106-7.utsa.tech/story/

systemctl stop story
systemctl stop story-geth

cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/story/priv_validator_state.json.backup

rm -rf $HOME/.story/story/data
rm -rf $HOME/.story/geth/odyssey/geth/chaindata

# скачиваем story
curl -o - -L https://share106-7.utsa.tech/story/story_testnet.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/story/

# скачиваем story_geth
curl -o - -L https://share106-7.utsa.tech/story/story_geth_testnet.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/geth/odyssey/geth/

mv $HOME/.story/story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json

systemctl restart story
systemctl restart story-geth

Создаем валидатора

Для начала посмотрим публичные validator keys

story validator export

Экспорт EVM key валидатора в каталог конфигурации данных по умолчанию

story validator export --export-evm-key

Если Вы хотите выполнять транзакции от имени валидатора, а не делегатора, то необходимо создать файл .env

story validator export --export-evm-key --evm-key-path $HOME/.story/story/.env

Теперь мы можем посмотреть наш private_key

cat /root/.story/story/config/private_key.txt

Теперь нам необходимо импортировать наш private_key в EVM кошелек и запросить токены из крана

Создаем нашего валидатора

story validator create --stake 1234000000000000000000 --moniker "<moniker>"  --private-key "<your_private_key>" --chain-id 1516

Данная команда создаст валидатора, который соответствует
ключу валидатора, сохраненному в priv_validator_key.json. Обратите внимание, что для участия в консенсусе необходимо сделать ставку как минимум на 1024 $IP IP (что эквивалентно 1024000000000000000000 wei)

Не забываем сохранить priv_validator_key.json

Не забываем сохранить private_key.txt

# добавить монеты в стейк
story validator stake --validator-pubkey ${VALIDATOR_PUB_KEY_IN_BASE64} --stake ${AMOUNT_TO_STAKE_IN_WEI}

# unstake
story validator unstake --validator-pubkey ${VALIDATOR_PUB_KEY_IN_BASE64} --unstake ${AMOUNT_TO_UNSTAKE_IN_WEI}

# stake-on-behalf
# Ставка от имени другого делегатора. Это сделает ставку ${AMOUNT_TO_STAKE_IN_WEI} IP валидатору от имени предоставленного делегатора
story validator stake-on-behalf --delegator-pubkey ${DELEGATOR_PUB_KEY_IN_BASE64} --validator-pubkey ${VALIDATOR_PUB_KEY_IN_BASE64} --stake ${AMOUNT_TO_STAKE_IN_WEI}

# unstake-on-behalf
story validator unstake-on-behalf --delegator-pubkey ${DELEGATOR_PUB_KEY_IN_BASE64} --validator-pubkey ${VALIDATOR_PUB_KEY_IN_BASE64} --unstake ${AMOUNT_TO_STAKE_IN_WEI}
To unstake on behalf of delegators you must be registered as an authorized operator for that delegator

# добавить оператора
story validator add-operator --operator ${OPERATOR_EVM_ADDRESS}

# удалить оператора
story validator remove-operator --operator ${OPERATOR_EVM_ADDRESS}

Полезные команды

Информация

# проверить статус story
curl localhost:26657/status | jq
curl localhost:26657/status | jq .result.sync_info


# проверить статус story-geth
curl -X POST -H "Content-Type: application/json" http://localhost:8545 --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'

Удалить story

systemctl stop story
systemctl stop story-geth

systemctl disable story
systemctl disable story-geth

rm /etc/systemd/system/story.service
rm /etc/systemd/system/story-geth.service

systemctl daemon-reload

cd $HOME
rm -rf .story story
rm -rf $(which story)
rm -rf $(which story-geth)

Поддержим природу вместе: 0xa7476EC14cD663C742d527113638C77a1631Cc89 cosmos1m2mm7kzvw6m3464h94ryqg8xvr6tyeyyecppnq