2021.07.08

StellarブロックチェーンとStellar上のトークンの発行について

はじめに

こんにちは、次世代システム研究室のB.M.Kです。

Stellarブロックチェーンについて聞いたことがありますでしょうか?

日本でStellarブロックチェーンの知名度があまり高くないかもしれませんが個人間の送金や国際送金における問題を解決することを目的として開発されたブロックチェーンネットワークです。スマートコントラクトの開発及びトークン発行のシンプルさ、そして取引実施のハイスピードとローコストはStellarの魅力です。今回はStellarブロックチェーンの特徴、Stellarトークンの発行及びStellarの主な応用を紹介したいと思います。


Stellarブロックチェーンの概要

Stellarブロックチェーンを理解するために、まず、ノード、ネットワーク、そして台帳、コンセンサスアルゴリズム等の基本コンポーネントから見てみましょう。

Stellarノードとネットワークの構成

Stellarネットワークは複数のコンピューター(Stellarノード)のP2Pネットワークで構成されています。Stellarノードのハードウェアはハイスペックが必要となく、普通のスペックでStellarノードとしてネットワークに参加できます。ノードのソフトウェアは非営利団体ステラ開発財団が開発したStellar Coreというオープンソースのインストールが必要となります。

Stellarノードの種類はウォッチャーノードとバリデーターノードという2種類があります。ウォッチャーノードはネットワークの監視、トランザクションの発信、Stellar台帳の最新バージョンの保管等の役割を持っています。バリデーターノードはビットコインブロックチェーン又はイーサリアムブロックチェーン上のマイナーの役割に近く、トランザクションを検証したり、コンセンサスプロセスに参加してStellar台帳に取引情報を記録したりする役割を持っています。Stellar Coreをインストールしたら、コンピューターはデフォルトとしてウォッチャーノードになり、Stellar Coreで設定を行うとバリデーターノードに変更することができます。


図1: Stellarノード&ネットワーク

