ステークプールの登録
ステークプールの登録
ティッカーの長さは3 ~ 5文字にする必要があります。文字はA ~ Zと0 ~ 9のみにする必要があります。
説明の長さは255文字を超えることはできません。
- BP
- 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 .
pool-metadata.jsonをgithub(またはご自身のWebサイト)へアップロードします。
ローカルマシンにダウンロードしてgithubへアップロードしてください。
- メタデータファイルのハッシュを計算します。これは
pool-metadata-hash.txtに保存されます。
cd $NODE_HOME
cardano-cli latest stake-pool metadata-hash --pool-metadata-file pool-metadata.json > pool-metadata-hash.txt
- メタデータ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ホストにアップロードしてください。
- 最小プールコストを見つけます。
min_pool_cost=$(cat $NODE_HOME/params.json | jq -r .minPoolCost)
echo minPoolCost: ${min_pool_cost}
minPoolCost は 170000000 Lovelaceまたは170ADA です。したがって、--pool-costは少なくともこの量である必要があります。
- ステークプールの登録証明書を作成します。
メタデータ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"
- エアギャップ(Relay1台IP運用)
- エアギャップ(Relay2台IP運用)
- エアギャップ(Relay1台DNS運用)
- エアギャップ(Relay2台DNS運用)
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
それぞれのRelayのIPを変数に代入します。
Relay-1のIPを変数
relay1_ipv4へ
Relay-2のIPを変数relay2_ipv4へ
relay1_ipv4=
relay2_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 \
--pool-relay-ipv4 ${relay2_ipv4} \
--pool-relay-port 3001 \
--metadata-url ${metadata_url} \
--metadata-hash $(cat pool-metadata-hash.txt) \
--out-file pool.cert
Relay-1のDNSを変数relay1_dnsに代入します。
relay1_dns=
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} \
--single-host-pool-relay ${relay1_dns} \
--pool-relay-port 3001 \
--metadata-url ${metadata_url} \
--metadata-hash $(cat pool-metadata-hash.txt) \
--out-file pool.cert
それぞれのRelayのDNSを変数に代入します。
Relay-1のDNSを変数
relay1_dnsへ
Relay-2のDNSを変数relay2_dnsへ
relay1_dns=
relay2_dns=
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} \
--single-host-pool-relay ${relay1_dns} \
--pool-relay-port 3001 \
--single-host-pool-relay ${relay2_dns} \
--pool-relay-port 3001 \
--metadata-url ${metadata_url} \
--metadata-hash $(cat pool-metadata-hash.txt) \
--out-file pool.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.certとdeleg.certをBPのcnodeディレクトリにコピーします。
この操作によりstake.vkeyに関連付けられたすべてのステークアドレスからの資金をコールドキーのnode.vkeyに属するプールに委任する委任証明書が作成されます。
ステークプールの所有者が自分のプールに資金を提供する約束を「誓約」と呼びます。
- 残高は誓約額より大きくなければなりません。
- 誓約金はどこにも移動されません。このガイドの例では、誓約金はステークプールの所有者キー、具体的には
payment.addrに残ります。 - 誓約を履行できない場合、ブロック生成の機会を逃し、委任者は報酬を逃すことになります。
- あなたの誓約はロックされません。資金を自由に移動できます。
- BP
invalid-hereafterパラメータを適切に設定するには、ブロックチェーンの先端を見つける必要があります。
cd $NODE_HOME
current_slot=$(cardano-cli latest query tip ${NODE_NETWORK} | jq -r '.slot')
echo Current Slot: ${current_slot}
- 残高と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}
- プールのデポジット料金を調べます。
stake_pool_deposit=$(cat $NODE_HOME/params.json | jq -r '.stakePoolDeposit')
echo stakePoolDeposit: ${stake_pool_deposit}
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
- 最低料金を計算します。
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より大きいことを確認してください。そうでない場合、これは機能しません。
- お釣りの量を計算します。
tx_out=$((${total_balance}-${stake_pool_deposit}-${fee}))
echo txOut: ${tx_out}
- トランザクションを構築します。
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ディレクトリにコピーします。
- トランザクションに署名します。
- エアギャップ
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ディレクトリにコピーします。
- トランザクションを送信します。
- BP
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 certificates、vrf.skey、cold keysを保存してはなりません。