コンテンツにスキップ

7.ステークプールの登録

概要

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

プール登録料

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

1.メタデータの作成

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

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

1.Githubアカウントを作成しログインします https://github.com/

2.右上の+マークをクリックしnew repository をクリックします。

3.Repository nameに任意のリポジトリ名を入力し、Create repositoryをクリックします。

4.小さい文字で書かれた"creating a new file"をクリックします。

5.ファイル名を poolMetaData.json として入力し json コンテンツを貼り付けます。

作成時の注意

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

{
"name": "MyPoolName",
"description": "My pool description",
"ticker": "MPN",
"homepage": "https://myadapoolnamerocks.com"
}
6.Commit new fileをクリックします。

7.作成したファイルの名前をクリックします。

8.Rawボタンをクリックします。

9.「https://raw」から始まるURLをコピーします。

例: https://raw.githubusercontent.com/coincashew/test/master/poolMetaData.json

10.URLは64文字より短くする必要があります。 https://bitly.com/ またはhttps://tinyurl.com/を使用してURLを短縮します。

11.9でコピーしたURLを貼り付けます。

12.短縮されたURLをpool.cert作成時--metadata-url に記述します。

例:
--metadata-url https://bit.ly/****

13.ブロックプロデューサーノードでjsonファイルをダウンロードし、ハッシュ値を計算する。

ヒント

下記のURLを12で作成した短縮URLに置き換えてから実行してください

cd $NODE_HOME
wget -O poolMetaData.json https://bit.ly/****

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

作成ルール

ticker名の長さは3~5文字にする必要があります。文字はA-Zと0-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をチェックする

cat $NODE_HOME/poolMetaData.json | jq .

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

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

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

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

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

ファイル転送

BPにあるvrf.vkeypoolMetaDataHash.txt をエアギャップマシンのcnodeディレクトリにコピーします。

graph LR
    A[BP] -->| vrf.vkey / poolMetaDataHash.txt | B[エアギャップ];

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

cd $NODE_HOME
sha256sum vrf.vkey

BPとエアギャップで表示された戻り値を比較して、ハッシュ値が一致していればOK

cd $NODE_HOME
sha256sum vrf.vkey

最小プールコスト(固定費)を出力します。

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

minPoolCost(固定費)は 340000000 lovelace (340 ADA)です。

エアギャップマシンでpool.certを作成する

pool.cert作成時の注意点▼

pool.certはプール登録証明書の役割を果たし、プール情報を記載します。

  • 誓約 100ADA  (--pool-pledge)  注釈→(1)
  • 固定手数料 340ADA (--pool-cost)  注釈→(2)
  • 変動手数料5% (--pool-margin)  注釈→(3)
  1. 🙋‍♂️ 誓約(Pledge)とは?
    Pledge(誓約)はシビル攻撃を防ぐ目的で導入されているパラメータで、SPOが自身のプールにADAをより預けることで委任者様の報酬が若干多く分配される設計になっており、複数プールを開設するよりも単一プールでの運営メリット促すために設けられた制度です。2022/02/16時点でのPledge(誓約)の設計は、SPOが差し出すADA(Pledge)が10M ADA以上からじゃないと報酬が増える割合が変わらないため、あまり機能していないのが実情です。(現在改良が検討されています)
  2. 🙋‍♂️ 固定手数料(cost)とは?
    プール運営におけるオペレーター報酬の1つで、最低340ADAから設定可能
  3. 🙋‍♂️ 変動手数料(margin)とは?
    プール運営におけるオペレーター報酬の1つで (総報酬-固定手数料費)におけるオペレーター報酬率
誓約(Pledge)について▼

自分のプールに保証金を預けることをPledge(誓約)と呼びます

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

上記のpool.cert作成時、自身のリレー情報を以下の3パターンの記述方法があります。

複数のリレーノードを構成する記述方法

IPアドレス方式: 1ノード1IPアドレスの場合(分からない場合はこちら)
[xxx.xxx.xxx]をリレーノードのパブリックIP(静的)アドレスへ書き換え

    --pool-relay-ipv4 xxx.xxx.xxx \
    --pool-relay-port 6000 \
    --pool-relay-ipv4 xxx.xxx.xxx \
    --pool-relay-port 6000 \

