Story Protocol
🪓 Telegram канал UTSA 🪓 Telegram чат UTSA
- Network Chain ID:
odyssey
1516 - Denom:
IP
- Binary:
story
story-geth
- Working directory:
.story
- RPC: https://t-story.archive.rpc.utsa.tech/
- API: https://t-story.archive.api.utsa.tech/
- EVM: https://t-story.archive.evm.utsa.tech:443
- WSS EVM: https://t-story.archive.wss.utsa.tech:443
- Explorer: https://testnet.storyscan.app/validators
- Explorer: https://odyssey.story.explorers.guru/validators
- Docs: https://docs.story.foundation/docs/odyssey-wallet-setup
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-моделей, использующих этот контент
Для защиты прав создателей платформа внедряет несколько модулей:
- Модуль лицензирования, который помогает автоматизировать создание и продажу лицензий
- Модуль роялти, который обеспечивает справедливое распределение прибыли
- Модуль разрешения споров, который позволяет оперативно решать конфликты между участниками системы
Story Protocol не просто платформа для лицензирования, это целая финансовая экосистема для авторов!
Story Protocol - это платформа, которая не только защищает ваш труд, но и даёт возможность его монетизировать!
Обновления
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.11.0-stable
cd wget -O story-geth https://github.com/piplabs/story-geth/releases/download/v0.11.0/geth-linux-amd64 chmod +x story-geth $HOME/story-geth version # Version: 0.11.0-stable # Git Commit: f6503708c29cf9b113d710888c51969ca78d79d1 # Git Commit Date: 20241205 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
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
Новая установка ноды
ВАЖНО — в командах ниже все, что в <> меняем на свое значение и убираем сами <>
В настоящее время для работы ноды необходимо запустить два отдельных клиента:
# при необходимости создаем каталог go/bin/ mkdir -p $HOME/go/bin/
cd wget -O story-geth https://github.com/piplabs/story-geth/releases/download/v0.11.0/geth-linux-amd64 chmod +x story-geth mv story-geth $HOME/go/bin/story-geth story-geth version # Version: 0.11.0-stable # Git Commit: f6503708c29cf9b113d710888c51969ca78d79d1 # Git Commit Date: 20241205
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
# Проверим генезис sha256sum ~/.story/story/config/genesis.json # d332e9082222cc0dd6fe4e9943eafc89b2ce5e118a75ffa01b77e549fdd12587
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
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
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
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)
# добавить монеты в стейк 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}'
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)