SPO JAPAN GUILD
ステークプール構築

ステークプール登録

概要

こちらの手順は初回プール登録時のみ有効です。
プール登録後にメタ情報、誓約、固定費、変動費、リレー情報を変更する場合は、運用証明書(pool.cert)の更新の変更手順を実施してください。

プール登録料

ステークプール登録には、 500ADA の登録料が必要です。
payment.addrに入金されている必要があります。

1. メタデータの作成

ホームページを持っていない場合

「JSONファイルをGitHubでホストする方法」を実施してください。

Example

  1. GitHubアカウントを作成し、ログイン https://github.com/

ユーザー名を最大13文字以内で作成してください。

  1. Repositoriesタブを選択し、右上のNew を選択

  2. リポジトリ作成

  • Repository nameに任意のリポジトリ名 最大13文字以内 を入力
  • Publicを選択
  • Create repositoryを選択

  1. 小さい文字で書かれたcreating a new fileを選択

  1. ファイル名を poolMetaData.json として入力し、JSON コンテンツを貼り付け

{
  "name": "MyPoolName",
  "description": "My pool description",
  "ticker": "MPN",
  "homepage": "https://myadapoolnamerocks.com"
}

作成時の注意

  • 下記は参考フォーマットとなります。ご自身のプール名、Ticker名に書き換えてください
  • まだホームページURLが無い場合は、ご自身のX(Twitter)アドレスでも大丈夫です。
  • ticker名の長さは3~5文字以内で、A-Z0-9のみで構成する必要があります。
  • descriptionの長さは255文字以内(255byte)となります。(ひらがな、漢字、カタカナは1文字2byte)
  1. Commit Changesを選択

  1. 上部のメニューからSettingsを選択

  1. GitHub Pages設定
  • 左メニューからPagesを選択
  • Branchのプルダウンからmain /rootを選択
  • Saveを選択

  1. URLの生成
  • 左メニューからPagesを選択
  • 上部にこのリポジトリの公開URLが表示されたことを確認
  • 赤枠のURLをコピー

  1. メタデータURLの生成

9でコピーしたURLにpoolMetaData.jsonを繋げてください

例)https://btbf.github.io/sjg/poolMetaData.json

このURLの文字列が64文字以内であることを確認してください
  1. BPJSONファイルをダウンロードし、ハッシュ値を計算

URLを書き換えてから実行してください

10で作成したメタデータURLを用いてください。

cd $NODE_HOME
wget -O poolMetaData.json https://xxx.github.io/xxx/poolMetaData.json 

Example

Hint

下記は参考フォーマットとなります。ご自身のプール名、Ticker名に書き換えてください

作成ルール

ticker名の長さは3~5文字にする必要があります。文字はA-Z0-9のみで構成する必要があります。
descriptionの長さは255文字以内(255byte)となります。(ひらがな、漢字、カタカナは1文字2byte)

メタデータファイルの作成

cd $NODE_HOME
cat > poolMetaData.json << EOF
{
  "name": "MyPoolName",
  "description": "My pool description",
  "ticker": "MPN",
  "homepage": "https://myadapoolnamerocks.com"
}
EOF

注意

poolMetaData.json をご自身の公開用Webサーバへアップロードしてください。

メタデータJSONの確認

jq . $NODE_HOME/poolMetaData.json

戻り値にエラーが表示される場合

戻り値にparse error:が表示される場合は、JSON構文に誤りがあります。 作成したメタデータJSONファイルを確認してください。

メタデータファイルのハッシュ値を計算します。

cd $NODE_HOME
cardano-cli latest stake-pool metadata-hash --pool-metadata-file poolMetaData.json > poolMetaDataHash.txt

2. プール登録証明書の作成

ファイル転送

BPにあるvrf.vkeypoolMetaDataHash.txt をエアギャップのcnodeディレクトリにコピーしてください。

vrf.vkey / poolMetaDataHash.txt BP エアギャップ

BPとエアギャップでvrf.vkeyファイルハッシュを比較

cd $NODE_HOME
sha256sum vrf.vkey

ヒント

BPとエアギャップで表示された戻り値を比較して、ハッシュ値が一致していれば問題ありません。

cd $NODE_HOME
sha256sum vrf.vkey

最小プールコスト(最低固定費)を出力してください。

minPoolCost=$(cat $NODE_HOME/params.json | jq -r .minPoolCost)
echo minPoolCost: ${minPoolCost}

Info

出力例: minPoolCost170000000 lovelace の場合、170 ADA です。

エアギャップでpool.certを作成してください

pool.cert とサンプル値

pool.cert はステークプールの登録内容を書き込んだ証明書です。
この後のサンプルコマンドでは、主に次の 3 つが設定されています。
実運用の値に読み替えてから実行してください。

  • 誓約(Pledge)--pool-pledge(例: 100 ADA に相当します)
  • 固定手数料(固定費 / cost)--pool-cost(例: 170 ADAチェーンの minPoolCost 以上が必要です)
  • 変動手数料(マージン / margin)--pool-margin(例: 5%0.05。0~1 の小数になります)

誓約(Pledge)について

誓約(Pledge)とは、プール運営者がご自身のプールに対して保持を宣言するADA量です。

  • 支払い用アドレス(payment.addr)の残高は、Pledge額よりも大きい必要があります
  • 設定した誓約数よりpayment.addrに入金されているADAが下回っている場合、プール報酬が0になります。
  • 誓約金はロックされません。いつでも自由に取り出せますが、プール登録証明書を再提出する必要があります。

下記はサンプルです。実行前に、ご自身のプール設定へ置き換えてから実行してください。