DNS方式:1つのエントリーの場合
[relay1.yourdomain.com]をあなたのドメイン名に書き換え

    --single-host-pool-relay relay1.yourdomain.com \
    --pool-relay-port 6000 \
    --single-host-pool-relay relay2.yourdomain.com \
    --pool-relay-port 6000 \

ラウンドロビンDNSベース SRV DNS recordの場合
[relay.yourdomain.com]をあなたのドメイン名に書き換え

    --multi-host-pool-relay relay.yourdomain.com \
    --pool-relay-port 6000 \

***.***.***.***はリレー1のIPに置き換えてください
下記のスクリプトは例です。ご自身のプール運用設定値に変更してから実行してください。

cd $NODE_HOME
cardano-cli stake-pool registration-certificate \
    --cold-verification-key-file $HOME/cold-keys/node.vkey \
    --vrf-verification-key-file vrf.vkey \
    --pool-pledge 100000000 \
    --pool-cost 340000000 \
    --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 \
    --metadata-url https://bit.ly/**** \
    --metadata-hash $(cat poolMetaDataHash.txt) \
    --out-file pool.cert

111.***.***.***はリレー1のIPに置き換えてください
222.***.***.***はリレー2のIPに置き換えてください
下記のスクリプトは例です。ご自身のプール運用設定値に変更してから実行してください。

cd $NODE_HOME
cardano-cli stake-pool registration-certificate \
    --cold-verification-key-file $HOME/cold-keys/node.vkey \
    --vrf-verification-key-file vrf.vkey \
    --pool-pledge 100000000 \
    --pool-cost 340000000 \
    --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 111.***.***.*** \
    --pool-relay-port 6000 \
    --pool-relay-ipv4 222.***.***.*** \
    --pool-relay-port 6000 \
    --metadata-url https://bit.ly/**** \
    --metadata-hash $(cat poolMetaDataHash.txt) \
    --out-file pool.cert

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

cardano-cli stake-address 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ディレクトリにコピーします。

graph LR
    A[エアギャップ] -->|pool.cert / deleg.cert| B[BP];

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

最新のスロット番号を取得する必要があります

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

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

cardano-cli query utxo \
    --address $(cat payment.addr) \
    $NODE_NETWORK > 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 transaction build-raw \
    ${tx_in} \
    --tx-out $(cat payment.addr)+$(( ${total_balance} - ${poolDeposit}))  \
    --invalid-hereafter $(( ${currentSlot} + 10000)) \
    --fee 0 \
    --certificate-file pool.cert \
    --certificate-file deleg.cert \
    --out-file tx.tmp

最低手数料を計算します

fee=$(cardano-cli transaction calculate-min-fee \
    --tx-body-file tx.tmp \
    --tx-in-count ${txcnt} \
    --tx-out-count 1 \
    $NODE_NETWORK \
    --witness-count 3 \
    --byron-witness-count 0 \
    --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

計算結果を出力します

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

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

cardano-cli 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ディレクトリにコピーします。

graph LR
    A[BP] -->|tx.raw| B[エアギャップ];

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

cd $NODE_HOME
cardano-cli 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ディレクトリにコピーします。

graph LR
    A[エアギャップ] -->|tx.signed| B[BP];

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

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

Transacsion Successfully submittedと表示されれば成功

4. プール登録確認

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

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

ファイル転送

エアギャップマシンのstakepoolid_bech32.txtstakepoolid_hex.txtをBPのcnodeディレクトリにコピーします。

graph LR
    A[エアギャップ] -->|stakepoolid_bech32.txt / stakepoolid_hex.txt| B[BP];

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

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

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

cd $NODE_HOME
cat stakepoolid_bech32.txt

表示されたPoolIDであなたのステークプールがブロックチェーンに登録されているか、次のサイトで確認することが出来ます。
Cardanoscan

あと一息です!

上記サイトであなたのプールティッカーが表示されたらブロックチェーンに登録されました!しかしまだブロック生成できる状態ではありません。この後も重要な作業が続きますがもう少し頑張ってください!