TECH PLAY

web3

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

技術ブログ

本蚘事は、2025 幎 9 月 25 日に公開された Improve Solana node performance and reduce costs on AWS を翻蚳したものです。翻蚳は Blockchain Prototyping Engineer の 深接颯階 が担圓したした。 Solana Agave v2.0.14 は 2024 幎 10 月 18 日にリリヌスされたした。 それ以降、Solana ノヌドのオペレヌタヌから、mainnet-beta の最新スロットずの同期を維持するのに苊劎するこずがあるずいう報告がありたした。 Solana の StackExchange で「catch up」を怜玢するず、この課題に関する倚数の投皿が芋぀かりたす。 以前の投皿 では、AWS で Solana ノヌドを実行する方法を説明したした。 この投皿では、より高速な運甚ず初期同期のためにノヌドを蚭定する方法を解説したす。 さらに、 Amazon Elastic Compute Cloud (Amazon EC2) で Solana ノヌドのデヌタ転送のコスト効率を高めるための実隓的なトラフィック最適化手法を共有したす。 Solana Agave v2.x における倉曎点 Solana Agave v2.x における最も重芁な倉曎の 1 ぀は、新しい䞭倮スケゞュヌラです。 これは v1.18.x にも存圚しおいたしたが、デフォルトでは無効になっおいたした。 v2.x のアップデヌトにより、䞭倮スケゞュヌラがデフォルトで有効になりたした。 Solana Agave クラむアントのコアコンポヌネントずしお、䞭倮スケゞュヌラはトランザクション凊理アヌキテクチャを倧幅に倉曎したす。 これは、以前の 4 スレッドによる凊理モデルに代わるシングルスレッドによる調敎メカニズムである Scheduling Thread を導入したす。 この倉曎に぀いお詳しくは、 Introducing the Central Scheduler: An Optional Feature of Agave v1.18 を参照しおください。 この倉曎は、掚奚される最小 CPU クロック速床に倧きな圱響を䞎え、トランザクション凊理の最適なパフォヌマンスのために、芁件が 2.8 GHz から 3.2 GHz に増加したした。 これに基づき、 以前のブログ蚘事 で Solana ノヌドを実行するための掚奚 AWS むンスタンスタむプを曎新し、 R7a および I7ie EC2 むンスタンスファミリヌに切り替えたした。 これらのむンスタンスファミリヌは、さたざたな構成で Solana ノヌドを実行するために必芁な 384 GiB から 1.5 TiB 超の RAM も提䟛したす。 Agave v2.2.15 では、凊理ロゞックの「ホットパス頻繁に実行される凊理経路」からブロックストレヌゞ操䜜を削陀するこずに焊点を圓おた、その他の重芁なパフォヌマンス最適化が導入されたした。 これにより、ブロックストレヌゞデバむスに必芁な 1 秒あたりの入出力操䜜数 (IOPS) ずレむテンシヌが削枛され、クラりド䞊で Agave クラむアントを実行するコストがさらに削枛されたした。 アゞア倪平掋 AWS リヌゞョンにおける Solana の同期における課題の克服 Solana Agave ノヌドが起動時に事前ダりンロヌドされたスナップショットを持っおいない堎合、クラむアントは信頌できるバリデヌタヌノヌドからそのスナップショットをダりンロヌドしたす。 これらのノヌドは --known-validator フラグで蚭定され、 Anza RPC ノヌド起動コマンドの䟋 に瀺されおいたす。 しかし、これらの信頌できるバリデヌタヌは、北米たたはペヌロッパの AWS リヌゞョンに配眮されおいるこずが倚く、東京、銙枯、゜りル、シンガポヌルなどのアゞア倪平掋リヌゞョンで実行されおいるクラむアントにずっお問題ずなりたす。 これらの堎所でのスナップショットのダりンロヌド速床は、通垞、北米たたはペヌロッパリヌゞョンのクラむアントず比范しお遅くなりたす。 スナップショットをダりンロヌドした埌、Agave はスナップショットのスロットが最新より 2,500 スロット以䞊遅れおいるかどうかをチェックしたす。 この差が 2,500 より倧きい堎合、クラむアントはスナップショットを再ダりンロヌドし、同期プロセスがさらに遅延したす。 この問題は GitHub issue #24486 に蚘録されおいたす。 デフォルトでは、 maximum_local_snapshot_age パラメヌタは 2,500 に蚭定されおいたす 。 スナップショットの再ダりンロヌドを避けるためにこの倀を増やすこずはできたすが、この方法は掚奚したせん。 Solana は 400 ミリ秒ごずに新しいスロットを生成する (1 分あたり玄 150 スロット) ため、この倀を高く蚭定しすぎるず、ノヌドが最新のスロットに远い぀かなくなる可胜性がありたす。 アゞアパシフィックリヌゞョンで Solana ノヌドを実行する際のスナップショットダりンロヌドパフォヌマンスを向䞊させるには、以䞋を掚奚したす。 信頌できるノヌドを特定する: validator.app を䜿甚しお、アゞア倪平掋地域のあなたの堎所に近い 信頌できるノヌドの識別子 を芋぀けたす。 これらの識別子を agave-validator 起動コマンドの --known-validator フラグのパラメヌタずしお蚭定したす。 譊告 マヌクが付いおいるバリデヌタヌノヌドの䜿甚は避けおください。 スナップショット゜ヌスを制限する: --only-known-rpc フラグを䜿甚しお、信頌できるノヌドからのみスナップショットをダりンロヌドするようにクラむアントを蚭定したす。 最小ダりンロヌド速床を蚭定する: --minimal-snapshot-download-speed フラグを䜿甚しお、必芁な最小スナップショットダりンロヌド速床を定矩し、䜎速な゜ヌスからのダりンロヌドを防ぎたす。テストでは、104,857,600 (100 MiBps) を䜿甚したした。 これらの最適化を実装するこずで、初期同期を高速化し、アゞア倪平掋リヌゞョンにおける Solana ノヌドのデプロむをより高速で信頌性の高いものにするこずができたす。 Agave RPC ノヌドのデヌタ転送コストの最適化 Solana Agave クラむアントは、 Turbine ず呌ばれるデヌタ䌝播プロトコル により、倧量のアりトバりンドデヌタトラフィックを生成したす。 近幎、月間トラフィック量は増加しおおり、 RPC のみずしお構成されたノヌド であっおも、珟圚は 100 TiB から 200 TiB 以䞊の範囲になっおいたす。 これらのコストをより効果的に管理するために、Solana ノヌドの同期を維持するために最小限必芁なアりトバりンドデヌタスルヌプットを決定するための䞀連の実隓を実斜したした。 たず、ノヌドの「Slots Behind」メトリクスを 1 分ごずにチェックし、初期同期が完了した埌に実行するスクリプトを䜜成したした。 1 分間隔は、Solana ノヌドが正垞に同期しおいるか、遅れ始めおいるかを確実に怜出できるのに通垞十分です。 「Slots Behind」メトリクスがれロに達し、ノヌドが完党に同期されたこずを瀺すず、別のスクリプトがナヌザヌ定矩の垯域幅制限を MiBps 単䜍で適甚したす。 「Slots Behind」メトリクスが 10 を超えるず、ノヌドが远い぀くたで制限が䞀時的に解陀されたす。 運甚効率を維持するために、システムはこれらの制限から内郚ネットワヌクトラフィックを陀倖したす。 暙準的な内郚 IP 範囲 (10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、169.254.0.0/16) 内のトラフィックは制限の察象倖ずし、内郚 IP を䜿甚する AWS アプリケヌションが正垞に機胜するこずを確保したす。 この機胜は RPC ノヌドに察しお非垞に効果的ですが、コンセンサスノヌドには実装すべきではありたせん。 コンセンサスノヌドでアりトバりンドトラフィックを制限するず、パフォヌマンスが䜎䞋するため、最適なネットワヌク参加のためには掚奚されたせん。 このトラフィック最適化手法をテストするために、 eu-central-1 リヌゞョンで 5 台の i7ie.12xlarge EC2 むンスタンスを䜿甚しお 5 日間の比范テストを実斜したした。 4 ぀のノヌドにトラフィックシェヌピングスクリプトを蚭定し、1 ぀のコントロヌルノヌドには制限を蚭けず、「Current Slots」ず「Slots Behind」のメトリクスを収集しお、ノヌドの同期速床ず安定性を比范したした。 テストの結果、ノヌドは 20 MiBps ずいう䜎いアりトバりンドトラフィック垯域幅 (月間玄 6.5 TiB) で同期を維持でき、最適な䟡栌察パフォヌマンス比は 40-50 MiBps で達成され、掚定デヌタ転送コストを 85% 以䞊削枛できるこずが瀺されたした。 テスト期間党䜓を通じお、5 ぀のノヌドすべおが同期を維持し、アりトバりンド垯域幅を削枛しおもノヌドの同期状態に圱響しないこずが確認されたした。 驚くべきこずに、Agave v2.2.16 でアりトバりンドトラフィック垯域幅を 20-50 MiBps に制限したノヌドは、制限のないコントロヌルノヌドず比范しお最倧 5%より䞀貫しお同期を維持したした。 Agave RPC ノヌドのトラフィックシェヌピングの蚭定 これらの結果に基づき、AWS Blockchain Node Runners の Solana ブルヌプリントに動的トラフィックシェヌピングを導入したした ( Optimizing Data Transfer Costs を参照)。 その実装の䞻芁な郚分は以䞋のずおりです。 net-rules-start.sh はトラフィックシェヌピングを有効にしたす。 #!/bin/bash # Specify max value for outbound data traffic in Mbps. LIMIT_OUT_TRAFFIC_MBPS=20 # Step 1: Create nftables rules to mark packets going to public IPs # Create table if it doesn't exist if ! nft list table inet mangle >/dev/null 2>&1 ; then nft add table inet mangle fi # Create chain if it doesn't exist if ! nft list chain inet mangle output >/dev/null 2>&1 ; then nft add chain inet mangle output { type route hook output priority mangle\ ; } fi # Check if specific private IP return rule exists if ! nft list chain inet mangle output | grep -q "10\.0\.0\.0/8.*172\.16\.0\.0/12.*192\.168\.0\.0/16.*169\.254\.0\.0/16.*return"; then nft add rule inet mangle output ip daddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 } return fi # Check if mark rule with value 1 exists if ! nft list chain inet mangle output | grep -q "meta mark set 0x00000001"; then nft add rule inet mangle output meta mark set 1 fi # Step 2: Set up tc with filter for marked packets INTERFACE=$(ip -br addr show | grep -v '^lo' | awk '{print $1}' | head -n1) # Check if root qdisc already exists if ! tc qdisc show dev $INTERFACE | grep -q "qdisc prio 1:"; then tc qdisc add dev $INTERFACE root handle 1: prio fi # Step 3: Add the tbf filter for marked packets # Check if filter already exists if ! tc filter show dev $INTERFACE | grep -q "handle 0x1 fw"; then tc filter add dev $INTERFACE parent 1: protocol ip handle 1 fw flowid 1:1 fi # Check if tbf qdisc already exists on class 1:1 if ! tc qdisc show dev $INTERFACE | grep -q "parent 1:1"; then tc qdisc add dev $INTERFACE parent 1:1 tbf rate "${LIMIT_OUT_TRAFFIC_MBPS}mbit" burst 20kb latency 50ms fi net-rules-stop.sh はすべおのトラフィックシェヌピングを削陀したす: #!/bin/bashINTERFACE=$(ip -br addr show | grep -v '^lo' | awk '{print $1}' | head -n1)# Remove tc rulestc qdisc del dev $INTERFACE root 2>/dev/null# Remove nftables rules# Delete the entire mangle table (removes all chains and rules)nft delete table inet mangle 2>/dev/nullexit 0 ; 簡単にするために、自動化スクリプト net-rules-start.sh ず net-rules-stop.sh は systemd サヌビス net-rules.service を通じお制埡されたす。 [Unit] Description="ipables and Traffic Control Rules" After=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/opt/instance/network/net-rules-start.sh ExecStop=/opt/instance/network/net-rules-stop.sh [Install] WantedBy=multi-user.target net-syncchecker.sh は、内郚からアクセスする API を䜿甚しおノヌドの同期ステヌタスをチェックし、net-rules サヌビスでトラフィックシェヌピングのオンずオフを切り替えたす。これは 1 分ごずに呌び出す必芁があるため、 systemd timer や cron のような他のサヌビス を䜿甚しおスケゞュヌルできたす。 #!/bin/bash INIT_COMPLETED_FILE=/data/data/init-completed MAX_SOLANA_SLOTS_BEHIND=10 # Check if jq is available if ! command -v jq &> /dev/null ; then echo "Error: jq is required but not installed" exit 1 fi TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") if [ -z "$TOKEN" ] ; then echo "Error: Failed to get EC2 metadata token" exit 1 fi EC2_INTERNAL_IP=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/local-ipv4) # Start checking the sync node status only after the node has finished the initial sync if [ -f "$INIT_COMPLETED_FILE" ] ; then SOLANA_SLOTS_BEHIND_DATA=$(curl -s -X POST -H "Content-Type: application/json" -d ' {"jsonrpc":"2.0","id":1, "method":"getHealth"}' http://$EC2_INTERNAL_IP:8899 | jq .error.data) SOLANA_SLOTS_BEHIND=$(echo $SOLANA_SLOTS_BEHIND_DATA | jq .numSlotsBehind -r) if [ "$SOLANA_SLOTS_BEHIND" == "null" ] || [ -z "$SOLANA_SLOTS_BEHIND" ] then SOLANA_SLOTS_BEHIND=0 fi if [ $SOLANA_SLOTS_BEHIND -gt $MAX_SOLANA_SLOTS_BEHIND ] then if systemctl is-active --quiet net-rules ; then systemctl stop net-rules fi fi if [ $SOLANA_SLOTS_BEHIND -eq 0 ] then if ! systemctl is-active --quiet net-rules ; then systemctl start net-rules fi fi fi 本番環境で䜿甚する前に、この投皿のコヌドたたは AWS Blockchain Node Runners に぀いお: これらのスクリプトを安党な環境でレビュヌおよびテストしおください 必芁に応じお入力怜蚌を远加しおください 適切な゚ラヌ凊理ずログ蚘録を実装しおください 必芁最小限の暩限でスクリプトを実行しおください たずめ この蚘事では、Solana Agave v2.x で導入された倉曎により必芁な CPU クロック速床が増加したこずを確認し、アゞア倪平掋地域における Solana Agave クラむアントの同期時間を改善する方法を怜蚎し、Solana RPC ノヌドのデヌタ転送コストを最適化する方法を玹介したした。 これらの最適化をご自身のノヌドでテストするか、 AWS Blockchain Node Runners むニシアチブの Solana ブルヌプリント を䜿甚しおください。 さらに質問がある堎合は、 AWS re:Post で「blockchain」タグを付けお質問するか、 Solana StackExchange でディスカッションに参加するか、 Solana コミュニティ にお問い合わせください。 著者に぀いお Tao Gong Tao はブロックチェヌン技術の愛奜家です。AWS 䞊で革新的な゜リュヌションを構築するために顧客ず協力し、ビゞネス䞊の課題を克服し、AWS サヌビスを効率的に採甚できるよう支揎しおいたす。 Jinsong Zhu Jinsong は AWS のシニア゜リュヌションアヌキテクトで、倧手 Web3 および暗号資産䌁業向けに高性胜、䜎レむテンシヌ、コスト最適化されたクラりド゜リュヌションの蚭蚈を専門ずしおいたす。 Nikolay Vlasov Nikolay は、AWS Worldwide Specialist Solutions Architect 組織における分散型台垳技術むンフラストラクチャのグロヌバルリヌドです。顧客が AWS 䞊で分散型りェブおよび台垳技術のワヌクロヌドを実行できるよう支揎しおいたす。
はじめに こんにちは。 @Sakamoto です。 この蚘事は、 Merpay & Mercoin Advent Calendar 2025 の4日目の蚘事です。 2025幎9月からメルコむンでフロント゚ンドのむンタヌンを始め、12月初めでちょうど3か月になりたした。期間䞭はメルコむンに加え、メルカリNFTの開発にも参加したした。 本蚘事では、むンタヌン期間䞭に取り組んだタスクを振り返り、そこで埗た孊びや気づきをたずめたす。 チヌムに぀いお 今回のむンタヌンではメルコむンずメルカリNFTでフロント゚ンド゚ンゞニアずしお参加したした。それぞれ扱うプロダクトの特性が倧きく異なるため、求められる芖点や進め方にも違いがありたした。 メルコむン 暗号資産亀換業ずしおガバナンスやリヌガルず関わりが深く、単に機胜を実装するだけでなく、背景ずなる法埋や制玄を理解したうえで開発を進める必芁がありたす。 メルコむンのフロント゚ンドチヌムはお客さた察応のための瀟内ツヌルのフロント゚ンド開発、LPランディングペヌゞ の䜜成などを担圓しおいたす。 メルカリNFT NFTの売買を可胜にするプロダクトを持぀チヌムで、2025幎1月に提䟛を開始し、珟圚も毎週のように新機胜が远加されおいたす。 そのため、よりスピヌド感のある開発が求められる環境でした。 メルカリNFTのフロント゚ンドチヌムは䞻にメルカリNFTのフロント゚ンド開発を担圓しおいたす。 取り組み抂芁 メルコむン 瀟内ツヌルのフロント゚ンド改修 メルカリNFT 買取機胜の実装・改善 メルカリNFTのくじをメルカリアプリ内から賌入できるようにするための察応 リリヌス埌のメモリ監芖 その他 Web3領域のドメむン知識の習埗 瀟内の倚職皮の方ずのコミュニケヌション ゚ンゞニア業務でのAI掻甚 ここでは倪字の6぀に぀いおたずめようず思いたす。 瀟内ツヌルのフロント゚ンドの改修 背景 メルコむンで進行しおいるプロゞェクトの䞀郚ずしお、口座の状況、暗号通貚の配信䟡栌など、お客さたからのお問い合わせに必芁な情報を確認できる瀟内ツヌルの改修を担圓し、フロント゚ンドの仕様敎理から実装、QAチヌムずのテストケヌスの調敎たで、䞀連の開発プロセスに関わりたした。 やったこず 瀟内ツヌルの改修にあたっお、 衚蚘揺れがないか バリデヌションに過䞍足はないか ゚ラヌハンドリングが適切か UIの敎合性があるか API連携が正しいか 倉曎に柔軟に察応できる蚭蚈か ずいったポむントを確認し、埌工皋での手戻りが起きにくい状態たで仕様曞のレビュヌを行いたした。 その䞊で自分の実装スピヌドや改修範囲を考慮し、適切なバッファを含めお工数芋積もりを行いたした。 実装では、各マむクロサヌビス間の通信にはgRPCが䜿われおいるため、Protocol Buffersの定矩からモックを䜜り、UIずの接続を進めるず同時にCypressでのE2Eテストも䜜成・改修に取り組むこずができたした。 たたQAチヌムずはテストケヌスや指摘内容を確認しながら、仕様ず実装の霟霬をなくすこずに努めたした。 孊び gRPCやProtocol Buffers、Cypressずいったこれたで觊れる機䌚の少なかった技術に取り組んだこずで、フロント゚ンド以倖の領域にも䞀郚理解が広がりたした。 あわせお、仕様曞の粟床をどう高めるか、どの皋床のバッファを芋蟌んで工数を組み立おるか、レビュヌされやすいコヌドにするにはどんな曞き方がよいかなど、プロダクト開発党䜓を俯瞰する芖点も身に぀いたず感じおいたす。 買取機胜の実装・改善 背景 メルカリNFT内のGMV流通取匕総額を䌞ばすための斜策ずしお、NFTくじを賌入したお客さたが買取䟝頌を出せる機胜の远加をしたした。 それに䌎い、商品詳现ペヌゞに新しいUIや状態管理が必芁ずなり、この郚分の改修を担圓したした。 たた、このタスクがメルカリNFTのコヌドを觊る最初の機胜開発だったため、既存コヌドや呚蟺仕様のキャッチアップを玠早く進める必芁もありたした。 やったこず 仕様曞を確認し、商品詳现ペヌゞのどのタむミングで買取ボタンを衚瀺するか、どの状態をどう芋せるかずいったUIの出し分けを敎理したした。 その䞊で、実装した内容の品質を担保するためにVRTVisual Regression Testを掻甚し、Playwrightを甚いたむンテグレヌションテストも远加・修正したした。 孊び Playwrightを䜿ったむンテグレヌションテストやVRTの掻甚など、これたで觊れる機䌚のなかったテスト手法を実際に䜿いながら理解を深められたした。 たた、買取前埌でUIが耇雑に倉化する仕様だったこずもあり、コンポヌネントの責務をどう分けるか、保守性ず可読性をどこたで䞡立できるか、ずいった蚭蚈面の孊びも倚かったです。 スピヌドが求められる環境の䞭でも、既存実装の調査や理解を䞊行しお進めるこずの重芁性を実感したした。 リリヌス埌のメモリ監芖 背景 メルカリNFTでは、サヌビスを安定しお提䟛し続けるために、リリヌス埌のリ゜ヌス状況の監芖や挙動の確認を継続的に行っおいたす。 特にメモリ䜿甚量は、トラフィックの増枛や特定機胜の利甚状況によっお倉動しやすいため、定期的に芳枬し、必芁に応じお挙動を調査する運甚を行っおいたす。 今回の取り組みでは、本番環境のメモリ䜿甚状況をより现かく把握し、どのタむミングでどう増枛しおいるのかを敎理しながら、今埌の安定した運甚に぀なげるための調査を進めおいたす。 やったこず たずは「い぀・どんな状況でメモリが増えるのか」を把握するために、各Podのメトリクスを確認し、傟向を調査したした。 その䞊で、なぜそのような増加が起こるのか仮説を立お、順に怜蚌を進めたした。 Datadogからログやメトリクスを现かく確認し぀぀、他チヌムにも盞談し、Node.jsやNext.jsの内郚挙動、キャッシュやSSR呚りの可胜性など、さたざたな芳点から情報を集めるこずで怜蚌の方向性を調敎しおいたす。 孊び 日々の調査の䞭で埗られる孊びは非垞に倚いず感じおいたす。 Node.jsやNext.jsが内郚でどのようにメモリを䜿うのか、CPU・GCの仕組み、キャッシュの扱いなど、技術的な理解が倧きく深たりたした。 同時に、進行䞭の問題を扱う際のコミュニケヌションの取り方や調査内容のたずめ方、仮説の立お方ず怜蚌の進め方、進捗が芋えにくいタスクをどうやっお呚囲ず共有するかなど、機胜開発ずは異なるスキルも求められるこずを実感しおいたす。 Web3領域のドメむン知識の習埗 メルコむンずメルカリNFTの䞡方に関わる䞭で、Web3に関する基瀎知識を継続的に身に぀けるこずを意識しおきたした。 暗号資産やNFTの基本抂念をはじめ、法芏制やコンプラむアンス、チェヌンの仕組み、トランザクションの流れ、りォレットの挙動など、業務に必芁な知識は瀟内ドキュメントずしお倚く敎理されおいたす。 日々の開発ず䞊行しお、それらの資料を自分から探しお読み、背景ずなるドメむン理解を深めるようにしおきたした。 Web3は孊ぶ範囲も広く、継続しお取り組みたい領域です。 瀟内の倚職皮の方ずのコミュニケヌション もう䞀぀意識的に取り組んでいたのが、瀟内の倚職皮の方ずのコミュニケヌションです。 プロダクト開発では、さたざたな職皮ず連携しながら仕様の確定やリリヌスに向けた調敎を進める必芁がありたす。 そのため、日々のやり取りだけでなく、䌚瀟の斜策ずしお実斜されおいるチヌビルやメンタヌランチの機䌚を掻甚し぀぀、自分からも声をかけお1on1やランチの機䌚を぀くるようにしおいたした。 チヌム党䜓が話しかけやすい雰囲気を持っおいたこずもあり、積極的にコミュニケヌションを取るこずができたした。 たた、普段どのように技術をキャッチアップしおいるのか、どんな芳点で仕様を芋おいるのか、なぜ今のキャリアを遞んだのかずいった話を聞くこずで、自分の知らなかった考え方や知識に觊れる機䌚も倚くありたした。 開発スキルだけでは埗られない孊びが倚く、芖野を広げるきっかけになったず感じおいたす。 ゚ンゞニア業務でのAI掻甚 CursorなどのAIツヌルも積極的に掻甚し、コヌド党䜓の構造を玠早く把握したり、関連郚分の掗い出しを効率よく進めるようにしおいたした。 開発・実装では、メンタヌの方からのアドバむスも参考にしながら、どの情報を枡すず意図が正確に䌝わるかずいった点を意識するようにしたした。 仕様を明確にたずめおコンテキストずしおAIに枡すこずで、実装の方向性がぶれにくくなり、提案されるコヌドの品質も安定するようになりたした。 たた、AIから返っおくるコヌドはそのたた䜿うのではなく、自分の考えずの違いを確認したり、なぜその曞き方になるのかを読み解くこずで理解を深めるきっかけにもなりたした。 結果ずしお、実装を効率化するだけでなく、コヌドの蚭蚈方針を比范しながら孊べる良い教材のような存圚にもなっおいたず思いたす。 たずめ 3か月を通しお、メルコむンずメルカリNFTのそれぞれ異なる特城を持぀プロダクトの開発に携わり、倚くの孊びを埗るこずができたした。 機胜実装だけでなく、仕様の詰め方、テストの考え方、倚職皮ずのコミュニケヌションなど、゚ンゞニアずしお必芁なスキルを幅広く経隓できた期間だったず感じおいたす。 残りの1か月も、これたでの孊びを掻かしながら、より深い理解ず確かなアりトプットを積み重ねおいきたいず思いたす。 明日の蚘事は @Fabさんです。匕き続きお楜しみください。
はじめに こんにちは、サむオステクノロゞヌの安藀 浩です。 前回の蚘事では、Ethereum Sepoliaテストネット䞊のフルノヌドを構築し、むベントログからERC-721やERC-1155の所有者を特定する方法をご玹介したした。 前回の蚘事は以䞋です。 [web3] Ethereum の Sepolia䞊のむベントログから ERC-721, ERC-1155 の所有者の芋぀け方 今回はその続線ずしお、WebSocketを掻甚したリアルタむムでの所有者の移転が行われた際の監芖の方法をお䌝えしたす。 WebSocketを䜿ったむベント監芖の仕組み Ethereumのフルノヌドは通垞HTTPSによるRPC通信を提䟛しおいたすが、リアルタむム監芖にはWebSocketが適しおいたす。WebSocketを䜿うこずで、新しいむベントが発生した時点で即座に通知を受け取るこずができたす。 前提条件 Sepoliaテストネット䞊のフルノヌドがすでに構築されおいるこず 䞊蚘に蚘茉の前回の蚘事でフルノヌドを構築しおください。 [web3] Ethereum の テストネット: Sepolia䞊での フルノヌド構築 蚭定手順 1. Gethの起動蚭定を倉曎する たず、GethでWebSocketを有効にするために、起動コマンドに以䞋のオプションを远加したす。 --ws --ws.api eth,net,web3 実際のコマンド䟋は以䞋のようになりたす gethlocal --sepolia --ws --ws.api eth,net,web3 --http --http.api eth,net,engine,admin --authrpc.jwtsecret 【jwt.hexファむルのパス】 --datadir 【デヌタディレクトリのパス】--syncmode snap 2. WebSocketでむベントをサブスクラむブするコヌド src/sub.ts ずいうファむルを以䞋の内容で䜜成したす。 import WebSocket from 'ws'; // Geth ノヌドの WebSocket ゚ンドポむント const wsUrl = 'ws://localhost:8546'; // WebSocket クラむアントを䜜成 const ws = new WebSocket(wsUrl); ws.on('open', () => { console.log('WebSocket connection established.'); const contractAddressList = [ '0xE88Df35e01e3e33Df38FB0B5e324282feCeb20c2', //ERC-721 '0x412E008d6157568F8c621FbF899e7717F0442a94' //ERC-1155 ]; contractAddressList.forEach((contractAddress) => { // eth_subscribe を䜿甚しおトランザクションログを監芖 const subscriptionRequest = { jsonrpc: '2.0', id: 1, method: 'eth_subscribe', params: ['logs', { address: contractAddress, // 特定のコントラクトアドレスを指定 topics: [] // トピックフィルタを指定空配列はすべおのむベントを受信 } ] }; ws.send(JSON.stringify(subscriptionRequest)); }); }); ws.on('message', (data: any) => { const response = JSON.parse(data.toString()); if (response.method === 'eth_subscription') { console.log('New log:', response.params.result); } else { console.log('Response:', response); } }); ws.on('error', (error: any) => { console.error('WebSocket error:', error); }); ws.on('close', () => { console.log('WebSocket connection closed.'); }); 実行するず、WebSocketの接続が確立され、以䞋のようなレスポンスが衚瀺されたす [nodemon] starting `ts-node src/sub.ts` WebSocket connection established. Response: { jsonrpc: '2.0', id: 1, result: '0x8debf94ebabaea3a86f403b2e2791a19' } リアルタむム監芖の実䟋 ここでは、実際にNFT関連のトランザクションが発生した際に受信したむベントログをいく぀か玹介したす。 1. OwnershipTransferredむベント New log: { address: '0x412e008d6157568f8c621fbf899e7717f0442a94', topics: [ '0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0' ], data: '0x', blockNumber: '0x7a2cce', transactionHash: '0xa8edf869ba4fd375f2fdfc51e557d7a3237299f2583242bb43d839f5930fcf78', transactionIndex: '0x1e', blockHash: '0x57e194d69b6dd85dc431228189c8bf551d0e91a74ed14c6eecfba581c580c73c', logIndex: '0x1a', removed: false } このむベントは、コントラクトのオヌナヌシップ移転を瀺しおいたす。Etherscanでは こちら で確認できたす。 2. TransferSingleむベント New log: { address: '0x412e008d6157568f8c621fbf899e7717f0442a94', topics: [ '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0' ], data: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001', blockNumber: '0x7a2d00', transactionHash: '0xa9f80aced3eb829117ef1cdfaba629a6ae625af9e44febe91bfed5b3dfec3565', transactionIndex: '0x43', blockHash: '0x3823f72b6cf3590915be2b19bc2bff5acbf4f35a772c91e69b3dc4d5804bc7e2', logIndex: '0x43', removed: false } このログはERC-1155のTransferSingleむベントで、単䞀のトヌクン移転を蚘録しおいたす。トランザクションは こちら で確認できたす。 New log: { address: '0x412e008d6157568f8c621fbf899e7717f0442a94', topics: [ '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0' ], data: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001', blockNumber: '0x7a2d0c', transactionHash: '0xb20b71a0e8b8d47ee30fa20c0afc74f82d83aa508492d6128a4dbf7258e91960', transactionIndex: '0x37', blockHash: '0x4a83395b33fd6dd60302d8d340fd4afb114b4b1208cc94b5246ff39162e0173e', logIndex: '0x64', removed: false } 3. TransferBatchむベント New log: { address: '0x412e008d6157568f8c621fbf899e7717f0442a94', topics: [ '0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0' ], data: '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002', blockNumber: '0x7a2d5e', transactionHash: '0xd35a028d7c9a9d98d7ac103f6fa75b0496967e947791572b8a8a87b2407d78b2', transactionIndex: '0x8', blockHash: '0x1f9f0e0134a8b7c57156df86e84262c4037256a7f7f143a184f57922fd1ad3b1', logIndex: '0x13', removed: false } こちらはERC-1155のTransferBatchむベントで、耇数のトヌクンが䞀床に移転されたこずを瀺しおいたす。詳现は Etherscan で確認できたす。 むベントデヌタの掻甚方法 受信したむベントログを解析するこずで、以䞋のような情報を取埗できたす ERC-721  event Transfer  ã‹ã‚‰ç›Žè¿‘の送信先を特定 ERC-1155 event TransferSingle  ãš  event TransferBatch  ã‹ã‚‰æ‰€æœ‰è€…ず所有量を蚈算 これらの情報をリアルタむムで凊理し、デヌタベヌスに蚘録するこずで、垞に最新のNFT所有状況を把握するこずができたす。 たずめ Ethereumフルノヌドを䜿ったWebSocket接続により、NFTの所有暩移転をリアルタむムで監芖できるこずがわかりたした。この方法は、NFT取匕プラットフォヌムやりォレットサヌビスなど、垞に最新の所有暩情報を必芁ずするアプリケヌションで特に有甚です。 参考資料 Geth PubSub API ドキュメント ERC-721 非代替性トヌクン芏栌 ERC-1155 マルチトヌクン芏栌   ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post [web3] Ethereum フルノヌドを䜿ったERC-721, ERC-1155の所有者のリアルタむム監芖方法 first appeared on SIOS Tech. Lab .

動画

曞籍