이 섹션에서는 메인넷용 Story 노드를 설정하는 방법을 안내합니다. Story는 실행 클라이언트와 합의 클라이언트를 분리하는 ETH PoS에서 영감을 받았습니다. 실행 클라이언트인 story-gethstoryexec는 Engine API를 통해 EVM 블록을 storystoryconsensus 합의 클라이언트로 전달하며, ABCI++ 어댑터를 사용하여 EVM 상태를 CometBFT와 호환되게 만듭니다. 이러한 아키텍처로 인해 합의 효율성은 더 이상 실행 트랜잭션 처리량에 의해 병목 현상이 발생하지 않습니다.

Story 노드 실행에 필요한 클라이언트를 구성하는 storystoryexecgethstoryconsensus 바이너리는 최신 릴리스에서 사용할 수 있습니다.release pages:

Story 노드 설치 가이드

설치 전 체크리스트

  • 시스템이 하드웨어 요구 사항을 충족하는지 확인
  • 운영 체제: Ubuntu 22.04 LTS
  • 필요한 포트가 사용 가능한지 확인
  • 충분한 디스크 공간 확보
  • 루트 또는 sudo 접근 권한

빠른 참조

  • 설치 시간: 약 30분
  • Network: Story Mainnet or Story Aeneid Testnet
  • 필요한 버전:
    • 최신 릴리스 확인

1. 시스템 준비

1.1 시스템 요구 사항

최적의 성능과 안정성을 위해 다음 중 하나에서 노드를 실행하는 것을 권장합니다:

  • 가상 사설 서버(VPS)
  • 전용 리눅스 기반 머신

시스템 사양

하드웨어최소 요구 사항
CPU전용 8 코어
RAM32 GB
디스크500 GB NVMe 드라이브
대역폭25 MBit/s

1.2 필요한 포트

노드 기능에 필요한 모든 포트가 아래 설명된 대로 필요한지 확인하세요

  • story-geth
    • 8545
      • 노드가 HTTP를 통해 JSON-RPC API로 인터페이스하려면 필요
    • 8546
      • 웹소켓 상호 작용에 필요
    • 30303 (TCP + API)
      • p2p 통신을 위해 반드시 열어야 함
  • story
    • 26656
      • 합의 p2p 통신을 위해 반드시 열어야 함
    • 26657
      • 노드가 Tendermint RPC로 인터페이스하려면 필요
    • 26660
      • 프로메테우스 메트릭을 노출하려면 필요

1.3 의존성 설치

# Update system
sudo apt update && sudo apt-get update

# Install required packages
sudo apt install -y \
  curl \
  git \
  make \
  jq \
  build-essential \
  gcc \
  unzip \
  wget \
  lz4 \
  aria2 \
  gh

1.4 Go 설치

Odyssey를 위해 Go 1.22.0을 설치해야 합니다

# Download and install Go 1.22.0
cd $HOME

# Set Go version
GO_VERSION="1.22.0"

# Download Go binary
wget "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz"

# Remove existing Go installation and extract new version
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz"

# Clean up downloaded archive
rm "go${GO_VERSION}.linux-amd64.tar.gz"

# Add Go to PATH
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
source ~/.bash_profile

# Verify installation
go version

2. Story 노드 설치

2.1 Story-Geth 설치

  1. 바이너리 다운로드 및 설정
cd $HOME
wget https://github.com/piplabs/story-geth/releases/download/v1.0.1/geth-linux-amd64
sudo mv ./geth-linux-amd64 story-geth
sudo chmod +x story-geth
sudo mv ./story-geth $HOME/go/bin/
source $HOME/.bashrc

# Verify installation
story-geth version

geth 바이너리의 버전이 표시됩니다.

Geth
version: 1.0.1-stable
...

(Mac OS X 전용) OS X 바이너리는 아직 빌드 프로세스에서 서명되지 않았으므로 수동으로 격리 해제해야 할 수 있습니다:

sudo xattr -rd com.apple.quarantine ./geth
  1. 서비스 구성 및 시작
       # Setup systemd service
sudo tee /etc/systemd/system/story-geth.service > /dev/null <<EOF
[Unit]
Description=Story Geth Client
After=network.target

[Service]
User=${user}
ExecStart=${path_to_geth_binary} --story --syncmode full
Restart=on-failure
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
EOF

# Start service
sudo systemctl daemon-reload
sudo systemctl enable story-geth
sudo systemctl start story-geth

# Verify service status
sudo systemctl status story-geth

2.2 Story 합의 클라이언트 설치

Cosmovisor 설치

story 클라이언트 업데이트를 위해 Cosmovisor 사용을 권장합니다.

  1. Cosmovisor 설치
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.6.0
cosmovisor version
  1. Cosmovisor 구성
# Set daemon configuration
export DAEMON_NAME=story
export DAEMON_HOME=$HOME/.story/story
export DAEMON_DATA_BACKUP_DIR=${DAEMON_HOME}/cosmovisor/backup
sudo mkdir -p \
  $DAEMON_HOME/cosmovisor/backup \
  $DAEMON_HOME/data


