payment.addr から任意アドレスへ送金
備考
payment.addr のUTxOを使用して、任意のアドレスへ通常送金します。
概要
- 送金元:
payment.addr(手数料もここから支払い) - 署名:
payment.skey(エアギャップ環境で実行) - 手数料・おつり:
cardano-cli transaction buildで自動計算 - pledge保護:送金上限(spendable)を事前計算し、pledgeを割らないようにします
注意事項
- 入力値は十分確認してください(自己責任)
payment.skeyは必ずオフライン環境で保管・使用してください--tx-inは1つのみ指定のため、選択UTxOが送金額+手数料より小さいと build は失敗します
任意のアドレス宛に送金する場合
- BP
送金額と送金先アドレスの設定
amount_to_send=
送金額
destination_address=
送金先アドレス
cd $NODE_HOME
can_build=true
例:
amount_to_send=99.5/destination_address=addr1...
入力値の検証と変換
if ! echo "${amount_to_send}" | grep -Eq '^[0-9]+([.][0-9]{1,6})?$' || echo "${amount_to_send}" | grep -Eq '^0([.]0+)?$'; then
echo "WARNING: amount_to_send は正の数値で、小数点以下6桁まで指定してください。"
can_build=false
else
amount_to_send_lovelace=$(echo "scale=0; (${amount_to_send} * 1000000)/1" | bc -l)
if ! echo "${amount_to_send_lovelace}" | grep -Eq '^[0-9]+$' || [ "${amount_to_send_lovelace}" -le 0 ]; then
echo "WARNING: 送金額の計算に失敗しました。"
can_build=false
fi
fi
if [ -z "${destination_address}" ] || ! echo "${destination_address}" | grep -Eq '^(addr1|addr_test1)[0-9a-z]+$'; then
echo "WARNING: destination_address が未設定または形式が不正です(addr1... / addr_test1...)。"
can_build=false
fi
送金額の検証とLovelace変換と送金先アドレスの検証
pledge と送金上限(spendable)の計算
payment.addr のみで運用している場合、送金後も 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_utxo_json=$(
cardano-cli latest query utxo \
--address "$(cat payment.addr)" \
${NODE_NETWORK} \
--output-json
)
total_balance_lovelace=$(
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)
| (.value.value.lovelace // 0)
)
| add // 0
'
)
fee_buffer_lovelace=2000000
if [ -z "${pledge_lovelace}" ] || ! echo "${pledge_lovelace}" | grep -Eq '^[0-9]+$'; then
echo "WARNING: pledge_lovelace を取得できません。pool-bech32.id と NODE_NETWORK を確認してください。"
can_build=false
else
spendable_lovelace=$(( total_balance_lovelace - pledge_lovelace - fee_buffer_lovelace ))
echo "送金上限: $(echo "scale=6; ${spendable_lovelace} / 1000000" | bc -l) ADA"
if [ -z "${amount_to_send_lovelace}" ] || [ -z "${spendable_lovelace}" ] || [ "${spendable_lovelace}" -le 0 ]; then
echo "WARNING: spendable_lovelace の計算に失敗しました。"
can_build=false
elif [ "${amount_to_send_lovelace}" -gt "${spendable_lovelace}" ]; then
echo "WARNING: 送金額が上限を超えています(pledge を割る可能性)。"
can_build=false
fi
fi
UTxO選択とトランザクション構築
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.value.lovelace // 0) | tonumber) | reverse
| if length > 0 then .[0].key else empty end
'
)
if [ -z "${tx_in}" ]; then
echo "WARNING: 使用可能なUTxOが見つかりません。"
can_build=false
else
tx_in_lovelace=$(echo "${payment_utxo_json}" | jq -r --arg k "${tx_in}" '.[$k].value.lovelace // 0')
if [ "${can_build}" = true ] && [ "${tx_in_lovelace}" -le $((amount_to_send_lovelace + fee_buffer_lovelace)) ]; then
echo "WARNING: 選択したUTxOの残高が不足しています。UTxO整理または送金額を下げてください。"
can_build=false
fi
fi
if [ "${can_build}" = true ]; then
cardano-cli latest transaction build \
${NODE_NETWORK} \
--tx-in "${tx_in}" \
--tx-out "${destination_address}+${amount_to_send_lovelace}" \
--change-address "$(cat payment.addr)" \
--witness-override 1 \
--out-file tx.raw
else
echo "INFO: 条件未達のため build を実行しません。上記 WARNING を確認してください。"
fi
ファイル転送
BPのtx.rawをエアギャップのcnodeディレクトリにコピーします。
- エアギャップ
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ディレクトリにコピーします。
- BP
署名されたトランザクションを送信します。
cardano-cli latest transaction submit \
--tx-file tx.signed \
${NODE_NETWORK}
以下のコマンドで送金先アドレスのUTxOを確認できます。
cardano-cli latest query utxo \
--address "${destination_address}" \
${NODE_NETWORK}
送金後、送金先アドレスのUTxOに amount_to_send が反映されていることを確認してください。