メインコンテンツまでスキップ

ステークプールの登録

ステークプールの登録

警告

ティッカーの長さは3 ~ 5文字にする必要があります。文字はA ~ Z0 ~ 9のみにする必要があります。
説明の長さは255文字を超えることはできません。

  1. JSONファイルを使用してプールのメタデータを作成します。
name=''
description=''
ticker=''
homepage=''
extended=''
cat > $NODE_HOME/pool-metadata.json << EOF
{
"name": "${name}",
"description": "${description}",
"ticker": "${ticker}",
"homepage": "${homepage}",
"extended": "${extended}"
}
EOF

構文チェックをします。

cat $NODE_HOME/pool-metadata.json | jq .
  1. pool-metadata.jsonをgithub(またはご自身のWebサイト)へアップロードします。
ヒント

ローカルマシンにダウンロードしてgithubへアップロードしてください。

  1. メタデータファイルのハッシュを計算します。これはpool-metadata-hash.txtに保存されます。
cd $NODE_HOME
cardano-cli latest stake-pool metadata-hash --pool-metadata-file pool-metadata.json > pool-metadata-hash.txt
  1. メタデータjsonのURLからメタデータハッシュを取得し、ローカルメタデータハッシュと等しいかを確認します。
metadata_url=""

""←の間にURLを入れてください。 例)metadata_url="https://xxx.github.io/xxx/pool-metadata.json"

cardano-cli latest stake-pool metadata-hash --pool-metadata-file <(curl -s -L --fail "${metadata_url}")
cd $NODE_HOME
echo $(cat pool-metadata-hash.txt)
ファイル転送

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

警告

ハッシュが一致しない場合は、アップロードされた.JSONファイルが切り捨てられたか、余分な空白によって問題が発生した可能性があります。.JSONを再度アップロードするか、別のWebホストにアップロードしてください。

  1. 最小プールコストを見つけます。
min_pool_cost=$(cat $NODE_HOME/params.json | jq -r .minPoolCost)
echo minPoolCost: ${min_pool_cost}
ヒント

minPoolCost は 170000000 Lovelaceまたは170ADA です。したがって、--pool-costは少なくともこの量である必要があります。

  1. ステークプールの登録証明書を作成します。

メタデータURLとリレーノード情報を更新します。

ヒント

ノード管理を簡素化するには、DNSベースのリレーが推奨されます。
つまり、IPが変更されるたびにこの登録証明書トランザクションを再送信する必要はありません。
また、たとえばリレーノードを再配置または再構築する場合、DNS を簡単に更新して新しいIPを指すようにすることができます。

リレーノードの複数設定
複数のリレーノードの設定

エアギャップオフラインマシンで適切なドメイン名またはIPアドレスを設定してください。

  • DNSベース:DNSレコードごとに1つのエントリ
    --single-host-pool-relay <DNS1> \
--pool-relay-port 3001 \
--single-host-pool-relay <DNS2> \
--pool-relay-port 3001 \
  • IPベース:IPアドレスごとに1つのエントリ
    
--pool-relay-ipv4 <your first relay node public IP address> \
--pool-relay-port 3001 \
--pool-relay-ipv4 <your second relay node public IP address> \
--pool-relay-port 3001 \
備考

例)固定プールコスト170ADA、プールマージン3%100ADAを誓約する場合の設定値

100ADAを誓約する場合:--pool-pledge 100000000 \
固定プールコストの最小値は170ADA:--pool-cost 170000000 \
プールマージン:--pool-margin 0.03 \

プールマージンは、パブリックプールの場合大体0~5%が多いと感じます。

  • 以下の変数pledged_adaに誓約するADA数を入れます。
pledged_ada=

pledged_ada=100

pledged_lovelace=$((pledged_ada * 1000000))
echo "${pledged_ada} ADAは、${pledged_lovelace} Lovelaceです。"
  • 以下の変数pool_cost_adaに固定プールコストのADA数を入れます。
警告

minPoolCost は 170000000 Lovelaceまたは170ADA です。

pool_cost_ada=

pool_cost_ada=170

pool_cost_lovelace=$((pool_cost_ada * 1000000))
echo "${pool_cost_ada} ADAは、${pool_cost_lovelace} Lovelaceです。"
  • 以下の変数percentに設定したいマージン数(%)を入れてください。
percent=

例)percent=3

pool_margin=$(echo "scale=10; ${percent} / 100" | bc | sed 's/^\./0./;s/\.0*$//;s/\.\([0-9]*[1-9]\)0*$/.\1/')
echo "Margin: ${pool_margin}"
  • githubにアップロードされているpool-metadata.jsonのURLを""の間に入れてください。
危険

metadata-urlは、64文字未満にする必要があります。URLまたはファイル名を短くしてください。
文字数カウント / ラッコツールズ

metadata_url=""

