💻

XRP Ledgerをローカル環境でテストする

2023/09/26に公開

XRP Ledgerとは

XRP Ledgerは、分散型のブロックチェーンの1つであり、ネイティブにトークンの発行やDEX、NFTなどの機能を持っていることが大きな特徴です。
2012年から稼働しており、10年以上に渡り8200万レジャー(ブロック)以上を処理してきた歴史があります。

https://xrpl.org/ja/index.html

XRPLのサーバプログラム

XRP Ledgerのサーバプログラムは、C++で書かれたrippledです。
rippled内にコンセンサスやトランザクション、ネットワークなどの機能が実装されています。

執筆時点での最新バージョンは2023年9月7日にリリースされた1.12.0となっています。

https://github.com/XRPLF/rippled

利用可能なネットワーク

XRP Ledgerには、メインネットワークの他にもいくつかのテストネットワークが存在しています。

https://xrpl.org/ja/public-servers.html

テストネット(testnet)

テストネットは、メインネットと同じ機能を持っていますが、テストネット上のXRPの価値はありません。
メインネットで有効化されていない機能はテストネットでも利用することは出来ません。

次のようなWebsocket URLでアクセス可能です。

  • wss://s.altnet.rippletest.net:51233/
  • wss://testnet.xrpl-labs.com/

開発ネット(devnet)

開発ネットは、開発中の機能を試すためのネットワークです。
正式リリースに含まれていない開発中の機能などを試すことができます。

次のWebsocket URLでアクセス可能です。

  • wss://s.devnet.rippletest.net:51233/

新機能向けの開発ネット

この特殊な開発ネットは大きな新機能などが開発されている場合に用意されることがあります。
例えば、NFTの開発が進んでいた時には、NFT機能の開発ネット、AMMの開発が進んでいた際にはAMM機能の開発ネットが用意されていました。

現在AMM機能は正式リリースに含まれたため、現在存在するAMM機能の開発ネットは近いうちに停止することが予想されます。

他に利用可能な新機能向けの開発ネットはクロスチェーンブリッジ機能XChainBridgeが利用可能なサイドチェーン開発ネットが挙げられます。

ローカルで試す

これらのサーバを利用する上で開発者は事前のセットアップが不要であるため、とても簡単に利用できますが、特定の条件下で動作を確認したかったり、レジャーが確定するまでの3~5秒を待ちたくない場合はローカルで試すことができます。

https://xrpl.org/ja/use-stand-alone-mode.html

Docker Image

XRPL Labsの創設者でありXRP Ledger財団のメンバーでもあるWietse Wind氏が公開しているDocker Imageを利用することで、簡単にローカルで試すことができます。

https://hub.docker.com/r/xrpllabsofficial/xrpld

次のコマンドを使うことでローカル環境での実行できます。

docker run -d \
  --name=rippled \
  -p 80:80 \
  -p 443:443 \
  -p 5005:5005 \
  -p 6006:6006 \
  -p 51235:51235 \
# --platform linux/amd64 \ M1/M2 Macの場合指定
  -e ENV_ARGS="-a --start" \
  --restart=always \
  -v $(pwd)/config:/config \
  xrpllabsofficial/xrpld:latest

Docker Compose

Docker Composeを使う場合は次のようなcompose.ymlファイルで実行できます。

compose.yml
services:
  rippled:
    container_name: rippled
    image: xrpllabsofficial/xrpld:latest
    platform: linux/amd64
    ports:
      - "80:80"
      - "443:443"
      - "5005:5005"
      - "6006:6006"
      - "51235:51235"
    environment:
      - ENV_ARGS=-a --start
    restart: always
    volumes:
      - ./config:/config

試してみる

ローカルサーバにアクセスしてみましょう。

ここではXRPLのJavaScript/TypeScriptライブラリxrpl.jsを使用します。

https://github.com/XRPLF/xrpl.js/tree/main/packages/xrpl

データの取得

ローカルサーバから情報を取得してみましょう。

import { Client, Wallet } from 'xrpl'

const client = new Client('ws://localhost:6006');
const MASTER_WALLET = Wallet.fromSeed('snoPBrXtMeMyMHUVTgbuqAfg1SUTb') // masterpassphrase

const main = async () => {
  await client.connect()
  const result = await client.getXrpBalance(MASTER_WALLET.classicAddress)
  console.log(result)
}

main()

snoPBrXtMeMyMHUVTgbuqAfg1SUTbから生成されるアドレスはジェネシスアドレスであり、ネットワークの稼働時に全てのXRPを保有するアドレスです。

https://xrpl.org/ja/addresses.html#special-addresses

ローカル環境において、このアドレスを直接利用する、もしくは、このアドレスから他のアドレスに資金を移してから利用することになります。

コードを実行すると100000000000(1000億)が表示されると思います。これがXRPLのネイティブトークンであるXRPの総発行量です。

トランザクションの送信

次にトランザクションを送信してみましょう。

import { Client, Wallet, xrpToDrops } from 'xrpl'

const client = new Client('ws://localhost:6006');
const MASTER_WALLET = Wallet.fromSeed('snoPBrXtMeMyMHUVTgbuqAfg1SUTb') // masterpassphrase

const wallet = Wallet.generate()

const main = async () => {
  await client.connect()
  
  await client.submit({
    TransactionType: "Payment",
    Account: MASTER_WALLET.address,
    Destination: wallet.address,
    Amount: xrpToDrops(100)
  }, { wallet: MASTER_WALLET })
  await client.request({ command: 'ledger_accept' })
  
  const result = await client.getXrpBalance(wallet.address)
  console.log(result)
}

main()

ローカル環境で実行する場合に、特徴的なのはledger_acceptコマンドを実行する必要がある点です。
ローカル環境ではサーバ自身が唯一のバリデータとなるため、このコマンドを実行することでレジャーが確定します。

https://xrpl.org/ja/advance-the-ledger-in-stand-alone-mode.html

おわりに

ローカル環境でXRP Ledgerを試す方法について説明しました!特定の条件下でのテストや、レジャーが確定するまでの待ち時間を短縮したい場合にはローカル環境を利用することをおすすめします!

https://x.com/_tequ_

興味を持たれた方はXRP Ledger開発者のDiscordチャンネルへ是非お越しください!
日本語チャンネルもありますので、英語ができなくても大丈夫です!
https://xrpldevs.org

開発者Discordには日本語チャンネルもありますので、英語ができなくても大丈夫です!

Discussion