🐑

XRPLのPythonライブラリを使ってトークンを発行してみよう

2024/05/23に公開

本記事の目的

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

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

  • トークンの発行
  • トラストラインの作成
  • トークンの送信

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

本記事で説明しないこと

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

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

またXRPLの送金に関しても、本記事では説明しません。
以下の記事で触れているので、こちらも確認してみてください。
https://zenn.dev/komdoroid/articles/cb5e1118ea819e

トークンを発行してみよう

それでは、トークンの発行、トラストラインの作成、トークンの送信までの流れを確認していきましょう!

1. ネットワークに接続する

トランザクションを提出するためには、ネットワークに接続している必要があります。
XRPL Testnetに接続しておきましょう!具体的なコードは以下を参考にしてください。

# ネットワークに接続する ---------------------------------------------------------
import xrpl
testnet_url = "https://s.altnet.rippletest.net:51234"
client = xrpl.clients.JsonRpcClient(testnet_url)

2. アカウントの取得

トークンの受け渡しを行うために、2つのアカウントをTestnet faucetから作成しましょう。
本記事では以下のページを参考にして
トークンを発行するアドレスをコールドアドレス
トークンを保有するアドレスをホットアドレス
と呼び区別します。

参考ページ↓
https://xrpl.org/ja/docs/concepts/accounts/account-types/

# Testnet Faucetからアカウントを取得 --------------------------------------
faucet_url = "https://faucet.altnet.rippletest.net/accounts"
from xrpl.wallet import generate_faucet_wallet
cold_wallet = generate_faucet_wallet(client, debug=True)
hot_wallet = generate_faucet_wallet(client, debug=True)

3. トークン発行者の設定

まず、トークンの発行者であるコールドウォレットの設定を行います。

# コールドウォレットの設定 -----------------------------------------------
cold_settings_tx = xrpl.models.transactions.AccountSet(
    account=cold_wallet.address,
    transfer_rate=0,
    tick_size=5,
    domain=bytes.hex("example.com".encode("ASCII")),
    set_flag=xrpl.models.transactions.AccountSetAsfFlag.ASF_DEFAULT_RIPPLE,
)

4. トークン保有者の設定

次に、トークンの保有者となるホットウォレットの設定を行います。

# ホットウォレットの設定 -----------------------------------------------
hot_settings_tx = xrpl.models.transactions.AccountSet(
    account=hot_wallet.address,
    set_flag=xrpl.models.transactions.AccountSetAsfFlag.ASF_REQUIRE_AUTH,
)

5. トラストラインの作成

トークンの送信を行う前にトラストラインを作成する必要があります

トラストラインとは?

トラストラインとはXRPLにおいて、トークンを保有するための仕組みのことで、これを形成することでトークンの送受信が可能になります。
トラストラインでは一方のアカウントから見ればプラス、もう一方から見ればマイナスとなるような共有の残高を持ち、一つの通貨コードにつき一つのトラストラインを形成します。
このようなトラストラインを作成することで「不要なトークンを他者に保有させない」というXRPLの原則を実現することができます。


トラストラインを作成するためには、ホットアドレスからTrustSet transactionを送信する必要があります。

# トラストラインの作成 -----------------------------------
currency_code = "KOM"
trust_set_tx = xrpl.models.transactions.TrustSet(
    account=hot_wallet.address,
    limit_amount=xrpl.models.amounts.issued_currency_amount.IssuedCurrencyAmount(
        currency=currency_code,
        issuer=cold_wallet.address,
        value="10000000000",
    )
)

6. トークンの送信

これでPayment transactionを送信することで、コールドアドレスからホットアドレスにトークンを送ることが可能になりました。
以下のコードで実現可能です。

# トークンを送信する ---------------------------------------------------------
issue_quantity = "3840"
send_token_tx = xrpl.models.transactions.Payment(
    account=cold_wallet.address,
    destination=hot_wallet.address,
    amount=xrpl.models.amounts.issued_currency_amount.IssuedCurrencyAmount(
        currency=currency_code,
        issuer=cold_wallet.address,
        value=issue_quantity
    )
)

