コンテンツにスキップ

資金引き出し

1 stake.addrからの引き出し

概要

  • 報酬は stake.addr アドレスに蓄積されていきます。
  • 1回のトランザクションで引き出せる金額は残高全額のみです。
    (分割して引き出すことはできません)
  • トランザクション手数料はpayment.addrから引き落とされます。

1-1 payment.addrへ送金する方法こちら

1-2 任意のアドレスへ送金する方法はこちら

注意

入力ミスなどで送金が失敗しても責任は負えません。自己責任のもと実施下さい。
payment.skeystake.skeyは必ずオフライン環境で保管してください。

1-1 payment.addrへ送金する方法

現在のスロットを算出します

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

ステークアドレスの残高を算出します

cd $NODE_HOME
rewardBalance=$(cardano-cli query stake-address-info \
    $NODE_NETWORK \
    --address $(cat stake.addr) | jq -r ".[0].rewardAccountBalance")
echo rewardBalance: $rewardBalance

1 ADA = 1,000,000 lovelace.と覚えましょう

報酬の移動先となるpayment.addrを設定します。payment.addrには取引手数料を支払うための残高が必要です。

destinationAddress=$(cat payment.addr)
echo destinationAddress: $destinationAddress

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

cardano-cli 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}

withdrawalString="$(cat stake.addr)+${rewardBalance}"

build-raw transactionコマンドを実行します。

cardano-cli transaction build-raw \
    ${tx_in} \
    --tx-out $(cat payment.addr)+0 \
    --invalid-hereafter $(( ${currentSlot} + 10000)) \
    --fee 0 \
    --withdrawal ${withdrawalString} \
    --out-file tx.tmp

現在の最低料金を計算します。

fee=$(cardano-cli transaction calculate-min-fee \
    --tx-body-file tx.tmp \
    --tx-in-count ${txcnt} \
    --tx-out-count 1 \
    $NODE_NETWORK \
    --witness-count 2 \
    --byron-witness-count 0 \
    --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

変更出力を計算します。

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

トランザクションをビルドします。

cardano-cli transaction build-raw \
    ${tx_in} \
    --tx-out $(cat payment.addr)+${txOut} \
    --invalid-hereafter $(( ${currentSlot} + 10000)) \
    --fee ${fee} \
    --withdrawal ${withdrawalString} \
    --out-file tx.raw

ファイル転送

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

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

支払いとステークの秘密鍵の両方を使用してトランザクションに署名します。

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

ファイル転送

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

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

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

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

資金が到着したか確認します。

cardano-cli query utxo \
    --address ${destinationAddress} \
    $NODE_NETWORK

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

更新されたラブレースの残高と報酬を表示します。

                           TxHash                                 TxIx        Lovelace
----------------------------------------------------------------------------------------
100322a39d02c2ead....  

1-2 任意のアドレスへ送金する方法

現在のスロットNoを算出します。

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

入金先アドレスを指定します。

destinationAddress=入金先アドレスを指定する
echo destinationAddress: $destinationAddress

報酬アドレス残高を算出します

cd $NODE_HOME
rewardBalance=$(cardano-cli query stake-address-info \
    $NODE_NETWORK \
    --address $(cat stake.addr) | jq -r ".[0].rewardAccountBalance")
echo rewardBalance: $rewardBalance

payment.addr の残高を算出

cardano-cli 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}

withdrawalString="$(cat stake.addr)+${rewardBalance}"
echo ${withdrawalString}

build-raw transactionコマンドを実行します。

cardano-cli transaction build-raw \
    ${tx_in} \
    --tx-out $(cat payment.addr)+0 \
    --tx-out ${destinationAddress}+0 \
    --invalid-hereafter $(( ${currentSlot} + 10000)) \
    --fee 0 \
    --withdrawal ${withdrawalString} \
    --out-file tx.tmp

現在の最低料金を計算します。

fee=$(cardano-cli transaction calculate-min-fee \
    --tx-body-file tx.tmp \
    --tx-in-count ${txcnt} \
    --tx-out-count 2 \
    $NODE_NETWORK \
    --witness-count 2 \
    --byron-witness-count 0 \
    --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

変更出力を計算します。

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

トランザクションをビルドします。

cardano-cli transaction build-raw \
    ${tx_in} \
    --tx-out $(cat payment.addr)+${txOut} \
    --tx-out ${destinationAddress}+${rewardBalance} \
    --invalid-hereafter $(( ${currentSlot} + 10000)) \
    --fee ${fee} \
    --withdrawal ${withdrawalString} \
    --out-file tx.raw

ファイル転送

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

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

支払いとステークの秘密鍵の両方を使用してトランザクションに署名します。

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

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

ファイル転送

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

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

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

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

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

資金が到着したか確認します。

cardano-cli query utxo \
    --address ${destinationAddress} \
    $NODE_NETWORK

更新されたラブレースの残高と報酬を表示します。

                           TxHash                                 TxIx        Lovelace
----------------------------------------------------------------------------------------
100322a39d02c2ead....  

2 Payment.addrからの引き出し

概要

payment.addrから任意のアドレスへ送信する例です

注意

  • 入力ミスなどで送金が失敗しても責任は負えません。自己責任のもと実施下さい。
  • 宣言した誓約(Pledge)分まで引き出してしまうと、プール報酬がゼロになりますのでご注意ください
  • payment.skeystake.skeyは必ずオフライン環境で保管してください。

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

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

lovelace形式で送信する金額を設定します。1 ADA = 1,000,000 lovelace で覚えます。

amountToSend=10000000
echo amountToSend: $amountToSend

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

destinationAddress=送金先アドレス
echo destinationAddress: $destinationAddress

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

cardano-cli 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}

build-rawトランザクションコマンドを実行します。

cardano-cli transaction build-raw \
    ${tx_in} \
    --tx-out $(cat payment.addr)+0 \
    --tx-out ${destinationAddress}+0 \
    --invalid-hereafter $(( ${currentSlot} + 10000)) \
    --fee 0 \
    --out-file tx.tmp

最低手数料を出力します

fee=$(cardano-cli transaction calculate-min-fee \
    --tx-body-file tx.tmp \
    --tx-in-count ${txcnt} \
    --tx-out-count 2 \
    $NODE_NETWORK \
    --witness-count 1 \
    --byron-witness-count 0 \
    --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

計算結果を出力します。

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

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

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

ファイル転送

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

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

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

cd $NODE_HOME
cardano-cli 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];

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

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

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

入金されているか確認します。

cardano-cli query utxo \
    --address ${destinationAddress} \
    $NODE_NETWORK \

先程指定した金額と一致していれば問題ないです。

                           TxHash                                 TxIx        Lovelace
----------------------------------------------------------------------------------------
100322a39d02c2ead....                                              0        10000000