🕊️

XRP LedgerのPythonライブラリを使ってXRPを送金してみよう

2024/05/15に公開

本記事の目的

本記事はブロックチェーン自体に初めて触れる方が、手を動かしながら理解することを目的として作成されています。

この記事ではXRP Ledger(以下、XRPL)のPythonライブラリであるxrpl-pyを使用して、以下を実行します。

  • トランザクションの作成
  • トランザクションへの署名
  • トランザクションの送信

まずは触って動かしてみましょう!

本記事で説明しないこと

  • XRPLとはなにか
  • xrpl-pyのインストール方法

この記事は↓の記事の続きとして作成しました。上記についてはこちらの記事で触れているので確認してみてください。
https://zenn.dev/komdoroid/articles/4bcf1b898f74d4

XRPを送金してみよう

1. パッケージのインポート

それでは早速始めていきましょう!
まずは使用するパッケージをインポートします。

from xrpl.wallet import Wallet
from xrpl.constants import CryptoAlgorithm

2. Testnetサーバーへ接続する

ネットワークにトランザクションを送信するには、ネットワークに接続する必要があります。
以下のコードで、Testnetサーバに接続する準備をしましょう。

# Connect ----------------------------------------------------------------------
import xrpl
testnet_url = "https://s.altnet.rippletest.net:51234"
client = xrpl.clients.JsonRpcClient(testnet_url)

3. 新しいアカウントをTestnet faucetから取得する

新しいアカウントをTestnet faucetから作成しましょう。

# Get credentials from the Testnet Faucet -----------------------------------
faucet_url = "https://faucet.altnet.rippletest.net/accounts"
from xrpl.wallet import generate_faucet_wallet
test_wallet = generate_faucet_wallet(client, debug=True)

4. トランザクションの準備をする

送信するトランザクションの準備をします。
XRPLのトランザクションは通常、JSONオブジェクトの形式で作成されます。以下のコードでPaymentのJSONオブジェクトを作成しましょう。

# Prepare transaction ----------------------------------------------------------
my_payment = xrpl.models.transactions.Payment(
	account=test_wallet.address,
	amount=xrpl.utils.xrp_to_drops(22),
	destination="rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe",
)
print("Payment object:", my_payment)

5. トランザクションに署名する

トランザクションを送信する前に、署名を行うことでトランザクションの認証を行います。

# Sign transaction -------------------------------------------------------------
signed_tx = xrpl.transaction.autofill_and_sign(my_payment, client, test_wallet)
max_ledger = signed_tx.last_ledger_sequence
tx_id = signed_tx.get_hash()

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

ここでついに、トランザクションを送信することができます!

# Submit transaction -----------------------------------------------------------
tx_response = xrpl.transaction.submit_and_wait(signed_tx, client)

7. 処理を全てまとめる

ここまでの処理を全てまとめることで、以下を実行することができます。

  1. 新しいアカウントの取得
  2. トランザクションの作成
  3. トランザクションへの署名
  4. トランザクションの送信

コードは以下のようになります。

from xrpl.wallet import Wallet
from xrpl.constants import CryptoAlgorithm

# Connect ----------------------------------------------------------------------
import xrpl
testnet_url = "https://s.altnet.rippletest.net:51234"
client = xrpl.clients.JsonRpcClient(testnet_url)

# Get credentials from the Testnet Faucet -----------------------------------
faucet_url = "https://faucet.altnet.rippletest.net/accounts"
from xrpl.wallet import generate_faucet_wallet
test_wallet = generate_faucet_wallet(client, debug=True)

# Prepare transaction ----------------------------------------------------------
my_payment = xrpl.models.transactions.Payment(
    account=test_wallet.address,
    amount=xrpl.utils.xrp_to_drops(22),
    destination="rERyNC2PGjo7xZPgWdSkXz5j4fancFkVTw",
)

# Sign transaction -------------------------------------------------------------
signed_tx = xrpl.transaction.autofill_and_sign(
        my_payment, client, test_wallet)
max_ledger = signed_tx.last_ledger_sequence

