COSMOS
September 6, 2024

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 - это платформа, которая не только защищает ваш труд, но и даёт возможность его монетизировать!

Обновления

UPD story-geth 🕊 на v 1.0.2

cd $HOME
rm -rf story-geth
git clone https://github.com/piplabs/story-geth && cd story-geth
git checkout v1.0.2
make geth
mv build/bin/geth  $HOME/go/bin/story-geth

story-geth version
# Version: 1.0.2-stable
# Git Commit: 3daeb0c89d72055608b93a94c9f6ca777f5e80f7

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

UPD story 🕊 на v1.2.0 (Высота обновления: 4362990)

cd $HOME/story
git pull
git checkout v1.2.0
go build -o story ./client 

$HOME/story/story version
# Version       
# Git Commit    

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

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

UPD story 🕊 на v1.3.0 (Высота обновления: 6008000)

cd $HOME/story
git pull
git checkout v1.3.0
go build -o story ./client 

$HOME/story/story version
# Version v1.3.0-stable 
# Git Commit 3c01046

# ПОСЛЕ ОСТАНОВКИ СЕТИ НА НУЖНОМ БЛОКЕ!!!
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

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

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

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

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

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

cd $HOME
rm -rf story-geth
git clone https://github.com/piplabs/story-geth.git
cd story-geth
git checkout v1.1.0
make geth
mv build/bin/geth  $HOME/go/bin/story-geth

story-geth version
# Version: 1.1.0-stable
# Git Commit: fe0d2f85bdc6d8bf39cdfcdb1579c3e10f9a3654

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

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

story version
# Version v1.3.0-stable
# Git Commit 3c01046

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

story init --moniker "UTSA_guide" --network aeneid

Genesis

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

Скачиваем 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="01f8a2148a94f0267af919d2eab78452c90d9864@story-testnet-peer.itrocket.net:52656,e1623185b6c5403f77533003b0440fae7c33eeed@15.235.224.129:26656,6d77bba865d84eea83f29c48d4bf034ee3540a11@37.27.127.145:26656,803b0100deb519eebaa16b9a55058d21aa8f8dd9@135.181.240.57:33656,311cd3903e25ab85e5a26c44510fbc747ab61760@152.53.87.97:36656,3d7b3efbe94b84112ec4051693438c91890b09fb@144.76.106.228:62656,2440358221774ba82360a08edd4bf5d43ed441a5@65.109.22.211:52656,83b25d26b8b7dd1d4a6f68182b75097d989dcdd0@88.99.137.138:14656,db6791a8e35dee076de75aebae3c89df8bba3374@65.109.50.22:56656"
sed -i -e "s|^persistent_peers *=.*|persistent_peers = \"$peers\"|" $HOME/.story/story/config/config.toml
seeds="46b7995b0b77515380000b7601e6fc21f783e16f@story-testnet-seed.itrocket.net:52656"
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="null"
sed -i -e "s/^indexer *=.*/indexer = \"$indexer\"/" $HOME/.story/story/config/config.toml

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

# добавляем пир
peers=""
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 --aeneid --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/aeneid/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/aeneid/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/aeneid/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/aeneid/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

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

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

Используйте этот закрытый ключ для импорта своей учётной записи в кошелёк, например Metamask. Добавьте тестовую сеть aeneid в свой кошелёк. Затем скопируйте свой «адрес EVM» из кошелька и запросите токены $IP. Теперь вы можете просматривать баланс и совершать транзакции в приложении кошелька.

Нужно добавить .env файл с вашей приватной фразой. После находитесь именно в том каталоге, где лежит .env и с этого каталога отправляйте транзакцию

cd
echo "PRIVATE_KEY=your_priv_key" > .env

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

story validator create --stake 1024000000000000000000 --moniker "UTSA" --chain-id 1315 --unlocked=false --rpc https://aeneid.storyrpc.io/ 

Данная команда создаст валидатора, который соответствует
ключу валидатора, сохраненному в 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}

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

Информация

# проверить статус 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