コンテンツにスキップ

Calidus Pool Key設定

概要

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

1.cardano-signerインストール

ブロックプロデューサー

ダウンロード

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にコピーします。

graph LR
    A[BP] -->|cardano-signer| B[エアギャップ];

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

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ペアキーで複数のプールを登録できます
一つのペアキーで複数プールを登録する場合はこちら
  1. 1プール目のエアギャップ領域でmyCalidusKeyペアキー発行する。
  2. 2プール目のエアギャップ領域($NODE_HOME)にcalidusディレクトリを作成する
    mkdir -p $NODE_HOME/calidus
    
  3. 作成したディレクトリにmyCalidusKeyペアキー(myCalidusKey.skey、myCalidusKey.vkey)のみをコピーする
  4. 「3.メタデータ作成」から実行する

myCalidusKeyペアキー発行

mkdir -p $NODE_HOME/calidus
cd $NODE_HOME/calidus
cardano-signer keygen --path payment \
    --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

5.オンチェーン登録

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

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

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

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

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

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

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

cardano-cli conway query utxo \
    --address $(cat payment.addr) \
    $NODE_NETWORK > 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ディレクトリにコピーします。

graph LR
    A[BP] -->|wallet_balance.sh / params.json| B[エアギャップ];

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

source $NODE_HOME/wallet_balance.sh

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

cd $NODE_HOME
cardano-cli conway 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 conway transaction calculate-min-fee \
    --tx-body-file tx.tmp \
    --witness-count 1 \
    --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

手数料計算

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

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

cardano-cli conway 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 conway transaction sign \
    --tx-body-file tx.raw \
    --signing-key-file payment.skey \
    $NODE_NETWORK \
    --out-file tx.signed

tx.signed をブロックプロデューサーノードのcnodeディレクトリにコピーします。

ファイル転送

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

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

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

ウォレット残高情報ファイルを削除する

rm $NODE_HOME/wallet_balance.sh
トランザクションIDを確認する
tx_id=$(cardano-cli conway transaction txid --tx-body-file $NODE_HOME/tx.signed)
echo TxID:$tx_id

トランザクションを送信する

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

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

6.オンチェーン確認

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"の項目があれば登録成功