# Submit transaction -----------------------------------------------------------
tx_response = xrpl.transaction.submit_and_wait(signed_tx, client)

# Check transaction results ----------------------------------------------------
import json
print(json.dumps(tx_response.result, indent=4, sort_keys=True))

8. 出力結果を確認する

それでは、上記のコードを実行した結果を確認して、正しく送信できたか見てみましょう!
各項目の内容は異なる箇所がありますが、以下のような結果が出力されます。

Attempting to fund address r47n324GRN1a8V8WD5PJvTw38d6ymHAmZx
Faucet fund successful.
{
    "Account": "r47n324GRN1a8V8WD5PJvTw38d6ymHAmZx",
    "Amount": "22000000",
    "DeliverMax": "22000000",
    "Destination": "rERyNC2PGjo7xZPgWdSkXz5j4fancFkVTw",
    "Fee": "10",
    "Flags": 0,
    "LastLedgerSequence": 669535,
    "Sequence": 669513,
    "SigningPubKey": "ED8ADB10B8D5CCBF51EE33A0D893A1F4B86E1550391EACBA238B673E66CA12FC9B",
    "TransactionType": "Payment",
    "TxnSignature": "ED52FF835133EFEC030FAF45EFCD8D9B131EB03961082E980269A4BC420CAEBCAA59B2F75AA0F8AAD614275B4F189379CC40997329F139C3005A7ACE48C9730B",
    "ctid": "C00A374D00000001",
    "date": 769016212,
    "hash": "44B9CB2EB0DACB343384F436430323B3984F4728331A2ECA4856C8F0B0492F94",
    "inLedger": 669517,
    "ledger_index": 669517,
    "meta": {
        "AffectedNodes": [
            {
                "ModifiedNode": {
                    "FinalFields": {
                        "Account": "rERyNC2PGjo7xZPgWdSkXz5j4fancFkVTw",
                        "Balance": "143999990",
                        "Flags": 0,
                        "OwnerCount": 0,
                        "Sequence": 668417
                    },
                    "LedgerEntryType": "AccountRoot",
                    "LedgerIndex": "0903762722E430F1CC8F7663DD9A117AC9C8CD828D407DDBE895F4057AB069CA",
                    "PreviousFields": {
                        "Balance": "121999990"
                    },
                    "PreviousTxnID": "75C103E045A2C6FCA9ED68E6E6042C20507B286155252A7D6006CC8D45C3EB3E",
                    "PreviousTxnLgrSeq": 668935
                }
            },
            {
                "ModifiedNode": {
                    "FinalFields": {
                        "Account": "r47n324GRN1a8V8WD5PJvTw38d6ymHAmZx",
                        "Balance": "77999990",
                        "Flags": 0,
                        "OwnerCount": 0,
                        "Sequence": 669514
                    },
                    "LedgerEntryType": "AccountRoot",
                    "LedgerIndex": "90DBAA141C93F23726493E58D5B173754FF27C921BED775F6F7DD21D77C4894D",
                    "PreviousFields": {
                        "Balance": "100000000",
                        "Sequence": 669513
                    },
                    "PreviousTxnID": "CB17498D6E49314628E2FEF3A98F9B686625A295DB5D158BB55A0451B2EA9D14",
                    "PreviousTxnLgrSeq": 669513
                }
            }
        ],
        "TransactionIndex": 0,
        "TransactionResult": "tesSUCCESS",
        "delivered_amount": "22000000"
    },
    "validated": true
}

いかがでしたか?
私はブロックチェーンに漠然と難しい印象を抱いていましたが、やってみるとXRPL上でXRPを送金するのは意外と簡単で驚きました!
XRPLには送金以外にも様々なトランザクションタイプが用意されているので、次回以降はそれらを試してみたいと思います。

(付録)XRPLエクスプローラー

XRPLには、送信したトランザクションが正しく反映されているか、情報をGUIで確認できるXRPLエクスプローラというものが存在します。
https://testnet.xrpl.org/
今回のような送金のトランザクションも確認することができます。上記のページにアクセスし、アドレスやハッシュでトランザクションを検索してみましょう。

(例)ハッシュによる検索

Discussion