7. 結果の確認

トークンの残高は発行者から見ればマイナス、保有者から見ればプラスとして確認することができます。
保有者の視点から残高を調べる場合はAccountLinesメソッドを使用します。これにより、限度額、残高、設定がそれぞれ確認できます。
発行者の視点から残高を調べる場合はGatewayBalancesメソッドを使用します。これにより、アドレスから発行されたすべてのトークンの合計を確認できます。
以下のコードでは両方のメソッドを使用して結果を確認します。

# 結果の確認 ---------------------------------------------------------------
print("Getting hot address balances")
response = client.request(xrpl.models.requests.AccountLines(
    account=hot_wallet.address,
    ledger_index="validated",
))
print(response)

print("Getting cold address balances")
response = client.request(xrpl.models.requests.GatewayBalances(
    account=cold_wallet.address,
    ledger_index="validated",
    hotwallet=[hot_wallet.address]
))
print(response)

8. すべての処理をまとめる

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

  1. 新しいアカウントの取得
  2. トークンの発行
  3. トラストラインの作成
  4. トークンの送信

処理をまとめたコードは以下になります。

# ネットワークに接続する ---------------------------------------------------------
import xrpl
testnet_url = "https://s.altnet.rippletest.net:51234"
client = xrpl.clients.JsonRpcClient(testnet_url)

# Testnet Faucetからアカウントを取得 --------------------------------------
faucet_url = "https://faucet.altnet.rippletest.net/accounts"
from xrpl.wallet import generate_faucet_wallet
cold_wallet = generate_faucet_wallet(client, debug=True)
hot_wallet = generate_faucet_wallet(client, debug=True)

# コールドウォレットの設定 -----------------------------------------------
cold_settings_tx = xrpl.models.transactions.AccountSet(
    account=cold_wallet.address,
    transfer_rate=0,
    tick_size=5,
    domain=bytes.hex("example.com".encode("ASCII")),
    set_flag=xrpl.models.transactions.AccountSetAsfFlag.ASF_DEFAULT_RIPPLE,
)

# ホットウォレットの設定 -----------------------------------------------
hot_settings_tx = xrpl.models.transactions.AccountSet(
    account=hot_wallet.address,
    set_flag=xrpl.models.transactions.AccountSetAsfFlag.ASF_REQUIRE_AUTH,
)

# トラストラインの作成 -----------------------------------
currency_code = "KOM"
trust_set_tx = xrpl.models.transactions.TrustSet(
    account=hot_wallet.address,
    limit_amount=xrpl.models.amounts.issued_currency_amount.IssuedCurrencyAmount(
        currency=currency_code,
        issuer=cold_wallet.address,
        value="10000000000",
    )
)

# トークンを送信する ---------------------------------------------------------
issue_quantity = "3840"
send_token_tx = xrpl.models.transactions.Payment(
    account=cold_wallet.address,
    destination=hot_wallet.address,
    amount=xrpl.models.amounts.issued_currency_amount.IssuedCurrencyAmount(
        currency=currency_code,
        issuer=cold_wallet.address,
        value=issue_quantity
    )
)

# 結果の確認 ---------------------------------------------------------
print("Getting hot address balances")
response = client.request(xrpl.models.requests.AccountLines(
    account=hot_wallet.address,
    ledger_index="validated",
))
print(response)

print("Getting cold address balances")
response = client.request(xrpl.models.requests.GatewayBalances(
    account=cold_wallet.address,
    ledger_index="validated",
    hotwallet=[hot_wallet.address]
))
print(response)

まとめ

トークンを発行し、送信する手順をまとめました。個人的に出力結果だけでは、少しわかりにくいので処理の内容をXRPLエクスプローラで確認すると直感的に理解しやすかったです。
https://testnet.xrpl.org/

これまでで、通貨や発行されたトークンがどのようにやり取りされているかが、理解できるようになってきました。ですが、まだまだ理解していないことも多いので、次回以降も他のユースケースを紹介できたらと思います。

Discussion