Skip to main content

Calidusキーの登録

Calidusキーの登録

まずはじめにcardano-signerのインストールをします。

cardano-signerインストール

  1. ダウンロード
    BP
release_tag=$(curl -s https://api.github.com/repos/gitmachtl/cardano-signer/releases/latest \
| jq -r '.tag_name | sub("^v"; "")')
echo "Release tag : ${release_tag}"
cd $HOME/git
wget -q https://github.com/gitmachtl/cardano-signer/releases/download/v${release_tag}/cardano-signer-${release_tag}_linux-x64.tar.gz
  1. 解凍
tar -xzvf cardano-signer-${release_tag}_linux-x64.tar.gz
rm cardano-signer-${release_tag}_linux-x64.tar.gz
  1. インストール
sudo cp cardano-signer /usr/local/bin/cardano-signer
  1. バージョン確認
cardano-signer --version

cardano-signer 1.35.0

  1. ファイル移動
    BPの$HOME/gitにあるcardano-signerをエアギャップマシンの$HOME/gitにコピーします。

エアギャップ
6. システムフォルダへコピー

mkdir -p $HOME/git
cd $HOME/git
chmod 755 cardano-signer
sudo cp cardano-signer /usr/local/bin/cardano-signer
  1. バージョン確認
cardano-signer --version

cardano-signer 1.35.0

Calidusキーの生成

エアギャップ

mkdir -p $NODE_HOME/calidus
cd $NODE_HOME/calidus

cardano-signer keygen \
--path calidus \
--out-skey my-calidus.skey \
--out-vkey my-calidus.vkey \
--json-extended \
--out-file calidus-mnemonics-key.json

Coldキーで署名された登録メタデータを生成

エアギャップ

chmod u+rwx $HOME/cold-keys

cardano-signer sign --cip88 \
--calidus-public-key $NODE_HOME/calidus/my-calidus.vkey \
--secret-key $HOME/cold-keys/node.skey \
--json \
--out-file $NODE_HOME/calidus/calidus-registration-metadata.json

chmod a-rwx $HOME/cold-keys

24単語のニーモニックを出力し、メモ帳などにコピーします。

jq -r '.mnemonics' calidus-mnemonics-key.json

オンチェーン登録

BPで$NODE_HOME/calidusディレクトリを生成し、エアギャップのcalidus-registration-metadata.jsonをファイル転送します。

BP

  1. ディレクトリの生成
mkdir -p $NODE_HOME/calidus
  1. 送金額、送金先の設定
amount_to_send=10000000
echo "Amount to send: ${amount_to_send} lovelace"
destination_address=$(cat $NODE_HOME/payment.addr)
echo "Destination: ${destination_address}"
  1. payment.addr のUTxOを取得し、入力(tx_in)の作成

pledge を維持したまま、Calidus登録用の 10 ADA を安全に送れるか確認します。

can_build=true
fee_buffer_lovelace=2000000

# 現在の pledge を取得
pledge_lovelace=$(
cardano-cli latest query pool-state \
--stake-pool-id "$(cat "$NODE_HOME/pool-bech32.id")" \
${NODE_NETWORK} \
| jq -r 'to_entries[0].value.poolParams.pledge // empty'
)

# payment.addr の UTxO を取得
payment_utxo_json=$(
cardano-cli latest query utxo \
--address "$(cat "$NODE_HOME/payment.addr")" \
${NODE_NETWORK} \
--output-json
)