例)metadata_url="https://xxx.github.io/xxx/pool-metadata.json"

Relay-1のIPを変数relay1_ipv4に代入します。

relay1_ipv4=
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 ${pledged_lovelace} \
--pool-cost ${pool_cost_lovelace} \
--pool-margin ${pool_margin} \
--pool-reward-account-verification-key-file stake.vkey \
--pool-owner-stake-verification-key-file stake.vkey \
${NODE_NETWORK} \
--pool-relay-ipv4 ${relay1_ipv4} \
--pool-relay-port 3001 \
--metadata-url ${metadata_url} \
--metadata-hash $(cat pool-metadata-hash.txt) \
--out-file pool.cert
  1. ステークプールにステークを誓約します。
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ディレクトリにコピーします。

ヒント

この操作によりstake.vkeyに関連付けられたすべてのステークアドレスからの資金をコールドキーのnode.vkeyに属するプールに委任する委任証明書が作成されます。

備考

ステークプールの所有者が自分のプールに資金を提供する約束を「誓約」と呼びます。

  • 残高は誓約額より大きくなければなりません。
  • 誓約金はどこにも移動されません。このガイドの例では、誓約金はステークプールの所有者キー、具体的にはpayment.addrに残ります。
  • 誓約を履行できない場合、ブロック生成の機会を逃し、委任者は報酬を逃すことになります。
  • あなたの誓約はロックされません。資金を自由に移動できます。
  1. invalid-hereafter パラメータを適切に設定するには、ブロックチェーンの先端を見つける必要があります。
cd $NODE_HOME
current_slot=$(cardano-cli latest query tip ${NODE_NETWORK} | jq -r '.slot')
echo Current Slot: ${current_slot}
  1. 残高とUTXOを見つけます。
cardano-cli latest query utxo \
--address $(cat payment.addr) \
${NODE_NETWORK} > fullUtxo.out

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

cat balance.out
tx_in=""
total_balance=0
while read -r utxo; do
type=$(awk '{ print $6 }' <<< "${utxo}")
if [[ ${type} == 'TxOutDatumNone' ]]
then
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}"
fi
done < balance.out
tx_count=$(cat balance.out | wc -l)
echo Total available ADA balance: ${total_balance}
echo Number of UTXOs: ${tx_count}
  1. プールのデポジット料金を調べます。
stake_pool_deposit=$(cat $NODE_HOME/params.json | jq -r '.stakePoolDeposit')
echo stakePoolDeposit: ${stake_pool_deposit}
  1. build-rawトランザクションコマンドを実行します。
備考

invalid-hereafter値は現在のチップよりも大きくなければなりません。この例では、現在のスロット + 10000を使用します。

cardano-cli latest transaction build-raw \
${tx_in} \
--tx-out $(cat payment.addr)+$(( ${total_balance} - ${stake_pool_deposit} )) \
--invalid-hereafter $(( ${current_slot} + 10000 )) \
--fee 200000 \
--certificate-file pool.cert \
--certificate-file deleg.cert \
--out-file tx.tmp
  1. 最低料金を計算します。
fee=$(cardano-cli latest transaction calculate-min-fee \
--tx-body-file tx.tmp \
--tx-in-count ${tx_count} \
--tx-out-count 1 \
${NODE_NETWORK} \
--witness-count 3 \
--byron-witness-count 0 \
--protocol-params-file params.json | awk '{ print $1 }')
echo fee: ${fee}
ヒント

残高が手数料 + minPoolCostより大きいことを確認してください。そうでない場合、これは機能しません。

  1. お釣りの量を計算します。
tx_out=$((${total_balance}-${stake_pool_deposit}-${fee}))
echo txOut: ${tx_out}
  1. トランザクションを構築します。
cardano-cli latest transaction build-raw \
${tx_in} \
--tx-out $(cat payment.addr)+${tx_out} \
--invalid-hereafter $(( ${current_slot} + 10000 )) \
--fee ${fee} \
--certificate-file pool.cert \
--certificate-file deleg.cert \
--out-file tx.raw
ファイル転送

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

  1. トランザクションに署名します。
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ディレクトリにコピーします。

  1. トランザクションを送信します。
cardano-cli latest transaction submit \
--tx-file tx.signed \
${NODE_NETWORK}

🛑 重要なセキュリティリマインダー 🔥

BP

ステークプールを実行するために必要なステークプールキーと証明書は、ブロックプロデューサーに必要なものであり、具体的には次の 3 つのファイルです。

KES=${NODE_HOME}/kes.skey
VRF=${NODE_HOME}/vrf.skey
CERT=${NODE_HOME}/node.cert

その他のすべてのキーは、エアギャップオフラインコールド環境でオフラインのままにしておく必要があります。

リレーノード

リレーノードは、operational certificatesvrf.skeycold keysを保存してはなりません。