実行前に変更する値

  • --pool-pledge:誓約額
  • --pool-cost:固定手数料
  • --pool-margin:変動手数料
  • ***.***.***.***:リレー1、リレー2のパブリックIPアドレス
  • https://xxx.github.io/xxx/poolMetaData.json:ご自身のメタデータURL
cd $NODE_HOME
cardano-cli latest stake-pool registration-certificate \
  --cold-verification-key-file $HOME/cold-keys/node.vkey \
  --vrf-verification-key-file vrf.vkey \
  --pool-pledge 100000000 \
  --pool-cost 170000000 \
  --pool-margin 0.05 \
  --pool-reward-account-verification-key-file stake.vkey \
  --pool-owner-stake-verification-key-file stake.vkey \
  $NODE_NETWORK \
  --pool-relay-ipv4 ***.***.***.*** \
  --pool-relay-port 6000 \
  --pool-relay-ipv4 ***.***.***.*** \
  --pool-relay-port 6000 \
  --metadata-url https://xxx.github.io/xxx/poolMetaData.json \
  --metadata-hash $(cat poolMetaDataHash.txt) \
  --out-file pool.cert

ご自身のステークプールに委任する証明書(deleg.cert)を作成します。

cardano-cli latest stake-address stake-delegation-certificate \
  --stake-verification-key-file stake.vkey \
  --cold-verification-key-file $HOME/cold-keys/node.vkey \
  --out-file deleg.cert

ファイル転送

エアギャップのpool.certdeleg.certをBPのcnodeディレクトリにコピーしてください。

pool.cert / deleg.cert エアギャップ BP

3. プール登録トランザクションの送信

最新のスロット番号を取得します。

cd $NODE_HOME
currentSlot=$(cardano-cli latest query tip $NODE_NETWORK | jq -r '.slot')
echo Current Slot: $currentSlot

payment.addrの残高を出力します。

cardano-cli latest query utxo \
  --address $(cat payment.addr) \
  $NODE_NETWORK \
  --output-text \
  --out-file fullUtxo.out

tail -n +3 fullUtxo.out | sort -k3 -nr > balance.out

cat balance.out

UTXOを算出します。

tx_in=""
total_balance=0
while read -r utxo; do
  in_addr=$(awk '{ print $1 }' <<< "${utxo}")
  idx=$(awk '{ print $2 }' <<< "${utxo}")
  utxo_balance=$(awk '{ print $3 }' <<< "${utxo}")
  total_balance=$((${total_balance}+${utxo_balance}))
  echo TxHash: ${in_addr}#${idx}
  echo ADA: ${utxo_balance}
  tx_in="${tx_in} --tx-in ${in_addr}#${idx}"
done < balance.out
txcnt=$(cat balance.out | wc -l)
echo Total ADA balance: ${total_balance}
echo Number of UTXOs: ${txcnt}

poolDepositを出力します。

poolDeposit=$(cat $NODE_HOME/params.json | jq -r '.stakePoolDeposit')
echo poolDeposit: $poolDeposit

トランザクション仮ファイルを作成します。

cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out $(cat payment.addr)+$(( ${total_balance} - ${poolDeposit})) \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --fee 200000 \
  --certificate-file pool.cert \
  --certificate-file deleg.cert \
  --out-file tx.tmp

最低手数料を計算します。

fee=$(cardano-cli latest transaction calculate-min-fee \
  --tx-body-file tx.tmp \
  --witness-count 3 \
  --output-text \
  --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

計算結果を出力します。

txOut=$((${total_balance}-${poolDeposit}-${fee}))
echo txOut: ${txOut}

トランザクションファイルを作成します。

cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out $(cat payment.addr)+${txOut} \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --fee ${fee} \
  --certificate-file pool.cert \
  --certificate-file deleg.cert \
  --out-file tx.raw

ファイル転送

BPのtx.rawをエアギャップのcnodeディレクトリにコピーします。

tx.raw BP エアギャップ

トランザクションに署名します。

cd $NODE_HOME
cardano-cli latest transaction sign \
  --tx-body-file tx.raw \
  --signing-key-file payment.skey \
  --signing-key-file $HOME/cold-keys/node.skey \
  --signing-key-file stake.skey \
  $NODE_NETWORK \
  --out-file tx.signed

ファイル転送

エアギャップのtx.signedをBPのcnodeディレクトリにコピーします。

tx.signed エアギャップ BP

トランザクションを送信します

cardano-cli latest transaction submit \
  --tx-file tx.signed \
  $NODE_NETWORK

Transaction successfully submittedと表示されれば成功

4. プール登録確認

ステークプールIDは以下のように出力できます。

chmod u+rwx $HOME/cold-keys
cardano-cli latest stake-pool id --cold-verification-key-file $HOME/cold-keys/node.vkey --output-format bech32 --out-file pool.id-bech32
cardano-cli latest stake-pool id --cold-verification-key-file $HOME/cold-keys/node.vkey --output-format hex --out-file pool.id
chmod a-rwx $HOME/cold-keys

ファイル転送

エアギャップのpool.id-bech32pool.idをBPのcnodeディレクトリにコピーします。

pool.id-bech32 / pool.id エアギャップ BP

以下のコマンドを実行し、プール情報が表示されればブロックチェーンに登録されています。

curl -s -X POST "https://api.koios.rest/api/v1/pool_info" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"_pool_bech32_ids":["'$(cat $NODE_HOME/pool.id-bech32)'"]}' | jq .

ご自身のステークプールがCardanoscanに登録されているか確認します。

cd $NODE_HOME
cat pool.id-bech32;echo

表示されたPool IDでご自身のステークプールがブロックチェーンに登録されているか、次のサイトで確認できます。
Cardanoscan


Last updated on

Cookieの使用について

当サイトでは、ドキュメントの効果測定と利用状況の把握のため、Google Analytics を使用しています。

同意すると、分析用 Cookie が有効になります。