SPO JAPAN GUILD
ステークプール運用

Calidusキー生成

概要

  • ステークプールの所有権を証明するための署名技術
  • 既存のCIP-22や少額送金による、プール秘密鍵やvrf秘密鍵を頻繁に使用することなく所有権を証明可能
  • Cardano対応のライトウォレットにも復元可能でWebベースプラットフォームでも利用可能
  • 今後Calidus Pool Keyに対応した多様なサービスがリリース予定

1. cardano-signerインストール

BP

ダウンロード

signer_release="$(curl -s https://api.github.com/repos/gitmachtl/cardano-signer/releases/latest | jq -r '.tag_name' | sed -e "s/^.\{1\}//")"
cd $HOME/git
wget -q https://github.com/gitmachtl/cardano-signer/releases/download/v${signer_release}/cardano-signer-${signer_release}_linux-x64.tar.gz
tar -xzvf cardano-signer-${signer_release}_linux-x64.tar.gz
rm cardano-signer-${signer_release}_linux-x64.tar.gz

インストール

sudo cp cardano-signer /usr/local/bin/cardano-signer

バージョン確認

cardano-signer --version

エアギャップ

ファイル転送

BPの$HOME/gitにあるcardano-signerをエアギャップの$HOME/gitにコピーします。

cardano-signer BP エアギャップ

システムフォルダへコピー

cd $HOME/git
chmod 755 cardano-signer
sudo cp cardano-signer /usr/local/bin/cardano-signer

バージョン確認

cardano-signer --version

2. Calidusキー作成

Calidusキーとjsonファイルの取り扱いについて

  • 通常のウォレットと同じ性質のペアキーとなります。
  • Calidus-MnemonicsKey.jsonにはライトウォレットに復元するためのMnemonics(復元シードフレーズ)が含まれています。
  • 万が一このキーを紛失した場合でも差し替え可能ですが、もしADAを保持している場合は出金が出来なくなりますのでご注意ください。
  • 複数のデバイスにバックアップすることをオススメします。
  • 一つのcalidusペアキーで複数のプールを登録できます。

myCalidusKeyペアキー発行

mkdir -p $NODE_HOME/calidus
cd $NODE_HOME/calidus
cardano-signer keygen --path calidus \
  --out-skey myCalidusKey.skey \
  --out-vkey myCalidusKey.vkey \
  --json-extended \
  --out-file Calidus-MnemonicsKey.json

3. メタデータ作成

プール秘密鍵で署名したメタデータの作成

chmod u+rwx $HOME/cold-keys
cardano-signer sign --cip88 \
  --calidus-public-key $NODE_HOME/calidus/myCalidusKey.vkey \
  --secret-key $HOME/cold-keys/node.skey \
  --json \
  --out-file $NODE_HOME/calidus/myCalidusRegistrationMetadata.json
chmod a-rwx $HOME/cold-keys

4. オンチェーン登録

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

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

Info

ご自身のプールウォレットアドレス宛に10ADAとメタデータを含んだTxを送信します。

amountToSend=10000000
echo "送金額: $amountToSend Lovelace"

送金先のアドレスを設定します。

destinationAddress=$(echo $(cat $NODE_HOME/payment.addr))
echo 送金先: $destinationAddress

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 | sed -e '/lovelace + [0-9]/d' > 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}

tempBalanceAmont=$(( ${total_balance}-${amountToSend} ))

ウォレット残高情報ファイルの作成

cat > $NODE_HOME/wallet_balance.sh << EOF 
#!/bin/bash
total_balance=$total_balance
tx_in="$tx_in"
tempBalanceAmont=$tempBalanceAmont
destinationAddress=$destinationAddress
amountToSend=$amountToSend
currentSlot=$currentSlot
EOF

ファイル転送

BPの$NODE_HOMEにあるwallet_balance.shparams.jsonをエアギャップのcnodeディレクトリにコピーします。

wallet_balance.sh / params.json BP エアギャップ

エアギャップでウォレット残高を読み込みます。

source $NODE_HOME/wallet_balance.sh

トランザクションファイルの作成

cd $NODE_HOME
cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out $(cat payment.addr)+${tempBalanceAmont} \
  --tx-out ${destinationAddress}+${amountToSend} \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --metadata-json-file $NODE_HOME/calidus/myCalidusRegistrationMetadata.json \
  --fee 200000 \
  --out-file tx.tmp

最低手数料を出力します。

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

手数料を計算します。

txOut=$((${total_balance}-${fee}-${amountToSend}))
echo Change Output: ${txOut}

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

cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out $(cat payment.addr)+${txOut} \
  --tx-out ${destinationAddress}+${amountToSend} \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --metadata-json-file $NODE_HOME/calidus/myCalidusRegistrationMetadata.json \
  --fee ${fee} \
  --out-file tx.raw

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

cd $NODE_HOME
cardano-cli latest transaction sign \
  --tx-body-file tx.raw \
  --signing-key-file payment.skey \
  $NODE_NETWORK \
  --out-file tx.signed

tx.signed をBPのcnodeディレクトリにコピーします。

ファイル転送

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

tx.signed エアギャップ BP

署名されたトランザクションを送信します。

ウォレット残高情報ファイルの削除

rm $NODE_HOME/wallet_balance.sh

トランザクションIDの確認

tx_id=$(cardano-cli latest transaction txid --tx-body-file $NODE_HOME/tx.signed)
echo TxID:$tx_id

トランザクション送信

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

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

5. オンチェーン確認

curl -s "https://api.koios.rest/api/v1/pool_calidus_keys?pool_id_bech32=eq.$(cat $NODE_HOME/pool.id-bech32)" | jq .

戻り値に、"pool_status": "registered"の項目があれば登録成功

6. Calidusキー転送

mkdir -p $NODE_HOME/calidus

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

ファイル転送

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

myCalidusKey.skey エアギャップ BP

7. ニーモニックフレーズを使い、Eternlでウォレット作成

エアギャップにて以下のコマンドを実行し、ニーモニックフレーズを紙などにメモします。

jq -r '.mnemonics' $NODE_HOME/calidus/Calidus-MnemonicsKey.json

Eternlウォレットにて復元します。

  1. 現在のウォレット」を選択
  2. ウォレットを追加」を選択
  3. シードフレーズを入力」を選択
  4. 24単語」を選択
  5. 先ほど控えた「ニーモニックフレーズ」を入力
  6. 新規ウォレット名」を入力
  7. 送金パスワード」の設定
  8. 新規ウォレットに少額(10 ADA程度)投入

Last updated on

Cookieの使用について

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

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