Stellarははイーサリアムと同様、Stellarメインネットとテスト用のテストネットを提供します。メインネットで現在のStellarノードの数、ノードの状況は以下のURL (https://stellarbeat.io/ )を経由して確認することができます。


図2:メインネット上のStellarノード(出典:https://stellarbeat.io/)

Stellar台帳

Stellar台帳はStellarブロックチェーンネットワークの特定の時点の状態を表します。全てのアカウントと残高の情報、Stellar分散型取引所での全ての注文情報が記録され、ネットワークを構成する全てノードに共有されます。各ノードは台帳のフルコピーを保存します。台帳に更新するタイミングになった時、更新する前の台帳の直前状態の要約(ハッシュ化によって得られたルートハッシュ値)とその時に記録される予定のトランザクションデータセットと合わせて新しい台帳のバージョンが構成されます。

各台帳のバージョンは以前の台帳のバージョンのハッシュ値を持つことでジェネシス(台帳の最初のバージョン)に遡ることができます。台帳の各バージョンを識別するために台帳連番を使います。台帳連番は再帰的に定義され、ジェネシス台帳の連番は1になります。新しい台帳のバージョンが生成される度に連番は1ずつ増えます。


図3:Stellar台帳の構成

Stellarコンセンサスプロトコル(SCP)

銀行等の中央集権型金融機関と違って、Stellarネットワーク内の全てのバリデーターは数秒から数分ごとに各台帳のバージョンに合意し、ネットワークの状態を反映する必要があります。合意に達するこのプロセスは、コンセンサスと呼ばれます。

ブロックチェーンの代表的なコンセンサスアルゴリズムは PoW(Prove of Work)、PoS(Prove of Stake)、 PBFT(Practical Byzantine Fault Tolerance)等があります。StellarはもともとRippleのPBFTプロトコルを使用していました。しかし、 2015年からPBFTの分散型代替案であるStellar Consensus Protocol(Federated Byzantine Agreement : FBA)と呼ばれるコンセンサスアルゴリズムを導入しました。

FBAには、 FBFTのような中央の機関によって選択された単一のマスターバリデーターリストはありません。むしろ、各バリデーターは、信頼する他のバリデーターを決定し、信頼できるクォーラムスライスと呼ばれるバリデーターのリストを構成します。各バリデーターのクォーラムスライスは重なり合って、クォーラムというネットワーク全体のコンセンサスを形成します。バリデーターリストを決定するために1つの中央機関を依存せず、どんなバリデーターでも自分で作成できます。参加しているバリデーターから彼らのクォーラムスライスに追加して頂いた場合、誰でも新しいバリデーターになりコンセンサスプロセスに参加できます。そのため、ネットワークの分散性を高まります。Stellarネットワークは、ビットコイン、イーサリアム程分散化されていないことに注意することが重要です。しかし、その構造は、ネットワークに追加されるノードが増えれば、新しいクォーラムスライスが形成されるに連れて、本質的に分散化の拡大を可能にします。


図4:Stellarコンセンサスプロトコル – クォーラムスライス(出典:インターネット)

Stellarの特徴

Stellarの特徴は、以下の通り、いくつかの特徴があげられます。
  • スマートコントラクトの簡易作成及び簡易修正、更新
  • トラストライン(Trust Line)の概念を導入
  • アセット(トークン)の簡易作成、発行
  • アカウントレベルのコントロール

スマートコントラクトの簡易作成及び簡易修正、更新

まず、Stellarのスマートコントラクトは簡易に作成することができます。イーサリアムスマートコントラクトを作成するための特殊なプログラミング言語(Solidity)が必要となりますがStellarの場合は特殊なプログラミング言語が不要となり、普及しているプログラミング言語(Javascript, Python, Go 等..) を利用して作成することができます。使った言語に応じる実行環境があれば、作成したスマートコントラクトを簡単に実行できます。Stellarスマートコントラクトはブロックチェーンにデプロイされないのでスマートコントラクトのバグ修正、更新等が簡単に行うことができます。StellarスマートコントラクトはStellarが提供しているStellar SDKとRestful APIサーバー(Horizon)を経由してStellarブロックチェーンネットワークとのやり取りを行うことができます。


図5:Stellarスマートコントラクトとネットワークとのやり取り

Stellar SDKはアカウントの作成、アセットの作成、トランザクションの開始、ブロックチェーンネットワークへの問い合わせ等のアプリケーション側の殆どのオペレーションをサポートします。

トラストライン(TrustLine)の概念を導入

ブロックチェーンネットワークの課題の中、知らないアカウントへ仮想通貨、トークンの誤送信、発行アカウントが気つかない内に怪しげなアカウントへトークンの送付等が挙げられます。Stellarブロックチェーンは上記の課題を防ぐために、トラストラインの仕組みを導入しました。トラストラインは直訳すると信頼線になり、トークンを送受信するために、送受信アカウントの間に信頼線を先に設定する必要となります。


図6:トラストライン及び解決する課題

トラストライン設定のリクエストは受信アカウントの方から行い、リクエストの承認は送信アカウントの方が行います。受信アカウントはトランザクションを開いて「ChangeTrust」のオペレーションを利用してトラストラインの設定を行います。

アセットの簡易作成、発行

アセットを発行する機能は、Stellarのコア機能の一つです。どのアセット(資産)もトークン化でき、トークン化すると、Stellarネットワークを介して迅速かつ安価に転送または取引できます。 どのアカウントでもStellarネットワークでアセットを発行でき、誰でもStellarアカウントを設定できるため、銀行、あらゆる種類のマネーサービス提供業者、営利企業、非営利団体、地域コミュニティ、さらには個人など、誰でもアセットを発行できます。これはセルフサービスのプロセスであり、許可は必要ありません。

アカウントレベルのコントロール

Stellar上アセットを発行するとデフォルトで誰でもそのアセットを保持できます。 ただし、規制に準拠するために(またはその他の理由で)アセットへのアクセスを制御する必要がある場合は、発行アカウントでのフラグを有効にすることで簡単に制御できます。フラグは、set_optionsオペレーションを使用してアカウントレベルで有効・無効にすることができます。 これらは、アセットを発行する時だけでなく、アセットのライフサイクルのいつでも設定して制御できます。Stellarは発行アカウントに対して以下の四つの制御フラグを提供します。

 Authorization Required : このフラグが有効になっている場合、トークンを受け取る前に受け取るアカウントは発行アカウントから受け取る可能の承認が必要となります。

Authorization revocable : このフラグが有効になっている場合、発行アカウントは既存のトラストラインの承認を取り消すことができ、それによってアカウントが保持しているアセットを凍結することができます。凍結状態になると、アカウントは既存のアセットを引き続き保持することができますが、アセットの転送または取引ができなくなります。

Authorization immutable : この設定では、発行アカウントが他のフラグ(Authorization Required、Authorization revocable等)を設定することはできなくなり、発行アカウントはアセットの制御ができなくなることになります。このフラグを設定することで、発行したアセットはもう制御なしの状態でStellar台帳上に保持されるため、潜在的なトークン所有者にこの点をアピールすることができます。

Clawback enabledこのフラグを有効になっている場合、アセット発行者は、世界に発行して流行していたアセットに対してより厳密に制御できるようになります。 具体的には、トラストラインを設定したアカウントからアセットをバーニングする力を与え、受取人のアカウントから効果的にアセットを取り戻したり、削除したりすることができます。

Stellar上のトークン発行について

トークンは「しるし」「証拠品」という意味を持ち、価値の表現、代替手段の一つです。トークンの発行と言えば、イーサリアムブロックチェーン上のトークン発行は人気がありますがStellar上のトークンの発行はも簡単に行うことができます。Stellar上トークンを発行する時に以下の主なステップで発行できます。
  • 発行アカウントと配布かカウントの作成
  • トークンの情報の定義(トークン名、発行量)
  • 発行アカウントと配布アカウント間のトラストラインの設定
  • 発行アカウントは配布アカウントに一定量でトークンを発行する

発行アカウントと配布アカウントの作成

Stellarでアカウントの作成はSDKを利用して簡単に作成することができます。まず、どのネットワークにアカウントを作成するかSDKを経由して指定します。そして、SDKを利用してアカウントのキーペアを生成します。アカウントを有効にするため、残高の条件は一つ以上のStellarのネイティブ仮想通貨(ルーメン)になるため、テストの場合、Stellarが提供しているFrendbotアカウントから無料の10000ルーメンを受けます。
const StellarSdk = require("stellar-sdk"); // Stellar SDKを利用
const server = new StellarSdk.Server("https://horizon-testnet.stellar.org");
const pair = StellarSdk.Keypair.random() // キーペアを生成
const response = await fetch(
     `https://friendbot.stellar.org?addr=${encodeURIComponent(
       pair.publicKey()
     )}`
   ); // アカウントを有効するために、friendbotから無料のXML(ルーメン)を頂く

トークンの情報の定義

トークン名、発行量、発行ネットワークを指定して、SDKの経由でトークンを定義します。
const config = {
 issuePublicKey: "GCFJFJ6WK6G4MY52ZCTZMXLWRXXCEM4T7UGKLX4LROJSIMOSY3AA4CU4",
 ... 
 tokenName: “ZUSD”, // トークン名の定義
 limitAmount: “1000000”,  //発行する上限量を指定
 issueAmount: "3000",
 sendAmount: "30",
};
// Stellar SDKを利用
const StellarSdk = require("stellar-sdk"); 
// トークン を作成したいネットワークを指定
exports.server = new StellarSdk.Server("https://horizon-testnet.stellar.org");
// トークンを作成
exports.asset = new StellarSdk.Asset(config.tokenName, config.issuePublicKey);

発行アカウントと配布アカウント間のトラストラインの設定

配布アカウントはSDKの経由でトランザクションを開いて、ChangeTrustのオペレーションを利用して、トークン種類、受け取る上限量を指定した上、発行アカウントとのトラストラインを設定します。
// トランザクションの作成、changeTrustオペレーションを利用
const changeTrustTx = new StellarSdk.TransactionBuilder(distributionAccount, {
   fee: fee,  // server.fetchBaseFee(),
   networkPassphrase: StellarSdk.Networks.TESTNET,
 })
   .addOperation(
     StellarSdk.Operation.changeTrust({
       asset,
       limit: config.limitAmount,
     })
   )
   .setTimeout(100)
   .build();
 console.log(
   chalk.green("sign the transaction with distribustion secret key")
 );
 changeTrustTx.sign(distributionKeyPair); // 配布アカウントでサインを行う
 console.log(chalk.green("submit the transaction to the network"));
 const changeTrustResult = await server.submitTransaction(changeTrustTx);

発行アカウントは配布アカウントに一定量でトークンを発行する

発行先、アセット種類、発行量を指定した上、トランザクションのPaymentオペレーションで発行アカウントが配布アカウントへトークンを発行します。
// トランザクションの作成、 paymentオペレーションを利用
const issueTokenTx = new StellarSdk.TransactionBuilder(issueAccount, {
   fee: fee,
   networkPassphrase: StellarSdk.Networks.TESTNET,
 })
   .addOperation(
     StellarSdk.Operation.payment({
       destination: config.distributionPublicKey,
       asset,
       amount: config.issueAmount,
       source: config.issuePublicKey,
     })
   )
   .setTimeout(100)
   .build();
 issueTokenTx.sign(issueKeyPair); //発行アカウントでサイン
 const issueTokenResult = await server.submitTransaction(issueTokenTx);

トークンの制御

Stellarはトークンの制御に対してアカウントレベルでサポートするため、実際の運用の中で発生する可能性がある事象と状況は々色ありますが以下の典型的なケースが挙げられます。

トークンの凍結

Stellar上特定アカウントのトークンの凍結又は凍結解除を行いたい場合、以下のステップで行うことができます。

まず、発行アカウントはトランザクションを開いてSetOptsのオペレーションで発行アカウントのレボカブル(Revocable)フラグを有効にします。そして別のトランザクションでSetTrustLineFlagsオペレーションを用いてSetFlagsのところにAuthorized to maintain liabilites を指定します。この設定でアセットへのアクセスは制限なし状態からアセット保持のみ状態に変更され、要するにトークンの送受信ができなくなり、凍結状態になります。

凍結解除

凍結解除は凍結処理と同様で前提は発行アカウントのレボカブル(Revocable)フラグを有効になっている状態が必要です。発行アカウントはトランザクションを開いてSetTrustLineFlagsオペレーションを用いてSetFlagsのところでAuthorizedを指定し、ClearFlagsのところにAuthorized to maintain liabilitesを指定します。

トークンの取り戻し、クローバック

トークンの取り戻し、クローバック等を実施できるために、トークンを発行する前にクローバック実施可能なトークを設定しておく必要となります。まず、発行アカウントでClawback enabledフラグを事前に有効にします。トランザクションのSetOptsオペレーションを用いてSetFlagsのところにClawback enabledフラグを有効にすることができます。そして、発行アカウントと受け取りアカウント間のトラストラインの設定を行って、トークン発行を行います。この流れで発行したトークンはクローバック実施可能なトークンになります。

次にクローバックを実施したい時、発行アカウントでトランザクションの「Clawback」オペレーションを利用してクローバックされるアカウントアドレス、トークン種類と取り戻し量を設定して実行すれば、強制的にクローバックが実施されます。

トークンバーニング

Stellarブロックチェーン上トークンバーニングには二つの方法があります。

自分でトークンをバーニングする場合:バーニングするトークン数はアカウントのトークンの残高を超えない条件で発行アカウントにトークンを送付すれば、バーニングとして取り扱われます。このアクションは実際にトランザクションのPaymentオペレーションを用いてバーニングを実施します。

バーニングされた場合:規制に準拠することによってバーニングされる対象があった場合、発行アカウントはバーニングするアカウントに対して上記述べたクローバックのプロセスを実施すれば、強制的にトークンバーニングを行うことができます。

Stellarの主な応用

ステーブルコインの発行

ステーブルコインは法定通貨、代表的な仮想通貨(ビットコイン、イーサ等)に連動した仮想通貨の一種です。ビットコイン等の通常仮想通貨はボラテリティにより決済手段としての機能を果たすことが難しいという背景の下で法定通貨との交換比率を固定化され、価格の安定化されるステーブルコインは生まれたきっかけになっております。Stellar上発行されるステープルコインはStellarトークンの一種であり、簡易作成、メンテナンス、更新等のStellarトークンの特徴を継承しています。そして、アカウント、アセットの凍結、凍結解除、発行したコインの取り戻し、クローバック等の実際運用中に発生する可能性のある事象に対して Stellarがアカウントレベルのコントロールをサポートすることでステーブルコインの運営がより便利と簡易になります。

海外送金

従来の海外送金の課題

マネーグラムのような送金オペレーター(Money Tranfer Operators : MTOs)を使用した従来の海外送金では、支払いの確認に数日かかる場合があり、現金での支払いは地元の代理店、金融機関に依存します。また従来の金融システムを使用し、中間金融機関を通じて価値を移動することには非常に多くのステップが含まれるため、コストは高くなります。


図7:従来の金融システムを利用する海外送金の流れ

Stellarを利用すると中間金融機関を排除することができ、及び送金はリアルタイムに実施されることで送金時間とコストを大幅に削減することができます。さらにStellarでは、ユーザーがある通貨を送信し、受信者に別の通貨を受信することもできます。Stellarの強みは1回のトランザクションで送金と交換の作業を行うことができます。

Stellar上国際送金の流れ

Stellar上の国際送金は通常以下のステップで行われます。

・送金者は自国の法定通貨でアンカーに資金を提供します。(アンカーは、マネーサービスビジネスに関する認可および規制されている金融機関、又はフィンテック企業であり、認可を受けた国の銀行システムに法定通貨のオン/オフランプを提供しする組織です。)

・アンカーはその資金を受け取り、法定通貨型トークン(フィアットトークン)を送金者のアカウントに発行します。

送金者は受金者の名前、受金者が受け取りたい通貨、送金額を指定します。これらの情報が指定されたら、送信フィアットトークンと受信フィアットトークンの間の為替レートを決めるために Stellarは Stellar Decentralized Exchange(DEX)上に最適なレートを探し、送金者に提供します。送金者はトランザクションを確認して実行すると、送信フィアットトークンが送信者のアカウントから離れます。

・Stellarはフィアットトークン間の交換を自動的に行い、受金者が受け取りたい通貨のフィアットトークンを交換し、送付します。

受金者は法定紙幣を引き出したい場合、受け取ったフィアットトークンをアンカーに送り、アンカーから法定紙幣を受けます。

 


図8:Stellar上国際送金の流れ

おまとめ

今回はStellarブロックチェーンとStellarトークンについての紹介しました。Stellarトークンの発行は簡易でメンテナンス及び更新等も簡単に実施することができます。Stellarブロックチェーンのバックボーンを構成するStellarノードは現在の数が少ないが、ノードが増えていけば、ネットワークの分散性とセキュリティが向上されます。Stellarブロックチェーンの知名度、そして分散型アプリ(Dapps)の開発のプラットフォームとしての面ではイーサリアムと比較できる程度がまだなっていないがあらゆる法定通貨の代替手段、そして海外送金、決済のアプリの開発の目的ならばStellarは最適な選択の一つだと思います。

最後に

次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。アプリケーション開発の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。

皆さんのご応募をお待ちしています。

 

Pocket

関連記事