# Persist configuration
echo "export DAEMON_NAME=story" >> $HOME/.bash_profile
echo "export DAEMON_HOME=$HOME/.story/story" >> $HOME/.bash_profile
echo "export DAEMON_DATA_BACKUP_DIR=${DAEMON_HOME}/cosmovisor/backup" >> $HOME/.bash_profile
echo "export DAEMON_ALLOW_DOWNLOAD_BINARIES=false" >> $HOME/.bash_profile

Story 클라이언트 설치

cd $HOME
wget https://github.com/piplabs/story/releases/download/v1.0.0/story-linux-amd64
sudo mv story-linux-amd64 story
sudo chmod +x story
sudo mv ./story $HOME/go/bin/
source $HOME/.bashrc
story version

버전 1.0.0-stable이 표시되어야 합니다

(Mac OS X 전용) OS X 바이너리는 아직 빌드 프로세스에서 서명되지 않았으므로 수동으로 격리 해제해야 할 수 있습니다:

sudo xattr -rd com.apple.quarantine ./story

Cosmovisor로 Story 초기화

cosmovisor init ./story
cosmovisor run init --network story --moniker ${moniker_name}
cosmovisor version

사용자 정의 구성

자신의 노드 설정을 재정의하려면 다음과 같이 할 수 있습니다:

  • ${STORY_DATA_ROOT}/config/config.toml 네트워크 및 합의 설정을 변경하기 위해 수정할 수 있습니다
  • ${STORY_DATA_ROOT}/config/story.toml 다양한 클라이언트 구성을 업데이트하기 위해
  • ${STORY_DATA_ROOT}/priv_validator_key.json 는 검증자 키를 포함하는 민감한 파일이지만 자신의 것으로 대체할 수 있습니다

사용자 정의 자동화

아래에 Linux에서 사용할 수 있는 샘플 Systemd 구성을 나열합니다

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

[Service]
Type=simple
User=$USER
Group=$GROUP
ExecStart=/usr/local/bin/cosmovisor run run \
--api-enable \
--api-address=0.0.0.0:1317
Restart=on-failure
RestartSec=5s
LimitNOFILE=65535
Environment="DAEMON_NAME=$DAEMON_NAME"
Environment="DAEMON_HOME=$DAEMON_HOME"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_DATA_BACKUP_DIR=$DAEMON_HOME/cosmovisor/backup"
WorkingDirectory=$DAEMON_HOME

[Install]
WantedBy=multi-user.target
EOF

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

[Service]
Type=simple
User=${USER}
Group=${GROUP}
ExecStart=${path_to_story_binary} run run \
--api-enable \
--api-address=0.0.0.0:1317
Restart=on-failure
RestartSec=5s
LimitNOFILE=65535
Environment="DAEMON_NAME=$DAEMON_NAME"
Environment="DAEMON_HOME=$DAEMON_HOME"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_DATA_BACKUP_DIR=$DAEMON_HOME/cosmovisor/backup"
WorkingDirectory=$DAEMON_HOME

[Install]
WantedBy=multi-user.target
EOF

서비스 시작

sudo systemctl daemon-reload
sudo systemctl enable story
sudo systemctl start story

# Monitor logs
journalctl -u cosmovisor -f -o cat

디버깅

실행 중인 story 의 상태를 확인하려면 내부 JSONRPC/HTTP 엔드포인트를 쿼리하는 것이 도움이 됩니다. 다음은 몇 가지 유용한 명령어입니다:

  • curl localhost:26657/net_info | jq '.result.peers[].node_info.moniker'
    • 이는 노드가 동기화된 합의 피어 목록을 모니커별로 제공합니다
  • curl localhost:26657/health
    • 이는 노드가 정상인지 알려줍니다 - {} 는 정상임을 나타냅니다

3. 설치 확인

3.1 Geth 상태 확인

# Check sync status
curl -X POST -H "Content-Type: application/json" \
  --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
  http://localhost:8545

3.2 합의 클라이언트 확인

# Check node status
curl localhost:26657/status

# Check peer connections
curl localhost:26657/net_info | jq '.result.peers[].node_info.moniker'

정상 상태

문제가 발생하여 초기화된 상태에서 네트워크에 다시 참여하고 싶다면 다음을 실행하세요:

Geth

rm -rf ${GETH_DATA_ROOT} && ./geth --story --syncmode full

Mac OS X: rm -rf ~/Library/Story/geth/* && ./geth --story --syncmode full

Linux: rm -rf ~/.story/geth/* && ./geth --story --syncmode full

Story

rm -rf ${STORY_DATA_ROOT} && ./story init --network story && ./story run

Mac OS X: rm -rf ~/Library/Story/story/* && ./story init --network story && ./story run

Linux: rm -rf ~/.story/story/* && ./story init --network story && ./story run