# datum / referenceScript を持たない UTxO の合計残高
total_balance_lovelace=$(
jq -r '
to_entries
| map(
select((.value.referenceScript // null) == null)
| select((.value.datum // null) == null)
| select((.value.inlineDatum // null) == null)
| select((.value.inlineDatumRaw // null) == null)
| select((.value.datumhash // null) == null)
| (
.value.lovelace
// .value.value.lovelace
// 0
)
)
| add // 0
' <<< "${payment_utxo_json}"
)

echo "pledge: ${pledge_lovelace}"
echo "total balance: ${total_balance_lovelace}"
if ! echo "${pledge_lovelace}" | grep -Eq '^[0-9]+$'; then
echo "ERROR: pledge_lovelace を取得できません。pool-bech32.id / NODE_NETWORK を確認してください。"
can_build=false
fi

if ! echo "${total_balance_lovelace}" | grep -Eq '^[0-9]+$'; then
echo "ERROR: total_balance_lovelace を取得できません。UTxO を確認してください。"
can_build=false
fi
if [ "${can_build}" = true ]; then
spendable_lovelace=$(( total_balance_lovelace - pledge_lovelace - fee_buffer_lovelace ))

echo "spendable_lovelace (pledge維持後): ${spendable_lovelace} lovelace"
echo "fee_buffer_lovelace: ${fee_buffer_lovelace} lovelace"

if [ "${spendable_lovelace}" -le 0 ]; then
echo "ERROR: pledge を維持すると送金可能残高がありません。"
can_build=false
elif [ "${amount_to_send}" -gt "${spendable_lovelace}" ]; then
echo "ERROR: pledge を割る可能性があります(送金額が大きすぎます)。"
can_build=false
fi
fi
if [ "${can_build}" = true ]; then
tx_in=$(
echo "${payment_utxo_json}" | jq -r '
to_entries
| map(
select((.value.referenceScript // null) == null)
| select((.value.datum // null) == null)
| select((.value.inlineDatum // null) == null)
| select((.value.inlineDatumRaw // null) == null)
| select((.value.datumhash // null) == null)
)
| sort_by((.value.lovelace // .value.value.lovelace // 0)) | reverse
| if length > 0 then .[0].key else empty end
'
)

if [ -z "${tx_in}" ]; then
echo "ERROR: 使用可能なUTxOが見つかりません(datum / referenceScript なし)。"
can_build=false
else
echo "tx_in: ${tx_in}"
fi
fi
if [ "${can_build}" = true ]; then
tx_in_lovelace=$(
jq -r --arg k "${tx_in}" '
.[$k].value.lovelace
// .[$k].value.value.lovelace
// 0
' <<< "${payment_utxo_json}"
)

echo "tx_in_lovelace: ${tx_in_lovelace}"

required_lovelace=$(( amount_to_send + fee_buffer_lovelace ))
echo "required_lovelace (amount + buffer): ${required_lovelace}"

if [ "${tx_in_lovelace}" -lt "${required_lovelace}" ]; then
echo "ERROR: 選択した tx_in の残高が不足しています(送金額 + 予備費を賄えません)。"
echo " tx_in_lovelace=${tx_in_lovelace}"
echo " required_lovelace=${required_lovelace}"
echo " UTxO を整理(consolidation)するか、複数 tx-in の手順にしてください。"
can_build=false
fi
fi
  1. トランザクションのビルド

手数料・お釣りは自動計算されます。

if [ "${can_build}" = true ]; then
echo "トランザクションをビルドします。"

cardano-cli latest transaction build \
${NODE_NETWORK} \
--tx-in "${tx_in}" \
--tx-out "${destination_address}+${amount_to_send}" \
--change-address "$(cat "$NODE_HOME/payment.addr")" \
--metadata-json-file $NODE_HOME/calidus/calidus-registration-metadata.json \
--witness-override 1 \
--out-file $NODE_HOME/calidus/tx.raw
else
echo "build は実行しません。条件を確認してください。"
fi
  1. ファイル転送

BPの$NODE_HOME/calidusにあるtx.rawをエアギャップの $NODE_HOME/calidusへコピー

  1. エアギャップで署名(tx.signed を作成)

エアギャップ

cd $NODE_HOME

cardano-cli latest transaction sign \
--tx-body-file $NODE_HOME/calidus/tx.raw \
--signing-key-file payment.skey \
${NODE_NETWORK} \
--out-file $NODE_HOME/calidus/tx.signed
  1. ファイル転送

エアギャップの$NODE_HOME/calidus/にあるtx.signedをBPの$NODE_HOME/calidusへコピー

  1. TxID確認と submit

BP

TxID を確認

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

送信

cardano-cli latest transaction submit \
--tx-file $NODE_HOME/calidus/tx.signed \
${NODE_NETWORK}

adastatでアクティブであることを確認します。
https://adastat.net/pools/940d6893606290dc6b7705a8aa56a857793a8ae0a3906d4e2afd2119

ニーモニックフレーズを使い、ウォレットの作成

  1. 現在のウォレットを選択
  2. ウォレットを追加を選択
  3. 「シードフレーズを入力」を選択
  4. 24単語を選択
  5. 先ほど出力したニーモニックを入力
  6. 新しいウォレットに名前を付けます。(CalidusKey-AKYO)
  7. 支出パスワードの設定
  8. 新しいウォレットに資金を投入(10 ADA)