イーサリアムのブロックチェーンで循環取引を行っているのは誰ですか？TuGraph+Kafkaのゼロコストのストリームグラフ解決策

GeaFlow（ブランド名TuGraph-Analytics）が正式にオープンソース化されました。皆さん、ぜひフォローしてください！ 

GitHubで私たちにスターを与えることを忘れないでください👉[https://github.com/TuGraph-family/tugraph-analytics](https://github.com/TuGraph-family/tugraph-analytics)

よりエキサイティングなコンテンツについては、ブログをフォローしてください [https://geaflow.github.io/](https://geaflow.github.io/)

----

Tips：この記事はChatGPT 3.5によって中国語から日本語に翻訳されました。不正確な点がある場合はお詫び申し上げます。


co-author: ChatGPT 3.5

## イントロダクション

データは新しい時代の生産資源と言われています。

しかし、ビッグデータや人工知能などの技術の発展により、データの価値がますます注目されているにも関わらず、個人の力だけではこのような大規模なデータを取得や分析することはできません。

富を得るためには道を築かなければなりません。新しい時代のデータを利用して富を築くためにも、手に入れやすいツールが必要です。適切なツールがなければ、大規模なデータの収集、クレンジング、ストレージ、処理、可視化などの各段階を達成することはできません。このようなツールを持つことによって、データをより効果的に活用し、経済社会の発展を推進し、人類により多くの価値を創出することができます。

![kafka_tugraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521915/e32b8360-c4c3-1c2e-b90b-cb741ceab6db.png)


現在、無料の、アリババグループのグラフ計算チームによってオープンソース化された超大規模ストリームグラフ処理システムであるTuGraphは、グラフ計算領域に特化したオープンソースデータ処理ツールとして注目されています。我々は、TuGraphのパワフルな機能を体験するために、シンプルな問題から始めましょう。

## "循環取引を行っているのは誰ですか？"

"イーサリアムのブロックチェーン上で循環取引を行っているのは誰ですか？"
この問いにどう答えますか？

ビッグデータのエキスパートであれば、すぐに手を挙げるかもしれません。Kafkaを使って、Flinkを使って、それでも無理ならSparkを使う... これらのシステムは、大規模なデータの処理では通常非常に時間がかかり、開発効率が低く、ユーザーの要求に迅速に対応することができません。

それぞれに得意なこと、それぞれに欠点があります。したがって、私たちは新しいデータ分析ツールを探し求め、ビッグデータ領域での作業効率を向上させ、ますます複雑で多様化するデータ処理の課題に対応する必要があります。

新しいツール？では、GPTを試してみましょう。

Q: イーサリアムのブロックチェーン上で循環取引を行っているのは誰ですか？
GPT: この問題にはデータ分析が必要であり、大量のイーサリアムの取引データが関与します。イーサリアムのブロックチェーン上で循環取引を行っている人を特定するには、以下の手順を実行できます：

イーサリアムのトランザクションデータを取得し、トランザクションハッシュ、送信元アドレス、受信元アドレス、トランザクションタイプ、トランザクション金額などの情報を含めます。
トランザクションデータをクリーニングおよび処理し、無効なデータや重複データなどを除去します。
グラフ計算などの技術を使用して、イーサリアムのトランザクションネットワークを構築し、トランザクション内の循環取引を特定します。
循環取引の送信元アドレスと受信元アドレスをさらに分析して、イーサリアムのブロックチェーン上で循環取引を行っている人を特定します。
なお、イーサリアムのブロックチェーンは分散化特性を持っているため、トランザクションデータの取得と分析には一定の困難や課題が存在するかもしれません。

姿勢が間違っています。もう一度挑戦しましょう。

Q: イーサリアムのブロックチェーン上で循環取引を行っているのは誰ですか？一文で答えてください。
GPT: 一文で答えることはできません。データ分析が必要です。

明らかなように、GPTなどの人工知能は自然言語処理や画像認識などの分野で大きな進歩を遂げていますが、データ洞察においてはまだ課題が存在します。なぜなら、データ洞察は具体的なビジネスの背景やドメイン知識と結びついていることが多く、これらの人間の経験や知恵は機械に完全に模倣や代替することが難しいからです。また、データのクリーニング、前処理、特徴抽出、モデリングなどの重要なステップでは、人間の専門家の介入や最適化が依然として必要です。

今日、私たちはオープンソースのTuGraphとストリームメッセージングシステムKafkaを使用して、イーサリアムのブロックチェーン上で循環取引を行っている人を正確に特定するだけでなく、金融レベルのリアルタイムソリューションも構築することができます。お客様、ぜひご覧ください----

## 循環取引とは何ですか？

具体例を見てみましょう。

![kafka_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521915/d3f72c55-e752-df6d-df4f-4eee3ad8e53a.png)


グラフには7つの異なる色のポイントがあり、各ポイントはイーサリアム上のウォレットアドレスに対応しています。アカウント間の送金プロセスは、方向を持つエッジで表され、このグラフには8つの取引があり、取引ネットワークを構成しています。
![kafka_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521915/7bd46983-2433-cd3d-edaf-e9702e843702.png)


取引の先頭と末尾をつなげると、出発点に戻る循環を見つけることができれば、それは循環取引と見なすことができます。

循環取引は通常、価格の差を利用して利益を得るために、複数の取引ステップを経て行われる取引方法を指します。このプロセスでは、異なる市場や異なる時間帯での買いと売りを行い、利益を得ます。取引ネットワークグラフでは、ループ検出アルゴリズムを使用して潜在的な循環取引経路を見つけ、この経路上のアカウントを取得することで、どのアカウントが循環取引に参加している可能性があるかを知ることができます。

しかし、新しい取引が発生すると-

![kafka_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521915/28315097-3b41-e9b1-b478-588be8dfd1c6.png)


わかるように、ループ検出は一度行えば終わりではない静的なグラフアルゴリズムではありません。リアルタイムにメッセージが届くたびに、取引ネットワークグラフ内の最新のループが変化し続けます。各取引が生成する取引ループに関心がある場合、非常に複雑な問題が発生します。

イーサリアムはブロックチェーン技術に基づくスマートコントラクトプラットフォームであり、取引速度は多くの参加者に依存しています。取引の成立速度は通常15秒から1分の間であり、取引のスループットは秒間数十から数百の取引に達することができます。しかし、イーサリアムには膨大な過去の取引データが存在し、かなり複雑な「基盤」となるものがあります。循環取引の問題では、新しい取引だけでなく、過去のすべての取引を総合的に分析する必要があります！

これが、GPTのような強力なモデルでもこの問題に一言で答えられない理由です。

## TuGraph

では、取引が行われるたびに循環取引をリアルタイムに検出することは本当に可能ですか？

実際には、専門のグラフ計算システムTuGraphを使用すると、この問題は数十行のコードで解決することができ、Kafkaとの組み合わせで取引ウォッチリストの構築、取引ネットワークの生成、リアルタイムでの循環取引の検出、下流へのメッセージ送信など、完全な金融レベルのリアルタイムソリューションを迅速に構築することができます。さらに、これらすべてが無料で利用できます〜 オープンソースに感謝します！

TuGraphでグラフ計算ジョブを作成すると、約40行のコードでエンドツーエンドのフローを完了することができます。

![kafka_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521915/e551af09-56cb-f446-ebb1-26dd9fe4a1e4.png)


以下はコードの説明です。自分で取得してください。

わずか40行のコードで、名前を「ethereum_transaction_network」とするイーサリアム取引の完全なグラフを作成しました。Kafkaからのリアルタイムな取引ストリーム「table_new_trade」を継続的に「ethereum_transaction_network」というグラフに追加します。

次に、新しい取引が到着するたびに、3ホップの循環取引パターンのチェックがトリガーされ、更新された結果がKafka上の外部テーブル「tbl_circular_trade」に保存されます。これにより、結果を容易に下流コンポーネントに配布できます。

リアルタイムな取引データには、XBlock-ETH: Extracting and exploring blockchain data from Ethereumという論文で整理された実際のイーサリアムのブロックデータを使用しています。このデモでは、イーサリアムのアドレスを隠し、数字で置き換えています。つまり、各数字はイーサリアムのウォレットアドレスを表し、同じ数字は同じアドレスを表します。生成された循環パスの結果は、文字列として結合され、観察が容易です。


```sql
set geaflow.dsl.window.size = 200;
-- イーサリアム取引のグラフ
CREATE GRAPH IF NOT EXISTS ethereum_transaction_network (
	Vertex address (id bigint ID),
	Edge trade (srcId bigint SOURCE ID, targetId bigint DESTINATION ID, mount double)
) WITH (
	storeType='rocksdb'
);

-- 最新の取引をKafkaでリッスンする
CREATE TABLE IF NOT EXISTS table_new_trade (
  srcId bigint, targetId bigint, mount double
) WITH (
	type='kafka',
  geaflow.dsl.kafka.servers = '{your.kafka.server.ip}:9092',
	geaflow.dsl.kafka.topic = 'tbl-trade'
);

-- 新しい取引をグラフに追加する
INSERT INTO ethereum_transaction_network.address SELECT srcId FROM table_new_trade;
INSERT INTO ethereum_transaction_network.address SELECT targetId FROM table_new_trade;
INSERT INTO ethereum_transaction_network.trade SELECT srcId, targetId, mount FROM table_new_trade;

-- 外部テーブルを作成し、検出された循環取引結果をKafkaに出力する
CREATE TABLE IF NOT EXISTS tbl_circular_trade (
	  circular VARCHAR
) WITH (
	type='kafka',
  geaflow.dsl.kafka.servers = '{your.kafka.server.ip}:9092',
	geaflow.dsl.kafka.topic = 'tbl-circular-trade'
);

-- イーサリアム取引グラフを使用してリアルタイムクエリを実行する
USE GRAPH ethereum_transaction_network;

-- 3ホップの循環取引パターンを検索し、結果をKafkaの外部テーブルに保存する
INSERT INTO tbl_circular_trade
MATCH (v1)-[:trade]->(v2)-[:trade]->(v3)-[:trade]->(v4)
WHERE v1.id = v4.id AND v1.id != v2.id AND v1.id != v3.id AND v2.id != v3.id
RETURN concat(CAST(v1.id as VARCHAR), '->', CAST(v2.id as VARCHAR),
       '->', CAST(v3.id as VARCHAR), '->', CAST(v4.id as VARCHAR)) AS circular
;
```

## 実機デモ！

Kafkaのプロデューサを開き、メッセージストリームを生成し、取引をKafkaに継続的に送信します。左側のターミナルウィンドウに表示されます。平均1秒程度で、最新の循環取引検出結果が右側のKafkaコンシューマウィンドウに表示されます。

![kafka_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521915/c436676f-ec0d-efdc-f6b5-ca81a977a651.png)


新しい取引ログが追加されると、右側のKafkaコンシューマウィンドウもリアルタイムに新しい循環取引検出結果が更新され、非常に素早い応答が得られます。

![kafka_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521915/208babb4-a4c4-2196-5449-1f9e040aaa2d.png)


以上は、オープンソースのグラフ計算プラットフォームTuGraphとKafkaを組み合わせて、イーサリアムの循環取引検出ソリューションを迅速に構築する方法です。これは小さなデモですが、実際のデモで強力なグラフ計算の文法とシステムのパフォーマンスを見ることができます。これにより、一般の人々がグラフ計算アプリを構築する難しさとコストが大幅に低減されます。

言葉よりも行動です。TuGraphは見逃せないツールです。[https://github.com/TuGraph-family/tugraph-analytics](https://github.com/TuGraph-family/tugraph-analytics)にアクセスして、TuGraphの魅力を自分自身で体験してください！また、私たちはオープンソースへの貢献を歓迎し、コミュニティの発展に自身の知識とコードを貢献することをお待ちしています。

## 参考文献
P. Zheng, Z. Zheng, J. Wu, and H.-N. Dai, “XBlock-ETH: Extracting and exploring blockchain data from Ethereum,” IEEE Open J. Comput. Soc., vol. 1, pp. 95–106, May 2020, doi: 10.1109/OJCS.2020.2990458.

----
GeaFlow（ブランド名TuGraph-Analytics）が正式にオープンソース化されました。

スターを与えてくれてありがとうございます！

GitHub👉[https://github.com/TuGraph-family/tugraph-analytics](https://github.com/TuGraph-family/tugraph-analytics)

よりエキサイティングなコンテンツについては、ブログをフォローしてください  [https://geaflow.github.io/](https://geaflow.github.io/)