# https://www.pontech.dev/ llms-full.txt ## Web3 Development Partner # 信頼できるweb3開発パートナー 株式会社Pontechは、Web3開発の豊富な経験を活かし、お客様のビジョンを高速に実現します。 # 事業内容 ![](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flaptop.22dcb094.jpg&w=3840&q=75) - **企画:** ブロックチェーン技術を活用した新しいサービスの企画・壁打ちを行います。最新技術動向や市場ニーズを踏まえ、お客様のビジョンをより具体化します。 - **設計・開発:** ブロックチェーンと連携して動作する分散型アプリケーション(Dapps)を開発します。最適なツールとフレームワークで、シンプルでメンテナンスコストの低いアーキテクチャを迅速に提供します。 - **R&D:** ブロックチェーン技術の研究開発を行い、最新技術の知見をわかりやすく共有します。競合他社との差別化とリーダーシップの実現を、先端技術を駆使してサポートします。 [開発の見積もりを依頼する / 打ち合わせを依頼する\\ \\ お問い合わせ](https://www.pontech.dev/contact) # 領域 ## Web Proofを用いたアプリケーション開発 zkTLSとweb proofを用いたアプリケーションの開発を企画から設計・実装まで伴走します。 [参考記事 →](https://www.pontech.dev/post/think-about-zktls) ## NFTミントサイト開発 NFTのコントラクトと初期販売ページの開発を行います。SBTやフルオンチェーンNFTの開発も可能です。 [参考記事 →](https://www.pontech.dev/post/dapps-everyday-1) ## NFT関連サービス開発 NFT保有者限定で閲覧できるサービスなど、NFTの特性を用いたサービスの開発を行います。 [参考記事 →](https://www.pontech.dev/post/dapps-everyday-6) ## ウォレット開発 WaaSを用いてソーシャルログインやERC4337のAccount Abstractionを採用したウォレットアプリの開発、カスタマイズを行います。 [参考記事 →](https://www.pontech.dev/post/wallet-adaptors) ## 各種web3リサーチ web3に関して技術リサーチ、市場リサーチ、競合リサーチを行います。 ## 新規事業コンサルティング トークンやNFTを活用した新規事業開発を支援します。 # 技術スタック Pontechで採用している技術スタックの一例です。これらの他にも、お客様のニーズに合わせて柔軟に対応いたします。 フロントエンド ![Products](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fnextjs.024d16f4.png&w=1080&q=75) ![Products](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Ftailwindcss.a1069bda.svg&w=640&q=75) バックエンド ![Products](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Ffirebase.028dddbf.svg&w=1920&q=75) ![Products](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Faws.3673bf62.png&w=2048&q=75) Ethereum関連 ![Products](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fthirdweb.d925559d.png&w=1920&q=75) ![Products](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fopenzeppelin.c18e05c2.png&w=3840&q=75) ![Products](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Falchemy.d4d2ccaf.png&w=1920&q=75) [開発ツール一覧を見る →](https://www.web3tools.wiki/) # 技術Blog Pontechのエンジニアが執筆した技術ブログ記事です。最新技術動向や開発Tipsを発信しています。 ![](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fce4b185bf3c8d091622b19dfe4a61b4e983937dd-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75) April 03, 2024 ![](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=48&q=75)Ponta ### [Dapps開発におけるウォレット接続の選択肢まとめ・比較](https://www.pontech.dev/post/wallet-adaptors) ![](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F408aeb0783c5f805691b0a5fcd42fe4def1a4577-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75) November 28, 2024 ![](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=48&q=75)Ponta ### [zkTLSについての考察と期待する理由](https://www.pontech.dev/post/think-about-zktls) ![](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b4f01fa09ecf7b5062c5ffe265cf7cef831fd92-2560x1600.png%3Frect%3D0%2C68%2C2560%2C1464%26w%3D2000%26auto%3Dformat&w=3840&q=75) April 30, 2024 ![](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F812300fd2e4f4f99d805ed62b76d19e372b23c6f-3024x4032.jpg%3Frect%3D0%2C0%2C1709%2C2677%26w%3D2000%26auto%3Dformat&w=48&q=75)mizuno ### [Dapps開発におけるNFT APIの選択肢まとめ・比較](https://www.pontech.dev/post/nft-api) [記事一覧へ →](https://www.pontech.dev/blog) # 自社サービス ![Products](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fbenefy.6d6988e5.png&w=1080&q=75) ### Benefy デジタルおみやげ・会員権発行サービス。会員権に最適化された機能を持つNFTを発行し、受け取りサイトをノーコードで作成できます。 #### Benefy会員証 指定した相手に発行でき、管理者が付属情報のアップデートや削除をできるNFTです。 #### Benefyおみやげ 受け取り条件をカスタマイズでき、参加賞や特典として適したNFTです。 #### Benefyゲート 会員証やおみやげの所有を確認する機能です。他サービスのNFTと連携も可能です。 [デジタル会員権を発行する\\ \\ サイトへ](https://benefy.pontech.dev/) ![Products](https://www.pontech.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fbenefy-blog.7e3f360e.webp&w=1080&q=75) ### Benefy Blog 誰でも簡単にNFT保有者限定コンテンツを作成できるブログCMSサービスです。 #### WYSIWYGエディター Notionライクなエディターでカンタンに記事を編集できます。 #### NFT保有者限定コンテンツの作成 チェーン、コントラクトアドレスを指定して閲覧条件を設定できます。 #### 販売ページへの導線 NFT入手ページを設定し、マーケティングに繋げることもできます。 [NFT保有者限定コンテンツを作成する\\ \\ サイトへ](https://pontech.benefy.blog/) ## Trusted by the world’s most innovative teams ![Marverick](https://static.wixstatic.com/media/d8ad8b_32e79d94c86842c19e53d387e34261b0~mv2.png/v1/crop/x_2,y_0,w_610,h_165/fill/w_442,h_120,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/%E5%BD%B1%E3%81%AA%E3%81%97%E3%83%AD%E3%82%B4%E7%99%BD.png)![Monex Crypto Bank](https://cryptobk.jp/wp-content/uploads/2023/02/monexcryptobank.png)![DAIJOBU](https://www.pontech.dev/img/DAIJOBU.png)![Thirdweb](https://www.pontech.dev/img/thirdweb-logo.webp)![Facewallet](https://www.pontech.dev/img/facewallet-logo.svg) # Company 会社概要 | | | | --- | --- | | 会社名 | 株式会社Pontech | | 設立日 | 2023年1月11日 | | 住所 | 〒150-0043
東京都渋谷区道玄坂1丁目10番8号渋谷道玄坂東急ビル2F−C | | 代表取締役 | 須原健太 | Copyright © 2025Pontech.Inc SystemDarkLight ## About Pontech # About We are a small passionate team. [![Matzo](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa1180731f9bb31b8725afa4543fa058a3675cea1-876x744.png%3Fw%3D876%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/matzo) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [![relatedtoweb3](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F45d7d317c8d8a9276ced9f7b0c771c807f2c46df-207x129.png%3Fw%3D207%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/relatedtoweb3) We provide real-time connectivity to enable software providers and financial institutions to build integrated products for their small business customers. Our API infrastructure is leveraged by clients ranging from lenders to corporate card providers and business forecasting tools, with use cases including automatic reconciliation, business dashboarding, and loan decisioning. [Get in touch](https://www.pontech.dev/contact) Copyright © 2025Pontech.Inc SystemDarkLight ## Tailored Sales Solutions あなたのサービスを最適な言葉で届ける # オーダーメイド 問い合わせフォーム営業代行 「問い合わせフォーム営業 = 大量送信」というイメージをお持ちではないでしょうか? 私たちのサービスは量より質を徹底追求。御社のサービス内容や強みを深く理解し、1社ごとにカスタマイズしたメッセージを届けることで、テレアポや一般的な一斉メールより高い反応率を実現します。 - 初期費用は5,000円 - 成果報酬型だから安心 - 弊社エンジニアが御社のサービスを深く理解 - ターゲット企業のリサーチ & 文面カスタマイズ [無料相談はこちら](https://www.pontech.dev/lp#contact) ## サンプル営業文面を無料でお届けします! 以下のフォームにご入力いただいた情報をもとに、お試しのフォーム営業文面を作成し、メールでお送りします。 メールアドレス 貴社のHP URL ターゲット企業のHP URL サンプルの文面を受け取る ## こんなお悩みありませんか? ![Concern](https://www.pontech.dev/img/lp/concern1.jpg) ### フォーム営業が自社のイメージダウンに 繋がらないか不安 新規開拓の手段としてフォーム営業を活用したい。でも、 スパム扱いされたり印象が悪くなったりしないか心配…。 ![フォーム営業に関する悩み3](https://www.pontech.dev/img/lp/concern3.jpg) ### 他サービスには プロフェッショナル感を感じない フォーム営業代行の業者は多いけれど、どこか素人っぽい…。 もっと信頼できるパートナーはいないのか? ![フォーム営業に関する悩み2](https://www.pontech.dev/img/lp/concern2.jpg) ### アポ率が低いのに 件数ごとの課金はもったいない 思うほど商談につながらない状態で、送信件数に応じて料金が 発生するのはコストがかさんでしまう…。 ## サービスの特徴 ![徹底リサーチのイメージ](https://www.pontech.dev/img/lp/feature1.jpg) ### 徹底したリサーチで ベストなマッチングを実現 私たちはまず、貴社のサービス内容・強みと、ターゲット企業の業界や事業課題を 双方向からリサーチし、正確なアプローチを行います。 ![エンジニア監修+ChatGPT活用のイメージ](https://www.pontech.dev/img/lp/feature3.jpg) ### プロのエンジニア監修 \+ ChatGPT o1 Pro活用 経験豊富なエンジニアが貴社のサービスを深く理解し、 テクノロジーとマーケティング視点を融合した高品質な営業を実現します。 ![成果報酬プランのイメージ](https://www.pontech.dev/img/lp/feature2.jpg) ### 成果が出るまで大きな負担なし 安心の成果報酬プラン 初期費用を抑え、アポや成約があった段階で費用が発生する成果報酬型を採用。 リスクを抑えながら、確かな成果を目指せます。 ## ご契約の流れ 1. 1 **無料相談・ヒアリング** オンラインにて、サービス内容や目標・課題を確認いたします。 2. 2 **プラン提案** ヒアリング内容を踏まえ、送信件数や目標アポイント数などをご提案。 3. 3 **契約・初期費用のお支払い** 初期費用5,000円をお支払いただき、本格的に開始となります。 4. 4 **企業リサーチ & 文面作成・送信** ターゲット企業を選定、1社1社に合った文面を作成し、フォーム送信を実施します。 5. 5 **成果報酬のお支払い** アポイントや成約が発生した段階で、成果報酬をお支払いただきます。 ## よくあるご質問 ### Q. 初期費用は本当に5,000円だけ? はい。ヒアリングやプラン作成、ターゲット抽出のための最低限のコストとして頂戴しております。 ### Q. 成果報酬の詳細を知りたい アポイントや成約数に応じた料金設定となります。詳細はお客様の商材内容・単価によって変動しますので、お問い合わせ時にご案内いたします。 ### Q. どのくらいのアポイント数が期待できますか? 商材・ターゲット企業の業界やタイミングにより大きく異なりますが、1社1社丁寧に送信することで大量送信よりも高い返信率が期待できます。 ### Q. フォーム送信のメールアドレスはどう管理? 自動返信メールが大量に届く可能性があるため、メインとは別の専用アドレスをご用意いただくことを推奨しています。 ## お問い合わせ・ご相談 ## サンプル営業文面を無料でお届けします! 以下のフォームにご入力いただいた情報をもとに、お試しのフォーム営業文面を作成し、メールでお送りします。 メールアドレス 貴社のHP URL ターゲット企業のHP URL サンプルの文面を受け取る ## Contact Pontech # Contact お気軽にお問い合わせください。 ## Contact Pontech 受託開発のご相談はこちらからお願いします。 東京都渋谷区道玄坂1丁目10番8号渋谷道玄坂東急ビル2F−C [suhara@pontech.dev](mailto:suhara@pontech.dev) メールアドレス Send Message Copyright © 2025Pontech.Inc SystemDarkLight ## Daily Dapps Guide [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6410467e72a60843a0ca27dbe34b7bc4b08f3590-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-20) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#20 フルオンチェーンの着せ替えNFT](https://www.pontech.dev/post/dapps-everyday-20) [誰でも簡単にピクセルアートをフルオンチェーンNFT化できるアプリ、そしてそのフルオンチェーンNFTを着せ替えできるというコントラクトについて解説します。](https://www.pontech.dev/post/dapps-everyday-20) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 22, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe25e0b7ed6f8395474b9d4586164911600c79de0-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-19) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#19 このブログの記事をNFT化してみる](https://www.pontech.dev/post/dapps-everyday-19) [まいにちDappsも目標としていた20回まで残りわずかとなりました。\\ 今回はこのブログ記事をNFTにしてmintできるようにしたいと思います。](https://www.pontech.dev/post/dapps-everyday-19) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 22, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff627205fcf9b0caacbb09b74c9cb843e11896d5a-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-18) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#18 NFTのOnchain-Royaltyと独自マケプレの導入](https://www.pontech.dev/post/dapps-everyday-18) [OpenSeaがNFTの二次流通に対するCreator Feeを強制ではなく取引するユーザーの任意にすることを発表したことで話題になっているロイヤリティ問題の詳細と、解決策の1つとなりうる独自マーケットプレイスについて書きました。](https://www.pontech.dev/post/dapps-everyday-18) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 21, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F43ea1016daa44fa4ac6cf6d04dad0f6149692544-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-17) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#17 MUDに入門してAutonomous Worldを触ってみる](https://www.pontech.dev/post/dapps-everyday-17) [グローバルのハッカソンではAutonomous Worldというテーマがよく聞かれます。フルオンチェーンゲームの解釈を進めたオンチェーンの自律的な世界のことだと認識していますが、どのように作られているのか詳しくないので一緒に見ていきましょう!](https://www.pontech.dev/post/dapps-everyday-17) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 18, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8f6d3e2feac6f1e70e387396568bb9b5e8d272c0-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-16) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#16 Token Bound Account (ERC6551) を導入する](https://www.pontech.dev/post/dapps-everyday-16) [ERC6551はトークンバウンドアカウントというNFTに紐づいたスマートアカウントを作成する規格です。](https://www.pontech.dev/post/dapps-everyday-16) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 17, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fdae5087857d25133d7f0ca1bf5553d177223ecd7-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-15) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#15 OPStackを使って独自のLayer2チェーンを立てる](https://www.pontech.dev/post/dapps-everyday-15) [まいにちDapps15日目はOptimismが提供しているOPStackを使って独自のLayer2チェーンを作成してみます。各アプリが独自のApp Chainを持つことの流れは加速すると思いますので、どれくらいの難易度なのか、その手順を見ていきましょう。](https://www.pontech.dev/post/dapps-everyday-15) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 16, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4c46065150b0992b998965e271594d1510792b89-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-14) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#14 Chainlinkを使ってDynamic NFTを作る](https://www.pontech.dev/post/dapps-everyday-14) [Dynamic NFTとはメタデータがある条件で切り替わるNFTのことと定義します。ChainlinkのAutomationを使ってメタデータを切り替えるNFTの実装方法について解説しました。](https://www.pontech.dev/post/dapps-everyday-14) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 15, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F83462a2a9a372e153ad061ebd69dd73b915ee89c-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-13) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#13 ERC4337を理解する](https://www.pontech.dev/post/dapps-everyday-13) [AAは、全てのアカウントをスマートコントラクトにすることで、ウォレットのセキュリティの向上を目指すものです。コントラクトウォレットは様々なロジックをプログラムできますから、例えばウォレットが扱える通貨の上限を決めたり、ガーディアンを設定してソーシャルリカバリーを実現したり等ができます。](https://www.pontech.dev/post/dapps-everyday-13) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 14, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F06bd7cc81163c884590f038a9f4b70250af770b4-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-12) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#12 NFTのステーキングコントラクトの開発](https://www.pontech.dev/post/dapps-everyday-12) [トークンのステーキングについて改めて概念を整理し、NFTステーキングのコントラクトをデプロイする方法を解説しました。](https://www.pontech.dev/post/dapps-everyday-12) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 09, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ffa54c63e60d118aff03c9913a5e9f8297083b774-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-11) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#11 DAOの基礎中の基礎、On-chainガバナンスを実装する](https://www.pontech.dev/post/dapps-everyday-11) [OpenZeppelinのGovernorコントラクトを作成し、ProposalやVoteがどのように機能するかを確認します。TallyというDAOツールに登録して運用する方法を実践します。](https://www.pontech.dev/post/dapps-everyday-11) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 09, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd6ec582b1ae91c765e69e17f4b07bc3e2a58a697-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-10) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#10 クリプト決済の結果をオフチェーンのDBに反映する](https://www.pontech.dev/post/dapps-everyday-10) [通常のオフチェーンのデータベースで管理しているサービスに暗号資産決済を導入する場合、自社で決済完了のイベントを監視する必要があります。今回はSlash Paymentを使って実装する方法について書きました。](https://www.pontech.dev/post/dapps-everyday-10) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 08, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F33c7ab21f4ddb54795be632573d37a224879c17b-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-9) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#9 クリプト決済のサブスクを作る【Superfluid】](https://www.pontech.dev/post/dapps-everyday-9) [Superfluidは世界中のDAOや暗号ネイティブビジネスに対してサブスクリプションを可能とするスマートコントラクトのフレームワークです。Superfluidでは既存のトークンをSuper TokenというERC20標準の拡張トークンにwrapします。Super Tokenは定期支払い機能を持っていて、1回のトランザクションだけで定期支払いを開始することができ、デポジットも必要ありません。](https://www.pontech.dev/post/dapps-everyday-9) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 07, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F585845a20f52c2f06b6d015953a6da608601a232-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-8) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) [NFT](https://www.pontech.dev/category/nft) ## [まいにちDapps\#8 Manifoldの開発者向け機能で何ができるのか](https://www.pontech.dev/post/dapps-everyday-8) [クリエイター向けのNFT発行ツールとして人気のManifoldで提供されているDeveloper向けの機能を俯瞰して、どんなアプリケーションが作れるのか考察します。](https://www.pontech.dev/post/dapps-everyday-8) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 04, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F50020edc35be4ae61cdabed8feb18036c864b635-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-7) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#7 トークンゲート機能付きのECサイトを構築する](https://www.pontech.dev/post/dapps-everyday-7) [NFTホルダーに対してフィジカルグッズを限定販売したり特別に割引をしたりする際、ShopifyなどのECサイト構築サービスにトークンゲート機能を導入する方法をご紹介します。](https://www.pontech.dev/post/dapps-everyday-7) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 03, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fadd64c066fe1637d132f3a1661e74537141c65f7-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-6) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#6 トークンゲート機能を持ったwebサイトやコンテンツの作成方法](https://www.pontech.dev/post/dapps-everyday-6) [NFTやERC20トークンなど特定のトークンを保有しているユーザーのみがアクセスできるコンテンツやサービスを提供する仕組み、トークンゲートの実装方法について解説しました。](https://www.pontech.dev/post/dapps-everyday-6) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 02, 2023 [![まいにちDapps#5 web3ウォレットとFirebaseAuthとを繋げる](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb5d55c35b28281ce9fab49ef537536f4a1bbe83e-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-5) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#5 web3ウォレットとFirebaseAuthとを繋げる](https://www.pontech.dev/post/dapps-everyday-5) [Dappsのフロントエンドでウォレット接続をしたあと、ユーザーごとにオフチェーンのデータ管理が必要になる場合もあります。その際は従来のオフチェーンのデータベース(クラウド)を利用したデータ管理とAuthでの権限管理をする必要があります。](https://www.pontech.dev/post/dapps-everyday-5) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 01, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff53f6fc19f59e9ea3fbd6e2da369c730b67bdefd-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-4) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#4 ガスレスで使えるDappsの作り方まとめ](https://www.pontech.dev/post/dapps-everyday-4) [ユーザーがガス代を払わずともブロックチェーンに対してトランザクションを発行してもらえるDappsの開発方法、開発に使えるツール・サービスを3つ紹介します。OpenZeppelin Defender、Biconomy、Gelato+Safeという3つです。](https://www.pontech.dev/post/dapps-everyday-4) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •July 31, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F3180deee8079daf78d3435cab223cf7cc559fbc3-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-3) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#3 サービス内ウォレットを作成できるツールまとめ](https://www.pontech.dev/post/dapps-everyday-3) [サービス内でウォレットを作成しweb2と似たUXでのウォレット接続を提供する際に使える便利なツールと導入方法をまとめます。](https://www.pontech.dev/post/dapps-everyday-3) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •July 28, 2023 [![クレカ決済できるNFTのmintサイトの作り方](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa39472fe25919f2e416c3828d235f2d46e9ac3c2-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-2) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#2 クレカ決済できるNFTのmintサイトの作り方](https://www.pontech.dev/post/dapps-everyday-2) [クレジットカード決済できるNFTのmintサイトの作り方を解説します。\\ PaperのCheckout機能、crossmintのCheckout機能、Stripeでの実装といった異なる3つのパターンを紹介します。](https://www.pontech.dev/post/dapps-everyday-2) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •July 27, 2023 [![NFTのmintサイトの作り方](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8425c04e4f90c44a93a2feabe378625325183e9f-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-1) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#1 NFTのmintサイトの作り方](https://www.pontech.dev/post/dapps-everyday-1) [Thirdwebを使ったNFT mintサイト作成まで詳しく解説します。NFTコレクタブルの発行、Claim Conditionsの設定、Next.jsを使ったフロントエンド開発までを実践的に学べます。初心者から上級者まで、自分だけのNFTの世界を創造する基盤を築くための一助となるガイドです。](https://www.pontech.dev/post/dapps-everyday-1) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •July 26, 2023 Copyright © 2025Pontech.Inc SystemDarkLight ## Pontech Archive # Archive See all posts we have ever written. [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6ea263cdc7056762e1f41fc312fe1ca638fb89a6-1200x630.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-ec-release-english) [プレスリリース](https://www.pontech.dev/category/press) ## [Pontech, in Collaboration with Hakuhodo Key3 and Hakuhodo, Releases Demo of a “Kaiwai” Limited E-Commerce Site Powered by zkTLS](https://www.pontech.dev/post/zktls-ec-release-english) [Pontech, in collaboration with Hakuhodo Key3 and Hakuhodo, presents a “Kaiwai” Limited E-Commerce demo powered by zkTLS, enabling exclusive purchases for verified community members.](https://www.pontech.dev/post/zktls-ec-release-english) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •March 25, 2025 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6ea263cdc7056762e1f41fc312fe1ca638fb89a6-1200x630.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-ec-release) [プレスリリース](https://www.pontech.dev/category/press) ## [博報堂キースリー・博報堂とともにzkTLSを活用した「界隈」限定ECサイトのデモを公開](https://www.pontech.dev/post/zktls-ec-release) [Pontechは博報堂キースリー・博報堂と共同で、zkTLSを活用した「界隈」限定ECサイトのデモを公開。特定コミュニティに属するユーザーだけが商品を購入できる新しい購買体験を実現します。](https://www.pontech.dev/post/zktls-ec-release) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •March 25, 2025 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb1bbd1b50354af24617256719172ed89548d8bdf-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-ai-agent) [技術記事](https://www.pontech.dev/category/tech) ## [Crypto AI AgentとzkTLSを活用したユースケースと未来展望](https://www.pontech.dev/post/zktls-ai-agent) [「Crypto×AI Agent」の注目が高まる2024年末〜2025年に向け、幻滅期に見える今だからこそ本質的な開発が加速中。本記事では一般的なAI Agentとの違いや、zkTLSとの融合による可能性、具体的なユースケースと展望を詳しく解説します。Pontechが取り組む最新事例も必見です。](https://www.pontech.dev/post/zktls-ai-agent) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •January 14, 2025 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe3ba3ff384af116b65443f3c94159c26ba141626-2940x1592.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-app-dev-zkpass) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSプロトコルを使用したアプリケーション開発【zkPass編】](https://www.pontech.dev/post/zktls-app-dev-zkpass) [zkPassを用いたDapps開発の手順について解説](https://www.pontech.dev/post/zktls-app-dev-zkpass) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •December 02, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2b7775a6230d49c4541af3c86f59c8d61d113027-1200x675.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-app-dev-reclaim-protocol) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSプロトコルを使用したアプリケーション開発【Reclaim Protocol編】](https://www.pontech.dev/post/zktls-app-dev-reclaim-protocol) [Reclaim Protocolを用いたDapps開発の手順について解説](https://www.pontech.dev/post/zktls-app-dev-reclaim-protocol) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •December 01, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5dca715352fe54eca72a3aabb9b759fd972be647-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-current-position) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSの現在地と実用化に向けた課題](https://www.pontech.dev/post/zktls-current-position) [本記事では、ユーザーのデータ主権を取り戻す革新的な技術zkTLSについて、技術的制約、UX改善の必要性、法的課題の3つの観点から深掘りします。Web3やプライバシー保護の未来に向けた最新の取り組みをぜひご覧ください。](https://www.pontech.dev/post/zktls-current-position) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •November 28, 2024 Copyright © 2025 Pontech.Inc SystemDarkLight ## Pontech Blog [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6ea263cdc7056762e1f41fc312fe1ca638fb89a6-1200x630.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-ec-release-english) [プレスリリース](https://www.pontech.dev/category/press) ## [Pontech, in Collaboration with Hakuhodo Key3 and Hakuhodo, Releases Demo of a “Kaiwai” Limited E-Commerce Site Powered by zkTLS](https://www.pontech.dev/post/zktls-ec-release-english) [Pontech, in collaboration with Hakuhodo Key3 and Hakuhodo, presents a “Kaiwai” Limited E-Commerce demo powered by zkTLS, enabling exclusive purchases for verified community members.](https://www.pontech.dev/post/zktls-ec-release-english) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •March 26, 2025 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6ea263cdc7056762e1f41fc312fe1ca638fb89a6-1200x630.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-ec-release) [プレスリリース](https://www.pontech.dev/category/press) ## [博報堂キースリー・博報堂とともにzkTLSを活用した「界隈」限定ECサイトのデモを公開](https://www.pontech.dev/post/zktls-ec-release) [Pontechは博報堂キースリー・博報堂と共同で、zkTLSを活用した「界隈」限定ECサイトのデモを公開。特定コミュニティに属するユーザーだけが商品を購入できる新しい購買体験を実現します。](https://www.pontech.dev/post/zktls-ec-release) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •March 26, 2025 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb1bbd1b50354af24617256719172ed89548d8bdf-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-ai-agent) [技術記事](https://www.pontech.dev/category/tech) ## [Crypto AI AgentとzkTLSを活用したユースケースと未来展望](https://www.pontech.dev/post/zktls-ai-agent) [「Crypto×AI Agent」の注目が高まる2024年末〜2025年に向け、幻滅期に見える今だからこそ本質的な開発が加速中。本記事では一般的なAI Agentとの違いや、zkTLSとの融合による可能性、具体的なユースケースと展望を詳しく解説します。Pontechが取り組む最新事例も必見です。](https://www.pontech.dev/post/zktls-ai-agent) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •January 14, 2025 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe3ba3ff384af116b65443f3c94159c26ba141626-2940x1592.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-app-dev-zkpass) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSプロトコルを使用したアプリケーション開発【zkPass編】](https://www.pontech.dev/post/zktls-app-dev-zkpass) [zkPassを用いたDapps開発の手順について解説](https://www.pontech.dev/post/zktls-app-dev-zkpass) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •December 03, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2b7775a6230d49c4541af3c86f59c8d61d113027-1200x675.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-app-dev-reclaim-protocol) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSプロトコルを使用したアプリケーション開発【Reclaim Protocol編】](https://www.pontech.dev/post/zktls-app-dev-reclaim-protocol) [Reclaim Protocolを用いたDapps開発の手順について解説](https://www.pontech.dev/post/zktls-app-dev-reclaim-protocol) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •December 02, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5dca715352fe54eca72a3aabb9b759fd972be647-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-current-position) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSの現在地と実用化に向けた課題](https://www.pontech.dev/post/zktls-current-position) [本記事では、ユーザーのデータ主権を取り戻す革新的な技術zkTLSについて、技術的制約、UX改善の必要性、法的課題の3つの観点から深掘りします。Web3やプライバシー保護の未来に向けた最新の取り組みをぜひご覧ください。](https://www.pontech.dev/post/zktls-current-position) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •November 28, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F408aeb0783c5f805691b0a5fcd42fe4def1a4577-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/think-about-zktls) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSについての考察と期待する理由](https://www.pontech.dev/post/think-about-zktls) [TLS通信とゼロ知識証明を組み合わせたzkTLSが、Web2とWeb3をつなぐ革新的な技術として注目されています。現状の課題、ユースケース、採用の可能性を通じて、zkTLSがどのように新しい価値を創出するかを探ります。](https://www.pontech.dev/post/think-about-zktls) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •November 28, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F09f9e3ed1714e930967d419a88231d3c2b5b1cb4-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLS技術の解説とETH Tokyoハッカソン参加レポート](https://www.pontech.dev/post/zktls) [ETH Tokyoハッカソンで受賞したzkCreditプロジェクトを解説。zkTLSとzkMLを組み合わせ、Web2とWeb3をつなぐ革新的な信用スコアシステムの可能性を探ります。DeFiやゲーム業界での応用例も紹介。](https://www.pontech.dev/post/zktls) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •September 02, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9d74d599a3ac1fbed90e6a08cad954a9d1d0157a-2786x1508.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/nft-minting-solution) [技術記事](https://www.pontech.dev/category/tech) ## [マーケットプレイス・国内向け発行ソリューションを利用したNFTの発行方法](https://www.pontech.dev/post/nft-minting-solution) [NFT(Non-Fungible Token)は、ブロックチェーン上で構築できる代替不可能なトークンです。\\ 本記事では、NFTマーケットプレイスと呼ばれるNFTの作成、出品、購入を行えるプラットフォームや、NFT発行に特化したアプリケーションを比較しながら、誰でも手軽にNFTを発行できる方法を紹介します!](https://www.pontech.dev/post/nft-minting-solution) ![Matzo](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa1180731f9bb31b8725afa4543fa058a3675cea1-876x744.png%3Fw%3D876%26auto%3Dformat&w=3840&q=75) Matzo •May 13, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b4f01fa09ecf7b5062c5ffe265cf7cef831fd92-2560x1600.png%3Frect%3D0%2C68%2C2560%2C1464%26w%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/nft-api) [技術記事](https://www.pontech.dev/category/tech) ## [Dapps開発におけるNFT APIの選択肢まとめ・比較](https://www.pontech.dev/post/nft-api) [NFTを活用したDappsの開発において、適切なNFT APIの選択は非常に重要です。本記事では、NFTミントサイト、マーケットプレイス、ウォレットなど、さまざまなDappsに適したNFT APIの機能を比較し、開発者が最適なAPIを選べるよう、APIの選び方のヒントをまとめます。](https://www.pontech.dev/post/nft-api) ![mizuno](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F812300fd2e4f4f99d805ed62b76d19e372b23c6f-3024x4032.jpg%3Frect%3D0%2C0%2C1709%2C2677%26w%3D2000%26auto%3Dformat&w=3840&q=75) mizuno •April 30, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fadbd52e27526bf3bfe1a9bdd85e38fa9b5a38de9-2940x1654.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/rollup-sdk-rollup-as-a-service) [技術記事](https://www.pontech.dev/category/tech) ## [Rollup SDKとRollup as a Serviceの比較・まとめ](https://www.pontech.dev/post/rollup-sdk-rollup-as-a-service) [あなたの企業やプロジェクトが独自のLayer2を開発する場合、どのような選択肢があるのでしょうか?この記事ではRollup SDKとRollup as a Serviceを比較してまとめてみます。](https://www.pontech.dev/post/rollup-sdk-rollup-as-a-service) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •April 24, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F97dba32d131fb408c75ea0b0cd61fcb6ee67611f-2940x1652.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/node-as-a-service) [技術記事](https://www.pontech.dev/category/tech) ## [Dapps開発におけるNode as a Serviceの比較・まとめ](https://www.pontech.dev/post/node-as-a-service) [独自のノードをセットアップするのは時間とコストがかかるため、2の選択肢を採ることが一般的です。このサードパーティによって提供されるノードとの通信ができるAPIをJSON RPC APIと言ったりします。またこのサービスのことをノード運用サービスやNode as a Serviceと呼びます。](https://www.pontech.dev/post/node-as-a-service) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •April 11, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fce4b185bf3c8d091622b19dfe4a61b4e983937dd-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/wallet-adaptors) [技術記事](https://www.pontech.dev/category/tech) ## [Dapps開発におけるウォレット接続の選択肢まとめ・比較](https://www.pontech.dev/post/wallet-adaptors) [Dapps開発におけるさまざまなウォレット接続のための開発ツールを比較し、各ツールの特徴、長所、短所を検討することで、開発者やプロジェクトマネージャーがプロジェクトの要件に最も適したウォレット接続方法を選択できるように情報を提供します。](https://www.pontech.dev/post/wallet-adaptors) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •April 03, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6410467e72a60843a0ca27dbe34b7bc4b08f3590-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-20) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#20 フルオンチェーンの着せ替えNFT](https://www.pontech.dev/post/dapps-everyday-20) [誰でも簡単にピクセルアートをフルオンチェーンNFT化できるアプリ、そしてそのフルオンチェーンNFTを着せ替えできるというコントラクトについて解説します。](https://www.pontech.dev/post/dapps-everyday-20) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 22, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe25e0b7ed6f8395474b9d4586164911600c79de0-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-19) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#19 このブログの記事をNFT化してみる](https://www.pontech.dev/post/dapps-everyday-19) [まいにちDappsも目標としていた20回まで残りわずかとなりました。\\ 今回はこのブログ記事をNFTにしてmintできるようにしたいと思います。](https://www.pontech.dev/post/dapps-everyday-19) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 22, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff627205fcf9b0caacbb09b74c9cb843e11896d5a-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-18) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#18 NFTのOnchain-Royaltyと独自マケプレの導入](https://www.pontech.dev/post/dapps-everyday-18) [OpenSeaがNFTの二次流通に対するCreator Feeを強制ではなく取引するユーザーの任意にすることを発表したことで話題になっているロイヤリティ問題の詳細と、解決策の1つとなりうる独自マーケットプレイスについて書きました。](https://www.pontech.dev/post/dapps-everyday-18) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 21, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F43ea1016daa44fa4ac6cf6d04dad0f6149692544-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-17) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#17 MUDに入門してAutonomous Worldを触ってみる](https://www.pontech.dev/post/dapps-everyday-17) [グローバルのハッカソンではAutonomous Worldというテーマがよく聞かれます。フルオンチェーンゲームの解釈を進めたオンチェーンの自律的な世界のことだと認識していますが、どのように作られているのか詳しくないので一緒に見ていきましょう!](https://www.pontech.dev/post/dapps-everyday-17) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 18, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8f6d3e2feac6f1e70e387396568bb9b5e8d272c0-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-16) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#16 Token Bound Account (ERC6551) を導入する](https://www.pontech.dev/post/dapps-everyday-16) [ERC6551はトークンバウンドアカウントというNFTに紐づいたスマートアカウントを作成する規格です。](https://www.pontech.dev/post/dapps-everyday-16) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 17, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fdae5087857d25133d7f0ca1bf5553d177223ecd7-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-15) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#15 OPStackを使って独自のLayer2チェーンを立てる](https://www.pontech.dev/post/dapps-everyday-15) [まいにちDapps15日目はOptimismが提供しているOPStackを使って独自のLayer2チェーンを作成してみます。各アプリが独自のApp Chainを持つことの流れは加速すると思いますので、どれくらいの難易度なのか、その手順を見ていきましょう。](https://www.pontech.dev/post/dapps-everyday-15) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 16, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4c46065150b0992b998965e271594d1510792b89-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-14) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#14 Chainlinkを使ってDynamic NFTを作る](https://www.pontech.dev/post/dapps-everyday-14) [Dynamic NFTとはメタデータがある条件で切り替わるNFTのことと定義します。ChainlinkのAutomationを使ってメタデータを切り替えるNFTの実装方法について解説しました。](https://www.pontech.dev/post/dapps-everyday-14) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 15, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F83462a2a9a372e153ad061ebd69dd73b915ee89c-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-13) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#13 ERC4337を理解する](https://www.pontech.dev/post/dapps-everyday-13) [AAは、全てのアカウントをスマートコントラクトにすることで、ウォレットのセキュリティの向上を目指すものです。コントラクトウォレットは様々なロジックをプログラムできますから、例えばウォレットが扱える通貨の上限を決めたり、ガーディアンを設定してソーシャルリカバリーを実現したり等ができます。](https://www.pontech.dev/post/dapps-everyday-13) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 14, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F06bd7cc81163c884590f038a9f4b70250af770b4-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-12) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#12 NFTのステーキングコントラクトの開発](https://www.pontech.dev/post/dapps-everyday-12) [トークンのステーキングについて改めて概念を整理し、NFTステーキングのコントラクトをデプロイする方法を解説しました。](https://www.pontech.dev/post/dapps-everyday-12) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 09, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ffa54c63e60d118aff03c9913a5e9f8297083b774-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-11) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#11 DAOの基礎中の基礎、On-chainガバナンスを実装する](https://www.pontech.dev/post/dapps-everyday-11) [OpenZeppelinのGovernorコントラクトを作成し、ProposalやVoteがどのように機能するかを確認します。TallyというDAOツールに登録して運用する方法を実践します。](https://www.pontech.dev/post/dapps-everyday-11) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 09, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd6ec582b1ae91c765e69e17f4b07bc3e2a58a697-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-10) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#10 クリプト決済の結果をオフチェーンのDBに反映する](https://www.pontech.dev/post/dapps-everyday-10) [通常のオフチェーンのデータベースで管理しているサービスに暗号資産決済を導入する場合、自社で決済完了のイベントを監視する必要があります。今回はSlash Paymentを使って実装する方法について書きました。](https://www.pontech.dev/post/dapps-everyday-10) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 08, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F33c7ab21f4ddb54795be632573d37a224879c17b-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-9) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#9 クリプト決済のサブスクを作る【Superfluid】](https://www.pontech.dev/post/dapps-everyday-9) [Superfluidは世界中のDAOや暗号ネイティブビジネスに対してサブスクリプションを可能とするスマートコントラクトのフレームワークです。Superfluidでは既存のトークンをSuper TokenというERC20標準の拡張トークンにwrapします。Super Tokenは定期支払い機能を持っていて、1回のトランザクションだけで定期支払いを開始することができ、デポジットも必要ありません。](https://www.pontech.dev/post/dapps-everyday-9) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 07, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F585845a20f52c2f06b6d015953a6da608601a232-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-8) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) [NFT](https://www.pontech.dev/category/nft) ## [まいにちDapps\#8 Manifoldの開発者向け機能で何ができるのか](https://www.pontech.dev/post/dapps-everyday-8) [クリエイター向けのNFT発行ツールとして人気のManifoldで提供されているDeveloper向けの機能を俯瞰して、どんなアプリケーションが作れるのか考察します。](https://www.pontech.dev/post/dapps-everyday-8) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 04, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F50020edc35be4ae61cdabed8feb18036c864b635-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-7) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#7 トークンゲート機能付きのECサイトを構築する](https://www.pontech.dev/post/dapps-everyday-7) [NFTホルダーに対してフィジカルグッズを限定販売したり特別に割引をしたりする際、ShopifyなどのECサイト構築サービスにトークンゲート機能を導入する方法をご紹介します。](https://www.pontech.dev/post/dapps-everyday-7) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 03, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fadd64c066fe1637d132f3a1661e74537141c65f7-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-6) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#6 トークンゲート機能を持ったwebサイトやコンテンツの作成方法](https://www.pontech.dev/post/dapps-everyday-6) [NFTやERC20トークンなど特定のトークンを保有しているユーザーのみがアクセスできるコンテンツやサービスを提供する仕組み、トークンゲートの実装方法について解説しました。](https://www.pontech.dev/post/dapps-everyday-6) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 02, 2023 [![まいにちDapps#5 web3ウォレットとFirebaseAuthとを繋げる](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb5d55c35b28281ce9fab49ef537536f4a1bbe83e-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-5) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#5 web3ウォレットとFirebaseAuthとを繋げる](https://www.pontech.dev/post/dapps-everyday-5) [Dappsのフロントエンドでウォレット接続をしたあと、ユーザーごとにオフチェーンのデータ管理が必要になる場合もあります。その際は従来のオフチェーンのデータベース(クラウド)を利用したデータ管理とAuthでの権限管理をする必要があります。](https://www.pontech.dev/post/dapps-everyday-5) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 01, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff53f6fc19f59e9ea3fbd6e2da369c730b67bdefd-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-4) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#4 ガスレスで使えるDappsの作り方まとめ](https://www.pontech.dev/post/dapps-everyday-4) [ユーザーがガス代を払わずともブロックチェーンに対してトランザクションを発行してもらえるDappsの開発方法、開発に使えるツール・サービスを3つ紹介します。OpenZeppelin Defender、Biconomy、Gelato+Safeという3つです。](https://www.pontech.dev/post/dapps-everyday-4) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •July 31, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F3180deee8079daf78d3435cab223cf7cc559fbc3-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-3) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#3 サービス内ウォレットを作成できるツールまとめ](https://www.pontech.dev/post/dapps-everyday-3) [サービス内でウォレットを作成しweb2と似たUXでのウォレット接続を提供する際に使える便利なツールと導入方法をまとめます。](https://www.pontech.dev/post/dapps-everyday-3) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •July 28, 2023 [![クレカ決済できるNFTのmintサイトの作り方](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa39472fe25919f2e416c3828d235f2d46e9ac3c2-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-2) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#2 クレカ決済できるNFTのmintサイトの作り方](https://www.pontech.dev/post/dapps-everyday-2) [クレジットカード決済できるNFTのmintサイトの作り方を解説します。\\ PaperのCheckout機能、crossmintのCheckout機能、Stripeでの実装といった異なる3つのパターンを紹介します。](https://www.pontech.dev/post/dapps-everyday-2) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •July 27, 2023 [![NFTのmintサイトの作り方](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8425c04e4f90c44a93a2feabe378625325183e9f-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-1) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) ## [まいにちDapps\#1 NFTのmintサイトの作り方](https://www.pontech.dev/post/dapps-everyday-1) [Thirdwebを使ったNFT mintサイト作成まで詳しく解説します。NFTコレクタブルの発行、Claim Conditionsの設定、Next.jsを使ったフロントエンド開発までを実践的に学べます。初心者から上級者まで、自分だけのNFTの世界を創造する基盤を築くための一助となるガイドです。](https://www.pontech.dev/post/dapps-everyday-1) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •July 26, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcf52468ec0aeb694448fe5fc97a2eef471f0cc78-2862x1560.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/tvasahi-hackathon) ## [テレビ朝日主催の「Web3エンタメハッカソン」で入賞しました!](https://www.pontech.dev/post/tvasahi-hackathon) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •April 29, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff2afac11a97cfe491bb3c2256cb2c456ef9270e0-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/toyota-hackathon) [Hackathon](https://www.pontech.dev/category/hackathon) ## [「web3 Hackathon|トヨタ自動車 × 博報堂キースリー」で入賞しました!](https://www.pontech.dev/post/toyota-hackathon) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •April 01, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b627a0e9462fe21e6ac9d28e6341ea665a224fa-1716x966.png%3Fw%3D1716%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/astar-slash-hackathon) [Hackathon](https://www.pontech.dev/category/hackathon) ## [Astar×Slash Bounty Bootcamp Hackathonで入賞しました!](https://www.pontech.dev/post/astar-slash-hackathon) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •March 07, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcc713c7c43cfbc575734186c4c6727dab4295ea5-812x476.png%3Fw%3D812%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/established-company) [Company](https://www.pontech.dev/category/company) ## [株式会社Pontechを創業しました!](https://www.pontech.dev/post/established-company) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •January 15, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1149753a12b469acf88b15f730685e694650d182-1400x766.png%3Fw%3D1400%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/aptos-tutorial-1) [Aptos](https://www.pontech.dev/category/aptos) ## [Aptosに入門する 2023/01時点](https://www.pontech.dev/post/aptos-tutorial-1) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •January 08, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F110a170c7aaf60af6bf2576cf4f9cbf2573deea9-2880x1584.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/thirdweb-simple) [thirdweb](https://www.pontech.dev/category/thirdweb) [NFT](https://www.pontech.dev/category/nft) ## [ThirdwebでNFTを発行する一番シンプルな方法【初級者・非エンジニア向け】](https://www.pontech.dev/post/thirdweb-simple) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •December 14, 2022 Copyright © 2025Pontech.Inc SystemDarkLight ## Token Gated E-Commerce [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#7 トークンゲート機能付きのECサイトを構築する [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 03, 2023· 4 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F50020edc35be4ae61cdabed8feb18036c864b635-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) [前回](https://www.pontech.dev/post/dapps-everyday-6) はトークンゲート付きのwebサイト・コンテンツ閲覧サイトのようなものを構築しました。一歩進めてNFTホルダーに対してフィジカルグッズを販売したり無料でプレゼントする場合に、ゼロからECサイトを構築するのはハードルが高いので、ECサイト構築サービスに連携する方法をご紹介します。 ### Shopify × Manifold この記事はもともとThirdweb×Shopifyの連携について書こうと思ったのですが、途中で見つけたManifoldのプラグインが素晴らしかったのでまずこちらを紹介させてください。 How to Setup a Token Gated Shopify Store \| Manifold Merch Bridge Setup Tutorial - YouTube Manifold Studio 359 subscribers [How to Setup a Token Gated Shopify Store \| Manifold Merch Bridge Setup Tutorial](https://www.youtube.com/watch?v=9nYzZpv4oKQ) Manifold Studio Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=9nYzZpv4oKQ&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 11:08•Live • [Watch on YouTube](https://www.youtube.com/watch?v=9nYzZpv4oKQ "Watch on YouTube") Shopifyパートナーズのページに行きログインします。 [https://www.shopify.com/partners](https://www.shopify.com/partners) 開発ストアを作成します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9249c91db4b141da7ce1f79f726b9a9341963cfa-2738x1268.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F31cb706687e1c499cd4837c5aeed0399b175c3de-2940x2356.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) テストデータを入れたので商品管理にダミーの商品が並びました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4b4bf52745b0168bab478c2b2a5f2d37738109e3-2382x1506.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 商品を1つ選んで商品タイプに「Manifold」と記入して保存します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F0f04381b2d6a2f45c6455e9066facc689d850c7f-1998x884.png%3Fw%3D1998%26auto%3Dformat&w=3840&q=75) Shopifyアプリストアへ遷移し、Manifold Merch Bridgeを追加します。 New Product GateからProduct Gateを作成します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Faae540b74b79d34b167aebbe99cdf1ec66f336c2-2014x1040.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) トークンゲートを設けたい商品を選択肢、ルールをこのように設定します。特定のToken IDやToken IDの範囲指定、Attributeでの指定などよく考えられていますね!%のDiscountも絶対値でのDiscountも指定できます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8ea8ea0f34fdc68556606296239529165e420fad-2152x1282.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 次にShopifyのストアをカスタマイズしていきます。 オンラインストアからテーマを選択してカスタマイズをクリック、「デフォルトの商品」ページを選びます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F01d92e0acc2da060c5bf62e39052692ef1a35735-2894x1642.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 「ブロックを追加」でManifoldのBuy Buttonを追加します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F680e361a74b4adc5aeccd02eb337973d19f65091-1234x1114.png%3Fw%3D1234%26auto%3Dformat&w=3840&q=75) ストアを見るからプレビューが見れます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7071a51175182924e2916012f3f189a42ea79d77-2912x1466.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) NFTを保持していない場合 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff3873c12b1ba62ce3d5a722706a292a93923d559-2456x1324.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) NFTを保持している場合↓ ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb05e45f4d6af938ff7a4365ee0ac0eb915a12dcd-2604x1300.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fffe9931a4c59797f20e1c37d12664420bf15cdeb-1726x1094.png%3Fw%3D1726%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa25f6084b0204a25b96053073b4c2c0ddd2e0c55-1004x642.png%3Fw%3D1004%26auto%3Dformat&w=3840&q=75) 非常によくできていて感動しました。他のアプリが有料のものも多い中、全ての機能が無料で使えるのも素晴らしいですね! ### Thirdweb × Shopify ShopifyはThirdwebのシリーズAラウンドに投資家として参加し、提携を進めています。 ThirdwebはShopifyとのパートナーシップに基づき、Commerce Kitというソリューションを提供しています。 [https://thirdweb.com/solutions/commerce](https://thirdweb.com/solutions/commerce) 下記のブログ記事を辿っていくと [https://portal.thirdweb.com/commercekit/get-started/integration](https://portal.thirdweb.com/commercekit/get-started/integration) 下記のShopが完成するようです。 [https://thirdweb.myshopify.com/](https://thirdweb.myshopify.com/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F01ef707a6a7ec66496f0c7130dc6a2551a978d4f-2470x1480.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa73f139890ebdbe363bee5b106dff3b59c6de12d-1766x1204.png%3Fw%3D1766%26auto%3Dformat&w=3840&q=75) ## BASEになんちゃってトークンゲートを実装する 日本国内で人気のBASEにはHTML編集機能があり、フロントエンドのデザインをカスタマイズすることができます。その機能を利用してフロントエンドでウォレット接続してNFTの保有状況に応じて購入ボタンを出し分けるという実装をしてみました。 HTML編集アプリを追加 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcb29b2896a0c5d7a91948e1d9a175673b232526b-1776x958.png%3Fw%3D1776%26auto%3Dformat&w=3840&q=75) テーマ一覧からエディタに入る ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7206425b9e90c20097fc33c074709f0878552401-2116x706.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F97a37623b4647a6b5f2ea768bf448ec2ee478ee0-2890x1414.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ボタンのcssクラスを探して以下のようなコードを追加しました。 ```html ``` カートに入れる前にウォレット接続を求められ、NFTの保有の有無を確認できたらカートに追加ボタンが表示されるという仕組みです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9b22a63c7fe4fd27bd02c60bc38af7dcbfe21ecb-802x546.png%3Fw%3D802%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa10efb33f5a64eb8b6184992088e299c4db75572-712x618.png%3Fw%3D712%26auto%3Dformat&w=3840&q=75) バックエンドを介して認証を行っていないのでhtml javascriptの知識がある方は簡単に偽装できてしまうのが難点ですが、BASEさん本家のアプリの登場を待ちたいです。 ### まとめ NFTを起点にしたEコマースは今後増えてくると思います。ShopifyのようなプラットフォームでNFT認証機能が使えるのは非常に便利ですね!自分が発行しているNFTに限らず、例えば私が勝手にBAYCホルダー向けの割引を実施できる、というのがNFTの特徴ですね。NFTプロジェクトを運営している方や、小売店を営まれている方に参考にしていただきたいです。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Wallet Connection Options [技術記事](https://www.pontech.dev/category/tech) # Dapps開発におけるウォレット接続の選択肢まとめ・比較 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) April 03, 2024· 14 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fce4b185bf3c8d091622b19dfe4a61b4e983937dd-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75) Dapps開発において、どのウォレットに対応するかは非常に重要な論点となります。Metamaskなどのセルフカストディアルのウォレットを採用する場合、ユーザー自身が秘密鍵を管理する必要があり、これがUXの低下に繋がると指摘されることがしばしばあります。 ソーシャルログインを利用したWaaS(Wallet as a Service)を導入することで、従来のWeb2.0サービスと同等のユーザーエクスペリエンスを実現できますが、このアプローチには慎重な検討が必要です。一度特定のWaaSプロバイダーを使用し始めると、そのサービスに依存する形でベンダーロックインされてしまう恐れがあります。 本記事では、Dapps開発におけるさまざまなウォレット接続のための開発ツールを比較し、各ツールの特徴、長所、短所を検討することで、開発者やプロジェクトマネージャーがプロジェクトの要件に最も適したウォレット接続方法を選択できるように情報を提供します。 株式会社Pontechでは、Dapps開発の受託を請け負っております。本記事を通じて、ウォレット接続の選択肢に関する知識を深めるとともに、Dapps開発に関するご相談がございましたら、ぜひ当社までお問い合わせください。 ## ウォレット接続SDKの種類 ウォレット接続は、ユーザーエクスペリエンス(UX)に直結し、Dappsの採用と成功に不可欠な要素となります。 ウォレット接続の実装方法には大きく分けて、以下の4種類があります。 1. **単体ウォレットのSDK:** これは、特定のセルフカストディアルウォレット(例えばMetamaskやCoinbase Wallet)に直接接続するための開発キットです。特定のウォレットユーザー向けに最適化された機能を提供しますが、例えばMetamaskとCoinbase Walletの両方のウォレットをサポートする場合、自分でそれぞれ実装し、その整合性を取る必要があります。 2. **複数の単体ウォレットから選択して接続できる統合SDK:** Rainbow Kitのようなツールは、開発者がアプリケーションで複数のウォレットをサポートできるように設計されています。これにより、ユーザーは自分の好きなウォレットを選択してDappsに接続できるため、より広い範囲のユーザーを対象とすることが可能になります。 3. **ソーシャルログインベースのWaaS:** 上記1,2が秘密鍵を自分で管理するタイプのウォレットへの接続だったのに対し、Web2.0の世界で一般的なソーシャルアカウントを紐付けたウォレットを管理してくれるWaaS(Wallet as a Service)があります。PrivyやWeb3Authなどがこれに該当し、ユーザビリティを大幅に向上させることができますが、前述の通り、サービスプロバイダーへの依存度が高まるという側面もあります。また、Metamask接続など2の機能を併せ持つ場合もあります。 4. **ERC4337のコントラクトウォレット:** 上記1,3はEOAなのに対し、コントラクトウォレットをユーザーに付与することでUXを高める方法も考えられます。コントラクトのロジックで柔軟性を持たせられるので、例えば複数のトランザクションを1回の署名でまとめたり、送金額の上限を設けることも実現できます。ただしユーザーが署名するEOAが必要なため、1ないし3の方法でユーザーがEOAを保有した上でさらに実装することになります。 本記事では1~3について主要サービスを紹介します。4のコントラクトウォレットについては別の機会にまとめる予定です。 ## 1\. 単体ウォレットのSDK #### MetaMask - **概要:** Ethereumネットワークで最も広く利用されているウォレットの一つ。ブラウザ拡張機能として利用できるほか、モバイルアプリも提供しています。 - **ドキュメント: [Use MetaMask SDK](https://docs.metamask.io/wallet/how-to/use-sdk/)** #### Coinbase Wallet - **概要:** 世界最大級の暗号通貨取引所であるCoinbaseが提供するウォレット。セキュリティに優れ、初心者でも使いやすい設計が特徴です。 - **ドキュメント:** [**Welcome \| Coinbase Cloud**](https://docs.cloud.coinbase.com/wallet-sdk/docs/welcome) #### Trust Wallet - **概要:** Binanceが2018年に買収したモバイルファーストのウォレットで、多様なブロックチェーンと数千種類のトークンをサポートしています。 - **ドキュメント: [Developing for Trust Wallet platform](https://developer.trustwallet.com/developer/develop-for-trust/browser-extension/evm)** これらはセルフカストディアルなウォレットのSDKの一例です。実際にこれらのSDKを使って開発するケースは稀だと思います。Coinbase Walletのドキュメントでも次項のマルチウォレットSDKの利用を推奨しています。 ## 2\. **マルチウォレットを接続できる統合SDK** ウェブアプリケーション内に簡単にマルチウォレットサポートを追加できるライブラリです。ソース内で上記の単体SDKをセットアップしてくれているので、ライブラリを追加するだけで簡単に複数のウォレット接続に対応できます。 #### Rainbow Kit - **概要:** RainbowKitは、dappにウォレット接続を簡単に追加できる React ライブラリです。 直感的でレスポンシブでカスタマイズ可能です。 - **ドキュメント**: [導入 — RainbowKit](https://www.rainbowkit.com/ja/docs/introduction) - **デモ**: [https://www.rainbowkit.com/ja](https://www.rainbowkit.com/ja) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F293d5c0f3171d6f712046bf90221b0ef9d88539f-1458x1024.png%3Fw%3D1458%26auto%3Dformat&w=3840&q=75) - **対応ウォレット**: Argent、Bitget、Bifrost Wallet、Bitski、Bitverse、Bloom Wallet、Bybit Wallet、Brave Wallet、Coinbase Wallet、Coin98 Wallet、Core、Dawn Wallet、Enkrypt Wallet、FoxWallet、Frame Wallet、Frontier Wallet、Gate Wallet、Ledger Live、imToken、Kresus Wallet、MetaMask、MEW Wallet、OKX Wallet、Omni、1inch Wallet、OneKey、Phantom、Rabby Wallet、Rainbow、Ramper Wallet、Ronin Wallet、Safeheron、Taho、Talisman、Tokenary、TokenPocket、Trust Wallet、Uniswap Wallet、XDEFI Wallet、Zerion (40ウォレット 2024/4時点) - **UIの日本語化: 🙆‍♂️** #### Web3Modal - **概要:** Web3ModalはWalletConnectチームが提供するウォレット接続ライブラリです。数多くのウォレットと、モバイルを含む複数のフロントエンドのフレームワークに対応しています。 - **ドキュメント**: [Introduction \| WalletConnect Docs](https://docs.walletconnect.com/web3modal/about) - **デモ**: [https://web3modal.com/](https://web3modal.com/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff5971361de9a63bc3fc50b27042055cb828f94b5-1156x1018.png%3Fw%3D1156%26auto%3Dformat&w=3840&q=75) - **対応ウォレット**: Metamask、Coinbase Wallet、Trust Walletを始めとする **ほぼ全てのウォレット**(+380ウォレット 2024/4時点) - **UIの日本語化:** ❌ #### Web3-Onboard - **概要:** blocknativeが提供するオープンソースのフロントエンドライブラリ。 - **ドキュメント**: [Web3-Onboard \| Framework-agnostic Web3 Connect Wallet Button](https://onboard.blocknative.com/docs/overview/introduction) - **デモ**: [https://onboard.blocknative.com/examples/connect-wallet](https://onboard.blocknative.com/examples/connect-wallet) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F92dca51d520c3bf18477c68d486bbbd3a120a7c7-1654x946.png%3Fw%3D1654%26auto%3Dformat&w=3840&q=75) - **対応ウォレット**: Arcana Auth、Bitget、BitKeep、Blocto、Capsule、Coinbase、Dcent、Enkrypt、Fortmatic、Frame、Frontier、Safe、Infinity Wallet、Injected Wallets、Keepkey、Keystone、Ledger、Magic、MetaMask、MewMew Wallet、Particle Network、Phantom、Portis、Taho、Tally Ho、Torus、Trezor、UAuth、Venly、WalletConnect、Walletlink、Web3auth、XDEFI、Zeal - **UIの日本語化**: ❌ #### ConnectKit (Family) - **概要:** ConnectKitは、あなたのdAppにウォレットを接続するための強力なReactコンポーネントライブラリです。 - **ドキュメント:** [Connectors \| Wagmi](https://wagmi-xyz.vercel.app/react/api/connectors) - **デモ**: [Try It Out](https://docs.family.co/connectkit/try-it-out) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff388e5a58c97cf1a8041865a2a5a26ab9c25bb30-1682x1108.png%3Fw%3D1682%26auto%3Dformat&w=3840&q=75) - **対応ウォレット**: Metamask、Coinbase Wallet、その他はWalletConnect経由 - **UIの日本語化**: 🙆‍♂️ ## 3\. **ソーシャルログインベースのWaaS (Wallet as a Service)** ソーシャルログインベースのWaaSは、GoogleアカウントやFacebookアカウントなど、Web2.0で一般的なソーシャルメディアアカウントを使用して、ブロックチェーンウォレットへのアクセスを簡単にするサービスです。これにより、ユーザーは従来のウォレット作成や秘密鍵の管理といった複雑な手順を踏むことなく、ブロックチェーンアプリケーションの利用を開始できます。 #### [Web3Auth](https://web3auth.io/) - **概要**: Torus Walletの開発元であるTorus Labsが開発するWaaS。対応SNSが多く、比較的老舗のため、採用しているプロジェクトが多い。 - **ドキュメント**: [https://web3auth.io/docs/index.html](https://web3auth.io/docs/index.html) - **デモ**: [https://demo.web3auth.io/](https://demo.web3auth.io/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F312f8c8e8d48262a1f0743de57b917e56b52508e-1942x1348.png%3Fw%3D1942%26auto%3Dformat&w=3840&q=75) - **対応ネットワーク**: 全EVM、Solana、XRP - **対応SNS**: X、Google、Facebook、Twitch、Discord、Apple、LinkedIn、GitHub、LINE、Weibo、Kakao、Baidu、Bitbucket、Microsoft、RenRen、Slack、Spotify、vKontakte、Yandex - **技術**: tKey、MPC - **UIの日本語化**: 🙆‍♂️ #### [Magic](https://magic.link/) - **概要**: MagicはEmailログインを中心としたウォレット機能を提供するWaaS - **ドキュメント**: [https://magic.link/docs/home/welcome](https://magic.link/docs/home/welcome) - **デモ**: [https://codesandbox.io/s/github/magiclabs/magic-connect-verification-demo?file=/src/App.js](https://codesandbox.io/s/github/magiclabs/magic-connect-verification-demo?file=/src/App.js) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F3753e7b50088dc0dbc52bea90153a84b5efbdedd-1298x617.webp%3Fw%3D1298%26auto%3Dformat&w=3840&q=75) - **対応ネットワーク**: Ethereum・Polygon等の約15のEVMチェーン、Solana、Aptos、Bitcoin、FLOW - **対応SNS**: Google、Facebook、X、Apple、Discord、LinkedIn、Bitbucket、Twitch、Microsoft、GitLab - **技術**: tKey - **UIの日本語化**: 🙆‍♂️ #### [Privy](https://www.privy.io/) - **概要**: OpenSeaやCourtyard.ioにも採用されたUXの良いWaaS - **ドキュメント**: [https://docs.privy.io/](https://docs.privy.io/) - **デモ**: [https://demo.privy.io/](https://demo.privy.io/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F274742e137a2887fe37e5683c20ff7d3b755fce7-960x1086.png%3Fw%3D960%26auto%3Dformat&w=3840&q=75) - **対応ネットワーク**: 全EVMチェーン - **対応SNS**: Google、Facebook、X、Apple、Discord、LinkedIn、GitHub、TikTok、Farcaster - **技術**: tKey - **UIの日本語化**: ❌ #### [Thirdweb Connect](https://portal.thirdweb.com/connect) - **概要**: web3総合開発プラットフォームであるThirdwebの接続機能+WaaS - **ドキュメント**: [https://portal.thirdweb.com/connect/connect](https://portal.thirdweb.com/connect/connect) - **デモ**: [https://thirdweb.com/dashboard/connect/playground](https://thirdweb.com/dashboard/connect/playground) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F801ffb27404c04643321586c2ec3a7d1a0a82bb6-1886x1182.png%3Fw%3D1886%26auto%3Dformat&w=3840&q=75) - **対応ネットワーク**: 全EVMチェーン - **対応SNS**: Google、Facebook、X、Apple - **技術**: tKey - **UIの日本語化**: 🙆‍♂️ #### [Facewallet](https://facewallet.xyz/) - **概要**: 韓国発のWaaS。他WaaSではサービスごとにウォレットを生成しているのに対し、Facewalletはサービスを越えてウォレットを共通利用できる。 - **ドキュメント**: [https://docs.facewallet.xyz/docs/overview](https://docs.facewallet.xyz/docs/overview) - **デモ**: [https://haechi-labs.github.io/face-sample-dapp/](https://haechi-labs.github.io/face-sample-dapp/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fce710c9f12b831419df8e5c6507980adae723878-1944x1236.png%3Fw%3D1944%26auto%3Dformat&w=3840&q=75) - **対応ネットワーク**: Ethereum、Polygon、BNB、Klaytn、OASYS + 非EVMチェーン - **対応SNS**: Google、Facebook、X、Apple、Discord、Kakao - **技術**: tKey - **UIの日本語化**: 🙆‍♂️ #### [Dynamic](https://www.dynamic.xyz/) - **概要**: 2\. マルチウォレットを接続できる統合SDK の機能を強く持つが、WaaSの機能も持つ - **ドキュメント**: [https://docs.dynamic.xyz/introduction/welcome](https://docs.dynamic.xyz/introduction/welcome) - **デモ**: [https://demo.dynamic.xyz/](https://demo.dynamic.xyz/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7e8b9c34a90e300d1e91d8254e68ba0cfa17a756-1622x1150.png%3Fw%3D1622%26auto%3Dformat&w=3840&q=75) - **対応ネットワーク**: Ethereum、Polygon、Arbitrum、Optimism、Palm、Aurora、BNB Smart Chain、Gnosis、Base、Avalanche C chain、Celo、Chiliz、Fantom、Solana、Flow、Bitcoin、Starknet、Algorand、Cosmos - **対応SNS**: Google、Facebook、X、Apple、Discord、Farcaster、Twitch、GitHub - **技術**: tKey - **UIの日本語化**: 🙆‍♂️ これらを表にまとめると以下のようになります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fce4b185bf3c8d091622b19dfe4a61b4e983937dd-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75) ## まとめ・おすすめWaaS ここまでウォレット接続周りのSDKとWaaSについてご紹介しました。 ウォレットをすでに持っているユーザー向けのサービスを展開するのであれば、マルチウォレットを接続できる統合SDKを利用してウォレット接続部分の開発を進めることができます。体感としてRainbow Kitが一番広く使われているので、とりあえず弊社もRainbow Kitを推奨いたします。 ウォレットを持たないライトユーザー向けにサービスを展開したい場合、WaaSを使うことになりますが、弊社は以下の理由からFacewalletを推奨します。 **1\. ウォレットがサイロ化しない** WaaSが抱える問題の1つに、ウォレットがサイロ化してしまうことがあります。例えば事業者Aがweb3Authを用いてユーザーAのGoogleアカウントに対して提供するウォレットと、事業者Bがweb3Authを用いてユーザーAのGoogleアカウントに対して提供するウォレットとでは、別のウォレットが生成されることになります。ユーザーAからすると、同じGoogleアカウントでNFTを受け取っているつもりだが、別々のウォレットにNFTが受け取られることになります。 また3rdパーティーのDappsへの接続にも課題が生じます。Dapp側は事業者のAPIキーを知らないのでweb3Authを用いたウォレットの接続をネイティブにサポートすることができません。WalletConnect経由で接続することになりますが、WalletConnectの実装は事業者側のウォレット(アプリ)側で行う必要があります。 FacewalletではDapps提供事業者に関係なく一意のアドレスがユーザーに対して紐づけられるので、上記の問題が起きません。3rdパーティーのDappsに接続するときに、どのウォレットを繋げばいいか分からないという問題を防ぐことができます。 **2\. 費用面** 他WaaSが月額課金モデルを採用しているのに対し、Facewalletは現在無料でサービスを提供しています。将来的にはMetaMaskのようにウォレット内にSwap機能を持ちそこで収益化を図るそうで、当面はDapps提供事業者に対する課金はないそうです。継続的な売り上げが読みづらいweb3プロジェクトにおいて、この料金モデル(無料)は大きなアドバンテージだと考えます。 弊社のNFT発行サービスBenefy(ベネフィー)では、NFTの受け取り時のウォレットにFacewalletを採用しています。ぜひお試しください。 [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Understanding zkTLS Technology [技術記事](https://www.pontech.dev/category/tech) # zkTLSについての考察と期待する理由 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) November 28, 2024· 6 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F408aeb0783c5f805691b0a5fcd42fe4def1a4577-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75) ここ数ヶ月、zkTLSについて研究を進めています。バンコクで開催されたDEVCONでも、多くの参加者がzkTLSについて言及していました。サイドイベントとして行われたVLayerのMeetupでは、創設者の [@zkMarek](https://twitter.com/zkMarek) 氏が「 **Verifiable Summer**」の到来について熱弁していました。彼は、さまざまなウェブデータが信頼を必要とせずに第三者に証明可能となり、DeFi SummerやNFT Summerのようなブームが起きると予測しています。私もこの予測に概ね同意しています。 この記事では、私がzkTLSにどのような期待を寄せているかを詳しく説明します。 ### zkTLSとは? 以前、『 [zkTLS技術の解説とETH Tokyoハッカソン参加レポート](https://www.pontech.dev/post/zktls)』でzkTLSの技術について説明しましたが、ここでもう一度簡単に整理します。 - TLS通信は、ウェブサーバーからユーザーのクライアントにセキュアに情報を送信するための一般的な技術です。 - zkTLSでは、ユーザーがクライアント側でゼロ知識証明技術を使用して、「 **このサーバーからこのデータを受け取った**」という証明(Proof)を作成します。 - このProofはオフチェーンでもオンチェーンでも検証可能であり、データをポータブルにすることができます。 - この証明を作成する際には、ウェブサービス側の承認を必要としません。 - よくある誤解は「zkTLSはTLSの進化形で、第三者に証明可能なProofを、ウェブサービスがユーザーに対して発行してあげる」という印象を持ってしまいがちですが、これは誤りです。正しくは「ユーザーがウェブサイトの許可を得ずに(パーミッションレスで)第三者に証明できる」点がポイントです。 - ユーザーは、証明したいデータのみを提出することができ、必要以上の個人情報などを提供する必要がありません。さらに、閾値証明を利用することで、「具体的な数値は明かさずに、〇〇以上であること」を証明することも可能です。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F09f9e3ed1714e930967d419a88231d3c2b5b1cb4-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75) ### zkTLSのユースケース考察 次に、zkTLS技術がどのようなユースケースに当てはまるのかを整理してみました。 #### 方向性 - **他サービス内のプライベートなデータを利用する** ユーザーが他のサービスで保持しているプライベートデータを、安全かつプライバシーを保護しながら活用できます。 - **競合サービスのデータを利用する** MNPの乗り換えキャンペーンのように、競合他社の顧客をターゲットにしたマーケティング施策が可能になります。 - **関連サービスのデータを利用する** 新規ユーザーの獲得や既存ユーザーの理解を深めるために、関連サービスからのデータを効果的に活用します。 - **安価なオラクルとしての利用** - **オンチェーンのプロダクトでオフチェーンのデータを必要とする場合** オラクルが提供できないデータや、オラクルよりも安価に提供されるデータを利用できます。データがパブリック化プライベートかは問いません。 - _具体例_: 予測市場で「特定のYouTuberの登録者が1万人以上になるか」を判定する際に、zkTLSを用いてデータを取得・証明します。 - **ユーザーが必要以上の個人情報を渡したくない/企業が必要以上の個人情報を保持したくない** - _資産に関わる情報_: 詳細な金額を明かさずに、一定以上の資産を保有していることを証明できます。 - _健康に関わる情報_: 個人の医療データを公開せずに、健康状態が良好であることを証明できます。 - _住所情報_: 具体的な住所を明かさずに、「東京都民であること」など特定の条件のみを証明できます。 #### 誰が採用するのか? - **オンチェーンのプロダクト** DeFiやNFT、予測市場などの既存のオンチェーンプロダクトが、zkTLSの採用を始めるでしょう。マーケティングに活用することも可能ですし、これまで実現できなかった新しいサービスが生まれる可能性もあります。具体的なサービス例については、別の記事で詳しくまとめます。 - **中小企業や個人事業主** 大企業が他サービス内のデータを持ち込む場合、訴訟リスクやコンプライアンス上の検討に時間を要する可能性があります。一方、大企業とのAPI連携が難しい小規模事業者や個人は、これらの課題が比較的少なく、zkTLSを採用しやすいと考えられます。 - _具体例_: アパレルや物販など、多数の小規模事業者が参入する市場で、「特定のサービスのユーザーだけが購入できる限定商品」を勝手に提供する。 - **大企業** - 大企業は、他社からデータを取得するにあたって、シンプルなAPI連携を依頼して交渉すれば実現できる可能性があります。また前述の通り訴訟やコンプライアンスの懸念があるため、zkTLSの本格的な採用は消極的なのではと予想します。 - 必要以上の個人情報を保持しないという大義名分が、zkTLS採用の鍵となるかもしれません。 - 自社のデータが他社からデータリソースとして無断で利用される現実に対抗するために、大企業もzkTLSと向き合う必要性が出てくるでしょう。 ### zkTLSが業界に与える影響と期待 最後に、私が現在の(特に日本の)web3スペースにどのような問題と閉塞感を感じているか、そしてzkTLSがどのように解決の糸口になるかについて触れたいと思います。 - **現状の課題** - ステーブルコインや予測市場などの一部ユースケースを除けば、ブロックチェーンを活用して現実の課題を解決しているプロダクトはほとんど存在しません。 - **Why Blockchain?** - 将来的にはブロックチェーンの採用がスタンダードになる可能性はありますが、現状のUXや運用コストを考えると、「なぜブロックチェーンなのか?」という問いに事業者側が答える必要が、まだあると思います。 - **先細り感** - 「Why Blockchain?」に明確な答えを持たず、コンサルらと共に実証実験を始めた大企業が、期待した効果を得られずサービスを終了するケースが増えてきました。成功例が出ないため、後続の企業が減少している印象です。 - 特に、通貨発行が制限されている日本では課題が顕著です。 - **web3ネイティブ企業の課題** - 既存のweb2サービスが既に便利でネットワーク効果が強く、多くの人にとって乗り換える動機が不足しています。 - 既存のweb2サービスと連携したいと考えても、説得材料がありません。中央集権的なシステムで成功しているサービス側に分散的なシステムに乗り換えるインセンティブがないからです。 - オンチェーンのデータは限られており、企業が取れる施策も限定的です。 - **zkTLSの可能性** - zkTLSがこのデータ不足の問題を解決する可能性が大いにあると考えています。 - zkTLS単体またはzkTLS + オンチェーンで、今まで示せなかったユーザーにとって明確なメリットを提示できる可能性があります。(個人的にはここを考える余地が出てきたのが、私がNFTの登場を観測した2019年と同じようで楽しいです) - zkTLSを活用したサービスが、既存のweb2の成功企業に対する外圧として作用し始め、自己主権型のデータ管理が加速すると考えています。 [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Simple NFT Creation [thirdweb](https://www.pontech.dev/category/thirdweb) [NFT](https://www.pontech.dev/category/nft) # ThirdwebでNFTを発行する一番シンプルな方法【初級者・非エンジニア向け】 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) December 14, 2022· 2 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F110a170c7aaf60af6bf2576cf4f9cbf2573deea9-2880x1584.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Thirdwebを使って独自コントラクトでNFTを作る方法を解説します。 [https://thirdweb.com/thirdweb.eth/DropERC721?via=/explore](https://thirdweb.com/thirdweb.eth/DropERC721?via=/explore) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F110a170c7aaf60af6bf2576cf4f9cbf2573deea9-2880x1584.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 右上のDeploy Nowボタンを押します ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9d7260d2dc40611fe45b1a58553a8a98ebd96a71-2248x1562.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) コントラクトの初期情報を入力します。 - コントラクト全体のメタデータ - Image - Name - Symbol - Description - Primary Sales - Recipient Address:初期販売の売上を受け取るアドレス - Royalties - Recipient Address:ロイヤリティを受け取るアドレス - Percentage:ロイヤリティの% - Network / Chain - 希望のネットワークを選択 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9ac13c46a7ae062c1caa82c7b6a4d081bad6d007-1508x1308.png%3Fw%3D1508%26auto%3Dformat&w=3840&q=75) 右下のDeploy Nowボタンを押します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F72a3ecd0a4b138590a4ecec21ba6773c11e074b4-2874x1516.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 右上のBatch Uploadボタンからトークンを登録(LazyMintの準備)します ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F14f44c45c8e61e7927f8f3691247c26f8abc421a-2678x1530.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F185bc639af3e8d33e400e46c1ee78557f0fa215e-2610x1390.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Download.csvのサンプルの通り準備していくと、上記画像のプレビューのようになります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe9cca5218516ffb68fe4bee6e58f62e270e92f91-1950x912.png%3Fw%3D1950%26auto%3Dformat&w=3840&q=75) リビールの有無を選択します。今回はリビールなしで直接絵柄がわかるものにします。 このタイミングでIPFSにメタデータをアップロードしてくれます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fbb46b834a367fc7f3458bc22f9217f15cc11f3b5-1798x1008.png%3Frect%3D0%2C0%2C1798%2C1005%26w%3D1798%26auto%3Dformat&w=3840&q=75) Metamaskに署名リクエストがくるので承認します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb3c14059f78f2995d091cf87ca308b00a77009fe-982x1276.png%3Fw%3D982%26auto%3Dformat&w=3840&q=75) ダッシュボードに登録されます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6f250ff62e962b425bd79367a9ad24b7ef60aa0b-2668x1546.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Claim Conditionsというタブを開きます。ここで条件を設定します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff5c288cfbd505cde9e0bfbb68942c56368ff7b89-2534x1352.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Add Initial Claim Phaseを押すとフェーズを設定できる画面が出てきます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4ab2c753dc5e74e7ef99a8816e677d08191f1b8c-2338x1424.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) How much do you want to charge to claim each NFT? でNFTをClaimするための価格を(=販売価格を)、 Who can claim NFTs during this phase? でAllow Listに限定するか、Public Saleかを選択できます。 Saveするにはトランザクションが必要なのでウォレットで署名が必要です。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6c1272272520dbbd1079c14f0ac06f78014a7363-2552x1526.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Embedというタブに行くとiframeで埋め込めるEmbed Codeが取得できます。プレビューが下の方の画面にあります。 このiframeをご自身のサイト、例えばNotionなどに埋め込むことでmintサイトとして機能できます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff877e66f3000e9b6c70176e9fa8973f03d30e04a-2114x1384.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) [https://www.notion.so/Demo-2411cb1f22f943da9df0e8bb5ba9d7cc](https://www.notion.so/Demo-2411cb1f22f943da9df0e8bb5ba9d7cc) [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Token-Gated Content Creation [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#6 トークンゲート機能を持ったwebサイトやコンテンツの作成方法 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 02, 2023· 4 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fadd64c066fe1637d132f3a1661e74537141c65f7-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDapps6日目の今日は、トークンゲートの実装について考察したいと思います。「トークンゲート」とは、特定のトークンを保有しているユーザーのみがアクセスできるコンテンツやサービスを提供する仕組みのことを指します。ここでいうトークンはNFTやERC20トークンのことを指します。トークンゲートを用いることで特定のコミュニティやサービスに対するエクスクルーシブなアクセスを提供することができ、これにより新しいビジネスモデルやマネタイゼーション戦略が可能になります。 ### Thirdweb Auth まずは自分で実装をしてみる方法ですが、Thirdwebが出している公式記事やそれを和訳したユウキさんの記事が参考になります。 [https://blog.thirdweb.com/guides/nft-gated-website/](https://blog.thirdweb.com/guides/nft-gated-website/) [https://zenn.dev/yuki2020/articles/77f0f452bdbea4](https://zenn.dev/yuki2020/articles/77f0f452bdbea4) ポイントとしてはgetServersideProps内でNFTの保有確認をしているので、バックエンド側で確認をしているということですね。 ```javascript // Instantiate our SDK const sdk = ThirdwebSDK.fromPrivateKey( process.env.THIRDWEB_AUTH_PRIVATE_KEY, "mumbai" ); // Check to see if the user has an NFT const hasNft = await checkBalance(sdk, user.address); // If they don't have an NFT, redirect them to the login page if (!hasNft) { console.log("User", user.address, "doesn't have an NFT! Redirecting..."); return { redirect: { destination: "/login", permanent: false, }, }; } ``` また、注意として上記記事・コードはNext.jsのPagesディレクトリの仕様を想定されていて、appsディレクトリだと期待通りの挙動をしないのでご注意ください。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff6803257fde11b765c8b7990a840a5a053eed94b-1712x408.png%3Fw%3D1712%26auto%3Dformat&w=3840&q=75) ### Lit Protocol Lit Protocolは、暗号鍵ペアの作成と管理を分散して行うことで、条件付き暗号化やプログラムによる署名の実現を目的としたプロトコルです。 分散型鍵管理ネットワークとして機能するLit Protocolは、集中型鍵保管サービスや他の鍵管理ソリューションの代わりとして利用できます。 [Lit Protocol](https://litprotocol.com/) のSDKを使ってトークンゲートを作成するチュートリアルがあったので紹介します [https://medium.com/coinmonks/token-gating-with-lit-protocol-b27ef6141696](https://medium.com/coinmonks/token-gating-with-lit-protocol-b27ef6141696) nextjsのプロジェクトを立ち上げ、必要なモジュールをインストールします。 `yarn add @lit-protocol/lit-node-client yarn add cookies js-cookie uuid yarn add -D @types/cookies @types/js-cookie @types/uuid` チュートリアルをより簡略化してこのようなコードにしました。 ```javascript "use client"; import * as LitJsSdk from "@lit-protocol/lit-node-client"; import { useState } from "react"; import Cookies from "js-cookie"; import { v4 as uuid } from "uuid"; export default function Home() { const [connected, setConnected] = useState(false); const [isVerified, setIsverified] = useState(false); const id = uuid(); const accessControlConditions = [\ {\ contractAddress: "0xE71eE93Ad57c8b355e1bCDFe435B05673d8B4930",\ standardContractType: "ERC721",\ chain: "mumbai",\ method: "balanceOf",\ parameters: [":userAddress"],\ returnValueTest: {\ comparator: ">",\ value: "0",\ },\ },\ ]; async function connect() { const resourceId = { baseUrl: "http://localhost:3000", path: "/contactus", orgId: "", role: "", extraData: id, }; const client = new LitJsSdk.LitNodeClient({ alertWhenUnauthorized: false }); await client.connect(); if (client) { console.log("Am Connected"); } const authSig = await LitJsSdk.checkAndSignAuthMessage({ chain: "mumbai" }); await client.saveSigningCondition({ accessControlConditions, chain: "mumbai", authSig, resourceId, }); try { const jwt = await client.getSignedToken({ accessControlConditions, chain: "mumbai", authSig, resourceId: resourceId, }); /** * Store retrieve jwt in cookies with the name lit-auth */ Cookies.set("lit-auth", jwt, { expires: 1 }); const { verified, payload } = LitJsSdk.verifyJwt({ jwt }); setIsverified(verified); } catch (err) { console.log("error: ", err); } setConnected(true); } return (
{connected ? ( <>{isVerified ? <>secret content : <>not an NFT holder} ) : ( )}
); } ``` サインインするとこのようになります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa7f260c35206cd6c0d946ed9a8aee6638e8bd24a-1038x632.png%3Fw%3D1038%26auto%3Dformat&w=3840&q=75) ### Collab.Land Collab.Landはweb3界隈のdiscordユーザーなら一度は触ったことのあるツールだと思います。Discordをトークンホルダー限定にするツールとして人気ですね。その方法については記事がたくさんあるのでここでは割愛するとして、APIを使って自分のサイトをトークンゲート化することもできるみたいです。 [https://dev.collab.land/docs/tutorials/token-gating-tutorial](https://dev.collab.land/docs/tutorials/token-gating-tutorial) \[Tutorial\] Token Gating Websites with Collab.Land - YouTube CollabLand 642 subscribers [\[Tutorial\] Token Gating Websites with Collab.Land](https://www.youtube.com/watch?v=EUVdGQuD_kw) CollabLand Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=EUVdGQuD_kw&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 35:24•Live • [Watch on YouTube](https://www.youtube.com/watch?v=EUVdGQuD_kw "Watch on YouTube") [https://dev-portal.collab.land/signin](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbERTWGRVaklPQUltYjFLN1VSMUlpMjdCNUV3UXxBQ3Jtc0tuSndGckkybGFMMDMwSm1URVdfWDA2TTRsQ1hTTzhmb29NMloySWhWZzdvUXVmRWRWNTV2a09OYzNBNjVGRW9LTnRlOUJsajVUSzhOdDgxUDRZeDNORE1kbVFNa0IxSHdkWVVwNV80OHp1dTNla1pYbw&q=https%3A%2F%2Fdev-portal.collab.land%2Fsignin&v=EUVdGQuD_kw) からログインしてAPI Keyを入手する必要があります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9a605e583d98b92bc85a13a6dfb2739b837e0250-2922x1546.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 無料でもある程度のAPI Callができて、なかなか使い勝手が良さそうだなと思いました! ### Pinata Submarine pinataというIPFSのマネジメントを代行してくれるPinningサービスの1機能にSubmarineという機能があり、それを使ってトークンゲート付きのコンテンツを作成することができます。 YouTube Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos This video is private [Visit YouTube to search for more videos](https://www.youtube.com/) ## More videos on YouTube Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=7MTs_H4GDos&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 0:00•Live • [Watch on YouTube](https://www.youtube.com/watch?v=7MTs_H4GDos "Watch on YouTube") 有料アカウントにしないと試せないため、今回は紹介だけに留めます。 ### Decir Decirというサービスを使ってみます。テストネットは以下のURLです。 [https://testnet.decir.io/token-gated/new-draft](https://testnet.decir.io/token-gated/new-draft) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F3998295872c472cdb9087207bfdc7e8bf2b70839-2940x1594.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ホルダー限定のコンテンツを設定します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7038e72f3d7eafcb67534c9b5c3fac7537079ca5-1438x1518.png%3Fw%3D1438%26auto%3Dformat&w=3840&q=75) トークンゲートの設定をします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc4f01746b2e4e95a4c6837ae2a297770ec51319c-1388x1134.png%3Fw%3D1388%26auto%3Dformat&w=3840&q=75) トークンゲート付きのリンクが生成できました。ログインするまでは閲覧できません。 [https://testnet.decir.io/token-gated/content/68b84bf2-ae8c-400a-b3b4-b2fd56bf6d8c](https://testnet.decir.io/token-gated/content/68b84bf2-ae8c-400a-b3b4-b2fd56bf6d8c) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fda821675acd69298540b3dc5e45718ca6fa7704c-2906x1522.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) トークンを保有していないウォレットで接続すると以下のようにコンテンツを表示できません。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2e20c11a23a59853a176521ee300290dc815444a-2560x1410.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 認証後のURLを見るとbackground-imgに画像を設定するという少し手の込んだことをしていましたが、画像自体はgoogleのstorageに保管されており、認証付きのURLが表示されているようです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb0706a3c5dfb4fcfc0344008262bd1e2df12bab7-950x256.png%3Fw%3D950%26auto%3Dformat&w=3840&q=75) ### まとめ トークンゲートを実現するいくつかのサービス・実装方法をご紹介しました。個人的にはThirdweb Authで実装する方法か、Lit Protocolを利用する方法がおすすめだと思います。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## NFT API Comparison [技術記事](https://www.pontech.dev/category/tech) # Dapps開発におけるNFT APIの選択肢まとめ・比較 [![mizuno](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F812300fd2e4f4f99d805ed62b76d19e372b23c6f-3024x4032.jpg%3Frect%3D0%2C0%2C1709%2C2677%26w%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/mizuno) [mizuno](https://www.pontech.dev/author/mizuno) April 30, 2024· 10 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b4f01fa09ecf7b5062c5ffe265cf7cef831fd92-2560x1600.png%3Frect%3D0%2C68%2C2560%2C1464%26w%3D2000%26auto%3Dformat&w=3840&q=75) こんにちは、Web3が好きでDapps開発のための勉強を日々、続けている駆け出しエンジニアです。今回の記事のテーマはNFT APIです。 Dappの開発においてNFTを扱う際、最も重要なピースの1つとなるのがNFT APIです。なぜなら、NFT APIを使わないと以下のような問題に直面するからです。 ERC721やERC1155のスマートコントラクトのNFTにおけるオンチェーンデータには制約があります。 - 1つのトークンIDのオーナーアドレスは取得できるが、複数のトークンIDのオーナーを取得するには、トークンの数だけ通信が必要になる - IPFSに保存されているURLしか取得できず、実際の画像などのデータを取得するにはIPFSにアクセスする必要がある - あるアドレスが特定のコントラクトのどのトークンを持っているかを確認することが簡単ではない このように、オンチェーンからデータを取得するには多くの通信が必要になり、フロントエンドのパフォーマンスが落ちる、Node as a Serviceを利用している場合はコストが増加するなどの問題が生じます。そのため、オフチェーンでデータをアグリゲートされたデータを使う必要があります。 そのために、自前でオフチェーンデータのアグリゲーションを行うという選択肢も存在します。自身でノードを立てるか、Node as a Serviceを定期的に叩いてオンチェーンデータをオフチェーンに保存することで、独自のNFT APIを構築できます。しかし、この方法には開発コストやメンテナンスコストがかかるため、結果的にNFT APIを提供しているサービスを活用することをおすすめします。 NFT APIを活用することで、NFTの発行(mint)、取引、管理などの機能を実装することができます。しかし、NFT APIには様々な種類があり、提供される機能も異なります。 NFT APIは、様々なタイプのプロバイダーから提供されています。 1. 代表的なAPIプロバイダー:AlchemyやMoralisなど。幅広いブロックチェーン、機能に対応したAPIを提供しているという特徴がある。 2. NFTマーケットプレイス発のAPIプロバイダー:Raribleなど。NFTの売買に関するAPIを多く提供するという特徴がある。 3. Node運用サービスを提供するAPIプロバイダー:QuikNode NodeRealなど。Node起点の幅広いデータへのアクセスが特徴的。 Dapp開発者は、自身のアプリケーションの要件に合わせて、最適なNFT APIを選択する必要があります。例えば、NFTマーケットプレスを開発する場合、NFTコレクション内のすべてのトークンを取得したり、個々のNFTの詳細情報を取得したり、トランザクション履歴を追跡したりする機能が必要になります。一方で、単にNFTを発行(mint)するだけのサイトを開発する場合は、NFT発行に特化したAPIで十分かもしれません。 また、近年では単一のブロックチェーンに留まらず、複数のブロックチェーンに対応したDappが増えています。そのような場合、一つのAPIで複数のブロックチェーンをカバーできるかどうかも重要な選択基準になります。 このように、Dapp開発におけるNFT APIの選択は、アプリケーションの要件によって大きく異なります。本記事では、主要なNFT APIの機能を比較、検討することで、開発者がより適切なNFT APIを選択できるよう支援します。 ## 代表的なAPIプロバイダー #### Moralis ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fef487376fd03c65406bdf54d2805585b7616dd0e-1786x1282.png%3Fw%3D1786%26auto%3Dformat&w=3840&q=75) 価格 - Starter: 無料 - 40,000 compute units/日 - Pro: $49 - 100,000,000 compute units/月 - Business: $249 - 350,000,000 compute units/月 機能 - コントラクトの全NFT取得: あり - NFTのメタデータ取得: あり - ウォレットの保有NFT取得: あり (チェーン毎) - ウォレットのNFT取引データ取得: あり チェーン Ethereum, Polygon, Binance Smart Chain, Avalanche C-Chain, Fantom, Cronos, Palm, Arbitrum, Gnosis, Base, Optimism, Linea, moonbeam ドキュメント [https://docs.moralis.io/web3-data-api/evm/reference/nft-api](https://docs.moralis.io/web3-data-api/evm/reference/nft-api) #### Alchemy ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6f63f8ec08fe3cda7267e27a07e61eb91384e020-2534x1184.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 価格 - Free: 無料 - 300 Million compute units/月 - Growth: $49 - 400 Million compute units/月 - Scale: $199 - 1.5 Billion compute units/月 機能 - コントラクトの全NFT取得: あり - NFTのメタデータ取得: あり - ウォレットの保有NFT取得: あり (チェーン毎) - ウォレットのNFT取引データ取得: なし チェーン Ethereum, Polygon (Matic), Arbitrum, Optimism, Base, Starknet ドキュメント [https://docs.alchemy.com/reference/nft-api-quickstart](https://docs.alchemy.com/reference/nft-api-quickstart) #### NFTPort ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fadb0a291cb4e785dc4b621d2be7c4268e3ef6f77-2526x1312.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 価格 - Free: 無料 - 25,000 requests/月 - Growth: $49 - 150,000 requests/月 - Scale: $299 - 1,000,000 requests/月 機能 - コントラクトの全NFT取得: あり - NFTのメタデータ取得: あり - ウォレットの保有NFT取得: あり (チェーン毎) - ウォレットのNFT取引データ取得: あり (チェーン毎) チェーン Ethereum, Polygon ドキュメント [https://docs.nftport.xyz/docs/welcome-to-nftport](https://docs.nftport.xyz/docs/welcome-to-nftport) ## NFTマーケットプレイス発のAPIプロバイダー #### Rarible ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b96c484d60a270539472954a7f853ba520ff6f0-2526x1292.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 価格 - Starter: 無料 - 50k requests/月 - Startup: $40 - 400k requests/月 - Pro: $250 - 4M requests/月 - Business: $999 - 20M requests/月 機能 - コントラクトの全NFT取得: なし - NFTのメタデータ取得: あり - ウォレットの保有NFT取得: あり (チェーン毎) - ウォレットのNFT取引データ取得: なし チェーン Ethereum, Polygon, Mantle, IMX, Flow, Arbitrum One, Chiliz, LightLink, Celo, zkSync, Base, RARI Chain, Astar, zkEVM, Kroma, Xai ドキュメント [https://docs.rarible.org/reference/getting-started](https://docs.rarible.org/reference/getting-started) ## Node運用サービスを提供するAPIプロバイダー #### QuickNode ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff1b9524595a4d76c01f765ae99b9e3c7a9222d41-2528x1302.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 価格 - 無料 - 50 Million API credits/月 - $10 - 100 Million API credits/月 - $49 - 500 Million API credits/月 - $299 - 3 Billion API credits/月 機能 - コントラクトの全NFT取得: あり - NFTのメタデータ取得: あり - ウォレットの保有NFT取得: あり - ウォレットのNFT取引データ取得: なし チェーン Aptos, Arbitrum, Arbitrum Nova, Avalanche, Base, Berachain, Bitcoin, Blast, BNB Smart Chain, Celo, Cyber, Ethereum, Fantom, Flow, Gnosis, Immutable, Mantle, NEAR, Optimism, Polkadot, Polygon, Polygon zkEVM, Scroll, SEI, Solana, Stacks, Starknet, Stellar, TRON, XRP Ledger, zkSync Era ドキュメント [https://www.quicknode.com/docs/ethereum/qn\_fetchNFTCollectionDetails\_v2#](https://www.quicknode.com/docs/ethereum/qn_fetchNFTCollectionDetails_v2#) #### NodeReal ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ffed61fcfa472e08ea039519a091e77b2f5034c3c-2532x1306.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 価格 - Free: 無料 - 100M CUs/月 - Growth: $31 - 500M CUs/月 - Team: $159 - 2B CUs/月 - Business: $399 - 5B CUs/月 機能 - コントラクトの全NFT取得: あり - NFTのメタデータ取得: あり - ウォレットの保有NFT取得: あり - ウォレットのNFT取引データ取得: あり チェーン Ethereum, BNB Smart Chain, Polygon, Moonbeam, Arbitrum One, Optimism, PlatON, Avalanche, Cronos, Fantom, Gnosis ドキュメント [https://docs.nodereal.io/reference/get-nfts-by-account](https://docs.nodereal.io/reference/get-nfts-by-account) #### ankr ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F50ca54af25b236688180abc3bf85d41385c006e4-2524x1306.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 価格 - Public: 無料 - 50 requests/分 - Premium: $10 per 100 million credits - 1k+ requests/分 機能 - コントラクトの全NFT取得: なし - NFTのメタデータ取得: あり - ウォレットの保有NFT取得: あり - ウォレットのNFT取引データ取得: あり チェーン arbitrum, avalanche, base, bsc, eth, fantom, flare, gnosis, linea, optimism, polygon, polygon\_zkevm, rollux, scroll, stellar, syscoin ドキュメント [https://www.ankr.com/docs/advanced-api/nft-methods/](https://www.ankr.com/docs/advanced-api/nft-methods/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b4f01fa09ecf7b5062c5ffe265cf7cef831fd92-2560x1600.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ## まとめ NFT APIを選ぶ際の主なポイントは以下の通りです。 - 開発するDappの種類(NFTミントサイト、マーケットプレイス、ウォレットなど) - 必要な機能(NFTの発行、取引、メタデータ取得、履歴追跡など) - 対応ブロックチェーンの種類 - API提供元の種類(汎用プロバイダー、マーケットプレイス発のプロバイダー、Node運用サービス発のプロバイダーなど) - コストやレート制限 例えば、マーケットプレイス開発の場合は、NFTコレクション内の全トークンデータの取得や、トークン単位の詳細情報、取引履歴の追跡など、豊富な機能が求められます。一方でミントサイトであれば、NFT発行に特化したシンプルなAPIで十分かもしれません。 NFTユースケースが今後さらに広がると考えられますので、Dapp開発者は常に最新のNFT APIの動向を注視し、自身のアプリケーションに最適なソリューションを選び続ける必要があるでしょう。 株式会社Pontechでは、Dapps開発の受託を請け負っております。本記事のように採用する技術やサードパーティのサービスの検討からお手伝いすることが可能です。 Dapps開発に関するご相談がございましたら、ぜひ当社まで [お問い合わせ](https://www.pontech.dev/contact) ください。 [← View all posts](https://www.pontech.dev/blog) [![mizuno](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F812300fd2e4f4f99d805ed62b76d19e372b23c6f-3024x4032.jpg%3Frect%3D0%2C0%2C1709%2C2677%26w%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/mizuno) ### About mizuno Copyright © 2025Pontech.Inc SystemDarkLight ## Token Bound Accounts Overview [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#16 Token Bound Account (ERC6551) を導入する [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 17, 2023· 4 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8f6d3e2feac6f1e70e387396568bb9b5e8d272c0-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) ERC6551という規格が6月頃に登場し、一時話題になりました。ここ数日でもギャルバースが導入して話題になっています。ではERC6551とはなんなのでしょうか?どのように実装するのでしょうか? ### ERC6551とは ERC6551はトークンバウンドアカウントというNFTに紐づいたスマートアカウントを作成する規格です。詳しくは以下の記事を参照して下さい。 [【完全保存版】ERC6551とは何か。トークンバウンドアカウントについて学びましょう。](https://zenn.dev/thirdweb_jp/articles/ce2c7bdc39ff85) またスマートアカウントについての解説はこちらを参照してください。 [まいにちDapps#13 ERC4337を理解する](https://www.pontech.dev/post/dapps-everyday-13) ### デモアプリの作成 今回はこちらの記事を参考に進めていきます。 [How to Create Token Bound Accounts (ERC-6551)](https://blog.thirdweb.com/guides/create-token-bound-accounts-erc6551) Nextのアプリを作成していきます。 `npx thirdweb create app` constants.tsというファイルを作成し、定数を定義します。 ```typescript import { Mumbai, Chain } from '@thirdweb-dev/chains' // your token bound factory address export const factoryAddress: string = '' // Your thirdweb api key - you can get one at https://thirdweb.com/dashboard/api-keys export const TWApiKey: string = process.env.NEXT_PUBLIC_TEMPLATE_CLIENT_ID export const activeChain: Chain = Mumbai export const nftDropAddress: string = '' export const tokenAddress: string = '' ``` 今回のアプリではERC721として [NFTDrop](https://thirdweb.com/thirdweb.eth/DropERC721?ref=pontech)、ERC20として [TokenDrop](https://thirdweb.com/thirdweb.eth/DropERC20?ref=pontech)、そしてアカウントとして [TBAのimplementation](https://thirdweb.com/0x7fDae677aA6f94Edff9872C4b91D26407709c790/TokenBoundAccount) を利用します。それぞれコントラクトをデプロイしてください。そしてAPIキーも準備してください。 factoryAddressにはこちらの [registry address](https://docs.tokenbound.org/contracts/deployments) を入れてください。 \_app.tsxを以下のようにします。 ```typescript import type { AppProps } from "next/app"; import { ThirdwebProvider, coinbaseWallet, metamaskWallet, walletConnect, } from "@thirdweb-dev/react"; import "../styles/globals.css"; import { TWApiKey, activeChain } from "../const/constants"; function MyApp({ Component, pageProps }: AppProps) { return ( ); } export default MyApp; ``` index.tsxをこのようにします。componentは [githubのサンプル](https://github.com/thirdweb-example/token-bound-account-app/) から取得してきました。 ```typescript import type { NextPage } from "next"; import styles from "../styles/Home.module.css"; import NFTGrid from "../components/NFT/NFTGrid"; import { ConnectWallet, useAddress, useContract, useOwnedNFTs, Web3Button, useClaimNFT, } from "@thirdweb-dev/react"; import { nftDropAddress } from "../const/constants"; /** * The home page of the application. */ const Home: NextPage = () => { const address = useAddress(); const { contract: nftDropContract } = useContract(nftDropAddress, "nft-drop"); const { data: nfts, isLoading } = useOwnedNFTs(nftDropContract, address); return (
{address ? (

Your NFTs

Browse the NFTs inside your personal wallet, select one to connect a token bound smart wallet & view it's balance.

await contract?.erc721.claim(1)} > Claim NFT
) : (

Connect a personal wallet to view your owned NFTs

)}
); }; export default Home; ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff13396a9884b221aa3d46ba270653a2ec9b92eec-2940x1308.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 上記のNFT一覧からトークンを選択した際に、トークン個別のページへ遷移して紐づくTBAを操作するページを作りたいので、pages/contract/\[contractAddress\]/\[tokenId\].tsxを作成します。 ```typescript export const getStaticProps: GetStaticProps = async (context) => { const tokenId = context.params?.tokenId as string; const sdk = new ThirdwebSDK(activeChain, { secretKey: process.env.SECRET_KEY, }); const contract = await sdk.getContract(nftDropAddress); const nft = await contract.erc721.get(tokenId); let contractMetadata; try { contractMetadata = await contract.metadata.get(); } catch (e) {} return { props: { nft, contractMetadata: contractMetadata || null, }, revalidate: 1, // https://nextjs.org/docs/basic-features/data-fetching/incremental-static-regeneration }; }; export const getStaticPaths: GetStaticPaths = async () => { const sdk = new ThirdwebSDK(activeChain, { secretKey: process.env.SECRET_KEY, }); const contract = await sdk.getContract(nftDropAddress); const nfts = await contract.erc721.getAll(); const paths = nfts.map((nft) => { return { params: { contractAddress: nftDropAddress, tokenId: nft.metadata.id, }, }; }); return { paths, fallback: "blocking", // can also be true or 'blocking' }; }; ``` useEffect内でトークンに紐づくSmart Walletがすでに作成されているかを確認します。作成されていない場合、後ほど作成するnweSmartWallet関数でsmart walletを作成します。 ```typescript // create a smart wallet for the NFT useEffect(() => { const createSmartWallet = async (nft: NFT) => { if (nft && smartWalletAddress == null && address && wallet) { const smartWallet = newSmartWallet(nft); console.log("personal wallet", address); await smartWallet.connect({ personalWallet: wallet, }); setSigner(await smartWallet.getSigner()); console.log("signer", signer); setSmartWalletAddress(await smartWallet.getAddress()); console.log("smart wallet address", await smartWallet.getAddress()); return smartWallet; } else { console.log("smart wallet not created"); } }; createSmartWallet(nft); }, [nft, smartWalletAddress, address, wallet]); ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7279b429f3782a420d6eb0195bfa07f601e0fe9c-2922x1588.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 以下2つを完成させます。 1. 新しい「TBA」を「newSmartWallet」関数で作成すること 2. 「SmartWalletConnected」 - ウォレットの情報を表示するコンポーネントで、トークンの請求やウォレットの残高表示も含む では、新しい「newSmartWallet」関数を作成しましょう。TBAスマートウォレットを作成するために、ERC-6551 registry factory コントラクトを使ってimplementationをクローンします。コンポーネントの中に「SmartWallet」というファイルを作成し、その中に「SmartWallet.ts」というファイルを作成す。このファイルには、スマートウォレットを作成するためのロジックが含まれていて、ERC-6551レジストリを使用してスマートウォレットを設定するには、以下の内容を追加します。 ```typescript import { ethers } from "ethers"; import { SmartWallet } from "@thirdweb-dev/wallets"; import { TWApiKey, factoryAddress, activeChain, nftDropAddress, implementation, } from "../../const/constants"; import { SmartContract, NFT } from "@thirdweb-dev/sdk"; import { WalletOptions } from "@thirdweb-dev/wallets"; import type { SmartWalletConfig } from "@thirdweb-dev/wallets"; import type { BaseContract } from "ethers"; export default function newSmartWallet(token: NFT) { //Smart Wallet config object const config: WalletOptions = { chain: activeChain, // the chain where your smart wallet will be or is deployed factoryAddress: factoryAddress, // your own deployed account factory address thirdwebApiKey: TWApiKey, // obtained from the thirdweb dashboard gasless: true, // enable or disable gasless transactions factoryInfo: { createAccount: async ( factory: SmartContract, owner: string ) => { const account = factory.prepare("createAccount", [\ implementation,\ activeChain.chainId,\ nftDropAddress,\ token.metadata.id,\ 0,\ ethers.utils.toUtf8Bytes("")\ ]); console.log("here", account); return account; }, // the factory method to call to create a new account getAccountAddress: async ( factory: SmartContract, owner: string ) => { return factory.call("account", [\ implementation,\ activeChain.chainId,\ nftDropAddress,\ token.metadata.id,\ 0\ ]); }, // the factory method to call to get the account address }, }; return new SmartWallet(config); } ``` Smart Walletが生成されて、ERC20がmintできるようになりました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb8654b27eed562f609e05840ead73e4e05ece541-2604x1382.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) NFTを他のウォレットにTransferしてみます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1c02a7a45a04d264a99ec3a495141d7beb015fe7-2390x884.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) もう一度ERC20をClaimしようとすると、元々NFTのオーナーだったアドレスでは失敗し、Transfer後にオーナーとなったアドレスでは成功しました。Smart Walletのコントロール権限がNFTに追従して移動したことが分かります(Token Bound)。 コードは [こちら](https://github.com/ksuhara/dapps-everyday/tree/main/016-token-bound-account/token-bound-demo) に掲載しておきます。 ### まとめ ERC6551をDapps上で作成・やり取りする実装を見ていきました。今回はimplementationコントラクトとして [Thirdweb提供のもの](https://mumbai.polygonscan.com/address/0xa786cF1e3245C792474c5cc7C23213fa2c111A95#code) を使いましたが、ここに独自ロジックを乗せれば色々と特殊なTBAも作成可能です。ERC6551を導入したいNFTプロジェクトのオーナーはお問い合わせください。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## zkTLS Technology Overview [技術記事](https://www.pontech.dev/category/tech) # zkTLS技術の解説とETH Tokyoハッカソン参加レポート [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) September 02, 2024· 8 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F09f9e3ed1714e930967d419a88231d3c2b5b1cb4-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75) 2024年8月23日〜25日に開催された [ETH Tokyo](https://www.ethtokyo.com/) のハッカソンに、チームで参加しました。結果として、Main Track (Infrastructure and Tooling) 1st placeをはじめとする複数の賞を受賞することができました🎉 [Xの投稿](https://x.com/suhara_ponta/status/1827647990292746735) [githubのレポジトリ](https://github.com/wasabijiro/zkCredit) [@wasabijiro](https://twitter.com/wasabijiro) くんにお誘いいただき、zkTLSとzkMLを組み合わせたプロダクトの開発に取り組みました。当初はzkTLSもzkMLも知識がなく理解が難しかったのですが、ハッカソン期間中に開発しながら学んでいくうちにこれらが非常に興味深く、大きな可能性を秘めた技術だと感じました。今回は特にzkTLSに焦点を当てて解説してみます。 ## zkTLSとは? zkTLS は、Web2 のプライベートデータを Web3 に安全に接続するプロトコルです。Web2のデータをWeb3に接続する方法というと、多くの人はオラクルを思い浮かべるでしょう。しかし、オラクルにはデータの拡張性の課題があります。 - オラクルの利用にはコストがかかります。 - そのため経済性が合うデータしか提供されません。主に通貨やトークンなどの価格情報に限定されています。 Defiプロジェクトには適していますが、プライベートなデータを用いたい場合には適していません。 zkTLSはゼロ知識証明(ZKP)を活用し、ユーザーがウェブサイトからデータを安全かつ検証可能な形でエクスポートできるようにします。従来のオラクルの限界を克服し、以下のような応用が期待されています。 - プライバシー保護認証 - データの移行 - Web3 アプリケーション向けの安全な証明作成 ### 実現できること zkTLSの可能性をより具体的に理解していただくため、まずユースケースの例を1つ紹介します。 **ユースケース例: 新規ライドシェアサービス「Ponber」の立ち上げ** あなたが新しいライドシェアサービス「Ponber」(Uberの架空の競合サービス)を立ち上げようとしているとします。ドライバーを獲得するための戦略として、Uberの優良ドライバーがPonberに登録すると特典を提供するキャンペーンを実施したいと考えています。これは、Web3の世界で「ヴァンパイアアタック」と呼ばれる手法に似ています。 zkTLSを使用したフローは以下のようになります: 1. UberドライバーにUberのマイページにログインしてもらう 2. Uberのサーバーからフロントエンドへの通信(TLS通信)からzkProof(ゼロ知識証明)を作成 3. 作成されたproofをPonber側に提出 4. Ponber側で、新規登録者が優良Uberドライバーであることを検証 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7366191c5390460fb63a3d2b7a2385f1838f65bb-2016x1512.png%3Frect%3D0%2C182%2C1883%2C1215%26w%3D2000%26auto%3Dformat&w=3840&q=75) _(注:この図はTLSNotaryチームがETH Tokyoで発表した内容です)_ このシステムの重要な特徴は次の2点です: - Uberの協力を必要としない - ドライバーは必要以上の個人データをPonberに提供する必要がない 以下では、この技術の詳細について深掘りしていきます。 ### TLSとは? そもそもTLS(Transport Layer Security)とはインターネット上でデータを安全に送受信するためのプロトコルです。TLSは、通信経路上でデータが第三者に盗聴されたり改ざんされたりしないように暗号化を行います。これは、Webブラウザとサーバーの間で使われるHTTPS通信の基盤となっており、オンラインバンキングや電子メールなど、機密性の高い情報をやり取りする際に広く利用されています。 ### zkTLSの仕組み(TLSNotary) [TLSNotary](https://tlsnotary.org/) はPrivacy and Scaling Ethereum teamによって開発されているオープンソースのプロトコルです。TLS通信にVerifierを追加し、安全なマルチパーティ計算 (MPC) を用いることで、セキュリティやプライバシーを損なわずに他者とデータを共有するという課題を解決します。MPCにより、Verifierは外部の信頼や完全なデータの開示なしにTLSの記録を認証できます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F0c25a9048815b9df774a976369991a4e1d6fb636-2126x982.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) - Proverは、セキュアかつプライバシーを保護するマルチパーティ計算(MPC)でVerifierと協力しながら、サーバーに対してTLSを介してデータを要求します。 - Proverは、選択的にデータをVerifierに開示します。 - Verifierは、そのデータを検証します。 こちらのブラウザ拡張機能を使ってProofを作成してみるチュートリアルをやってみると、より具体的にイメージが掴めると思います。 [https://docs.tlsnotary.org/quick\_start/browser\_extension.html](https://docs.tlsnotary.org/quick_start/browser_extension.html) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7daf906f00aca9128af003c530ad20559aae45b8-954x1200.png%3Fw%3D954%26auto%3Dformat&w=3840&q=75) _(注:この画像↑はTLSNotaryのチュートリアルの画像を転載しています)_ TLS通信の情報が表示され、 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F459206688772726e3cb9c0e2ec31ad2715c78bd7-958x1192.png%3Fw%3D958%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1ecabd39bc9c116da775f008643ba0b0c2a6a66b-1010x486.png%3Fw%3D1010%26auto%3Dformat&w=3840&q=75) パブリックにしたいデータだけを選択し、 **Notarize** ボタンを押してProofを作成するという流れです。 ### TLSNotaryを使って開発されているプロダクト・ユースケース [TLSNotaryのページ](https://tlsnotary.org/use-cases) に想定されるユースケースが載っていたので、一部を紹介してみます。 TLSNotary は以下の用途に利用できます: - **身分証明**:オンラインの政府サービスからあなたの名前、年齢、または市民権を確認する - **評価の確認**:AirBnb、Uber、Strava などのプラットフォームでユーザーの経験や信頼性を確認する - **実世界の資産所有確認**:車両や不動産などの有形資産の所有権を確認する - **健康情報の確認**:MyHealth や HealthVault などのプラットフォームから個人の健康記録を確認する - **アカウント所有確認**:Google、Microsoft、Apple、Twitter などのオンラインアカウントの管理権を確認する - **財務確認**:銀行やその他のサービスから財務状況を確認したり、財務取引を証明する - **ユーザー制限確認**:特定のアプリケーションやサービスへのアクセスが制限されているかどうかを確認する ### TLSNotary以外のプロジェクト zkTLS = TLSNotaryという訳ではなく、他にもいくつかチームがあります。 [Pado Labs](https://padolabs.org/) はこの分野で開発を行っている別のチームです。彼らは香港を拠点とし、対話型ゼロ知識証明を用いたMPC-TLSの構築のために300万ドルを調達しました。また、完全準同型暗号化も利用しており、より複雑なゼロ知識スキーマの作成を可能にしています。現在、彼らは主にユーザーのための中央集権型取引所(CEX)の資産証明に焦点を当てているようで、これはChromeの拡張機能によって実現されています。 [zkPass](https://zkpass.org/) はSequoia、Binanceなどから250万ドルを調達し、TransGateというプロダクトの構築を進めています。これにより、ユーザーは任意のHTTPSウェブサイト上のデータをWeb3の世界に対して選択的かつプライベートに検証することができます。現在、彼らはプレアルファテストネットの段階にあり、UberやInstagram、Courseraなどのウェブサイトを組み込んだ50以上の検証済みスキーマを有しています。 ## 我々がハッカソンで開発&提案したもの いよいよ我々がハッカソンで開発したプロダクトの紹介です。 ETH Tokyo 2024 ~ zkCredit ~ - YouTube わさび愛好会 No subscribers [ETH Tokyo 2024 ~ zkCredit ~](https://www.youtube.com/watch?v=WDGJQbM-rik) わさび愛好会 Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=WDGJQbM-rik&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 2:47•Live • [Watch on YouTube](https://www.youtube.com/watch?v=WDGJQbM-rik "Watch on YouTube") 我々のチームは、zkTLSとzkMLを組み合わせた「zkCredit」を開発しました。zkMLの詳細については別の機会に解説する予定ですが、簡単に言えば推論の元となるインプットデータを秘匿した状態で計算結果が正しいことを証明する技術です。この部分の開発は [@JunK](https://twitter.com/JunK_0908) 先生に担当していただきました✨ ### zkCreditの特徴 - zkTLSを用いて各種Web2サービスからユーザー自身がプライベートなデータのzkpを複数取得 - これらのデータをzkMLにインプットとして入れ、信用スコアを計算 - zkMLの結果はさらにzkProofも生成され、オンチェーンで検証可能 ### 応用例 - 信用スコアに応じた担保率のLending Protocolの開発 - web2ゲームの経歴スコアを活用したweb3ゲームのNFTのローンチパッド 2晩のハッカソンという短期間での開発だったため、以下のような課題があります: - セキュリティ上クライアント側で計算しなければいけない処理を、一部サーバー側で処理 - MLのモデルは現段階では簡易的なもの 実用化には更なる開発が必要ですが、アイデアのポテンシャルを評価していただき、多くのPrizeを受賞することができました。とても楽しい2日間でした、運営や参加者の皆様、ありがとうございました!! 今後PontechではZKについて本格的に注力し、また技術的な解説の発信していく所存です。よければ [Xをフォロー](https://twitter.com/suhara_ponta) して下さい。 参考記事 [https://telah.vc/zktls](https://telah.vc/zktls) [https://docs.tlsnotary.org/](https://docs.tlsnotary.org/) 関連記事 [zkTLSの現在地と実用化に向けた課題](https://www.pontech.dev/post/zktls-current-position) [zkTLSについての考察と期待する理由](https://www.pontech.dev/post/think-about-zktls) [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Toyota Hackathon Success [Hackathon](https://www.pontech.dev/category/hackathon) # 「web3 Hackathon|トヨタ自動車 × 博報堂キースリー」で入賞しました! [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) April 01, 2023· 2 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff2afac11a97cfe491bb3c2256cb2c456ef9270e0-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75) 2023年2月14日から3月25日にかけて開催された「web3 Hackathon|トヨタ自動車 × 博報堂キースリー」に社外メンバーと参加し、開発したプロジェクト予測市場プラットフォーム「Paddock」が入賞を果たしました。 このハッカソンでは、トヨタ自動車をはじめ、Astar Network、Web3 Foundation、Alchemyが協賛し、博報堂キースリーが主催するという豪華な顔ぶれで、総額$100,000(約1,320万円)相当の賞金が授与されました。我々は$10,000の優秀賞を受賞しました。 ハッカソンのテーマは「企業内プロジェクト向けDAO支援ツールの開発」で、トヨタ自動車が持つ業務改善の文化を活かし、ブロックチェーンを活用した新しい業務効率化サービスを生み出すことが求められました。 弊社が開発した「Paddock」は、プロジェクトの成否を予測する予測市場プラットフォームです。サービスの仕組みは以下の通りです。 1. プロジェクトの起案者(新規事業担当者)がサービス内にプロジェクトを作成し、目標期日と目標値を設定。プロジェクトの予算をデポジットする。 2. 社内外の協力者・参加者が目標の成功/未達にbet(賭け)する。このとき応援メッセージや未達と考える理由を投稿。未達と考える理由は期日が来るまで非公開。 3. bet期間が終了したらプロジェクトが開始。 4. 社内外の参加者で目標達成にbetした人はプロジェクトにアドバイスや作業支援で貢献。 5. プロジェクトの終了日に目標の達成可否を入力。 6. 目標の達成可否に応じてプールから報酬が分配される。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F0b3c2cf3d4da64166e0902137b094de171831ee1-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75) 「Paddock」のアイデアは、社内の新規事業プロジェクトが実証実験(PoC)で終わってしまうことが多いという問題意識からから生まれました。DAO・分散型組織の導入だけでは解決できず、むしろリーダーシップの低下により悪化しかねないと考えたことがきっかけです。そこで、インセンティブの設計に着目し、予測市場のアイデアにたどり着きました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcd7f2b842ab306b872b1559007e3ee76025d429b-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75) 「Paddock」はbetを通じてプロジェクト参加者が積極的にアドバイスや作業支援を行い、プロジェクト成功に向けたインセンティブを提供しています。また、プロジェクトは「失敗にbetされた金額が多いほど成功した時のリターンが大きい」という仕組みのため、高い目標を設定するインセンティブが働きます。これにより、プロジェクトの成否を正確に予測し、新規事業プロジェクトの成功率を向上させることが期待されます。 [プレゼンのスライドはこちら](https://www.canva.com/design/DAFdPimpAjg/1jhcy4r0ztXzo-frfxeQLQ/view?utm_content=DAFdPimpAjg&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink) web3 Hackathonで「Paddock」が入賞したことは、技術力とアイデア力が高く評価された結果であり、今後もこのようなイノベーションを生み出していきたいと考えています。今回のハッカソンを開催してくださった協賛・主催者の皆様、そして参加者の皆様に心から感謝申し上げます。 [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## zkTLS App Development [技術記事](https://www.pontech.dev/category/tech) # zkTLSプロトコルを使用したアプリケーション開発【Reclaim Protocol編】 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) December 02, 2024· 6 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2b7775a6230d49c4541af3c86f59c8d61d113027-1200x675.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75) 株式会社Pontechの [ぽんた](https://twitter.com/suhara_ponta) です。PontechではzkTLSを用いたアプリケーションの開発に着目・注力しています。 [zkTLSについての考察と期待する理由](https://www.pontech.dev/post/think-about-zktls) zkTLSのプロトコルを使用したアプリケーションの開発方法について記事を書きます。今回はReclaim Protocol編です。 ### この記事で作るアプリケーション Xで特定のアカウントをフォローしている人がトークンをClaimできるページを作ります。 [https://zk-present.vercel.app/](https://zk-present.vercel.app/) (こちらのデモでは、SepoliaでUSDCがClaimできます) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fab570e9312533a73d062024957cd70732bb16253-1532x1016.png%3Fw%3D1532%26auto%3Dformat&w=3840&q=75) 主に以下について整理してご紹介します。 - Reclaim ProtocolのダッシュボードでAppと独自のProviderを作成する手順 - ReclaimのProofをVerifyするコントラクトの開発方法 ※2024年12月時点での情報をまとめます。一次情報は公式ドキュメントを参照してください。 ### Reclaim Protocolの設定 [https://dev.reclaimprotocol.org/dashboard](https://dev.reclaimprotocol.org/dashboard) にログインします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F52185d657c22f91b422fa84ca6cf59a2f912c246-2930x1590.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 今回はWeb Appを作成します。Application NameとApp Logoを設定してください。これらはユーザーにProofを要求する場面で表示されます。後から編集可能です。 次にProviderを設定します。Providerとは、ユーザーにどのwebページでどのようなProofを作成してもらうかを規定したものです。のちに自作のProviderに変更するので、一旦適当なProviderを選択して先に進んでください。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fddfcb848018e021d24085f6991e3b0c951a50d4a-2328x1342.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Application Secretを保存してください。ここにコードのサンプルがあるので、Reactのフレームワークを実行して試してみてください。私はNext.jsで試しました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc40706ffb59c5e91578e442ec6a8ef522a6e8787-2292x1110.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) QRコードが表示され、QRコードをスマホで読み込むとApp Clipが立ち上がり、Providerの要求するサイトに移動すると思います。そこでログインすると自動的にzkTLSの計算が走り、Proofがフロントエンドに返されます。 #### Reclaim ProtocolのProviderの作成 ここまでProviderは既存のものを使ってきましたが、自前のProviderを採用したいので作成していきます。 Providerの作成にはReclaim Devtoolというネイティブアプリのダウンロードが必要です。このアプリはエンドユーザーはダウンロードする必要はない開発者向けのアプリです。 [https://dev.reclaimprotocol.org/my-providers](https://dev.reclaimprotocol.org/my-providers) から+New Providerボタンを押下します。Session IDが表示されるのでReclaim DevtoolアプリでIDを入力して接続します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fec04bc7aacb7f9553966397fa7506dc49c0943c7-1458x626.png%3Fw%3D1458%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F67eff5ea68e9fbc02d4546568ba8515c8c7151c6-1170x2532.png%3Fw%3D1170%26auto%3Dformat&w=3840&q=75) 接続が成功すると、アプリ側で実行されたTLS通信がPCのダッシュボード側で検知できるようになります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1f13c89aeae5858d3f75fee15990d11855a21f59-2470x1436.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Proofを作成したいページにアプリ内ブラウザで遷移します。様々なAPIリクエストが実行されていることが分かります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa142a5d9021ae20b3f0d28a7769110825d520427-2432x1416.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) この中からユーザーに証明を作成してもらいたいデータが返ってくるエンドポイントを探します。 Xでログインしているユーザーが対象ユーザーをフォローしているかどうかのエンドポイントは以下でした。 [https://x.com/i/api/graphql/-0XdHI-mrHWBQd8-oLo1aA/ProfileSpotlightsQuery](https://x.com/i/api/graphql/-0XdHI-mrHWBQd8-oLo1aA/ProfileSpotlightsQuery)... ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F408278fc94db990670cc0b5d6e66b4815f21218b-2374x1274.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) followingとscreen\_nameという属性情報を取得したいので、それを選択しましょう。エンドユーザーごとに異なる識別子を求めている場合にはUnique to userにチェック、秘匿化したい情報を求める場合にはPrivate Informationにチェックします。今回はどちらにも当てはまらないのでチェック不要です。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F96fe077094fdfc0d99f92541c9da6c2ca63aa8b0-1220x620.png%3Fw%3D1220%26auto%3Dformat&w=3840&q=75) ユーザーに表示されるガイドの文章を設定していきます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F462402724d9140d7480586dbba295f07e18b77c1-2422x1424.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Advance Optionsを開いて、JS Injectionにユーザーのページへ自動で遷移するコードを仕込みます。このJS Injectionを入れた場合、Providerを使うためにReclaim Protocolの運営の承認が必要になります。Reclaimが悪意のあるコードがinjectionされていないか確認しています。 ```javascript setInterval(function() { if (window.location.href === "https://x.com/home" || window.location.href === "https://x.com/home/") { window.location.href = "https://x.com/peaceandwhisky"; } }, 3000); // 3000 milliseconds = 3 seconds ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F3f9443578cbeef06f03da7de2d3512c282131b7f-2122x1376.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 次のページへ進み、QRコードをスマホで読み込んで実際にProofの生成を試して成功すると、Providerが設定が完了となります。 ### コントラクトの開発 次に、XでフォローしていることのProofを提出したらUSDCを引き出すことができるコントラクトを作成します。こちらのレポジトリをcloneまたはforkして始めます。 [https://github.com/reclaimprotocol/reclaim-solidity-sdk](https://github.com/reclaimprotocol/reclaim-solidity-sdk) ちなみに [@reclaimprotocol/verifier-solidity-sdk](https://www.npmjs.com/package/@reclaimprotocol/verifier-solidity-sdk?activeTab=code) というライブラリがありますが、proofの検証が未完成のままな気がして利用を避けています。 早速コントラクトのコードを見ていただきます。 [https://sepolia.etherscan.io/address/0x600a3a23d96c09a65c05071e833e2dd6886cda95#code#F1#L4](https://sepolia.etherscan.io/address/0x600a3a23d96c09a65c05071e833e2dd6886cda95#code#F1#L4) ```typescript function submitProof(IReclaim.Proof memory proof) external { string memory trgtFollowing = '"following":"'; string memory isFollowing = reclaimContract.extractFieldFromContext(proof.claimInfo.context, trgtFollowing); require(keccak256(bytes(isFollowing)) == keccak256(bytes("true")), "Not following"); string memory trgtScreenName = '"screen_name":"'; string memory screenName = reclaimContract.extractFieldFromContext(proof.claimInfo.context, trgtScreenName); require(isValidScreenName(screenName), "Invalid screen_name"); require(!claimed[msg.sender][screenName], "Already claimed for this screen_name"); try reclaimContract.verifyProof(proof) { claimed[msg.sender][screenName] = true; uint256 tokenAmount = screenNameToTokenAmount[screenName]; require(token.transfer(msg.sender, tokenAmount), "Token transfer failed"); emit ProofSubmitted(msg.sender, screenName, tokenAmount); } catch { // verifyProofが失敗した場合の処理 revert("Proof verification failed"); } } ``` まず [各チェーンにデプロイされているReclaim Protocolのコントラクト](https://gitlab.reclaimprotocol.org/integrations/verifier-solidity-sdk/-/blob/main/contracts/Addresses.sol) を呼び出せるように、アドレスを設定しておきます。 次にproofの中身を確認したいので、extractFieldFromContext()関数で、proof内の文字列を抽出して、期待する文字列かどうかを確認します。 そしてverifyProof(proof)関数でverifyに成功する場合はUSDCをtransferし、失敗する場合はrevertします。残高となるUSDCはコントラクトに別途手動でデポジットしておきます。本稼働する際にはdepositする関数を用意したり、コントラクトを分割した方が良いでしょう。 ### フロントエンドの開発 Next.jsのフロントエンドのコードを記載しておきます。ユーザーにウォレット接続を要求し、Reclaim ProtocolのQRコードを表示、Proofを生成できたらコントラクトに接続してトランザクションを発行するコードです。 ```typescript "use client"; import { Proof, ReclaimProofRequest, transformForOnchain, } from "@reclaimprotocol/js-sdk"; import QRCode from "react-qr-code"; import { useState } from "react"; import { createPublicClient, createWalletClient, custom, http } from "viem"; import { sepolia } from "viem/chains"; import { disctributionContractAbi } from "./abi"; import Link from "next/link"; /* eslint @typescript-eslint/no-explicit-any: 0 */ declare global { interface Window { ethereum: any; } } export default function Home() { const [walletAddress, setWalletAddress] = useState(null); const [requestUrl, setRequestUrl] = useState(""); const [proof, setProof] = useState(null); const [txStatus, setTxStatus] = useState(""); const connectWallet = async () => { try { const { ethereum } = window; if (!ethereum) { alert("MetaMaskをインストールしてください。"); return; } const [account] = await ethereum.request({ method: "eth_requestAccounts", }); setWalletAddress(account); } catch (err) { console.error(err); } }; const getVerificationReq = async () => { // Your credentials from the Reclaim Developer Portal // Replace these with your actual credentials const APP_ID = "your_app_id"; const APP_SECRET = process.env.NEXT_PUBLIC_RECLAIM_APP_SECRET!; const PROVIDER_ID = "your_provider_id"; // Initialize the Reclaim SDK with your credentials const reclaimProofRequest = await ReclaimProofRequest.init( APP_ID, APP_SECRET, PROVIDER_ID ); // Generate the verification request URL const requestUrl = await reclaimProofRequest.getRequestUrl(); console.log("Request URL:", requestUrl); setRequestUrl(requestUrl); // Start listening for proof submissions await reclaimProofRequest.startSession({ onSuccess: async (proof) => { console.log("Proof received:", proof); setProof(proof as Proof); }, onError: (error: Error) => { console.error("Error in proof generation:", error); }, }); }; const claimToken = async () => { const forOnchain = transformForOnchain(proof as Proof); console.log("forOnchain", forOnchain); try { setTxStatus("トランザクション送信中..."); const client = createWalletClient({ chain: sepolia, transport: custom(window.ethereum!), }); const hash = await client.writeContract({ account: walletAddress, address: "0x8c4eD7cCb92c8892C683De858965647a70eFe45d", abi: disctributionContractAbi, functionName: "submitProof", args: [forOnchain], }); setTxStatus(`トランザクション送信完了。ハッシュ: ${hash}`); const publicClient = createPublicClient({ transport: http("https://sepolia.drpc.org"), chain: sepolia, }); const receipt = await publicClient.waitForTransactionReceipt({ hash }); if (receipt.status === "success") { setTxStatus("トランザクションが完了しました!"); } else { setTxStatus("トランザクションに失敗しました。"); } } catch (err) { console.error(err); setTxStatus("エラーが発生しました。"); } }; return (

FujitaさんのフォロワーはUSDCをclaimできるよ!

Next.js logo

1. まずFujitaさんをフォローしてね

{/* ウォレット接続 */} {!walletAddress ? ( ) : (

接続中のウォレット: {walletAddress}

)} {/* 検証要求取得ボタン */} {!requestUrl && ( )} {/* QRコード表示 */} {requestUrl && (

4. このQRコードを読んで、立ち上がったアプリでXにログインしてね

)} {/* 検証成功メッセージ */} {proof && (

zkProofの作成が完了したよ!

)} {/* Claimボタン */} {walletAddress && (

5. zkProofを提出してトークンを受け取ってね

)} {/* トランザクションステータスの表示 */} {txStatus && (
{txStatus}
)}
); } ``` 以上で開発の流れの説明を終了します。 ### まとめ Reclaim Protocolを用いた開発は、ある程度柔軟性が高く、Dapps開発経験がある方であれば比較的容易に取り組めると思います。Reclaim Protocol自体のアップデートが頻繁に行われているので情報が最新でない場合もある点に気をつけてください。 株式会社Pontechでは、Dapps開発の受託を請け負っております。本記事のように採用する技術やサードパーティのサービスの検討からお手伝いすることが可能です。 Dapps開発に関するご相談がございましたら、ぜひ当社まで [お問い合わせ](https://www.pontech.dev/contact) ください。 [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Full On-Chain NFTs [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#20 フルオンチェーンの着せ替えNFT [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 22, 2023· 3 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6410467e72a60843a0ca27dbe34b7bc4b08f3590-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) 節目の20回目となる今回ですが、母校の応援で急遽甲子園に遠征することになったので、過去作のDapp解説とさせていただきます! 誰でも簡単にピクセルアートをフルオンチェーンNFT化できるアプリ、そしてそのフルオンチェーンNFTを着せ替えできるというコントラクトについて解説します。 ### Nounsと同じ形式のフルオンチェーンNFT [https://pixel-onchained.vercel.app/](https://pixel-onchained.vercel.app/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F78f3c3aa56d280d2631cd4af1076297c6d9bf686-1168x1086.png%3Fw%3D1168%26auto%3Dformat&w=3840&q=75) [https://twitter.com/suhara\_ponta/status/1491404327336165384?s=20](https://twitter.com/suhara_ponta/status/1491404327336165384?s=20) もう一年半前のDappですね。そのときに書いた記事がこちらです。 [RLE形式(Run Length Encoding)のフルオンチェーンNFTのコントラクト解説](https://qiita.com/ksuhara/items/501cf50a5e7520e916e0) 32×32のピクセルアートで、左上から数えて1色目が何マス続いて、2色目が何マス続いて、3色目が何マス続いたあとにまた1色目が何マス続いて... というようなデータと、1色目は黄色、2色目は青色という情報のカラーパレットをブロックチェーン上に書き込み、プログラム上で画像を生成しています。 フロントエンドからピクセルアートをフロントに入力してもらい、rle形式にエンコードするコードをバックエンドで実行し、オンチェーンに投げるという方式です。 githubはこちらになります。 [https://github.com/ksuhara/pixel-onchained/tree/main](https://github.com/ksuhara/pixel-onchained/tree/main) ### フルオンチェーンNFT同士の重ね合わせで着せ替えを実現 次にこのアプリの継続として出したPixel FasionというDappの解説です。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1c29aa6d90b46d90716881a734e99a7dbe732056-1174x1162.png%3Fw%3D1174%26auto%3Dformat&w=3840&q=75) こちらも基本的にロジックは一緒なのですが、トークンごとにmapping(uint256 => Accessory\[\]) public accessories; というマッピングを保持しています。 ```typescript //SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol"; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; import {NFTDescriptor} from "./NFTDescriptor.sol"; import {IPixelFashion} from "./IPixelFashion.sol"; contract PixelFashionMold is Initializable, ERC721Upgradeable, OwnableUpgradeable, IERC2981 { using StringsUpgradeable for uint256; using SafeMathUpgradeable for uint256; struct Accessory { address contractAddress; uint256 tokenId; } struct Royalty { address recipient; uint256 salePrice; } mapping(uint256 => Royalty) internal _royalties; mapping(uint256 => string[]) public palettes; mapping(uint256 => string) public names; mapping(uint256 => string) public backgrounds; mapping(uint256 => bytes) public parts; mapping(uint256 => Accessory[]) public accessories; uint256 private _totalSupply; string public contractName; function initialize( address _owner, string memory _name, string memory _symbol ) public initializer { __Ownable_init_unchained(); transferOwnership(_owner); __ERC721_init_unchained(_name, _symbol); contractName = _name; } function supportsInterface(bytes4 _interfaceId) public view override(ERC721Upgradeable, IERC165) returns (bool) { return super.supportsInterface(_interfaceId); } function _addColorToPalette(uint256 _paletteIndex, string calldata _color) internal { palettes[_paletteIndex].push(_color); } function setAccessory( uint256 tokenId, address _accessoryAddress, uint256 _accessorieTokenId ) public { require(this.ownerOf(tokenId) == msg.sender, "PixelFashion: must be owner of this token"); require( IPixelFashion(_accessoryAddress).ownerOf(_accessorieTokenId) == msg.sender, "PixelFashion: must be owner of accessory token" ); accessories[tokenId].push(Accessory({contractAddress: _accessoryAddress, tokenId: _accessorieTokenId})); } function mintNFT( string calldata name, bytes memory seed, string[] calldata colors, string memory bgColor, address toAddress ) public onlyOwner { uint256 tokenId = _totalSupply + 1; require(palettes[tokenId].length + colors.length <= 256, "Palettes can only hold 256 colors"); for (uint256 i = 0; i < colors.length; i++) { _addColorToPalette(tokenId, colors[i]); } parts[tokenId] = seed; backgrounds[tokenId] = bgColor; names[tokenId] = name; _totalSupply++; _safeMint(toAddress, tokenId); } function totalSupply() public view returns (uint256) { return _totalSupply; } function tokenURI(uint256 tokenId) public view override(ERC721Upgradeable) returns (string memory) { require(_exists(tokenId), "URI query for nonexistent token"); return dataURI(tokenId); } /** * @notice Given a token ID and seed, construct a base64 encoded data URI for an official Nouns DAO noun. */ function dataURI(uint256 tokenId) public view returns (string memory) { string memory name = names[tokenId]; string memory description = string(abi.encodePacked(contractName, " #", tokenId.toString())); return genericDataURI(name, description, tokenId); } /** * @notice Given a name, description, and seed, construct a base64 encoded data URI. */ function genericDataURI( string memory name, string memory description, uint256 tokenId ) public view returns (string memory) { NFTDescriptor.TokenURIParams memory params = NFTDescriptor.TokenURIParams({ name: name, description: description, parts: getPartsForTokenId(tokenId), background: backgrounds[tokenId] }); return NFTDescriptor.constructTokenURI(params, getPalletesForTokenId(tokenId)); } function returnParts(uint256 tokenId) public view returns (bytes memory) { return parts[tokenId]; } function returnPalletes(uint256 tokenId) public view returns (string[] memory) { return palettes[tokenId]; } function getPartsForTokenId(uint256 tokenId) public view returns (bytes[] memory) { bytes[] memory _parts = new bytes[](accessories[tokenId].length + 1); _parts[0] = parts[tokenId]; for (uint8 p = 0; p < accessories[tokenId].length; p++) { _parts[p + 1] = IPixelFashion(accessories[tokenId][p].contractAddress).returnParts( accessories[tokenId][p].tokenId ); } return _parts; } function getPalletesForTokenId(uint256 tokenId) public view returns (string[][] memory) { string[][] memory _palletes = new string[][](accessories[tokenId].length + 1); _palletes[0] = palettes[tokenId]; for (uint8 p = 0; p < accessories[tokenId].length; p++) { _palletes[p + 1] = IPixelFashion(accessories[tokenId][p].contractAddress).returnPalletes( accessories[tokenId][p].tokenId ); } return _palletes; } function removeAccessories(uint256 tokenId) public { require(this.ownerOf(tokenId) == msg.sender, "PixelFashion: must be owner of this token"); delete accessories[tokenId]; } function setRoyalties( uint256 _tokenId, address _receiver, uint256 _percentage ) public onlyOwner { require(_percentage <= 10000, "ERC2981Royalities: Too high"); _royalties[_tokenId] = Royalty(_receiver, _percentage); } function royaltyInfo(uint256 tokenId, uint256 salePrice) public view override returns (address, uint256) { require(_exists(tokenId), "PixelFashion: royalty query for nonexistent token"); if (_royalties[tokenId].recipient != address(0)) { return (_royalties[tokenId].recipient, (salePrice * _royalties[tokenId].salePrice) / 10000); } return (address(0x0), 0); } } ``` AccessoryはコントラクトアドレスとトークンIDからなる構造体です。setAccessory関数を通してNFTはアクセサリーを装着することができます。tokenURI→dataURI→genericDataURIとデータ取得が進んでいく中で、getPartsForTokenId()の中でaccessories配列をループして装着しているNFTのデータを取得しています。 なお、本体と服のコントラクトに区別をしていないので、本体に服を着せることも服に本体を着せることも原理上できてしまいます。また複数枚重ねることも可能ですが、removeAccessoriesで一旦全裸になります。 [https://opensea.io/collection/pixel-fashionista](https://opensea.io/collection/pixel-fashionista) 現在フロントエンドのホスティングをやめてしまっているのですが、また整備して再開できればなと思っております! ### まとめ まいにちDapps、初期に目標としていた平日1ヶ月続けるという目標をこの記事で達成しました! ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb191fc6ce9bf250d1c20e037eb34565de3776025-1206x1192.png%3Fw%3D1206%26auto%3Dformat&w=3840&q=75) 明日以降は毎日ではなく、週1くらいのペースでクオリティにこだわったDappsを作成して公開していこうと思います。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Pontech Company Launch [Company](https://www.pontech.dev/category/company) # 株式会社Pontechを創業しました! [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) January 15, 2023· 2 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcc713c7c43cfbc575734186c4c6727dab4295ea5-812x476.png%3Fw%3D812%26auto%3Dformat&w=3840&q=75) 2023年1月11日に株式会社Pontechを法人設立登記しました。 今回は僕がPontechでやっていきたいことを、所信表明も兼ねて書かせて頂こうと思います。ピンとくる項目がありましたら、Twitter等でお声がけください。ぜひ応援のほどよろしくお願いします。 #### スキルセット - Ethereum, NFTを中心としたDapp開発 - 要件定義・設計 - コントラクト開発 - バックエンド開発 - フロントエンド開発 - プロジェクトマネジメント #### スタンス - 基本的にはクライアントワークを積極的に受けていきます - 時給ベースではなく、開発物に対して見積もりをする形式が望ましいです - レベニューシェアでの開発依頼もご相談ください - 自社サービスの立ち上げもハッカソン等に参加しながら、ゆるく検討していきます - マイクロ法人ですので、株式での資金調達は当面考えていません #### やっていきたいこと - 既存ビジネスへのNFTの活用 - 企業の新規事業立ち上げやマーケティングツールとしてのNFTの活用のサポートをしたいです。自分が関わるからにはクリプトネイティブな層に刺さる取り組みに昇華したいです。 - NFTブランドの立ち上げ - ピクセルアーティストmaeさんのコレクション、Drools & Pixelsを技術面でサポートさせていただいています。このような取り組みを強化し増やしていきたいです。 - 自分もジェネラティブアート、コントラクトアートの分野で活動していきたいです。 - AI・ARなどのテクノロジーとの掛け合わせ - ここ数年ブロックチェーンに特化してきましたが、スキルと提案の幅を広げていきます。 - 不動産 × web3 - 昨年宅地建物取引士の試験に合格しました。不動産の業界的な非効率さに可能性を感じています。 - 地球温暖化対策につながること - スキーヤー⛷なので日本の冬を守りたいです。 #### Pontechの行動理念 - 「だらけきった正義」 - 怠惰さはプログラマーの美徳の一つであり、ラクな仕組みを作ることが正義である - 自分で書いたコントラクトより、世の中の天才が書き、時の検閲を経た既存のコントラクトを活用していくことが、車輪の再発明を防ぎ、エコシステムに貢献することになる - 「道草を楽しめ 大いにな」 - 目標を達成すると同時にそれまでの道中も楽しむ。一見関係のないことから新しい発見が生まれるので、道草を楽しむ余裕を持つ。 - 一緒に働く人を大切にし、楽しくやる。 - 「いつか世界一になる奴と、知り合えたらステキだなって。な…普通だろ。」 - 高みを目指す人の役にたつ。見返りは求めない。自分にとってステキなことだから。 [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Web3 Language Learning # テレビ朝日主催の「Web3エンタメハッカソン」で入賞しました! [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) April 29, 2023· 1 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcf52468ec0aeb694448fe5fc97a2eef471f0cc78-2862x1560.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) テレビ朝日様主催のに参加し、BLOCKSMITH&Co.様のプライズを受賞しました! [https://twitter.com/BLOCKSMITH\_JP/status/1649734434579701760?s=20](https://twitter.com/BLOCKSMITH_JP/status/1649734434579701760?s=20) GOGAKU!!!は、ChatGPTとLINEを活用した、語学学習ゲームです。ユーザーは学習したいシナリオをNFTで購入し、LINEでGOGAKUを友達追加するだけで様々なシナリオで学習が可能です。 ChatGPTがリスニングのクイズを作成し、GoogleTextToSpeechで音声を読み上げます。 ユーザーが音声で回答するとWhisperで文字起こしが行われ、ChatGPTが添削・採点を行うことで、自然な英会話学習が可能になります。 最近個人的にLINE Botの開発とGPTに取り組んでおり、その一環で今回のハッカソンにも参加しましたが、受賞できて嬉しいです。このサービスはweb3要素を一度なくして、単純なweb2のサービスとして継続して開発・リリースしていこうと考えておりますので、応援よろしくお願いいたします。 ハッカソンを企画してくださった皆様、スポンサーの皆様、参加者の皆様、ありがとうございました。 [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Create Layer2 Chain [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#15 OPStackを使って独自のLayer2チェーンを立てる [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 16, 2023· 3 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fdae5087857d25133d7f0ca1bf5553d177223ecd7-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDapps15日目はOptimismが提供しているOPStackを使って独自のLayer2チェーンを作成してみます。OPStackは最近話題となっているCoinbase社のBaseというチェーンをはじめいくつかのL2チェーンに採用されています。OPStackによって各アプリが独自のApp Chainを持つことの流れは加速すると思いますので、どれくらいの難易度なのか、その手順を見ていきましょう。 ### OPStack OPStackの [Getting Started](https://stack.optimism.io/docs/build/getting-started/#) を進めていきます。 前提条件として [prerequisites](https://stack.optimism.io/docs/build/getting-started/#prerequisites) にあるソフトウェアをインストールしておく必要があります。これが入っていないとbuildが通らないので事前にインストールしておいてください。 ETHGlobalでのこちらの動画も参考にしています。 Optimism 🛠️ Launch your own Rollup with the OP Stack in 30 minutes - Kelvin Fichter - YouTube ETHGlobal 29.8K subscribers [Optimism 🛠️ Launch your own Rollup with the OP Stack in 30 minutes - Kelvin Fichter](https://www.youtube.com/watch?v=PcgAKoUKRv4) ETHGlobal Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=PcgAKoUKRv4&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 28:34•Live • [Watch on YouTube](https://www.youtube.com/watch?v=PcgAKoUKRv4 "Watch on YouTube") モノレポ全体をgit cloneします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fab64c16c28bd7aa7190b4db428678f6400a24a5c-1750x1238.png%3Fw%3D1750%26auto%3Dformat&w=3840&q=75) op-gethをcloneします。 ```bash cd ~ git clone https://github.com/ethereum-optimism/op-geth.git ``` 以下のコマンドでキーを作成します。 ```bash echo "Admin:" cast wallet new echo "Proposer:" cast wallet new echo "Batcher:" cast wallet new echo "Sequencer:" cast wallet new ``` 作成されたアドレスは保存しておき、各アカウントに以下の量のETHを補充します(今回はSepoliaでやってみます)。1/10のくらいでも全然大丈夫でした。 - `Admin` — 2 ETH - `Proposer` — 5 ETH - `Batcher` — 10 ETH cd packages/contracts-bedrock に移動して、 `cast block finalized --rpc-url $ETH_RPC_URL | grep -E "(timestamp|hash|number)"` でSepoliaの最新のTimestampを取得します。 deploy-config/getting-started.jsonファイルを探し出し、各アドレスで変更します。 自分の場合こんな形になりました↓ ```bash { "numDeployConfirmations": 1, "finalSystemOwner": "0xd7A724C4C589EfBA058B8454519CceD05aCE7CDa", "portalGuardian": "0xd7A724C4C589EfBA058B8454519CceD05aCE7CDa", "l1StartingBlockTag": "0x832a16a4654d3ea99217d47c3a0eab515d72405c709c39d07e9dc1b2c9218d85", "l1ChainID": 11155111, "l2ChainID": 11155420, "l2BlockTime": 2, "maxSequencerDrift": 600, "sequencerWindowSize": 3600, "channelTimeout": 300, "p2pSequencerAddress": "0x213bfFd68389E19850cBAd39Db42607929664bfE", "batchInboxAddress": "0xff00000000000000000000000000000000042069", "batchSenderAddress": "0x3229ad6426621884618C97Ca00223e62A6CB0162", "l2OutputOracleSubmissionInterval": 120, "l2OutputOracleStartingBlockNumber": 2, "l2OutputOracleStartingTimestamp": 1692162516, "l2OutputOracleProposer": "0x9eD06996584f9C9Ab5cE348c4251733846B2BA29", "l2OutputOracleChallenger": "0xd7A724C4C589EfBA058B8454519CceD05aCE7CDa", "finalizationPeriodSeconds": 12, "proxyAdminOwner": "0xd7A724C4C589EfBA058B8454519CceD05aCE7CDa", "baseFeeVaultRecipient": "0xd7A724C4C589EfBA058B8454519CceD05aCE7CDa", "l1FeeVaultRecipient": "0xd7A724C4C589EfBA058B8454519CceD05aCE7CDa", "sequencerFeeVaultRecipient": "0xd7A724C4C589EfBA058B8454519CceD05aCE7CDa", "baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", "l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", "sequencerFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", "baseFeeVaultWithdrawalNetwork": 0, "l1FeeVaultWithdrawalNetwork": 0, "sequencerFeeVaultWithdrawalNetwork": 0, "gasPriceOracleOverhead": 2100, "gasPriceOracleScalar": 1000000, "enableGovernance": true, "governanceTokenSymbol": "OP", "governanceTokenName": "Optimism", "governanceTokenOwner": "0xd7A724C4C589EfBA058B8454519CceD05aCE7CDa", "l2GenesisBlockGasLimit": "0x1c9c380", "l2GenesisBlockBaseFeePerGas": "0x3b9aca00", "l2GenesisRegolithTimeOffset": "0x0", "eip1559Denominator": 50, "eip1559Elasticity": 10, "systemConfigStartBlock": 2, "l1BlockTime": 12 } ``` L1にコントラクトをデプロイします。 `forge script scripts/Deploy.s.sol:Deploy --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL` `forge script scripts/Deploy.s.sol:Deploy --sig 'sync()' --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL` ↑別々で実行したほうがいいと思います deployments/getting-startedフォルダに以下のようにコントラクトのABIがたくさん生成されていれば成功しています。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7814cb35100ab1c87b7930b2f61ae9d62130a562-508x864.png%3Fw%3D508%26auto%3Dformat&w=3840&q=75) L2側の設定をしていきます。 ```bash go run cmd/main.go genesis l2 \ --deploy-config ../packages/contracts-bedrock/deploy-config/getting-started.json \ --deployment-dir ../packages/contracts-bedrock/deployments/getting-started/ \ --outfile.l2 genesis.json \ --outfile.rollup rollup.json \ --l1-rpc ``` 上記コードでエラーが出ますが、getting-started.jsonのl2BlockTimeを1以上に、l1BlockTimeという項目を新しく増やして2以上にするとエラーが出ません。 op-gethを立ち上げます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe4e34a0f2f84a3a3f7fa269d2660fbe6e86c106a-1042x644.png%3Fw%3D1042%26auto%3Dformat&w=3840&q=75) op-nodeも走らせます。 officialページのコマンドをそのまま使うと./jwt.txt \\の後に不要なスペースがあることによってエラーが出るという罠があるので削除して使用してください。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F30da6859e119583f743e079299d5f837e8c1ef96-750x470.png%3Fw%3D750%26auto%3Dformat&w=3840&q=75) L2も立ち上がりました! ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6a4473b7e2a5f4de36778b1bb9a791841fdc668b-1812x736.png%3Fw%3D1812%26auto%3Dformat&w=3840&q=75) その後にL1からL2のブリッジコントラクトにETHを送り、L2でコントラクトをデプロイして関数を実行するというチュートリアルの続きもありますが今回はここまでとします!ぜひご自身でやってみてください。 ### まとめ OPStackを使ってL2を作成する方法を学習しました。独自チェーンを作るという意味ではAvalancheのSubnetを立てる方法もあれば、同様のL2をZkRollupを使って立てるためのZkStackもあるようなのでこちらもいずれ見てみたいです。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## NFT Minting from Blogs [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#19 このブログの記事をNFT化してみる [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 22, 2023· 3 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe25e0b7ed6f8395474b9d4586164911600c79de0-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDappsも目標としていた20回まで残りわずかとなりました。 今回はこのブログ記事をNFTにしてmintできるようにしたいと思います。 先に開発物のアウトプットをお見せします。 [https://pontech-blog-git-development-pontech.vercel.app/post/dapps-everyday-5](https://pontech-blog-git-development-pontech.vercel.app/post/dapps-everyday-5) 記事下部にConnectボタンがあり、mintできるようになっています。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F0380a9f9d964bc8d14267690b50256ce963b67bd-1882x1274.png%3Fw%3D1882%26auto%3Dformat&w=3840&q=75) [mintできるNFT](https://testnets.opensea.io/ja/assets/mumbai/0xd2ba08159c22818ecfdbd701036b6de2dd55cff4/5) ### このHP・ブログの技術構成 少し脱線しますが、株式会社PontechのHPであるこのサイトは、Sanity.io + Next.jsで作られています。 特に [Stablo Minimal Blog Template](https://www.sanity.io/projects/stablo-minimal-blog-template) というテンプレートを使っています。 フロントエンドは自分でカスタマイズすることができ、ブログ部分のCMSはSanity.ioである程度柔軟にできているので気に入っています。 今回はこのNext.jsのコードをいじっていきます。 ### ERC1155のSignature mint Thirdwebを使って各記事ごとにERC1155トークンをmintできるようにします。 以下の記事がベースとなります(テーマとはズレますがERC1155のSignature mintingの点だけ参考にします)。 [Sell Your NFT in Multiple Currencies at the Same Time](https://blog.thirdweb.com/guides/sell-nft-multiple-currencies) まず [Editionコントラクト](https://thirdweb.com/thirdweb.eth/TokenERC1155/1.1.4) を用意しておきます。 次にAPI層を作り、フロントエンドから触れるように開通します。 app/api/generate-mint-signature/route.ts ```typescript import { NextResponse } from "next/server"; import { ThirdwebSDK } from "@thirdweb-dev/sdk"; type APIRequest = { address: string; slug: string; }; export async function POST(request: Request) { const data: APIRequest = await request.json(); const { address, slug } = data; const json = { signedPayload: "mintSignature" }; return NextResponse.json(json); } ``` mint.jsというコンポーネントを作ります。ボタンを押してPOSTできていることを確認します。 ```typescript "use client"; export default function Mint(props) { const mint = async () => { const signedPayloadReq = await fetch( `/api/generate-mint-signature`, { method: "POST", body: JSON.stringify({ address: "address", slug: props.slug.current }) } ).catch(error => { console.log(error); setIsMinting(false); alert(error); }); const signedPayload = (await signedPayloadReq.json()) .signedPayload; }; return (
); } ``` Thirdwebのreact SDKをインストールしてConnect Walletを実装し、Mint.jsをPostのページで読み込みます。読み込む際にThirdwebProviderで囲ってあげる必要があります。 ```typescript "use client"; import { ConnectWallet, useAddress, useContract } from "@thirdweb-dev/react"; import { useState } from "react"; export default function Mint(props) { const address = useAddress(); const mint = async () => { if (!address) return; setIsMinting(true); const signedPayloadReq = await fetch( `/api/generate-mint-signature`, { method: "POST", body: JSON.stringify({ address, slug: props.slug.current }) } ).catch(error => { console.log(error); setIsMinting(false); alert(error); }); const signedPayload = (await signedPayloadReq.json()) .signedPayload; console.log(signedPayload); }; return (
{address ? ( ) : ( )}
); } ``` post/\[slug\]/default.js ```typescript ``` apiでsignatureを生成します。 ```typescript import { NextResponse } from "next/server"; import { ThirdwebSDK } from "@thirdweb-dev/sdk"; type APIRequest = { address: string; slug: string; }; export async function POST(request: Request) { const data: APIRequest = await request.json(); const { address, slug } = data; const sdk = ThirdwebSDK.fromPrivateKey( process.env.ADMIN_PRIVATE_KEY!, "mumbai", { secretKey: process.env.TW_SECRET_KEY } ); const edition = sdk.getContract( "0xD2BA08159c22818EcFdbD701036b6de2dD55cFF4", "edition" ); const metadata = { name: `Dapps Everyday NFT #${slug}`, description: "このNFTをmintしたことで、まいにちDappsのファンであることを証明します。", image: "https://15065ae3c21e0bff07eaf80b713a6ef0.ipfscdn.io/ipfs/bafybeihhcykfpr2nt6kt5jshcn3kskfsf2a3cl2qkbqzxsv543qpn7bi4e/IMG_8953.jpg", attributes: { slug }, animation_url: `https://pontech.dev/post/${slug}` }; const numberPart = slug.match(/\d+$/); if (!numberPart) { throw Error("この記事はmint対象ではありません。"); } const number = parseInt(numberPart[0], 10); const nextTokenIdToMint = await ( await edition ).erc1155.nextTokenIdToMint(); let mintSignature; if (number == nextTokenIdToMint.toNumber()) { console.log("generate"); mintSignature = await ( await edition ).erc1155.signature.generate({ quantity: 1, to: address, price: "0", mintStartTime: new Date(0), metadata }); } else if (number < nextTokenIdToMint.toNumber()) { console.log("generateFromTokenId"); mintSignature = await ( await edition ).erc1155.signature.generateFromTokenId({ tokenId: number, quantity: 1, to: address, price: "0", mintStartTime: new Date(0), metadata }); } else { throw Error("この記事はmint対象ではありません。"); } const json = { signedPayload: mintSignature }; return NextResponse.json(json); } ``` ERC1155のsignatureの生成には2種類あり、新しくトークンを生成する場合は通常のerc1155.signature.generate()を、既存のトークンをmintしたい場合にはerc1155.signature.generateFromTokenId()を実行する必要があります。上記のコードはそこを使い分けています。 またThirdwebのSDKのinit時にAPIのsecretKeyを渡しているのは、generateするときにmetadataをThirdweb経由でIPFSにアップロードしてもらっているので、APIKeyが必要になります。 フロントエンドでmintします。 ```typescript "use client"; import { ConnectWallet, useAddress, useContract } from "@thirdweb-dev/react"; import { useState } from "react"; export default function Mint(props) { const address = useAddress(); const [isMinting, setIsMinting] = useState(false); const { contract: edition } = useContract( "0xD2BA08159c22818EcFdbD701036b6de2dD55cFF4", "edition" ); const mint = async () => { if (!address) return; setIsMinting(true); const signedPayloadReq = await fetch( `/api/generate-mint-signature`, { method: "POST", body: JSON.stringify({ address, slug: props.slug.current }) } ).catch(error => { console.log(error); setIsMinting(false); alert(error); }); const signedPayload = (await signedPayloadReq.json()) .signedPayload; console.log(signedPayload); try { const nft = await edition?.erc1155.signature.mint( signedPayload ); setIsMinting(false); alert( `mint成功 https://testnets.opensea.io/ja/assets/mumbai/0xd2ba08159c22818ecfdbd701036b6de2dd55cff4/${nft.id}` ); return nft; } catch (e) { console.error(e); setIsMinting(false); return null; } }; return (
{address ? ( <> {isMinting ? ( ) : ( )} ) : ( )}
); } ``` これで完成です! ### まとめ 今回はまだ本番のサイトには導入していませんが、機能面、デザイン面、そしてトークンの意義を調整して、各記事ごとにNFTをmintしてもらえる機能をつけようと考えています。トークン×企業HPの新しい導入例を作れたらと思います! 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## NFT Minting with Credit Cards [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#2 クレカ決済できるNFTのmintサイトの作り方 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) July 27, 2023· 5 min read ![クレカ決済できるNFTのmintサイトの作り方](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa39472fe25919f2e416c3828d235f2d46e9ac3c2-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDappsの2日目は、 [前日](https://www.pontech.dev/post/dapps-everyday-1) に続いてNFTのmintサイトを作成しますが、クレジットカード💳での支払いに対応していきます。私たちが受託開発を行う際、クライアントからは非クリプトユーザーに対応した機能の1つとしてクレカ決済が要望されることがあります(個人的には必ずしも良い策だとは思わないですが😅)。 今回は以下のいくつかの方法を試してみます。 - Paper.xyzのCheckout機能 - Crossmint - Stripeで実装する方法 ### Paper.xyzのCheckout機能 [Paper.xyz](https://withpaper.com/) はサービス内ウォレットの導入(Embedding Wallet)や今回使用するCheckout機能などNFT・Dapps開発者のためのツールを提供してくれているサービスです。先日Thirdwebに買収されたことを発表しました。 記事はかなり古いものなので、UIは現在とは異なっていますが、 [こちらの記事](https://blog.thirdweb.com/guides/accept-credit-card-payments/) を参考に進めていきます。 [https://withpaper.com/dashboard/contracts](https://withpaper.com/dashboard/contracts) にアクセスします。Paper.xyzを使ってNFTのコントラクトを新規に作成することも可能ですが、今回はThirdwebで既に作成してあるコントラクトを使いたいので、"Register Contract"ボタンを押します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F70e7687dce8f1289c8382e368e1c6b82ebaab285-2138x914.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Import Contract URLを選択し、ThirdwebのURLを入力します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F53ea23bf9ee4caf454346d6399ed54041cf5eec4-1240x870.png%3Fw%3D1240%26auto%3Dformat&w=3840&q=75) まいにちDapps 1日目で作成した [NFT Dropのコントラクト](https://thirdweb.com/mumbai/0xE71eE93Ad57c8b355e1bCDFe435B05673d8B4930) をそのまま使用します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F0f01f4471ada3e540ccb8837191f9dc082b60f5a-2070x680.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) [クレカ決済ができる販売リンク](https://withpaper.com/checkout/2cfbed1e-3e19-48e9-bac6-a125e973742d) が生成されます。 まずNFTを受け取るWalletをConnectする必要がありますが、先述したEmbedding Walletの機能を使ったサービス内ウォレットをemailベースで作成することもできます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F98385a732719f3a65b6661124e501c84494de13d-2666x1400.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc4d4931c5feade73aa526b8ad25e95923401486b-1374x932.png%3Fw%3D1374%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F15e0fed88805e2d42a2e12e5e8b4c220c7acf410-996x756.png%3Fw%3D996%26auto%3Dformat&w=3840&q=75) EmailにPINコードが送られてくるのでそれを使用するとウォレットが作成されてクレジットカード画面に遷移できます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1abcdad1857439eec0f27c8b559dba86d73ef623-1656x1012.png%3Fw%3D1656%26auto%3Dformat&w=3840&q=75) 支払われた売り上げの情報はDashboardで確認して、本人確認等が済んだのち引き出すことができます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F092423ac361465c76f309d5993b3330fdd8f3b6b-2100x1454.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) また自分のサイトに独自UIで埋め込むこともできるみたいです。 [https://docs.withpaper.com/reference/checkoutwithcard](https://docs.withpaper.com/reference/checkoutwithcard) Paperが購入者側から手数料を徴収するのでその点ご注意下さい。 ### Crossmintの導入 Paper.xyzと似たようなサービスでCrossmintがあります。 [こちらの記事](https://blog.thirdweb.com/guides/how-to-accept-credit-card-payments-for-your-ethereum-nft-drop-using-thirdweb-crossmint/) と [公式ドキュメントのQuickStart](https://docs.crossmint.com/docs/payments-quickstart) を元に進めていきます。 [staging.crossmint.com/console](https://staging.crossmint.com/console) にアクセスしてDeveloperアカウントを作成します。 [https://staging.crossmint.com/console/collections](https://staging.crossmint.com/console/collections) に行き、NFTコントラクトを登録します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7c4d114d81462340f622cf1f78cf5ed061a860f5-2734x1448.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8e24e2a91f44b176268ba67cd644df1fe9566905-2134x1402.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F03de8f394dd8c7ed9bf2fe4190b6961a255bca9e-1812x1312.png%3Fw%3D1812%26auto%3Dformat&w=3840&q=75) ダッシュボードに反映されます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fddc3ca561beb471336c6ec7b2e73b6b67bd0efd4-2556x1540.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Next.jsのプロジェクトを立ち上げて導入してみます。 ```javascript "use client"; import { CrossmintPayButton } from "@crossmint/client-sdk-react-ui"; export default function Home() { return (
); } ``` mintボタンが生成されます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ffbc8906dd8ea54fad672efaf2a49377f055e0fcb-1278x580.png%3Fw%3D1278%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F747c267755f5f471596ddd8b9adfc39a6db9aed6-894x1300.png%3Fw%3D894%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2fcd83d056f2b16b7e5a07b562ba4fdeb53c20b0-2398x1514.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 決済部分にはStripeが使われているようです。 ちなみにStripeのステージングモードではクレカ番号は424242424242で行けます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F0685f1b6912096bbaaf0873086f46656927d0fe8-898x1238.png%3Fw%3D898%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F241f513d94ed7639a0175936b3deb4402910aeaf-1054x1346.png%3Fw%3D1054%26auto%3Dformat&w=3840&q=75) 一度crossmint内に生成されたウォレットに対してmintされているようです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F0f809ef5f5907e54dbf1ae2af84a33d007419e83-1344x1246.png%3Fw%3D1344%26auto%3Dformat&w=3840&q=75) 好きなウォレットにガスレスで送ってくれるようです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9bb2ff247e8c7cb5ccc594b44e73c8a1edd00872-1156x498.png%3Fw%3D1156%26auto%3Dformat&w=3840&q=75) こちらも十分使いやすいと思いました。 ### Stripeで実装 最後に比較的自力で実装するケースを紹介します。 アーキテクチャとしてはシンプルで、Stripeでクレカ決済を行い、成功したらwebhookをキャッチしてそこでNFTをウォレットに対してmintするというものです。 Thirdwebでコントラクトをデプロイしておきます。 次に、Stripeのテストモードで商品を準備します。Productページから "+Add Product" をクリックして商品を追加します。subscriptionではなく単品にします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F935b3b8ec464a514533c38d171e5b3fd4221728a-2836x560.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 作成した商品のprice\_idと開発者アカウントのSecret\_Keyを取得しておきます。 次にNFT mintサイトを作ります。Next.jsのプロジェクトを立ち上げます。 トップページにボタンを設置、API層にstripe-checkoutというapiを生やします。 ```javascript import { NextResponse } from "next/server"; import Stripe from "stripe"; const stripe = new Stripe(process.env.STRIPE_SECRET_KEY || "", { apiVersion: "2022-11-15", }); export async function POST(request: Request) { const data = await request.json(); const { address } = data; const session = await stripe.checkout.sessions.create({ line_items: [\ {\ price: process.env.STRIPE_PRICE_ID,\ quantity: 1,\ },\ ], payment_method_types: ["card"], mode: "payment", success_url: `${process.env.NEXT_PUBLIC_BASE_URL}/success`, cancel_url: `${process.env.NEXT_PUBLIC_BASE_URL}/?canceled=true`, allow_promotion_codes: true, metadata: { address: address }, }); return NextResponse.json({ session_id: session.id, checkout_url: session.url, }); } ``` ```javascript "use client"; import { ConnectWallet, useAddress } from "@thirdweb-dev/react"; import { useRouter } from "next/navigation"; export default function Home() { const address = useAddress(); const router = useRouter(); const payment = async () => { const response: any = await fetch(`/api/stripe-checkout`, { method: "POST", body: JSON.stringify({ address: address, }), }); console.log(response); const result = await response.json(); router.push(result.checkout_url); }; return (
{address ? ( ) : ( )}
); } ``` ボタンを押すとStripeの決済画面に飛ぶ仕組みができました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F165078e36c300df998684c46c1c3f89e825c56c8-1956x1420.png%3Fw%3D1956%26auto%3Dformat&w=3840&q=75) webhookを作ります。 [https://dashboard.stripe.com/test/webhooks](https://dashboard.stripe.com/test/webhooks) テストするにはwebhookのエンドポイントをリモートからアクセス可能にする必要があるのでvercelにデプロイするか、開発中であればngrokなどで一時的なurlを取得する方法があります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F753ec73453d1bce9fa03403b6096404461695922-2084x1506.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 上記画像の右側にあるコードをNextに適切なコードに変更します。 ```javascript import { headers } from "next/headers"; import { NextResponse } from "next/server"; import { ThirdwebSDK } from "@thirdweb-dev/sdk"; import Stripe from "stripe"; const stripe = new Stripe(process.env.STRIPE_SECRET_KEY || "", { apiVersion: "2022-11-15", }); export async function POST(request: Request) { const bodyString = await request.text(); const body = JSON.parse(bodyString); const signature = headers().get("Stripe-Signature") as string; let event: Stripe.Event; try { event = stripe.webhooks.constructEvent( bodyString, signature, process.env.STRIPE_ENDPOINT_SECRET || "" ); } catch (err: any) { return NextResponse.error(); } switch (event.type) { case "checkout.session.completed": const checkoutSessionCompleted = event.data.object; // Then define and call a function to handle the event checkout.session.completed const sdk = ThirdwebSDK.fromPrivateKey( process.env.PRIVATE_KEY || "", "mumbai", { secretKey: process.env.SECRET_KEY, // Use secret key if using on the server, get it from dashboard settings } ); const contract = await sdk.getContract( "0xE71eE93Ad57c8b355e1bCDFe435B05673d8B4930" ); const tx = await contract.erc721.claimTo( body.data.object.metadata.address, 1 ); console.log(tx); break; // ... handle other event types default: console.log(`Unhandled event type ${event.type}`); } return NextResponse.json({}); } ``` デプロイして試してみました。Polygonscanでも確認できているのでOKそうです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fede058dc401187a11f5d17845aa6a8c5a611d2c2-1514x596.png%3Fw%3D1514%26auto%3Dformat&w=3840&q=75) ### まとめ 以上今回はクレジットカード決済をNFT mintサイトに導入する3つの実装方法をご紹介しました。いずれの方法も本番環境で行うには発行者の事業体の審査が必要になるのでご留意ください。 日本の事業者さんで [Piement](https://paypiement.xyz/) というサービスが提供されているようです!こちらは試せていないのですが、LPを見る限り、NFTプロジェクト側の手数料は無料で導入でき、ユーザーに支払ってもらうビジネスモデルで運営されているようです。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## zkTLS App Development [技術記事](https://www.pontech.dev/category/tech) # zkTLSプロトコルを使用したアプリケーション開発【zkPass編】 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) December 03, 2024· 13 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe3ba3ff384af116b65443f3c94159c26ba141626-2940x1592.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 株式会社Pontechの [ぽんた](https://twitter.com/suhara_ponta) です。PontechではzkTLSを用いたアプリケーションの開発に着目・注力しています。 [zkTLSについての考察と期待する理由](https://www.pontech.dev/post/think-about-zktls) zkTLSのプロトコルを使用したアプリケーションの開発方法について記事を書きます。今回はzkPass編です。 ### 今回開発するアプリケーション [Stackup](https://stackup.dev/) というDeveloper向けのLearn&Earnプラットフォームで提供されていたミッションがとても分かりやすく、公式チュートリアル以上に充実していたので、そちらに沿ってやっていきます。 [Quest 2 - Understand how to use the Extension zkPass JS-SDK](https://earn.stackup.dev/campaigns/begin-your-zero-knowledge-journey-with-zkpass/quests/quest-2-understand-how-to-use-the-extension-zkpass-js-sdk-98f6) [Quest 3 - Using zkPass In A Practical Example](https://earn.stackup.dev/campaigns/begin-your-zero-knowledge-journey-with-zkpass/quests/quest-3-using-zkpass-in-a-practical-example-e5c2) ざっくり言うとNotionの特定のOrganizationに入れる人だけがオンチェーンからSecretの文字列を参照できるというデモです。 ### zkPassのダッシュボードでの設定 [zkPass dev center](http://dev.zkpass.org/) にアクセスし、ウォレットでログインします。 Projectを作成します。開発環境でテストするため、Domainはlocalhostに設定します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fbdaaf65d0dd5b266178791aced10f46a9efa6905-1419x801.png%3Fw%3D1419%26auto%3Dformat&w=3840&q=75) ### カスタムスキーマの設定 次にSchemaを作成していきます。Schemaの設定には以下の2つのBrowser Extensionが必要です。 - [zkPass Schema Validator](https://chromewebstore.google.com/detail/zkpass-schema-validator/kpcbjghknfclbkejkdllpjhhheppaoca) - [zkPass Transgate](https://chromewebstore.google.com/detail/zkpass-transgate/afkoofjocpbclhnldmmaphappihehpma) zkPass Schema Validatorは、構築されたJSONスキーマが正しく機能していることを検証します。JSONスキーマは、証明生成のために取得する外部データソースを記述するための「仕様」です。JSONスキーマについての詳細は次のステップで説明されます。 zkPass Transgate拡張機能は、証明生成が行われる場所です。これはエンドユーザーにもインストールしてもらう必要があります。 #### **JSON Shcema** JSONスキーマ(または単にスキーマ)は、以下の3つの主要な要素で構成されます 1. 検証条件に基づいて必要なAPIリクエスト 2. 検証に必要なフィールドを抽出するためのAPIレスポンス内のパス 3. 検証のためのアサーション 以下はスキーマの詳細な定義です: - **issuer**: データソースの名前(例: Twitter、Discordなど)。 - **desc**: スキーマの詳細な説明。 - **website**: 指定されたAPIが含まれるウェブページのリンク。このウェブページは、ユーザーが検証を開始するとブラウザタブでTransGate拡張機能によって表示されます。 - **APIs**: 指定されたデータを返すRESTful APIのリスト。配列として定義されており、複数のAPIを含むことができます。 - **host**: APIのホスト。 - **intercept**: APIの詳細情報を定義。TransGate拡張機能は、ここで定義されたAPIに対して3P-TLSを実行します。 - **url**: APIのURLの絶対パス。 - **method**: APIのHTTPメソッド。 - **query**: HTTPリクエストヘッダー内のクエリパラメータ。 - **keyとvalue**: クエリのキーと値を指定。例: URL `https://...?needBalanceDetail=true` の場合、 `"needBalanceDetail": "true"` と定義。 - **verify**: キーと値がゼロ知識検証を受ける必要がある場合、値は `true` または `false` とする。 - **header**: HTTPリクエストヘッダー内のヘッダーパラメータ。 - **keyとvalue**: ヘッダーのキーと値を指定。例: ヘッダー `graphql-operation: AvatarMenuQuery` の場合、 `"graphql-operation": "AvatarMenuQuery"` と定義。 - **verify**: キーと値がゼロ知識検証を受ける必要がある場合、値は `true` または `false` とする。 - **body**: HTTPリクエスト内のボディ。 - **keyとvalue**: ボディのキーと値を指定。 - **verify**: キーと値がゼロ知識検証を受ける必要がある場合、値は `true` または `false` とする。 - **assert**: 検証条件を定義。 - **key**: JSON内で検証されるデータフィールドを選択。キーは「\|」で区切られます。 - **value**: 上記で定義されたキーに関連付けられたデータと比較する値。 - **operation**: アサーション条件(例: >, <, =, >=, <=, !=, in, contains)。 - **nullifier**: データソース内のJSONで一意の識別子フィールドを選択(例: uid、idなど)。 - **HRCondition**: 各アサーションの説明。 - **tips**: データソースのウェブサイトの右下に表示されるユーザーへのヒント。 `nullifier` と `intercept` は次の用途で重要です。 - **nullifier**: ユーザーの一意の識別子を提供するため、Sybil攻撃を防止します。 - **intercept**: 外部データソースを取得し、APIエンドポイントを指し示すために必要であり、証明を生成するために使用されます。 #### zkPass Dev Centerの使用方法 zkPass Dev Centerを使用すると、開発者は一意のアプリIDを生成し、プリセットまたはゼロからJSONスキーマを作成できます。各JSONスキーマには一意のスキーマIDが割り当てられます。 - **アプリID**: zkPassをアプリに統合するために使用されます。各アプリIDにはスキーマとスキーマIDのリストが関連付けられています。スキーマIDに対して間違ったアプリIDを使用すると、zkPass統合が無効になります。 - **データソース**: ユーザーは外部のプライベートデータソースを使用して証明を生成したり、証明生成に利用したりすることができます。 どのように動作するのかを理解するために、カスタムJSONスキーマを作成するためのデータポイントを選択してみましょう。 #### データポイントの選択 ゼロ知識証明(zkProofs)に使用できる任意のデータポイントを選択できます。これらのデータポイントは、クライアント側でAPIコールを行い、サーバー側のデータを取得します。 今回のクエストでは、Notionアプリをこれらのデータポイントのソースとして使用します。以下に、その利用方法を説明します。 #### データポイントを有効活用する方法 例えば、次のようなテストを実行できます: - **例1:** Notionページを所有していることを証明する → この場合、Notionアカウントを所有していることにもなります(プロセスでログインが必要だからです)。 - **例2:** 特定のNotionページにアクセスできることを証明する → 所有権は関係なく、そのページにアクセス権があることを示します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc7653fe2461062879f2bddedfe9ca1650cb2a40f-1130x907.png%3Fw%3D1130%26auto%3Dformat&w=3840&q=75) データはJSON形式で提供されます。注目すべきフィールドは `userHasExplicitAccess` で、ユーザーが指定されたNotionページにアクセスできるかを確認するために使用されます。 もしNotionページ上に「リクエストアクセス」ボタンが表示されている場合、それはそのページへのアクセス権がないことを意味します。ただし、これはあくまでデモンストレーション用の例です。このクエストのステップの目的は、証明に使用できるデータポイントをどのように探すかを学ぶことにあります。 使用できるデータについての理解が深まったところで、次に進んで **カスタムスキーマを作成** しましょう。 ```json { "issuer": "Notion", "desc": "A productivity and note-taking web application", "website": "https://www.notion.so/xxxxxxx", "APIs": [\ {\ "host": "www.notion.so",\ "intercept": {\ "url": "api/v3/getUserAnalyticsSettings",\ "method": "POST"\ },\ "nullifier": "user_id"\ },\ {\ "host": "www.notion.so",\ "intercept": {\ "url": "api/v3/getPublicPageData",\ "method": "POST"\ },\ "assert": [\ {\ "key": "userHasExplicitAccess",\ "value": "true",\ "operation": "=",\ "verify": true\ }\ ]\ }\ ], "HRCondition": [\ "Notion Has Page Access"\ ], "tips": { "message": "Login to your Notion Account and select any page you want to check you have access to. Wait for the page to fully load." } } ``` 次に、JSONスキーマエディタの右下付近にある「Check Schema」を選択します。スキーマ内のターゲットウェブサイトフィールドが正しく設定されていれば、指定されたNotionページにリダイレクトされます。リダイレクト後、「Check Pass」ボタンが表示されたモーダルが表示されます。検証が完了するまで待ちます。APIエンドポイントがスキーマ内で正しく設定されている場合、以下のスクリーンショットのような一致が確認されます。「Check Pass」ボタンをクリックしてください。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb47b4aebff07c26bd6a954d96935ebbe66ba1937-424x233.png%3Fw%3D424%26auto%3Dformat&w=3840&q=75) 最後に、zkPass Dev Centerのページで\*\*「Submit」\*\*をクリックし、新しいスキーマを登録します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4c794029f8d33b793e1c4780d9b204b927a75353-673x210.png%3Fw%3D673%26auto%3Dformat&w=3840&q=75) ### Vite+Reactでフロントエンドの作成 Vite + React プロジェクトを準備します。以下のコマンドを実行して、プロジェクトテンプレートを作成してください。 ```bash npm create vite@latest zkpass-capstone -- --template react-swc-ts cd zkpass-capstone npm install npm install @zkpass/transgate-js-sdk vite-plugin-node-polyfills web3 ethers ``` `npm run dev` **http://127.0.0.1:5173** に立ち上がります。 App.tsxを編集していきます。 ```typescript import { type FormEvent, useEffect, useState } from "react"; import "./App.css"; import TransgateConnect from "@zkpass/transgate-js-sdk"; import type { Result } from "@zkpass/transgate-js-sdk/lib/types"; import { ethers } from "ethers"; const App = () => { const [appId, setAppId] = useState("xxxxxxxxxxx"); const [schemaId, setSchemaId] = useState("xxxxxxxxx"); const [result, setResult] = useState(undefined); return (
requestVerifyMessage(e, appId, schemaId)} > {result !== undefined ? (
Result: {JSON.stringify(result, null, 2)}
) : ( "" )}
); } export default App; ``` `appId` と `schemaId` には初期状態のプレースホルダ値がすでに割り当てられています。ご自身のappIdとschemaIdにこれらの「xxxxxxxxxxx」を置き換えてください 検証ロジックを書き始める前に、プロジェクトのルートディレクトリに移動してください。その後、 `vite.config.ts` ファイルを編集します。内容をすべて以下のコードスニペットに置き換えてください。 ```typescript import { defineConfig } from "vite"; import react from "@vitejs/plugin-react-swc"; import { nodePolyfills } from "vite-plugin-node-polyfills"; // https://vitejs.dev/config/ export default defineConfig({ build: { modulePreload: { polyfill: true, }, }, server: { port: 5173, host: "127.0.0.1", }, plugins: [\ nodePolyfills({\ globals: {\ Buffer: true,\ },\ }),\ react(),\ ], }); ``` App.tsxに戻り、編集していきます。 ```typescript export type TransgateError = { message: string, code: number } ``` ```typescript const requestVerifyMessage = async ( e: FormEvent, appId: string, schemaId: string, ) => { e.preventDefault(); try { const connector = new TransgateConnect(appId); const isAvailable = await connector.isTransgateAvailable(); if (isAvailable) { const provider = window.ethereum ? new ethers.BrowserProvider(window.ethereum) : null; const signer = await provider?.getSigner() const recipient = await signer?.getAddress() const res = (await connector.launch(schemaId, recipient)) as Result; console.log("Result", res); const verifiedResult = connector.verifyProofMessageSignature( "evm", schemaId, res ); if (verifiedResult) { alert("Verified Result"); setResult(res); } } else { console.log( "Please install zkPass Transgate from https://chromewebstore.google.com/detail/zkpass-transgate/afkoofjocpbclhnldmmaphappihehpma", ); } } catch (error) { const transgateError = error as TransgateError; alert(`Transgate Error: ${transgateError.message}`); console.log(transgateError); } }; ``` **vite-env.d.ts**. を以下に置き換えます。 ```typescript /// import type { Eip1193Provider } from "ethers/providers"; declare global { interface Window { ethereum?: Eip1193Provider | null; } } ``` 実際に試してみます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fae81e7aa4ab7f03fc207b2c885d97688f5506983-396x476.png%3Fw%3D396%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb4fe587c435dc782706db26fc24d391e6570433f-1089x638.png%3Fw%3D1089%26auto%3Dformat&w=3840&q=75) ### コントラクトの開発 `forge init secret` をプロジェクトのRootディレクトリで実行します。secretフォルダができます。 `touch src/{Proof,ProofVerifier,Attestation,GetSecret}.sol` 以下のスマートコントラクトは、 `Proof.sol`、 `ProofVerifier.sol`、および `Attestation.sol` です。これらのスマートコントラクトは、オンチェーンでデータを検証および確認するために一緒に使用されます。そのためには、生成された証明を確認する必要があります。以下は、証明の生成時に得られる重要なフィールドのAPIリファレンスです。 #### 証明に関連する重要なフィールド - **allocatorAddress (string)**: アロケーターノードのアドレス。 - **allocatorSignature (string)**: アロケーターノードによるタスクメタデータの署名。 - **publicFields (Object)**: スキーマで定義された公開フィールドの値。 - **publicFieldsHash (string)**: 公開フィールド値のハッシュ。 - **taskId (string)**: アロケーターノードによって割り当てられたタスクの一意のID。 - **uHash (string)**: データソース内のユーザー一意IDのハッシュ値。 - **validatorAddress (string)**: バリデーターノードのアドレス。 - **validatorSignature (string)**: バリデーターノードによる検証結果の署名。 また、証明を生成するためのデータを取得する特定のAPIエンドポイント(例: Notion API)を指し示すJSONスキーマのスキーマIDが必要です。このスキーマIDは `zkPass Dev Center` で生成されます。 #### 各スマートコントラクトの機能 - **`Proof.sol`** - **Proof構造体** を含み、証明に必要なフィールドを保持します。 - **`ProofVerifier.sol`** - バリデータアドレスを検証するロジックを含みます。 - **`Attestation.sol`** - 検証済みの証明を記録し、証明の正確性を保証します。また、証明が再検証された、または再検証可能であることを証明します(アテステーション)。 これらのスマートコントラクトを次のステップで記述していきます。 **Proof.sol** ```typescript // SPDX-License-Identifier: APACHE-2.0 pragma solidity ^0.8.20; struct Proof { bytes32 taskId; bytes32 schemaId; bytes32 uHash; address recipient; bytes32 publicFieldsHash; address validator; bytes allocatorSignature; bytes validatorSignature; } ``` **ProofVerifier.sol** ```typescript // SPDX-License-Identifier: APACHE-2.0 pragma solidity ^0.8.20; import {Proof} from "./Proof.sol"; contract ProofVerifier { address public defaultAllocator = 0x19a567b3b212a5b35bA0E3B600FbEd5c2eE9083d; constructor() {} function verify(Proof memory _proof) public view returns (bool) { return ( verifyAllocatorSignature(_proof.taskId, _proof.schemaId, _proof.validator, _proof.allocatorSignature) && verifyValidatorSignature( _proof.taskId, _proof.schemaId, _proof.uHash, _proof.recipient, _proof.publicFieldsHash, _proof.validator, _proof.validatorSignature ) ); } function verifyAllocatorSignature( bytes32 _taskId, bytes32 _schemaId, address _validator, bytes memory _allocatorSignature ) public view returns (bool) { bytes32 hashed = keccak256(abi.encode(_taskId, _schemaId, _validator)); address allocator = recoverSigner(prefixed(hashed), _allocatorSignature); return (allocator == defaultAllocator); } function verifyValidatorSignature( bytes32 _taskId, bytes32 _schemaId, bytes32 _uHash, address _recipient, bytes32 _publicFieldsHash, address _validator, bytes memory _validatorSignature ) public pure returns (bool) { bytes32 hashed = keccak256(abi.encode(_taskId, _schemaId, _uHash, _publicFieldsHash, _recipient)); address validator = recoverSigner(prefixed(hashed), _validatorSignature); return (validator == _validator); } function prefixed(bytes32 hash) private pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } function recoverSigner(bytes32 _hash, bytes memory _signature) private pure returns (address signer) { require(_signature.length == 65, "Invalid signature length"); bytes32 r; bytes32 s; uint8 v; assembly { r := mload(add(_signature, 0x20)) s := mload(add(_signature, 0x40)) v := byte(0, mload(add(_signature, 0x60))) } if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { revert("SignatureValidator#recoverSigner: invalid signature 's' value"); } if (v != 27 && v != 28) { revert("SignatureValidator#recoverSigner: invalid signature 'v' value"); } signer = ecrecover(_hash, v, r, s); // Prevent signer from being 0x0 require(signer != address(0x0), "SignatureValidator#recoverSigner: INVALID_SIGNER"); return signer; } } ``` **Attestation.sol** ```typescript // SPDX-License-Identifier: APACHE-2.0 pragma solidity ^0.8.20; import {Proof} from "./Proof.sol"; import {ProofVerifier} from "./ProofVerifier.sol"; struct Attestation { bytes32 uid; bytes32 schema; bytes32 uHash; address recipient; bytes32 publicFieldsHash; } contract SampleAttestation is ProofVerifier { mapping(bytes32 uid => Attestation) private attestations; mapping(address => bytes32 uid) private attestedAddresses; string private secret = "bad Secret"; constructor() ProofVerifier() {} function attest(bytes memory _proofAsBytes) public returns (string memory) { Proof memory _proof = abi.decode(_proofAsBytes, (Proof)); require(verify(_proof), "verify proof fail"); Attestation memory attestation = Attestation({ uid: 0, schema: _proof.schemaId, uHash: _proof.uHash, recipient: _proof.recipient, publicFieldsHash: _proof.publicFieldsHash }); bytes32 uid; uint32 bump = 0; while (true) { uid = getUID(attestation, bump); if (attestations[uid].uid == 0) { break; } unchecked { ++bump; } } attestation.uid = uid; attestations[uid] = attestation; attestedAddresses[_proof.recipient] = uid; return secret; } function getAttestationFromAddress(address _recipient) public view returns (Attestation memory) { return attestations[attestedAddresses[_recipient]]; } function getAttestation(bytes32 uid) public view returns (Attestation memory) { return attestations[uid]; } function getUID(Attestation memory attestation, uint32 bump) private pure returns (bytes32) { return keccak256( abi.encodePacked( attestation.schema, attestation.uHash, attestation.recipient, attestation.publicFieldsHash, bump ) ); } } ``` **Attestation.sol の概要** `Attestation.sol` は、証明が検証されるたびに、\*\*証明されたデータの正確性を保証する「アテステータ」\*\*として機能します。このコントラクトは、 `ProofVerifier` を利用して署名を検証し、 `attest` 関数を通じて検証済み証明の記録(アテステーション)を作成します。 **主な特徴** **アテステーションの一意性**: 各アテステーションには `getUID` 関数から生成される新しいUIDが割り当てられます。これにより、すべてのアテステーションは一意であることが保証されます。 **秘密の返却**: アテステーションが生成されると、同じ `attest` 関数の最後のreturn文で秘密(secret)が返されます。 **オンチェーン記録**: このコードは、すべての検証済み証明をオンチェーンに記録し、それらの証明が改ざんされないことを保証するために重要です。 **GetSecret.sol** ```typescript // SPDX-License-Identifier: MPL-2.0 pragma solidity ^0.8.20; import {Proof} from "./Proof.sol"; contract GetSecret { address public proxy; string private secret = "bad Secret"; event Response(bool success, string secret, address recipient); constructor(address _proxy) { proxy = _proxy; } function getSecret() public view returns (string memory) { return secret; } function assignSecret(Proof calldata _proof) public returns (string memory) { require(msg.sender == _proof.recipient, "Sender address do not match with recipient!"); (bool success, bytes memory secretData) = proxy.call(abi.encodeWithSignature("attest(bytes)", abi.encode(_proof))); if (success) { secret = abi.decode(secretData, (string)); emit Response(true, secret, msg.sender); return secret; } revert("Nuh uh!"); } } ``` 本来はテストケースを書くべきですが、この記事では省略します。 scriptsディレクトリにDeployer.s.solを作成します。 ```typescript // SPDX-License-Identifier: MPL-2.0 pragma solidity ^0.8.13; import {Script, console} from "forge-std/Script.sol"; import {GetSecret} from "../src/GetSecret.sol"; contract Deployer is Script { GetSecret public getSecret; address public proxyContract = 0x75982eBc73a9Fc60d4CBbb4be8CF301bfC032976; function run() external { // reads our .env file uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); getSecret = new GetSecret(proxyContract); vm.stopBroadcast(); } } ``` Deployer.s.solを実行してコントラクトをデプロイします。 ```bash source .env forge script --chain sepolia script/Deployer.s.sol:Deployer --rpc-url ${SEPOLIA_RPC_URL} --broadcast -vvvv ``` フロントエンドにコントラクトとのインタラクションを実装していきます。 `npm install @wagmi/cli wagmi viem@2.x @tanstack/react-query` wagmi.config.tsを作成し、以下のコードを実装します。 ```typescript import { defineConfig } from "@wagmi/cli"; import { foundry, react } from "@wagmi/cli/plugins"; const toTitleCase = (str: string) => { return str .toLocaleLowerCase() .replace(/\b\w/g, (char: string) => char.toUpperCase()); }; export default defineConfig({ out: "src/generated.ts", contracts: [], plugins: [\ foundry({\ project: "./secret",\ }),\ react({\ getHookName(options) {\ return `use${toTitleCase(options.type)}${options.contractName}${options.itemName}`;\ },\ \ }),\ ], }); ``` `npx @wagmi/cli generate ` を実行すると **generated.ts** がsrcディレクトリに生成されます。 main.tsxを以下に置き換えます。 ```typescript import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import App from "./App.tsx"; import "./index.css"; import { WagmiProvider } from "wagmi"; import { http, createConfig } from 'wagmi' import { sepolia } from 'wagmi/chains' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' const queryClient = new QueryClient(); const config = createConfig({ chains: [sepolia], transports: { [sepolia.id]: http(), }, }) const root = document.getElementById("root") ?? new HTMLElement(); createRoot(root).render( , ); ``` App.tsxを以下に置き換えます。 ```typescript import { type FormEvent, useEffect, useState } from "react"; import "./App.css"; import TransgateConnect from "@zkpass/transgate-js-sdk"; import type { Result } from "@zkpass/transgate-js-sdk/lib/types"; import { ethers } from "ethers"; import { useReadGetSecretGetSecret, useWriteGetSecretAssignSecret } from "./generated"; import { readContract } from "viem/actions"; export type TransgateError = { message: string; code: number; }; export type Proof = { taskId: `0x${string}`, schemaId: `0x${string}`, uHash: `0x${string}`, recipient: `0x${string}`, publicFieldsHash: `0x${string}`, validator: `0x${string}`, allocatorSignature: `0x${string}`, validatorSignature: `0x${string}` } const contractAddress = ""; const App = () => { let chainParams: Proof; const [appId, setAppId] = useState( "xxxxxx", ); const [schemaId, setSchemaId] = useState( "xxxxxx", ); const [result, setResult] = useState(undefined); const [secret, setSecret] = useState("0x"); const { writeContractAsync, isPending } = useWriteGetSecretAssignSecret(); const { data, isPending: isPendingRead, refetch } = useReadGetSecretGetSecret({ address: contractAddress }); useEffect(() => { if (!isPending || !isPendingRead) { setSecret(data ?? ""); } }, [isPending, data]) const requestVerifyMessage = async ( e: FormEvent, appId: string, schemaId: string, ) => { e.preventDefault(); try { const connector = new TransgateConnect(appId); const isAvailable = await connector.isTransgateAvailable(); if (isAvailable) { const provider = window.ethereum ? new ethers.BrowserProvider(window.ethereum) : null; const signer = await provider?.getSigner() const recipient = await signer?.getAddress() const res = (await connector.launch(schemaId, recipient)) as Result; console.log("Result", res); const validatedResult = connector.verifyProofMessageSignature( "evm", schemaId, res ); if (validatedResult) { alert("Validated Result"); console.log(res); setResult(res); const taskId = ethers.hexlify(ethers.toUtf8Bytes(res.taskId)) as `0x${string}` // to hex const schemaIdHex = ethers.hexlify(ethers.toUtf8Bytes(schemaId)) as `0x${string}`// to hex if (recipient) { chainParams = { taskId, schemaId: schemaIdHex, uHash: res.uHash as `0x${string}`, recipient: recipient as `0x${string}`, publicFieldsHash: res.publicFieldsHash as `0x${string}`, validator: res.validatorAddress as `0x${string}`, allocatorSignature: res.allocatorSignature as `0x${string}`, validatorSignature: res.validatorSignature as `0x${string}`, } await writeContractAsync({ address: contractAddress, args: [chainParams] }); await refetch(); } } } else { console.log( "Please install zkPass Transgate from https://chromewebstore.google.com/detail/zkpass-transgate/afkoofjocpbclhnldmmaphappihehpma", ); } } catch (error) { const transgateError = error as TransgateError; alert(`Transgate Error: ${transgateError.message}`); console.log(transgateError); } }; return (
requestVerifyMessage(e, appId, schemaId)} > {result !== undefined ? (<>
Result: {JSON.stringify(result, null, 2)}

Secret: {secret}

) : ( "" )}
); }; export default App; ``` 以上で開発は完了です! NotionアカウントでVerificationを行ってみましょう。 以下の手順で、ウォレットアドレスが正常にアテステーションされたことを確認してください。 1. **リンク先にアクセス** [Sepolia Etherscan](https://sepolia.etherscan.io/address/0x75982eBc73a9Fc60d4CBbb4be8CF301bfC032976#readContract) に移動します。 2. **コントラクトの読み取り** ページ上の「 **Read Contract**」タブをクリックします。 3. **手順に従う** スクリーンショットに示された手順に従って操作します。 - 必要なフィールドに正しいウォレットアドレスを入力します。 - `Call` ボタンをクリックして、アテステーションの状態を確認します。 これにより、アテステーションが正常に記録されていることを確認できます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5cce1cc45039f1695995790267bf078a266d5739-1411x669.png%3Fw%3D1411%26auto%3Dformat&w=3840&q=75) ### まとめ zkPassを用いた開発は、Schemaのカスタマイズが一番の難関と思われます。Reclaim Protocolと比較すると難易度が高く、検証できるデータの柔軟性も低い印象です。一方、ブラウザ拡張機能の性質上、ユーザーに対して複数回Proofを発行してもらうユースケースでは、既存ブラウザ内でログイン済みのサービスからProofを生成できるので、都度ログイン作業をしてもらう必要のあるReclaim ProtocolよりUXが良い印象です。 株式会社Pontechでは、Dapps開発の受託を請け負っております。本記事のように採用する技術やサードパーティのサービスの検討からお手伝いすることが可能です。 Dapps開発に関するご相談がございましたら、ぜひ当社まで [お問い合わせ](https://www.pontech.dev/contact) ください。 関連記事 [zkTLSの現在地と実用化に向けた課題](https://www.pontech.dev/post/zktls-current-position) [zkTLSについての考察と期待する理由](https://www.pontech.dev/post/think-about-zktls) [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025 Pontech.Inc SystemDarkLight ## AI Agents and zkTLS [技術記事](https://www.pontech.dev/category/tech) # Crypto AI AgentとzkTLSを活用したユースケースと未来展望 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) January 14, 2025· 7 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb1bbd1b50354af24617256719172ed89548d8bdf-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75) 2024年末から2025年の始まりにかけて、Cryptoの文脈での AI Agent が大きな注目を集めました。トークン価格の高騰を経て、市場はすでに高値から大幅に調整が入っている状況で「幻滅期」にも見えますが、本質的な開発・ユースケースの拡大が進むタイミングでもあり、依然として **AI Agent** は注目に値する分野といえるでしょう。 本記事では、Crypto業界の AI Agent がどのように一般的な AI Agent と異なるのかを整理しつつ、弊社が注目しているzkTLSとの組み合わせによる新たな可能性を事例を交えて考察してみたいと思います。 ## 1\. AI Agent とは? ### 一般的なAI エージェント AI エージェントとは、環境と対話してデータを収集し、そのデータをもとに自律的に意思決定を行い、設定された目標を達成するためのソフトウェアプログラムです。人間が目標を設定し、それを達成するための最適なアクションを AI エージェントが自ら選択して実行します。 たとえば、コンタクトセンターの顧客対応を自動化する AI エージェントを考えてみましょう。エージェントは顧客に質問を投げかけ、内部文書を検索して解決策を提示します。顧客の反応や追加情報の有無によって、ケースを解決するか、あるいは人間の担当者にバトンタッチするかを判断します。これは従来の定型的なチャットボットとは異なり、学習を重ねて対応を最適化できる点に特徴があります。 > **参考:** [What is AI Agent? (AWS公式)](https://aws.amazon.com/jp/what-is/ai-agents/) ### Crypto文脈におけるAI Agent 一方で、暗号通貨(Crypto)のエコシステムにおける AI エージェントは、 **ブロックチェーンと暗号通貨固有のタスクを自律的に処理** するように設計されたシステムです。取引の自動化、ポートフォリオ管理、ブロックチェーン関連のさまざまなタスクを最小限の人間の介入で行い、データを分析・意思決定・アクション実行まで担います。 - 暗号通貨のトレーディングや資産運用を自動化し、煩雑なやり取りを簡素化 - 単にあらかじめ設定されたルールに従うだけのボットではなく、 **学習・適応** していくのが特徴 > **参考:** [What Are Crypto AI Agents? (CoinGecko)](https://www.coingecko.com/learn/what-are-crypto-ai-agents) こうしたCryptoの AI エージェントは、単なるbotとは違い、 **LLM(Large Language Model)などの機械学習モデルの出力** をフルに活用し、オンチェーン/オフチェーンのデータを分析してより複雑な指示を自律的にこなすことが期待されています。 ## 2\. zkTLSとは? そしてAI Agentとの融合 ### zkTLS とは? 「zkTLS」は、Zero-Knowledge(ゼロ知識証明)やMPC(マルチパーティ計算)の技術を用いて、「 **あるwebサーバーからあるデータを受け取ったことを第三者に証明する**」仕組みです。既存の仕組みではプラットフォーム側がAPIを公開していない限り上記は実現できませんでした。zkTLSはユーザー側がプラットフォーム側の許可なく勝手に証明を作ることができます。さらにその証明はオンチェーンでも検証可能なため、web2データのweb3への橋渡しが進むことが期待されています。 詳しくは以下の記事をご覧ください↓ [**zkTLSについての考察と期待する理由**](https://www.pontech.dev/post/think-about-zktls) [**zkTLSの現在地と実用化に向けた課題**](https://www.pontech.dev/post/zktls-current-position) ## 3\. AI × zkTLS 事例①:AI Agentの真正性証明 AI Agent には、「本当にAIを使っているのか?」「中身は実は人力では?」と疑わしくなるケースも少なくありません。そこで、zkTLSを使って「 **AI Agentの応答が、実際に特定のAI APIサーバーから返ってきたものか**」を検証可能にするユースケースが登場しています。 ### Primusによる事例 「Primus」というプロジェクトはzkTLSを活用して、Eliza Agent(対話型AIエージェント)の応答が正真正銘 AI(特定のAPI)からのものであることを **オンチェーン上で検証可能** にする仕組みを構築しています。 [https://x.com/primus\_labs/status/1878101990275690666](https://x.com/primus_labs/status/1878101990275690666) [https://x.com/primus\_labs/status/1878721426490073455](https://x.com/primus_labs/status/1878721426490073455) > **引用:** _With cryptography-backed #zkTLS, your agent is always on its best behavior—fully verifiable and trustworthy!_ > > _Primus X Artela: Partnering to Advance the Fully On-Chain #AIAgent Revolution @primus\_labs has effectively leveraged #zkTLS to develop a fully verifiable Eliza agent._ このように、 **暗号学的な証明を用いて「AIがきちんとAIによる応答を返している」ことを担保** できるのがzkTLSとの掛け合わせのメリットの一つといえます。たとえば、ユーザーが「このエージェント、本当にLLMを利用しているの?」と疑問を抱いたときに、オンチェーンの証明を確認することで、エージェントへの信頼性を高めることが可能です。 ## 4\. AI × zkTLS 事例②:zkTLSプロトコル自体へのAIの組み込み もう一つ興味深いのは、 **zkTLSプロトコル自体にAIを組み込む** というユースケースです。zkTLSの開発においては、以下のような課題が挙げられます。 - 証明したいデータのPath(JSONの構造体)を具体的に指定する必要がある。 - そのため、Webから証明したい特定のデータを取得しようとしても、開発者自身がそのアカウントを保有していないと認証が難しい - さらに、サイトやAPIの仕様変更が頻繁に起きるとメンテナンスコストがかさむ こうした課題を、AI が以下のようにサポートするイメージです。 1. 「このwebサイトから、○○という条件を証明するデータを取得して証明を作成して」とざっくり指定しておくことが可能に 2. 開発者が条件を満たすアカウントを保有していない場合でも類推して指定しておくことができる可能性がある 3. サイトやAPIの仕様変更があっても、AIが柔軟性を持っているので、個別に対応する必要が減少する 実際にReclaim Protocolではそのような取り組みがなされています。 [https://x.com/madhavanmalolan/status/1870497769049509988](https://x.com/madhavanmalolan/status/1870497769049509988) > **引用:** _!!! huge !!! we are now able to use AI to extract information from a website it has never seen before it is able to do a zk setup for a deterministic privacy preserving flow for any user that comes thereafter idea to prod in 3months!_ ## 5\. これからの展望:AI (特にLLM) とブロックチェーンの接点 以上のように、Crypto文脈の AI Agent と zkTLS の組み合わせは、 - **AIの応答をオンチェーンで信頼性を担保しながら利用** できる - **AIがzkTLSの開発を補助し、さらなるユースケース開拓を加速** する といった未来への可能性を切り開きつつあります。2024年末〜2025年はブームが一服するようにも見えますが、技術的な進化と実サービスレベルのユースケース拡大が加速する時期でもあると言えます。 株式会社PontechではzkTLSの普及に向けてユースケースの創出に取り組んでおります。 zkTLSを活用したDapps開発に関するご相談がございましたら、ぜひ当社まで [お問い合わせ](https://www.pontech.dev/contact) ください。 [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Aptos Tutorial Overview [Aptos](https://www.pontech.dev/category/aptos) # Aptosに入門する 2023/01時点 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) January 08, 2023· 2 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1149753a12b469acf88b15f730685e694650d182-1400x766.png%3Fw%3D1400%26auto%3Dformat&w=3840&q=75) 韓国で開催されるハッカソンに参加したい(韓国に行ってみたいだけw)のでAptosに入門していきます。 Petraというウォレットのインストール [https://aptos.dev/guides/install-petra-wallet-extension](https://aptos.dev/guides/install-petra-wallet-extension) Aptos CLIのダウンロード [https://aptos.dev/cli-tools/build-aptos-cli](https://aptos.dev/cli-tools/build-aptos-cli) このチュートリアルをやっていきます [https://aptos.dev/tutorials/your-first-transaction/](https://aptos.dev/tutorials/your-first-transaction/) pnpm run transfer\_coin のところで nodenv: version \`v16.14.0' is not installed が出たのでnodenv install 16.14.0でインストール 再び実行するとトランザクションを起こせた ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F0b1baad175dd1b4be02740b77a395a49c31437c5-1408x652.png%3Fw%3D1408%26auto%3Dformat&w=3840&q=75) transfer\_coin.tsのコードを読みます。Typescriptなので読める。少し安心。 続いてこちらのチュートリアル、NFTについて [https://aptos.dev/tutorials/your-first-nft](https://aptos.dev/tutorials/your-first-nft) セットアップ部分はすでにやっているので飛ばしてStep3から create collectionしたのちにcreate tokenしている。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F35adece65d18112f19f171575add34a8882ce81b-1300x454.png%3Fw%3D1300%26auto%3Dformat&w=3840&q=75) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F997cfb2b2febd4be86e67d3af3cc7bb96ecd6485-1092x410.png%3Fw%3D1092%26auto%3Dformat&w=3840&q=75) EVMと同じ感じだろうか。 コレクションとトークンのデータはクリエイターのアカウントの中に保存されているらしい。ここはEVMとは概念が違うところ ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4d1de3a8f45701f4fd589806b4d366be70fb314b-1678x278.png%3Fw%3D1678%26auto%3Dformat&w=3840&q=75) 欲しくないNFTを勝手に送りつけられないように、OfferとClaimという手順を踏む仕様にしているらしい。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F959d7dd052e1a648f393137cd5d915e8f264c476-1694x346.png%3Fw%3D1694%26auto%3Dformat&w=3840&q=75) 一方的なトークンの送付は複数の署名を必要とするmultiagent transactionでならできるらしい ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F73f771e062c20b8db811ebb4a5de8e7b3d3386c2-1664x384.png%3Fw%3D1664%26auto%3Dformat&w=3840&q=75) 続いてこちらのYour first Dappに挑戦していきます。 [https://aptos.dev/tutorials/your-first-dapp](https://aptos.dev/tutorials/your-first-dapp) STEP2まで進めるとこうなります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb7136c184fbdbcfa63d4949b1b242a57a6129431-1620x274.png%3Fw%3D1620%26auto%3Dformat&w=3840&q=75) Step4でMove moduleを公開しました [https://explorer.aptoslabs.com/account/](https://explorer.aptoslabs.com/account/0x0ac81922a0eae8e08959c496918b86db8452a50d0a34ecc9151b6d2f3aa5cf4f).... ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F762de82c75be271a49344c90fa2c909420a99dba-2808x216.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Step5までやるとこうなりました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F699e7837589f988118f2f9d49e0fa51a347509b1-2460x812.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Step6で少しつまづきました。 const resourceType =\`${address}::message::MessageHolder\`; このアドレスの部分が、フロントで取得できる部分は0x0から始まるのに対して、getAccountResourcesで取れるデータ内では0xで始まるという事態が起きました。この部分は省略しました。ご存じの方いたら教えてください。 今回は主にフロントエンドの連携の方法がわかったので、次はMoveを本格的に触ってみようと思います。 [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## NFT Minting Site Guide [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#1 NFTのmintサイトの作り方 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) July 26, 2023· 7 min read ![NFTのmintサイトの作り方](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8425c04e4f90c44a93a2feabe378625325183e9f-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) ### 企画趣旨説明 今日から新しい企画を始めます。 その名も『まいにちDapps』です。僕が可能な限り毎日、Dapps(分散型アプリケーション)を作り、その作り方を公開していく企画です。 Ethereumを中心にNFT・DeFiなどの基本的なDappsを改めて調査しながら理解して作れるようになっていきます。新しいDappsを発明するのではなく、既存のDappsを真似していくイメージです。カバー予定のリストは以下になります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa5c54e5279fe5ca0e04b5d6a1d687fc1277311ff-860x1686.png%3Fw%3D860%26auto%3Dformat&w=3840&q=75) この企画を通して、 - 弊社が受託開発でご提供できるサービスの例をご紹介すること - 既存の素晴らしいツール・サービスを紹介して業界として車輪の再発明を防ぐこと - 逆に簡単なサービスの割に高い料金を取っているところはめくっていこう という裏テーマがあります! ### Thirdwebで作るNFTのmintサイト徹底解説 『まいにちDapps』の1日目では、NFTの基本中の基本、mintサイトを作るところから始めます。 色々なやり方は存在しますが、今回は簡単で実用的なThirdwebを使ってmintサイトを作る方法をご紹介します。Thirdwebは非常に便利なので、これからも頻繁に登場する予定です。ただし、今回提供する情報は2023年7月時点のものなので、最新のバージョンや情報と異なる可能性がある点、ご了承ください。 まずは、Thirdwebのテンプレートから [NFT Drop](https://thirdweb.com/thirdweb.eth/DropERC721) を選択し、デプロイします。 これで [コントラクトのデプロイが完了しました](https://thirdweb.com/mumbai/0xE71eE93Ad57c8b355e1bCDFe435B05673d8B4930)。なお、Thirdwebのダッシュボードは誰でもアクセス可能ですが(←便利ですね!)、特定のmethodはその権限を持つウォレットからのみ実行できます。 次に、ExtensionsタブからNFTsのページに移動し、NFTの情報を登録します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F384886089d7eb32f6566a0f97f46b5fd1023cf3c-2422x1060.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) コレクタブルを発行する際は、Batch Upload機能を活用すると便利です。csvまたはjsonファイルを事前に準備しておく必要があります。また、画像等を先にIPFSにアップロードする場合も、ThirdwebのGUIを使用するか、あるいは自身でSDK経由でアップロードするスクリプトを書いて用意しておくといいですよ。 [https://thirdweb.com/dashboard/storage](https://thirdweb.com/dashboard/storage) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F09565284debc7851bb4caab8b426be8ca1d3a499-2190x1326.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ここでのUpload操作で、NFTのLazy mintの準備が整います。 なお、一度登録したNFTはClaim(取得)される前であっても編集はできなくなるので、誤ったデータをアップロードしないよう注意しましょう。 次に、Claim Condition(取得条件)の設定に移ります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc24e678b7cc86870c2809a995121ab1265666374-2360x1020.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ThirdwebのClaim Conditionsでは開始日時や価格、Allowlistなど様々な設ThirdwebのClaim Conditions機能では、開始日時、価格、Allowlist(許可リスト)等、多岐に渡る設定が可能です。複数の条件を設定できるので、例えば「この期間はAllowlistのユーザーだけが0.01ETHで購入できる」や「この期間は全体公開で0.02ETHで購入できる」といったフェーズごとの設定も可能ですよ。 現在のverで設定可能な項目を列挙します。 - フェーズの種類 - Only Owner - Allowlist Only - Public with Allowlist - 誰でもmintできるが、Allowlistのウォレットは特別な条件でmintできる - Public - フェーズの開始日時 - フェーズのmint総数上限 - フェーズの1ウォレット当たりmint数上限 - mintあたりの価格と支払い通貨(ERC20であれば対応可能) - Allowlistの登録 コントラクト全体についての設定可能項目も以下のものがあります。 - コントラクト自体のメタデータ - 画像、名前、SNSのLinkなど、Etherscanなど一部Dappsで参照されます - Primary SalesのRecipient Address - 初期販売の売り上げが送付されるアドレス - RoyaltiesのRecipient Addressと% - オンチェーンのロイヤリティ分配標準に準拠しているマケプレで参照されて二次流通のロイヤリティが分配されます - Platform fee - 発行代理店みたいなサービスが入る時に売り上げの%を分配する設定ができます。Primary SalesのRecipient AddressをSplitコントラクトにする方法もありますが、こちらの方が便利ですね(参照: [what is platform fee?](https://support.thirdweb.com/faqs/46Gqh9RZHFdSczPCyeCQJH/what-are-platform-fees/1Ucdf3xUMLUvJois9jctS6?utm_source=dc)) - Admin - 上記などの設定を変更できるアドレス、複数設定可能 - Minter / Creator - Adminの権限はないが、NFTを作成できるアドレス、複数設定可能 - Transfer - コントラクト全体のトークンを誰がTransferできるかを決定します。基本はTransferableで全員がTransferできるようになっています。 - Not Transferableにすることで指定のアドレスだけがTransfer可能な状態にしたり、全アドレスを不可にすることでいわゆるSBTを実現できます。 これでコントラクトの準備はひとまず完了です。 次に、フロントエンドの作成に進みます。まずは、Next.jsのプロジェクトを立ち上げましょう。 `yarn create-next-app` 最近ではNext.js 13がリリースされ、ディレクトリ構成等が変わりました。まだ新しいバージョンに慣れていないところもありますが、今回は新しいバージョンに準拠して進めていきます。また、CSSのライブラリについては個人的にはChakra UIに慣れていますが、Tailwindが主流になりつつある(もしくはすでになっている)感があるので、これを機にTailwindを使ってみることにします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4f1f65f1392874e1f0931850233a3f8c03dfed6c-2922x1248.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 基本的には、Thirdwebのbuildページの指示に従って進めていきます。 まず、以下のThirdwebのライブラリをインストールします。 `@thirdweb-dev/react @thirdweb-dev/sdk ethers@5` 次に、ThirdwebProviderを設定しますが、これにはNext.js 13では少し手間がかかります。具体的には、Providersというfunction componentを作成し、それをlayout.tsxで読み込むように設定します。 providers/Providers.tsx ```javascript "use client"; import { ThirdwebProvider } from "@thirdweb-dev/react"; export function Providers({ children }: { children: React.ReactNode }) { return {children}; } ``` Layout.tsx ```javascript import { Providers } from "./providers/Providers"; export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( {children} ); } ``` 次に、Page.tsxを編集していきます。こちらの公式リンクには、全てのパターンを網羅した例が出ています→ [https://github.com/thirdweb-example/nft-drop/blob/main/src/App.tsx](https://github.com/thirdweb-example/nft-drop/blob/main/src/App.tsx) 今回は基本的な部分のみを取り出して実装していきます。 在庫量と価格を取得し表示する機能と、Connect WalletボタンおよびClaimボタンを作成しました。本来であれば、「Sold Out」の表示やエラーハンドリングも必要になるのですが、今回はこれらの部分は省略します。 ```javascript "use client"; import { ConnectWallet, useActiveClaimConditionForWallet, useAddress, useClaimedNFTSupply, useContract, useContractMetadata, useNFT, useUnclaimedNFTSupply, useClaimNFT, } from "@thirdweb-dev/react"; import { useMemo } from "react"; import { BigNumber, utils } from "ethers"; export default function Home() { const contractAddress = "0xE71eE93Ad57c8b355e1bCDFe435B05673d8B4930"; const contractQuery = useContract(contractAddress); const contractMetadata = useContractMetadata(contractQuery.contract); const { data: firstNft, isLoading: firstNftLoading } = useNFT( contractQuery.contract, 0 ); const address = useAddress(); const activeClaimCondition = useActiveClaimConditionForWallet( contractQuery.contract, address ); const unclaimedSupply = useUnclaimedNFTSupply(contractQuery.contract); const claimedSupply = useClaimedNFTSupply(contractQuery.contract); const numberClaimed = useMemo(() => { return BigNumber.from(claimedSupply.data || 0).toString(); }, [claimedSupply]); const numberTotal = useMemo(() => { return BigNumber.from(claimedSupply.data || 0) .add(BigNumber.from(unclaimedSupply.data || 0)) .toString(); }, [claimedSupply.data, unclaimedSupply.data]); const priceToMint = useMemo(() => { const bnPrice = BigNumber.from( activeClaimCondition.data?.currencyMetadata.value || 0 ); return `${utils.formatUnits( bnPrice.mul(1).toString(), activeClaimCondition.data?.currencyMetadata.decimals || 18 )} ${activeClaimCondition.data?.currencyMetadata.symbol}`; }, [\ activeClaimCondition.data?.currencyMetadata.decimals,\ activeClaimCondition.data?.currencyMetadata.symbol,\ activeClaimCondition.data?.currencyMetadata.value,\ ]); const { mutate: claimNFT, isLoading, error, } = useClaimNFT(contractQuery.contract); return (
{firstNftLoading || !unclaimedSupply || !claimedSupply || !activeClaimCondition ? ( <>
loading...
) : ( <>

{numberClaimed} / {numberTotal} claimed

{priceToMint}

{address ? ( <> {isLoading ? ( <>loading... ) : ( )} ) : ( )} )}
); } ``` これで完成です!vercelにデプロイしてください。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc5a855ef7950921ab49a8f98a03e464191cca526-1978x1474.png%3Fw%3D1978%26auto%3Dformat&w=3840&q=75) コードはこちらに公開しておきます。 [https://github.com/ksuhara/dapps-everyday/tree/main/001-mint-site](https://github.com/ksuhara/dapps-everyday/tree/main/001-mint-site) ### まとめ 今日の連載では、NFTの基本となるmint(発行)サイトの作成について解説しました。 明日は、今日作成したmintサイトを一歩進め、クレジットカード決済機能を付け加えたサイトの作り方を解説します。より多機能なサービスの開発を可能にするためのノウハウを身につけていきましょう。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Node as a Service [技術記事](https://www.pontech.dev/category/tech) # Dapps開発におけるNode as a Serviceの比較・まとめ [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) April 11, 2024· 5 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F97dba32d131fb408c75ea0b0cd61fcb6ee67611f-2940x1652.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Dapps開発において、webのフロントエンドがブロックチェーン上のスマートコントラクトと通信して関数を呼び出すためには、ブロックチェーンを構成するノードのいずれかと通信する必要があります。ノードがEVM上で実行されるトランザクションのリクエストをブロードキャストし、マイナーがトランザクションを実行し、状態の変化をネットワーク全体に伝播します。ノードと通信するには 1. 独自のノードをセットアップする 2. サードパーティによって提供されるノードを使用する という選択肢があります。独自のノードをセットアップするのは時間とコストがかかるため、2の選択肢を採ることが一般的です。このサードパーティによって提供されるノードとの通信ができるAPIをJSON RPC APIと言ったりします。またこのサービスのことをノード運用サービスやNode as a Serviceと呼びます。以下の図がイメージしやすいです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F69dcf0aea15b59c2ccd9f09e9f30be713526e266-1130x1536.png%3Fw%3D1130%26auto%3Dformat&w=3840&q=75) (出典: [The Architecture of a Web 3.0 application](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application#Story)) ## 代表的なノード運用サービス Ethereumの公式ドキュメント「 [ノード運用サービス](https://ethereum.org/ja/developers/docs/nodes-and-clients/nodes-as-a-service/)」で列挙されるサービスのうち、いくつかをピックアップしてまとめてみます。 #### [Infura](https://www.infura.io/) - 最も代表的なサービスの1つ。Consensysが運営 - 他サービスと比べてスループット(1秒あたりの最大リクエスト数)が高い - Free、$50、$225、$1,000、カスタムという5段階の料金体系 - Ethereum、Polygon、Avalanche、Optimism、Arbitrum、Linea、Blast、Starknet、Celo、Palm #### [Alchemy](https://www.alchemy.com/supernode) - NFT APIでも人気のSaaS - 無料プランの枠が大きい - Free、$49、$199、カスタムという4段階の料金体系 - Ethereum、Polygon、Optimism、Arbitrum、Starknet、Base、Solana、Astar、Polygon zkEVM #### [QuickNode](https://www.quicknode.com/) - 老舗のJSON RPC APIプロバイダー - 低額の有料プランがある。非EVMも比較的豊富 - Free、$10、$49、$299、カスタムという5段階の料金体系 - Aptos、Arbitrum、Arbitrum Nova、Avalanche、Base、Berachain、Bitcoin、Blast、BNB Smart Chain、Celo、Cyber、Ethereum、Fantom、Flow、Gnosis、Immutable zkEVM、NEAR、Optimism、Polkadot、Polygon、Polygon zkEVM、Scroll、SEI、Solana、Stacks、Starknet、Stellar、TRON、XRP Ledger、zkSync Era #### [ChainStack](https://chainstack.com/) - NFT APIやIPFSストレージなどのサービスも併せ持つ開発者プラットフォーム - Free、$49、$349、カスタム($990 ~ )という4段階の料金体系 - Ethereum、Polygon、BNB Smart Chain、Base、Avalanche、Arbitrum、zkSync Era、Polygon zkEVM、Optimism、NEAR、Aurora、Solana、Scroll、Ronin、Aptos、Oasis Sapphire、Gnosis Chain、Cronos、Filecoin、Fantom、Starknet、Harmony、Tezos、Fuse、Bitcoin #### [All That Node](https://www.allthatnode.com/) - 韓国ベースのDSRV Labsが運営するサービス - Free、$49、$199、カスタムという4段階の料金体系 - 62のチェーンに対応 #### [Ankr](https://www.ankr.com/) - Public、Freemium、Premium、Enterpriseという4段階の料金体系(PublicもFreemiumも無料のため実質3つの料金体系) - Publicはサインインなしで利用可能 - Premiumは従量課金制 - 40以上のチェーンに対応 #### [Tokenview](https://services.tokenview.io/en/product/node-service) - Free、$588、$3588、カスタムという4段階の料金体系 - Ethereum、BNB Smart Chain、Ethereum Classic、KuCoin、Bitcoin、 TRON、Bitcoin Cash、DASH、DOGE、Lite coin、DigiByte、Ravencoin. #### [NodeReal](https://nodereal.io/) - Free、$31、$159、$399、カスタムという5段階の料金体系 - Aptos、BNB Smart Chain、Ethereum、Ethereum Beacon、Optimism、Polygon 表にまとめると以下のようになります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F97dba32d131fb408c75ea0b0cd61fcb6ee67611f-2940x1652.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ## まとめ ご自身のプロジェクトに合わせて以下の観点から絞り込み、選択をすると良いかと思います。 1. 対応チェーンが十分かで絞り込み。将来的に複数チェーンに展開する可能性がある場合、そのチェーンも考慮に入れる。 2. 可用性が信頼できるサービスか検討(実際に数字を検証することは難しいので、運営歴の長さや採用プロジェクト数でトラストできるか検討するしかないです) 3. 想定ユーザー数・リクエスト数に照らしてコストを比較 4. エンタープライズプランに適応しそうな場合、各サービスに連絡して相見積もり→交渉 株式会社Pontechでは、Dapps開発の受託を請け負っております。本記事のように採用する技術やサードパーティのサービスの検討からお手伝いすることが可能です。 Dapps開発に関するご相談がございましたら、ぜひ当社まで [お問い合わせ](https://www.pontech.dev/contact) ください。 **関連記事** [Dapps開発におけるウォレット接続の選択肢まとめ・比較](https://www.pontech.dev/post/wallet-adaptors) [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## zkTLS Exclusive EC Site [プレスリリース](https://www.pontech.dev/category/press) # 博報堂キースリー・博報堂とともにzkTLSを活用した「界隈」限定ECサイトのデモを公開 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) March 26, 2025· 6 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6ea263cdc7056762e1f41fc312fe1ca638fb89a6-1200x630.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75) 2025年3月26日 株式会社Pontech 株式会社Pontechはこの度、株式会社博報堂キースリー(以下「博報堂キースリー」)および株式会社博報堂(以下「博報堂」)が共同開発したweb3を活用した「界隈」マーケティングソリューションに開発パートナーとして参画し、web3技術「Web Proof(zkTLS)」を用いたデモサイト「界隈限定ECサイト」の公開に協力したことをお知らせします。本ソリューションでは、特定のコミュニティ(界隈)に属することを証明できたユーザーだけが商品やサービスを購入可能となる、新たな購買体験を提供します。 ### ■界隈限定ECサイトについて 公開されたデモサイトでは、以下3種類の条件を満たしたユーザーのみが商品の購入ページにアクセスできます。 1. **暗号資産界隈** - Binance Japanのアカウントに100$USD以上の資産を保有していることを証明 2. **風呂キャンセル界隈** - X(旧Twitter)で「風呂キャン」を含むツイートをしていることを証明 3. **生成AI界隈** - ChatGPTのPlusまたはProプランに加入していることを証明 URL: [kaiwai-ec.pontech.dev](https://kaiwai-ec.pontech.dev/) Kaiwai EC - YouTube Pontech 5 subscribers [Kaiwai EC](https://www.youtube.com/watch?v=qLj-EessAsI) Pontech Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=qLj-EessAsI&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 0:48•Live • [Watch on YouTube](https://www.youtube.com/watch?v=qLj-EessAsI "Watch on YouTube") [zkPass](https://zkpass.org/) が提供するzkTLS技術を通じ、これらの証明はユーザーが許可した範囲内で安全に行われます。証明データは検証可能な形で保持され、従来のスクリーンショットやAPI公開による個人情報の過剰な露出リスクを大幅に低減しました。 ### ■zkTLS(Web Proof)がもたらす新しいデータ連携のかたち Pontechは、zkTLS(Web Proof)を「 **ユーザーにデータの主権が存在する新しい形のデータ連携基盤**」と位置づけています。従来、このようなデータ連携を行うためには、プラットフォーム側のAPI公開や企業同士の交渉・合意によるデータ共有が必要でした。しかしこれは、小規模企業や個人開発者にとってハードルが高く、またユーザー視点に立っても、データはプラットフォーム側に握られ、ポータブルに活用できないという課題がありました。 zkTLSでは、ユーザーが手元のデータを選択的かつ安全に証明・共有できるため、 **ユーザー自身がデータ主権を持つ** 新しいエコシステムの実現が期待されています。プラットフォームの制約を超えて、個人がコントロールできる「ポータブルな」データ連携が可能になり、多様なユースケースに対応していくことが目標です。 ### ■ECサイトから始めた理由 Pontechは、zkTLSがブロックチェーンとは関係なく証明の作成・検証ができ、幅広いユースケースに活用できる技術であることを多くの方に知ってもらいたいと考えています。とはいえ、zkTLSはまだ一般的に **Battle Tested** な状況ではありません。いきなり大きな金額を扱うサービスで導入するとリスクが高いと考え、まずは **比較的導入ハードルが低く、かつ企業数も多い「ECサイト」** を入口として、デモや小規模検証を進めることを選びました。 また、 **「界隈限定」や「特別感」** という付加価値を打ち出すことで、EC事業者が顧客体験を差別化しやすくなるという仮説も背景にあります。今後、この取り組みを通じてノウハウを蓄積し、より大規模なサービスや他業種への展開を博報堂様とともに目指していきます。 ### ■zkTLS技術についての詳細 以下の記事を参考にしてください。 [zkTLSについての考察と期待する理由](https://www.pontech.dev/post/think-about-zktls) [zkTLS (Web Proofs) がっつり解説](https://zenn.dev/suhara_ponta/articles/68591f49ebb73e) [zkTLSプロトコルを使用したアプリケーション開発【zkPass編】](https://www.pontech.dev/post/zktls-app-dev-zkpass) ### ■zkPassについて [zkPass](https://zkpass.org/) は、 **ユーザーのプライベートなWebデータをブロックチェーン上で検証可能にするサービス** です。これにより、ユーザーは自身の法的な身元、金融記録、医療情報、社会的交流、ゲームデータ、実世界の資産、職務経験、教育、スキル認証など、多種多様なデータを選択的に証明できます。 - **プライバシー保護:** ユーザーが証明したい情報のみを安全に共有し、過剰な個人情報の漏洩リスクを低減。 - **柔軟なデータ連携:** 従来のAPIや直接交渉による連携とは異なり、ユーザー中心の証明プロセスを実現。 - **ブロックチェーン連携:** 証明データはブロックチェーン上で検証可能なため、改ざん防止や透明性が担保される。 ### ■Pontechへの開発相談・新規事業のご相談について 今回の「界隈限定ECサイト」をはじめ、Pontechでは **zkTLS技術を活用したPoC(概念実証)やMVPの高速開発、さらにブロックチェーンを含むweb3分野の新規事業検討** まで幅広く支援しています。 - **実際のビジネスに合わせたユースケース設計** (例:ユーザーの所有するオフチェーンデータの証明活用、競合サービスや補完サービスのユーザーに対するターゲティング施策など) - **MVPの開発・検証からプロダクション展開までのトータルサポート** (要件定義、UI/UX設計、アプリケーション開発、運用サポート など) - **技術・ビジネス両面での壁打ちコンサルティング** (今後のアップデートを見据えたロードマップ策定、技術選定、マーケティング施策のご提案 など) 「データの主権をユーザーに取り戻す」zkTLS技術を、これからのビジネスやサービスにどう活用できるのか。 **「まだアイデア段階だが、初期の構想を一緒に詰めてみたい」「具体的なプロダクト導入を検討している」** など、お気軽にご相談ください。 ### ◼︎博報堂キースリーについて 博報堂キースリーは、博報堂とAstar Network開発の知見を活かしコンサルティングや開発サポートを行うStartale Labs JapanのCEO渡辺創太氏が共に2022年12月に設立したweb3事業プロデュース企業です。「生活者発想」と「クリエイティビティ」で世界初のweb3サービスを生み出すことを目指し、パートナー企業と共により多くの生活者がweb3に参加できる社会の実現に貢献してまいります。 公式サイト: [https://key3.co.jp/](https://key3.co.jp/) 公式X(旧Twitter): [https://twitter.com/H\_KEY3](https://twitter.com/H_KEY3) ### ◼︎Pontechについて Pontechは、ブロックチェーンに特化した開発企業として、NFTを中心としたDappsやzkTLSを活用したプロダクトの開発に注力しています。自社サービスだけでなく、受託開発も積極的に手がけており、既存のDappsや開発者ツールへの深い理解を基に、MVPの高速開発を実現しています。 会社名:株式会社Pontch 代表者:須原 健太 事業内容:web3関連システム開発・コンサルティング事業 公式サイト: [https://www.pontech.dev/](https://www.pontech.dev/) ### ■本件に関するお問い合わせ - 株式会社Pontech - Email:info@pontech.dev - 公式サイト: [https://www.pontech.dev/](https://www.pontech.dev/) [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025 Pontech.Inc SystemDarkLight ## NFT Minting Solutions [技術記事](https://www.pontech.dev/category/tech) # マーケットプレイス・国内向け発行ソリューションを利用したNFTの発行方法 [![Matzo](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa1180731f9bb31b8725afa4543fa058a3675cea1-876x744.png%3Fw%3D876%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/matzo) [Matzo](https://www.pontech.dev/author/matzo) May 13, 2024· 8 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9d74d599a3ac1fbed90e6a08cad954a9d1d0157a-2786x1508.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) こんにちは。ブロックチェーン技術に関心があり学んでいる、大学院生です。今回は、NFTの発行方法のうち、NFTマーケットプレイスの発行機能を利用する方法と、国内向けの発行ソリューションについてまとめました。 NFT(Non-Fungible Token)は、ブロックチェーン上で構築できる代替不可能なトークンです。これにより、従来は簡単にコピーや改ざんができたデジタルアートやデジタルコンテンツにも、唯一無二の価値を付与することが可能になりました。 もちろん、独自にプログラミングなどを行なって、NFTを発行するコントラクトをブロックチェーン上にデプロイし、NFTを発行することもできますが、それなりの専門知識を必要とします。 そこで本記事では、非エンジニアの個人やアーティスト、あるいはNFTのマーケティング利用を考えている企業の担当者を対象に、NFTマーケットプレイスの発行機能を利用した方法と、国内企業向けの発行ソリューションを利用した方法を紹介します! ## NFTマーケットプレイスを活用した発行方法 NFTマーケットプレイスとは、NFTの作成、出品(発行)、販売、購入、二時販売などを含めた一連の取引ができるプラットフォームです。OpenSeaが代表例です。 ### どのような人におすすめか? 非エンジニアの個人やアーティスト、小規模なプロジェクトで気軽にNFTを発行したい人におすすめです。NFT販売ページのデザインや、コントラクトの機能のカスタマイズ性は低いので、活用方法は限定される面もありますが、ユーザーも使い慣れたUIで安心して取引できるというメリットもあります。費用面でも一番安価に抑えられるでしょう。 ### NFTを発行するマーケットプレイスの選定基準 1. **対応チェーン** どのブロックチェーンで発行・取引が可能か。あなたのプロジェクトが発行予定のチェーンに対応しているか確認しましょう。 2. **コントラクトの種類** NFTの代表的な規格にERC-721とERC-1155があります。またERC721AやERC721Cなど721を拡張した複数の公式/非公式の規格が存在します。プロジェクトがどのような規格を採用するべきかの検討はそれだけで別記事が書けるのでここでは省略しますが、コントラクトの規格も確認しましょう。可能ならエンジニアに相談しましょう(お気軽にPontechにご相談ください) 3. **ガス代** NFTを発行する際にはガス代が発生します。正確にはコントラクトの作成やNFTを発行するタイミングでガス代が発生しますが、技術的にはそれぞれ誰が負担するか(発行者か購入者かマーケットプレイス運営か)を選択する余地があります。マーケットプレイスが自身が望むガス代負担に対応しているか確認しましょう。 また、ガス代の大小もコントラクトによって差があるので、大量に発行する場合やEthereumメインネットで発行する場合は考慮したほうがよいかもしれません。 4. **手数料** NFTを販売するタイミングで、マーケットプレイスの手数料が発生する場合があります。課金体系を確認しましょう。 5. **画像データの保存先** 画像や動画の保存先も重要です。フルオンチェーンNFTもありますが、データ量の制限から多くはブロックチェーン外に保存されます。保存先はマーケットプレイスのサーバーやIPFSなどの分散型ファイルシステムがあります。 6. **対応データ形式** ほとんどのマーケットプレイスは画像、動画、音声ファイルに対応していますが、3Dオブジェクトやテキストファイルに対応しているか、データ量の上限があるかも比較のポイントです。 7. **UI(ユーザーインターフェース)** UIは使いやすさに直結しますが、実際に使ってみて好みで判断するのが良いでしょう。 ### 4つのマーケットプレイスの比較 #### [OpenSea](https://opensea.io/ja) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd4ced8ae63e1a428ab45f87f8a9637c250a7a495-2608x1562.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb9ee91223b06b9e8e18f25cad468b5a31d90fb63-2590x1532.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 世界で最も使用ユーザー数が多いマーケットプレイスです。宣伝次第では、世界中の登録者の目にとまる一方で、自分の作品が埋もれてしまう可能性もあります。 #### [Rarible](https://rarible.com/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2d777108e712097fa577a88a4cbc9a73e89c2387-2632x1344.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F52663d2400265a8434f1c425762cbd70c3dc5502-2480x1346.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) RaribleもOpenSea同様、人気のあるNFTマーケットプレイスの1つです。マーケットでNFTを売買すると、RARIと呼ばれるガバナンストークが得られ、コミュニティ自体の運営にも参加することができます。 #### [Zora](https://zora.co/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7eb85f850f6fe44c5f95696bb96c3e3b894df6ca-2584x1414.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcfa3fcad4f585e0ca618866106c21b12facea207-2634x1552.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 2022年1月に立ち上がったZoraは、従来の中央集権的な運営によるマーケットプレイスと一線を画し、あくまで誰もがアクセスできるプロトコルとしてのマーケットプレイスです。そのため、ガス代のみで動き、取引に係る手数料が0%となっているのが特徴です。 #### [SuperRare](https://superrare.com/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fab7b2262e3912bdaed43035f7977ca28fcde2f26-2242x1342.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) アート作品の取引が主なSuperRare。最大の特徴は、作品を出品するためには、厳正なクリエイターの審査に合格しなければならないということです。この審査制度によってコンテンツの質が保証され、他のマーケットプレイスと比較して高値で取引されやすい市場といえるでしょう。 ここまで見てきたマーケットプレイスを比較すると以下のようになります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9d74d599a3ac1fbed90e6a08cad954a9d1d0157a-2786x1508.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ## 国内向けNFT発行ソリューション比較 NFTのマーケティング目的での利用を考えている企業にとって、国内企業が提供するNFT発行ソリューションも選択肢の1つになります。NFTの発行・配布または販売をし、マーケティング機能やコンサルティングも付随したサービスを提供する企業が複数あります。 個人での利用ではなく、法人が主要な対象顧客のイメージです。 #### [キリフダ](https://synschismo.com/service/kirifuda) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb7a65482b1b13c483d61ae3e68059c12f29f3d1f-1298x722.png%3Fw%3D1298%26auto%3Dformat&w=3840&q=75) キリフダは、2023年にリリースした、LINE上でのNFTの配布や販売に特化したツールです。LINEのメッセージ画面でNFTを配布したり、クレジットカードでNFTを購入したりすることが可能で、これまでウォレットの作成などで離脱しがちだったユーザーにも使いやすいのが特徴です。 #### [NFT Shot](https://www.sushitopmarketing.com/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd3f108a35dfb8a5593d4633bc60738da1eef951b-1774x926.png%3Fw%3D1774%26auto%3Dformat&w=3840&q=75) NFT Shotは、SUSHI TOP MARKETINGが開発するNFT配布サービスです。 画像をアップロードするだけで簡単にNFT配布用のリンクを生成でき、受け取る側もウォレットや暗号資産不要でNFTを体験することができます。 #### [NFT Pocket](https://web.nft-pocket.com/) キリフダ同様、LINE上でNFTの発行・配布を簡単に行うことができます。LINE上でNFT Pocketの友達追加を行うだけでウォレット操作ができるため、NFT所有に馴染みのない層にも簡単に配ることも可能です。 #### [Mint Monster](https://mint-monster.io/) MintMonsterでは、QRコード等を通して誰でも簡単にNFTにアクセスでき、メールアドレスを入力するだけで作成されるウォレットを通して、広く配布することができます。「ミッション」と呼ばれる配布条件を設定し、達成したユーザーのみに配布するなど、企業の目的に応じた機能拡張も可能です。 #### [Benefy](https://benefy.pontech.dev/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7046c1650bb226676a037f68db81b72285ce19ff-2638x1402.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 株式会社Pontechが提供するNFT発行サービス「Benefy」では、デジタル会員証やデジタル特典などを簡単にNFTとして発行できます。暗号通貨やウォレットを持たないユーザーも受け取りが可能になっています。 例えば、デジタル会員証では、管理者が付属情報のアップデートや削除ができるNFTを発行することで、会員権をコントロールすることができます。また、受け取り条件をカスタマイズでき、例えば合言葉を知っている人やアンケートに答えた人にだけ、特典を贈ることができる「デジタルおみやげ」もあります。 #### [SBINFT Mits](https://sbinft-mits.com/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2d575a13a43a14bc460f76c5459ee3840179201f-2568x1458.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) SBINFT Mits は企業とNFTプロジェクト、ファンとNFTフォルダーを、結び付けるための一連のサービスを提供しています。NFTの配布だけでなく、投票や抽選、discordとの連携などによって、ロイヤルカスタマーの獲得に特化しているといえます。 以上の国内向け発行ソリューションは、いずれも複雑なウォレット連携をすることなく、既存のLINEアカウントやメールアドレスで簡単に発行でき、かつ幅広い層に配布することができます。対応するチェーン、ウォレットを中心に比較してみると、以下のようになります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff33a5a04a24735dd1ee6b8390d5286644129d16b-2864x1546.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) UI・UX、料金体系、発行面以外のサポート、サービス終了後の移行容易性などから、どのソリューションを採用するか総合的に判断することをお勧めします。また各社サービスのアップデートが頻繁に行われている最中です。チェーン対応や料金体系も交渉の余地があると思いますので、現時点のサービス内容での比較に留まらず、要望をお伝えするのが良いかと思います。弊社運営のBenefyもお気軽にお問い合わせください! ## まとめ この記事では、NFTマーケットプレイス、国内向け発行ソリューションの一部を紹介してきました。これらのツールを活用することで、自分でコードを書かずとも簡単にNFTを発行することができます。NFT化したい対象や目的、対応するチェーンやウォレットの条件に合った発行方法を選んでみてください! 株式会社Pontechでは、Dapps開発の受託を請け負っております。本記事のように採用する技術やサードパーティのサービスの検討からお手伝いすることが可能です。 Dapps開発に関するご相談がございましたら、ぜひ当社まで [お問い合わせ](https://www.pontech.dev/contact) ください。 [← View all posts](https://www.pontech.dev/blog) [![Matzo](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa1180731f9bb31b8725afa4543fa058a3675cea1-876x744.png%3Fw%3D876%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/matzo) ### About Matzo Copyright © 2025Pontech.Inc SystemDarkLight ## zkTLS Current Challenges [技術記事](https://www.pontech.dev/category/tech) # zkTLSの現在地と実用化に向けた課題 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) November 28, 2024· 7 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5dca715352fe54eca72a3aabb9b759fd972be647-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75) 弊社Pontechではここ数ヶ月zkTLSの研究を進めています。これまでの記事では、zkTLSの可能性やその魅力的な側面について主にお伝えしてきました。しかし、実際にzkTLSを活用したアプリケーションのプロトタイプを開発する中で、いくつかの課題も明らかになってきました。今回は、zkTLSの現状と、それを実用化するうえで直面する課題について、技術的な制約、UXの課題、法的な整理の必要性という3つの視点から共有したいと思います。 過去関連記事↓ [zkTLSについての考察と期待する理由](https://www.pontech.dev/post/think-about-zktls) [zkTLS技術の解説とETH Tokyoハッカソン参加レポート](https://www.pontech.dev/post/zktls) ### zkTLSの現在地 zkTLSに関連するプロトコルはいくつか存在し、それぞれを活用したアプリケーションも登場しています。代表的なプロトコルとして以下が挙げられます。 - [TLSNotary](https://tlsnotary.org/) - [Reclaim Protocol](https://www.reclaimprotocol.org/) - [zkPass](https://zkpass.org/) - [Primus](https://primuslabs.xyz/) - [Opacity Network](https://www.opacity.network/) これらの中で、特に実用的なユースケースを提供しているアプリケーションの一例が、PSE(Privacy & Scaling Explorations)が開発する [**zkP2P**](https://zkp2p.xyz/) です。zkP2Pは、法定通貨から暗号資産へのオンランプを実現するサービスで、以下のような仕組みを採用しています。 1. ユーザーがVenmoやRevolutなどの個人間送金アプリで、特定の相手に送金を完了。 2. その送金完了画面をもとに、zkProofを生成。 3. zkProofをスマートコントラクトに提出し、対応するステーブルコインを引き出す。 このほかにも、ドメインやチケットの二次流通サービスなど、zkTLSを活用したユースケースが展開されています。これらはどれもzkTLSの使い所が上手く、感心するユースケースです。 しかし、現時点ではユーザー数が少なく、まだ「Battle Tested」(十分に実践で試された)の状態には至っていません。 次にzkTLSの現状の課題について、技術的な制約、UXの課題、法的な整理の必要性という3つの観点から整理してみます。 ### 技術的な制約 #### Web2サービスのAPI仕様への依存 - zkTLSを利用するサービスは、証明を作成する対象となるweb2サービスのTLS通信やAPI仕様に合わせて開発する必要があります。当然ながら、web2サービス側がこちらの要件に適応してくれることは期待できません。 - 例えば、1つのページに表示されるデータが複数のAPIエンドポイントから取得されることは珍しくありません。しかし、zkTLSでは1つのTLS通信に対して1つのProofしか生成できないため、複数のデータを証明する場合、個別にProofを作成する必要があります。これにより、効率や実装の複雑さに課題が生じます。 - また、web2サービス側がAPIの仕様を変更した場合、それに応じてシステムのメンテナンスが必要になります。zkProofの検証がオフチェーンでのみ行われる設計の場合はアップデートすれば足りますが、オンチェーンで検証を行う設計の場合、コントラクトのアップグレードとガバナンスを考慮しておく必要があります。 #### 証明の使い回しの問題 - zkProof内にユーザーを識別するためのIDが含まれていない場合、Proofを他人や自分で使い回すことが可能になります。これにより、本来意図した用途とは異なる形でProofが悪用されるリスクがあります。 - 例として、X(旧Twitter)上で特定のアカウントAをフォローしている人だけが購入できる商品を販売するケースを考えます。 - XのAPIでは、アカウントBがログインした状態でアカウントAのページにアクセスすると、アカウントBがAをフォローしているかどうかの情報が返されますが、このレスポンスにはアカウントBの情報は含まれていません。アカウントBの情報は別のAPIから取得されています。 - 仮にアカウントBがアカウントAをフォローしている場合、Bはその情報を基にzkProofを生成できます。しかし、AをフォローしていないCが商品を購入したい場合、BにProofの生成を依頼し、それを使用して商品を購入することが可能になってしまいます。 - zkTLSは匿名性を保つことが特長と謳われますが、多くのユースケースでは、Proofにある程度のユーザー識別要素が必要であることが上記のケースから分かります。 #### 対応可能なデータの範囲 - 現時点のzkTLSプロトコルでは、Proofを生成できる対象はWebブラウザを通じてログイン可能なサービスに限定されています。ネイティブアプリのデータや、特定のデバイスでのみアクセス可能な情報には対応できないため、利用可能なデータ範囲が制約されています。 ### UXの課題 #### ブラウザ拡張機能またはスマホネイティブアプリの必要性 zkProofを作成するには、 **ブラウザ拡張機能** または **スマホネイティブアプリ** を利用する必要があります。それぞれに特徴がありますが、導入ハードルや操作性に課題が残ります。 **ブラウザ拡張機能** - **メリット**:既存のブラウザで動作し、ログイン済みのページから直接Proofを生成できるため、操作がスムーズ。 - **デメリット**: - **インストールのハードル**:拡張機能をインストールする必要がある。 - **PC依存**:PC環境でしか利用できない。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fec60e49e844f65be328fe371901dfdd9ac574afb-2940x1750.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) **スマホネイティブアプリ** - **メリット**:スマホでも利用可能で、モバイルユーザーへの対応が可能。 - **デメリット**: - **再ログインの必要性**:アプリ内ブラウザで対象サービスに再ログインが必要。 - **インストールの手間**:アプリのダウンロードが障壁に。 Reclaim Protocolでは軽量版アプリである **App Clip** を採用し、インストールの手間を軽減する工夫をしています。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F0d9af37ee3d2a481908e08e990b0fce81170809d-1170x2532.png%3Fw%3D1170%26auto%3Dformat&w=3840&q=75) #### zkProof生成にかかる時間 zkProofの生成は計算負荷が高いため、一定の処理時間を要します。zk技術の進化により計算速度は向上しており、これがzkTLSの実用化を後押しする要因となっています。しかし、現時点でも待機時間が発生する場合があり、ユーザーのストレスを軽減するために **分かりやすく工夫されたUI** が重要です。 また、Proof生成にはデバイスの性能やネットワーク環境も影響を与えます。これらの要因を踏まえたさらなる技術的な最適化が、ユーザー体験の向上に向けた次の課題と言えます。 ### 法的な整理の必要性 技術的には全てのデータのproofを作成することが可能でも、企業の保有する知的財産の観点から、zkTLSを使うべきではないグレーゾーンなケースも考えられます。 [Reclaim ProtocolのCEOが述べている](https://twitter.com/madhavanmalolan/status/1861988658280292636) 点を要約します。 - zkTLSは、まず「正当にユーザーのものであるデータ」を守るために戦う技術。 - ユーザーがプラットフォーム上で生成したデータ(例:視聴履歴、フォロー、購入履歴)はユーザーの権利として扱うべき。 - 一部のデータやアルゴリズムは企業に正当な所有権がある(例:Spotifyのトップアーティスト、プレイリストなど)。 - ユーザーのデータとして扱うか企業のデータとして扱うか曖昧なデータもある(例:ユーザーに対するレコメンデーションなど)。 - ユーザーに直接または間接的に属さないデータにはzkTLSを使うべきではない。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe6d544812d0a021b850e7f52a88204f2dcd92fab-1216x2134.png%3Fw%3D1216%26auto%3Dformat&w=3840&q=75) ### まとめ zkTLSは、データの透明性とプライバシー保護を両立しながら、ユーザーが自身のデータを自由に活用できる未来を実現する可能性を秘めた技術です。その一方で、技術的な制約、UXの改善、そして法的な整理といった課題が依然として存在します。これらの課題を解決することで、zkTLSがより多くのユーザーやサービスに採用され、Web3やデジタルエコシステム全体の進化に貢献することが期待されます。 本記事がzkTLSに興味を持つきっかけや、新たな可能性を考えるヒントになれば幸いです。今後もzkTLSの発展やその応用例について共有していきますので、引き続きご注目ください。 株式会社Pontechでは、Dapps開発の受託を請け負っております。本記事のように採用する技術やサードパーティのサービスの検討からお手伝いすることが可能です。 Dapps開発に関するご相談がございましたら、ぜひ当社まで [お問い合わせ](https://www.pontech.dev/contact) ください。 [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Integrating Crypto Payments [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#10 クリプト決済の結果をオフチェーンのDBに反映する [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 08, 2023· 5 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd6ec582b1ae91c765e69e17f4b07bc3e2a58a697-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) 前回はSuperfluidでオンチェーンのサブスクリプション決済を行う方法について記載して、予想以上に反響がありました。今回は通常のクリプト決済を扱いますが、クリプト決済の結果をオフチェーンに反映する方法について書きます。 クリプト決済でオンチェーンのデータを書き換える場合、つまりNFTやERC20トークンの購入・移転などを行う場合、スマートコントラクトで処理が完結するので特に考えることはないです。 一方で、例えば通常のオフチェーンのデータベースで管理しているサービスに暗号資産決済を導入する場合、オンチェーンで決済が完了したことをブロックチェーン側からは通知してくれないので、自社でその情報をブロックチェーン側の情報をデータベースにsyncする必要があります。 ### スクラッチで開発する場合 具体的な実装ではなく、基本的な概念だけ解説します。 Ethereum上でトークンが転送されたことを検知するためには、イベントの監視が一般的な方法です。ERC20トークンは通常、トークンの転送に関連するイベントを発行します。以下のステップで支払い処理を行うことができます。 1\. 各ユーザーのトランザクションの監視 - サーバー側で、各ユーザーが購入を行う際のトークン転送トランザクションを監視します。 - Web3.jsなどのライブラリを使用して、特定のERC20トークン契約の `Transfer` イベントを監視します。 2\. `Transfer` イベントのフィルタリング - `Transfer` イベントには、送信者アドレス、受信者アドレス、転送量などの情報が含まれます。 - 運営側のアドレス宛てのトークン転送をフィルタリングして検知します。 3\. トランザクションの確認 - イベントがトリガーされた後、トランザクションの詳細を確認して適切な処理を行います。 - トランザクションがまだ確認されていない場合(未承認の場合)は、必要な数の確認を待ちます。 4\. サービス内のアイテム付与 - トランザクションが正常に確認されたら、Firestoreなどのデータベースを更新してユーザーにサービス内のアイテムやポイントを付与します。 5\. エラーハンドリング - 何か問題が発生した場合に備え、適切なエラーハンドリングを実装します。 上記の一連の流れを実行するサーバーを定期実行させる必要があります。 ### Slash Paymentでwebhookを受け取る 上記の部分をいい感じに省略するために、 [Slash Payment](https://slash.fi/) を使ってみましょう。 Slashは暗号資産決済を簡単に導入できるサービスです。裏側に最適なレートを検索してくれるスマートコントラクトが存在し、顧客は任意のトークンを最適なレートで支払うことができます。 こちらの [Quickstart](https://slash-fi.gitbook.io/docs/integration-guide/quick-start) に従って実装していきますが、その前に簡単にNext.js+Firestoreでアプリケーションを作成しておいてください。 https://testnet.slash.fi/admin/dashboard にウォレットを接続してログインします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5c64d79031a317ef92c755fbb73f268e320965e2-2916x1508.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 支払いで受け取りたい通貨の種類を選択します。Slashでは1ウォレットアドレスにつき1つのプロジェクトの設定しかできないので注意してください。 先述したようにコントラクトを経由して支払いを受けるので、自分専用のコントラクトをデプロイする必要があります。ネットワークごとに必要です。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc563009a2457ee998143ccfd1c12ace6a7632830-1786x1256.png%3Fw%3D1786%26auto%3Dformat&w=3840&q=75) デプロイできました。受信アドレスは支払いを受け取るアドレスで初期設定はデプロイしたアドレスになっていますが、他のアドレスに変更することもできます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ffb09b6747759346f16b473b32d1ba52bb1aceac9-1598x934.png%3Fw%3D1598%26auto%3Dformat&w=3840&q=75) 支払い設定の画面からQRコードが表示できます。このQRコードが店頭に印刷されて置かれているQRですね。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F996a8d453c08bcf350b27ff125a233d58ae10faa-1574x948.png%3Fw%3D1574%26auto%3Dformat&w=3840&q=75) [https://testnet.slash.fi/payment-merchant/5c94c1e5159ca1f3952367961b508ee0](https://testnet.slash.fi/payment-merchant/5c94c1e5159ca1f3952367961b508ee0) QRを読み込むと支払い画面が出てきます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2fcd0dd9ebda3b36b12abbd9503436b5422ed3ea-1228x1066.png%3Fw%3D1228%26auto%3Dformat&w=3840&q=75) 実装のほうに戻りましょう。 先ほど用意したNext.jsとFirestoreのプロジェクトにAPIを2つ作る必要があります。一つは決済URLを作成するslash-checkout、もう一つは決済完了時のキックバックを受け取るslash-webhookと名付けます。 公式Docsにnodejsがなかったので自分で書いてみました。 api/slash-checkout/route.ts ```typescript import { NextResponse } from "next/server"; import * as crypto from "crypto"; import axios from "axios"; import { SlashCheckoutAPIRequest } from "../../types"; import randomstring from "randomstring"; export async function POST(request: Request) { const data: SlashCheckoutAPIRequest = await request.json(); const { userId } = data; const rand = randomstring.generate({ length: 16, charset: "alphanumeric", capitalization: "lowercase", }); const amount = 100; const orderCode = `${userId}_${rand}`; const authenticationToken = process.env.SLASH_AUTH_TOKEN; const hashToken = process.env.SLASH_HASH_TOKEN; const raw = orderCode + "::" + amount + "::" + hashToken; const hashHex = crypto.createHash("sha256").update(raw, "utf8").digest("hex"); const amountType = "USD"; const requestObj = { identification_token: authenticationToken, order_code: orderCode, verify_token: hashHex, amount: amount, amount_type: amountType, }; const paymentRequestUrl = "https://testnet.slash.fi/api/v1/payment/receive"; const result = await axios.post(paymentRequestUrl, requestObj); return NextResponse.json({ payment_id: result.data.token, checkout_url: result.data.url, }); } ``` frontendから実行してcheckout\_urlにリダイレクトします。 ```typescript const slashPayment = async () => { const response = await fetch(`/api/slash-checkout`, { method: "POST", body: JSON.stringify({ userId: user.uid, }), }).then((data) => data.json()); console.log(response, "respense"); router.push(response.checkout_url); }; ``` api/slash-checkout/route.ts ```typescript import { NextResponse } from "next/server"; import * as crypto from "crypto"; import { SlashWebhookAPIRequest } from "../../types"; import initializeFirebaseServer from "@/lib/initFirebaseAdmin"; export async function POST(request: Request) { const data: SlashWebhookAPIRequest = await request.json(); const { order_code, verify_token, amount, result } = data; const localVerifyToken = crypto .createHash("sha256") .update(`${order_code}::${amount}::${process.env.SLAHS_HASH_TOKEN}`) .digest("hex"); if (localVerifyToken !== verify_token) { return NextResponse.error(); } if (!result) { return NextResponse.error(); } const splittedCode = order_code.split("_"); const userId = splittedCode[0]; const { db } = initializeFirebaseServer(); const docRef = db.collection(`users`).doc(userId); await docRef.update({ amount, }); return NextResponse.json({}); } ``` Slashからのキックバックが正しいことをverifyして、ユーザーのデータベスを更新しています。 [https://testnet.slash.fi/admin/payment/settings/basic](https://testnet.slash.fi/admin/payment/settings/basic) デプロイしたslash-webhookのURLをこちらから設定します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5575f1806e008381dbdd9d00e0227dcc1975022a-2022x1398.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 今回上記コード全部を動かして確認することが間に合わなかったので、少し古いですがこちらのコードを参考にしてみてください [https://github.com/ksuhara/omiyage-nft](https://github.com/ksuhara/omiyage-nft) ### まとめ このように、既存のweb2サービスにクリプト決済を簡単に導入することができました。ちなみにクレカ決済のStripeも非常によく似たプロセスで実装できます。 SlashはPaymentのほかに [Slash Vaults](https://www.vaults.fi/) というNFTをキーにしてトークンを出し入れするサービスを開発中(現在テストネット)なので、今後それを使ったDapps開発にも挑戦してみたいなと思います。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Astar×Slash Hackathon [Hackathon](https://www.pontech.dev/category/hackathon) # Astar×Slash Bounty Bootcamp Hackathonで入賞しました! [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) March 07, 2023· 4 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b627a0e9462fe21e6ac9d28e6341ea665a224fa-1716x966.png%3Fw%3D1716%26auto%3Dformat&w=3840&q=75) 3/5に開催された [Astar×Slash Bounty Bootcamp Hackathon](https://akindo.notion.site/Astar-Slash-Bounty-Bootcamp-Hackathon-7133ffb059624bbd9d2ba079058ad1fc) のDEMO DAYに参加してきました。応募していたSlash PaymentさんのIntegrate Slash Web3 payments into Web2 services($2,000)の賞と、全体の中から選ばれるtv asahi "EXpect" PRIZE (¥300,000)を獲得することができました! ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff415dc11ec50c21f49a11dde067010cdd5f9c061-5888x3925.jpg%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) この投稿では何を作ったか、どう作ったか、今後の構想について書こうと思います。 ### 作ったもの Amazonの欲しいものリストとSlashを組み合わせることで、Amazonで買えるものなら何でもクリプト決済で購入できる購入代行サービスを作りました。詳細は発表スライドをご覧ください - [DEMO](https://slash-everything.vercel.app/) (Testnetなので実際に購入はできません) - [発表スライド](https://www.canva.com/design/DAFbGJ0-wLg/4iSU7Nmb7CYpCWviIhcQXw/view?utm_content=DAFbGJ0-wLg&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton) - [GitHub](https://github.com/ksuhara/slash-everything) クリプトの世界とリアルの世界の距離はまだまだ遠いと感じていて、そこを近づけるサービスを作りたいと日頃から考えていました。 別件でNFT保有者のみが割引価格で購入できるECサイトを構築したりしているのですが、どうしても顧客の住所等の個人情報とEthereumのウォレットアドレスを知る必要があり、分散と匿名の観点から気持ち悪いなと課題を感じていました。 クリプト決済の素晴らしいツールであるSlashさんのハッカソンがあったことで真剣に考えて、誕生日にAmazonの欲しいものリストで匿名でプレゼントを受け取っている人たちを見てこのスキームを思いつきました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b627a0e9462fe21e6ac9d28e6341ea665a224fa-1716x966.png%3Fw%3D1716%26auto%3Dformat&w=3840&q=75) ### どう作ったか テックスタック - Next.js + Typescript + Chakra UI - Firestore - Slash Payment - Thirdweb Auth + Firebase Auth 僕のプロジェクトはMVPの時点ではほとんどこのNext + Typescript + Chakra UI + Firestoreという構成で作っています。簡単なものであれば一番サクッと実装できる気がしています。NextのAPIでサーバー側を簡単に実装できるのが好きな点で、vercelへのデプロイもスムーズです。 フロントエンドはChat GPTの手助けであっという間に出来上がりました。他のサービスから引っ張ってきたりしたコンポーネントも多いので、全部で3~4時間くらいでしょうか ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F71771cbf63b51d06aa04540803a9dacbef91fe4d-2102x1420.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Slashの実装は公式ドキュメントのStandard Integrationを追っていけばできます。 [https://slash-fi.gitbook.io/docs/integration-guide/integration-guide/standard-integration](https://slash-fi.gitbook.io/docs/integration-guide/integration-guide/standard-integration) Thirdweb AuthとFirebase Authの連携はここを参考にしてみてください [https://github.com/thirdweb-example/firebase-auth](https://github.com/thirdweb-example/firebase-auth) Firestoreのルール等セキュリティ面や、フロントエンドのUXは作り込んでもハッカソンの時点では評価に影響しないだろうと思いだいぶ犠牲にしました。 本当はAmazonの欲しいものリストのURLのみを入力してもらい、バックエンドでスクレイピングをして合計価格を算出するというUXを実現したかったのですが、ローカルでは動くスクレイピングのスクリプトがデプロイ後には動かず(エラーが出るのではなく商品がないことになる)、残念ながら諦めましたw スクレイピングが詳しい方いたら教えてください。 ### 今後の展望 本格的にサービスをリリースするためにはかなりのハードルがあると思っています。 **1\. ニーズの検証** クリプトで日用品(Amazonでお買い物)をしたい人がいるのかどうかの検証をまずはする必要があると思います。2. 3. に入る前に10人限定でやってみたいなとは思っています **2\. リーガルチェック** 単純な購入代行で整理がつく気もするのですが、匿名でクリプト決済で物が買えるというのはAML的に問題があるような気もしますし、法的な専門家にアドバイスをもらう必要があると思っています。ご協力いただける弁護士の方がいればご連絡ください!!!!! **3\. 運営への中央集権度の軽減。分散化** 現状の仕組みは非常に運営(=僕)をトラストする仕組みになっています。その上僕のクレジットカードの上限がトランザクションの限界ですw プレゼントする側(Liquidity Providor)をオープンにして、たとえば一定のデポジットをしてもらい、問題が起きたらDAOで裁判をする形式にすることを妄想しています。 以上で今回の記事を終わります。 素晴らしい機会をくださった Slash、Astar、Akindo、テレ朝はじめスポンサーの皆さん、参加者の皆さん、ありがとうございました! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## NFT Staking Contracts Guide [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#12 NFTのステーキングコントラクトの開発 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 09, 2023· 6 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F06bd7cc81163c884590f038a9f4b70250af770b4-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDapps12日目はNFTのステーキングについて整理していきます。11日目ではオンチェーン・ガバナンスを題材にしましたが、少し関連性のある内容ですね。 NFTのステーキングとは何か、プロジェクト側にどんな狙いがあり、ユーザー側にどんな体験が提供されるか、考えてみましょう。 ### ステーキングとは何か そもそもトークンのステーキングとは特定のトークンをプラットフォームやプロジェクトに一定期間「拘束」するプロセスです。 まず押さえておくべきはプルーフ・オブ・ステーク(PoS)またはその変種を使用するブロックチェーンネットワークのネイティブトークンのステーキングです。 ネットワークメンバー(バリデーター)は、ブロックを生成する権利を得るために、ネットワークのネイティブトークンを「ステーキング」(拘束)します。 ステーキングされたトークンの量や他の要因に基づいて、特定のバリデーターがブロックの提案と検証のために選ばれます。 選ばれたバリデーターは新しいブロックを提案し、他のバリデーターによって検証されます。正当なブロックが検証されると、ネットワークの一部として追加されます。 ブロックを提案し、正しく検証するバリデーターは報酬を受け取ります。この報酬は、通常、新しく発行されたネイティブトークンとトランザクション手数料の形で与えられます。 攻撃者がネットワークを攻撃するには、大量のトークンをステーキングする必要があります。これによって攻撃が非常に高コストとなりセキュリティが高まります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F616cc2986842e63caf6a6a5274b1cf86de65f462-2926x1570.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) (参考: [https://hub.oasys.games/staking](https://hub.oasys.games/staking)) 次にガバナンストークンやユーティリティトークンなどのERC20のステーキングを採用しているプロジェクトの狙いは、コミュニティメンバーにプラットフォーム上での投票権や意思決定への参加を促進し、ロイヤリティとエンゲージメントを高めます。また市場からトークンの供給量を減らすことで、トークン価格の安定化が図れます。 また中央集権取引所が行なっているステーキングは、ユーザーから資金を借りてそれを運用し運用益の一部はユーザーにステーキング報酬として還元して残りを取引所の利益としている、銀行の預金のようなビジネスモデルです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5b56b7dd44a4039586e751bd2d36ee1ae21e45da-2930x1588.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) (参考:https://www.sbivc.co.jp/services/staking) ではNFTのステーキングについてですが、自分はあまり腹落ちしていないところもあります。 ステーキングに参加することでユーザー側に提供される体験として、ユーザーはしばしば報酬や特典を受け取り、プロジェクトへのより深い関与を通じてコミュニティの一部であるという参加感を得ることができるでしょう。これは分かります。 プロジェクト側の狙いとしても上記のユーザーエンゲージメントの向上で、原資は自分で発行している独自トークンなので無から生み出しているので配りまくれる、ということなのでしょうか? 詳しい方いたらぜひ教えてください! ### ERC721ステーキング 前置きが長くなりましたがステーキングの実装について見ていきます! [How to Create an ERC721 NFT Staking Smart Contract + Web App](https://blog.thirdweb.com/guides/how-to-allow-users-to-stake-their-nfts-and-earn-rewards/) 毎度お馴染みThirdwebさんにAudit済みのERC721のステーキングコントラクトとチュートリアルがあるので参考にして進めてみましょう。 まずERC721のコントラクトとERC20のコントラクトをデプロイして、それぞれ適当にmintしておきます。 https://thirdweb.com/mumbai/0xE71eE93Ad57c8b355e1bCDFe435B05673d8B4930 https://thirdweb.com/mumbai/0x15A142002C032CA499150359Ce2A3ef66c8533B0 StakeERC721というコントラクトをデプロイします。 [https://thirdweb.com/thirdweb.eth/NFTStake?ref=blog.thirdweb.com](https://thirdweb.com/thirdweb.eth/NFTStake?ref=blog.thirdweb.com) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fabce0b359c2ca299b6b68c26c1182b03e952b6e0-1406x1484.png%3Fw%3D1406%26auto%3Dformat&w=3840&q=75) Time Unit for Rewardsは、ステーキング報酬が計算されていく時間を設定します。Rewards per unit timeは1単位の時間で何wei報酬がもらえるかを設定します。つまり上記の画像では60秒に1000weiがステーキング報酬として加算されていく設定になっています。 少しコントラクトを覗いてみます。コメントで簡単に解説を入れました。 ```javascript function _stake(uint256[] calldata _tokenIds) internal virtual { uint256 len = _tokenIds.length; require(len != 0, "Staking 0 tokens"); address _stakingToken = stakingToken; // stakerが追加ステーキングであればアップデート if (stakers[_stakeMsgSender()].amountStaked > 0) { _updateUnclaimedRewardsForStaker(_stakeMsgSender()); } else { // stakerが新しくステーキングを開始する場合 // stakerの配列にpush // block.timestampを保存 // stakingCondition(ステークした時の条件)を保存 stakersArray.push(_stakeMsgSender()); stakers[_stakeMsgSender()].timeOfLastUpdate = block.timestamp; stakers[_stakeMsgSender()].conditionIdOflastUpdate = nextConditionId - 1; } for (uint256 i = 0; i < len; ++i) { // NFTをユーザーからコントラクトへTransfer require( IERC721(_stakingToken).ownerOf(_tokenIds[i]) == _stakeMsgSender() && (IERC721(_stakingToken).getApproved(_tokenIds[i]) == address(this) || IERC721(_stakingToken).isApprovedForAll(_stakeMsgSender(), address(this))), "Not owned or approved" ); isStaking = 2; IERC721(_stakingToken).safeTransferFrom(_stakeMsgSender(), address(this), _tokenIds[i]); isStaking = 1; stakerAddress[_tokenIds[i]] = _stakeMsgSender(); if (!isIndexed[_tokenIds[i]]) { isIndexed[_tokenIds[i]] = true; indexedTokens.push(_tokenIds[i]); } } stakers[_stakeMsgSender()].amountStaked += len; emit TokensStaked(_stakeMsgSender(), _tokenIds); } ``` withdrawも見ていきます。withdrawはステーキングしたNFTを引き出す関数です。 ```javascript function _withdraw(uint256[] calldata _tokenIds) internal virtual { uint256 _amountStaked = stakers[_stakeMsgSender()].amountStaked; uint256 len = _tokenIds.length; require(len != 0, "Withdrawing 0 tokens"); require(_amountStaked >= len, "Withdrawing more than staked"); address _stakingToken = stakingToken; _updateUnclaimedRewardsForStaker(_stakeMsgSender()); if (_amountStaked == len) { address[] memory _stakersArray = stakersArray; for (uint256 i = 0; i < _stakersArray.length; ++i) { if (_stakersArray[i] == _stakeMsgSender()) { stakersArray[i] = _stakersArray[_stakersArray.length - 1]; stakersArray.pop(); break; } } } stakers[_stakeMsgSender()].amountStaked -= len; for (uint256 i = 0; i < len; ++i) { require(stakerAddress[_tokenIds[i]] == _stakeMsgSender(), "Not staker"); stakerAddress[_tokenIds[i]] = address(0); IERC721(_stakingToken).safeTransferFrom(address(this), _stakeMsgSender(), _tokenIds[i]); } emit TokensWithdrawn(_stakeMsgSender(), _tokenIds); } ``` ややこしいですがwithdrawRewardTokensはAdminがRewardTokenをコントラクトから引き上げるための関数です。 claimRewardsでユーザーはステーキング報酬を得ることができます。 ```javascript function _claimRewards() internal virtual { uint256 rewards = stakers[_stakeMsgSender()].unclaimedRewards + _calculateRewards(_stakeMsgSender()); require(rewards != 0, "No rewards"); stakers[_stakeMsgSender()].timeOfLastUpdate = block.timestamp; stakers[_stakeMsgSender()].unclaimedRewards = 0; stakers[_stakeMsgSender()].conditionIdOflastUpdate = nextConditionId - 1; _mintRewards(_stakeMsgSender(), rewards); emit RewardsClaimed(_stakeMsgSender(), rewards); } ``` ```javascript function _mintRewards(address _staker, uint256 _rewards) internal override { require(_rewards <= rewardTokenBalance, "Not enough reward tokens"); rewardTokenBalance -= _rewards; CurrencyTransferLib.transferCurrencyWithWrapper( rewardToken, address(this), _staker, _rewards, nativeTokenWrapper ); } ``` ユーザーはNFTとステーキング報酬の引き出しを1トランザクションではできず別々にする必要があります。逆にいうとNFTはステーキングしたままでステーキング報酬だけClaimすることができるということですね。 ではAdminのウォレットからERC20トークンをステーキングコントラクトにデポジットします。 ERC20トークン側でステーキングコントラクトのアドレスをapproveします。その後ステーキングコントラクト側でdepositRewardTokensします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9e527d322152030a59e1e30bc2bb3cf409b74f2c-2322x1086.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) フロントエンドから叩けるようにしましょう。 Next.jsのプロジェクトを作成してこちらのコードをコピペします。 [https://github.com/thirdweb-example/nft-staking-app/blob/main/pages/stake.tsx](https://github.com/thirdweb-example/nft-staking-app/blob/main/pages/stake.tsx) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa8fe6c93b7d78ef01d69b5cd16080b34c48aec2f-2910x1592.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ステークにはApproveと実際のStake関数の実行の2トランザクションが必要です。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1dee3e09363e66297fe6da192ee863bd2e391d6f-1258x1600.png%3Fw%3D1258%26auto%3Dformat&w=3840&q=75) ステーキングができました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F42920338a8659f9c4aa60175ddc7025f134846e7-2218x1024.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) claim・withdrawもできます。 ### まとめ トークンのステーキングについて改めて概念を整理し、NFTステーキングのコントラクトをデプロイする方法を解説しました。これでお客さんから「NFTをステーキングさせたいんだけど」という要望が来ても対応できますね!ただしリワードのトークンが国内で適法で発行できるかは確認が必要なのでご注意ください! 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Exclusive E-Commerce Site Launch [プレスリリース](https://www.pontech.dev/category/press) # Pontech, in Collaboration with Hakuhodo Key3 and Hakuhodo, Releases Demo of a “Kaiwai” Limited E-Commerce Site Powered by zkTLS [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) March 26, 2025· 13 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6ea263cdc7056762e1f41fc312fe1ca638fb89a6-1200x630.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75) **March 26, 2025** **Pontech Inc.** Pontech Inc. is pleased to announce that we have participated as a development partner in the Web3-based “Kaiwai” marketing solution jointly developed by Hakuhodo Key3 Inc. (hereinafter “Hakuhodo Key3”) and Hakuhodo Inc. (hereinafter “Hakuhodo”), and have supported the release of a demo site called the “Kaiwai-Limited E-Commerce Site,” which utilizes the Web Proof (zkTLS) technology. This solution offers a new purchasing experience in which only users who can prove they belong to a specific community (“Kaiwai”) are able to buy certain products or services. ## About the Kaiwai-Limited **E-Commerce** Site The published demo site grants access to product purchase pages only to users who satisfy one of the following three conditions: 1. **Crypto Asset Kaiwai** - Prove that you have more than USD 100 (valuation) in assets in your Binance Japan account. 2. **“Furo Cancel” Kaiwai** - Prove that you have a tweet on X (formerly Twitter) containing the term “風呂キャン” (furo-cancel refers to people who find taking a daily bath bothersome and choose to skip it.). 3. **Generative AI Kaiwai** - Prove that you are subscribed to the ChatGPT Plus or Pro plan. **URL:** [kaiwai-ec.pontech.dev](https://kaiwai-ec.pontech.dev/) Kaiwai EC - YouTube Pontech 5 subscribers [Kaiwai EC](https://www.youtube.com/watch?v=qLj-EessAsI) Pontech Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=qLj-EessAsI&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 0:48•Live • [Watch on YouTube](https://www.youtube.com/watch?v=qLj-EessAsI "Watch on YouTube") By leveraging the zkTLS technology provided by zkPass, these proofs can be performed securely within the user’s permitted scope. The proof data is preserved in a verifiable format, greatly reducing the risk of excessive personal information exposure compared to conventional methods such as screenshots or API disclosures. ## zkTLS (Web Proof) as a New Form of Data Collaboration Pontech regards zkTLS (Web Proof) as a **“new type of data collaboration platform that places data sovereignty in the hands of the user.”** Traditionally, data collaboration of this kind would require APIs to be made public by the platform side or negotiations and agreements between companies. However, for small businesses or individual developers, this barrier can be high. Additionally, from a user’s perspective, data is often held by the platform and cannot be used portably. With zkTLS, users can selectively and securely prove and share the data they possess. This is expected to usher in a new ecosystem in which users themselves have data sovereignty. By transcending platform constraints and enabling “portable” data collaboration that individuals can control, zkTLS aims to open the door to a wide variety of use cases. ## Why We Started with an **E-Commerce** Site Pontech believes it is important for people to recognize that zkTLS does not rely solely on blockchain technology. In fact, it can generate and verify proofs entirely off-chain, making it applicable to a broad range of use cases beyond blockchain-based solutions. That said, zkTLS is not yet fully “battle-tested” in practice. Jumping directly into a service handling large sums of money would carry significant risk. Therefore, we selected **E-Commerce sites**—which tend to have lower implementation hurdles and are run by numerous businesses—as an entry point for demos and small-scale trials. Furthermore, adding an element of **“Kaiwai exclusivity” or “a sense of specialness”** can help E-Commerce businesses differentiate themselves and enhance their customer experience. Through this initiative, we plan to accumulate know-how and, together with Hakuhodo, explore larger-scale services and expand into other industries in the future. ## About zkPass [zkPass](https://zkpass.org/) is a service that enables private web data owned by users to be verified on the blockchain. As a result, users can selectively prove a wide range of data—such as legal identity, financial records, medical information, social interactions, game data, real-world assets, professional experience, educational background, and skill certifications. - **Privacy Protection:** Only the information a user wants to verify is safely shared, reducing the risk of excessive personal data exposure. - **Flexible Data Collaboration:** Unlike conventional APIs or direct negotiations, zkPass provides a user-centric proof process. - **Blockchain Connectivity:** Verification data can be confirmed on the blockchain, ensuring tamper-resistance and transparency. ## Consultation on Development and New Business with Pontech In addition to the “Kaiwai-Limited E-Commerce Site,” Pontech supports a wide range of initiatives—such as **PoC (Proof of Concept) or rapid MVP development using zkTLS** and new business exploration involving Web3 and blockchain. - **Use Case Design Tailored to Real-World Business** (Examples: Leveraging proof of users’ off-chain data, targeting users of competitor or complementary services, etc.) - **Comprehensive Support from MVP Development to Production Launch** (Requirements definition, UI/UX design, application development, operational support, and more) - **Consulting for Both Technology and Business** (Roadmap planning for future updates, technical selection, marketing strategy proposals, etc.) We welcome inquiries on **how zkTLS can be used to “return data sovereignty to users”** and applied to your future business and services. Whether you’re in the idea stage or actively considering a product launch, feel free to reach out to us for a discussion. ## About Hakuhodo Key3 Hakuhodo Key3 is a Web3 business production company established in December 2022 through a partnership between Hakuhodo Inc. and Sota Watanabe, CEO of Startale Labs Japan, who leverages insights from the development of Astar Network for consulting and development support. With a “people-centric mindset” and “creativity,” Hakuhodo Key3 aims to create the world’s first Web3 services and contribute to a society where more people can participate in Web3 in collaboration with its partners. - **Official Website:** [https://key3.co.jp/](https://key3.co.jp/) - **Official X (formerly Twitter):** [https://twitter.com/H\_KEY3](https://twitter.com/H_KEY3) ## About Pontech Pontech is a blockchain-focused development company that specializes in creating NFT-centric Dapps and products utilizing zkTLS. Alongside the development of its own services, Pontech is active in contract development, offering rapid MVP launches based on its deep understanding of existing Dapps and developer tools. - **Company Name:** Pontech Inc. - **CEO:** Kenta Suhara - **Business:** Development and consulting of Web3-related systems - **Official Website:** [https://www.pontech.dev/](https://www.pontech.dev/) ## For Inquiries Regarding This Announcement **Pontech Inc.** - **Email:** info@pontech.dev - **Official Website:** [https://www.pontech.dev/](https://www.pontech.dev/) [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025 Pontech.Inc SystemDarkLight ## Subscription Payments with Superfluid [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#9 クリプト決済のサブスクを作る【Superfluid】 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 07, 2023· 4 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F33c7ab21f4ddb54795be632573d37a224879c17b-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDappsではこれまで、発行したNFTに対してトークンゲートでユーティリティをつけて付加価値を付ける実装について解説をしてきました。 NFTのビジネスモデルの中で継続的なインカムを得るためには二次流通時のロイヤリティや新規販売くらいしかないという認識が一般的ですが、今回はオンチェーンのプロダクトで継続課金をする方法を見てみましょう。 ### Thirdweb×Unlockで有効期限付きNFTを作成する Unlock ProtocolにSubscription機能を持ったMembershipのコントラクトがあります。こちらの使用方法については [Thirdwebとユウキさんの素晴らしい記事](https://zenn.dev/yuki2020/articles/55571ec545a577) があるのでこちらにお任せします。 要点としては有効期限と延長する関数を持ったNFTをmintでき、有効期限が切れた場合、有効期限切れのNFTを所持しているという状態になります。NFTがburnされたりTransferされるわけではないですが、balanceOf()を実行すると、有効期限切れのNFTをつ保有している場合 0 が返ってきます。 [Token-gated Application Architecture](https://docs.unlock-protocol.com/tutorials/building-token-gated-applications#checking-the-contract) また、有効期限を延長するにはユーザーがトランザクションを発生させる必要があり、自動延長みたいなことはできないです。 ちなみにNFTベースのサブスクリプションについて考察されている記事があったので貼っておきます。 [Are Subscription NFTs the Future? Exploring the Pros and Cons of Web3 Online Subscriptions](https://hackernoon.com/are-subscription-nfts-the-future-exploring-the-pros-and-cons-of-web3-online-subscriptions) ### SuperfluidでERC20トークンでのサブスクを実装する [Superfluid](https://www.superfluid.finance/) は世界中のDAOや暗号ネイティブビジネスに対してサブスクリプションを可能とするスマートコントラクトのフレームワークです。Superfluidでは既存のトークンをSuper TokenというERC20標準の拡張トークンにwrapします。Super Tokenは定期支払い機能を持っていて、1回のトランザクションだけで定期支払いを開始することができ、デポジットも必要ありません。 まずはどんなものかテストネットで触ってみます。 [https://app.superfluid.finance/](https://app.superfluid.finance/) を開きます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd98277812c3113e5e7bf8f878cee468c7bd2061f-2486x1476.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Get Testnet TokensでClaimボタンを押しましょう。Matic、fUSDC、fDAIがfaucetからもらえますが、通常のfaucetと違うのはこの時点ですでにsuperfluidでのstreamが始まっている点です。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F38dd2b22746d9f42c5b2f23b21bfa0de44f83aa8-1350x1034.png%3Fw%3D1350%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2981782e15c211eda4b3c54e5512f8910911222c-2940x1912.gif%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) fUSDC、fDAIが毎秒少しずつ送られてきているのがわかりますね。 Streamingをキャンセルすると、その時点までのトークンがもらえます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F31b24eb818932aa2df9a5a2996f7a10a1bb1527a-1618x990.png%3Fw%3D1618%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5e07d8903ec9c058a39c7977d59e40bd2a2ab32a-1532x914.png%3Fw%3D1532%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F02d43500ccca1f2e46235cbebcf2985f4528e17c-1416x664.png%3Fw%3D1416%26auto%3Dformat&w=3840&q=75) 自分でStreamを作成して送信してみます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe4f8c087d81555e9b5a95de899e284ed3c2f1ebf-2190x1550.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) トークンが送られて残高が減っていくことが分かります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe2a3b6ad26e3528afe6b70472f72e9f12f904472-2940x1912.gif%3Frect%3D10%2C201%2C2930%2C1711%26w%3D2000%26auto%3Dformat&w=3840&q=75) 次に自分のアプリにウィジェットを組み込む方法をみてみます。 Checkout Builderというツールが用意されているので開きます。 [https://checkout-builder.superfluid.finance/builder](https://checkout-builder.superfluid.finance/builder) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F379c68d174b68c9b5102a37ade9357130ed709ca-2908x1586.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) UIも調整できるので便利ですね。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6c44d0f2b454bb65a052f6b83e4be56df7a50c27-2900x1564.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) JSONをダウンロードしておきます。 Next.jsのプロジェクトを立ち上げて必要なモジュールをインストールします。 `yarn add @superfluid-finance/widget wagmi @superfluid-finance/tokenlist` こちらのコードを移植していきます。 [https://github.com/superfluid-finance/widget/blob/master/examples/widget-vite-react-web3modal/src/App.tsx](https://github.com/superfluid-finance/widget/blob/master/examples/widget-vite-react-web3modal/src/App.tsx) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F33d749f2e67e1b110a26f6af6cdef80fedd7cec1-2412x1588.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) drawerはできたのですがConnect Walletボタンを押してもWallet Connectが立ち上がらないというバグが発生してしまいました。 publish IPFSのほうでは上手くいったのでこちらを掲載しておきます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa152789db334b3b7e723eeb33cddff77a6304082-942x396.png%3Fw%3D942%26auto%3Dformat&w=3840&q=75) [https://checkout.superfluid.finance/QmebDU9Kx61wNtamDpEhb8EtESfNAejNFzSdG9uZmmXRL4](https://checkout.superfluid.finance/QmebDU9Kx61wNtamDpEhb8EtESfNAejNFzSdG9uZmmXRL4) ### まとめ 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Manifold Developer Features [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) [NFT](https://www.pontech.dev/category/nft) # まいにちDapps\#8 Manifoldの開発者向け機能で何ができるのか [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 04, 2023· 4 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F585845a20f52c2f06b6d015953a6da608601a232-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) [前日にShopify×Manifoldでトークンゲート付きのECサイトを作った](https://www.pontech.dev/post/dapps-everyday-7) 際に、Manifold製のプラグインの完成度に感動しました。恥ずかしながらManifoldを使ったことがほとんどなかったので、改めてどんな機能があるのか触ってみようというのが今回の趣旨です。 ### クリエイター向けUI まずUIから触れる機能を確認していきます。 [https://studio.manifold.xyz/home](https://studio.manifold.xyz/home) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc0c3d7b79f87e7a79bd37ffa6f9fa125475d797e-2930x1166.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) New Contractを作成します。ASCIIアートをコントラクトに埋め込む箇所があるのが自分のコントラクト感があって人気の一つだと昔(半年以上前に)聞いたことがあります ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5fba36e40fa13f3c95b77f183d1de18c8cc487aa-2906x1474.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Deployボタンを押してデプロイ ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcca46e92a1a99551cb56f0b0fd67782e2a587489-1438x882.png%3Fw%3D1438%26auto%3Dformat&w=3840&q=75) デプロイできました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8d1820444d1cc1fb91899b0b696f876d73b7378f-2940x1588.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Token ページでトークンを作成してみます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fdcf7a4e04d8b6fe555f197ef3f432c2ace2e92da-2682x1144.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) テストネットではトークンの発行方式が3パターンあるみたいです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd302fabf04c476a0d16b189a60c18efef76ac3cf-1832x1128.png%3Fw%3D1832%26auto%3Dformat&w=3840&q=75) - Single Token - Batch of Tokens - Edition Settingからロイヤリティやアドミン権限の設定ができました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd692fa47ce9fb0d7381328ce846cb6836fd52648-2398x1292.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ここまでの感覚としては、Thirdwebに比べて搭載する機能をユーザーフローの後半で追加できる傾向があり、柔軟性が高いかなと思いました。またテストしたものをそのままMainnetに持って行けるのは便利そうだなと感じました(選べるネットワークがEth MainnetとOptimismだけなのは少し残念ですね)。 Mintページを作成するにはClaim Pageという拡張Appを入れる必要があり、メインネット化しないといけないため今回はパスします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5275144a5b8e526e35fc5785545b49479de85e2f-2322x1236.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) このほか、一時期話題になったBurn Redeemという機能も使えます。こちらもメインネットにする必要があります。 ### Developer向け さて、ここから本題でDevelopperアカウントを作成して開発者として何ができるか見ていきます。 [https://developer.manifoldxyz.dev/apps](https://developer.manifoldxyz.dev/apps) メールアドレスでアカウント作成します。 New Appを作成します。 [Getting Start](https://docs.manifold.xyz/v/manifold-for-developers/guides/getting-started) に沿ってSignature Grantにしてみます(現時点で何か分かってませんがおそらく署名をした人がログインできるサイトのようなものが作れるのでしょう) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F588395152033027bdcee3608251b3ff829146896-2174x976.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) こちらのサンプルコードを動かしてみます。 [https://github.com/manifoldxyz/manifold-templates/tree/main/nextjs/nft\_profile\_page](https://github.com/manifoldxyz/manifold-templates/tree/main/nextjs/nft_profile_page) Connect Walletボタンが表示され、ウォレット接続をすると自分の保持しているNFTが表示されるサンプルです。(ウォレット内のNFTの画像が死んでてすみません) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4297fde7337ebb28b368d94747ac67f1025c4e08-2906x1570.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 下記部分が実装です。envファイルにはdevelopperページで作成したclient idを設定します。 ```javascript useEffect(() => { window.addEventListener("m-authenticated", async (event) => { // Get the data client instance const client = event.detail.client; // Get the NFTs owned by the currently connected wallet // Data client API's can be found here: https://docs.manifold.xyz/v/manifold-for-developers/client-widgets/connect-widget/data-client-apis setNfts(await client.getNFTsOfOwner()); setAuthenticated(true); }); window.addEventListener("m-unauthenticated", async (event) => { console.log("m-unauth event: ", event); setNfts([]); setAuthenticated(false); }); }); ``` ```javascript
`, }} /> ``` マーケットプレイス機能も見てみましょう。 Listing widgetのサンプルコードはこちらになります。 [https://github.com/manifoldxyz/manifold-templates/tree/77303f47f0e945726208965175b7a6a449322c37/nextjs/marketplace\_page](https://github.com/manifoldxyz/manifold-templates/tree/77303f47f0e945726208965175b7a6a449322c37/nextjs/marketplace_page) \_document.jsで必要なscriptとcssを読み込んでいますね ```javascript import { Html, Head, Main, NextScript } from 'next/document' export default function Document() { return ( {/* -- Stylesheets for connect and marketplace widgets -- */} {/* replace the specific version with `latest` to get the most up-to-date version of the widgets. */} {/* WARNING: `latest` may cause breakage, so use with caution */}
) } ``` Next.jsで立ち上げてみたところ↓ ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8767ad2d5338033a3f5a92969b575a8d301e190a-2940x6194.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 最後にRoyalty Registryを見てみます。 [https://royaltyregistry.xyz/lookup](https://royaltyregistry.xyz/lookup) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb141334fff337b499cb03e5f0fc9b16a3c7a2640-2898x1574.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1cf149fcfb25e9ac002a2a71ad903de455c65068-2894x1402.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Royalty Registryの目的は二つです 1. マーケットプレイスが適切なon-chainのロイヤリティ設定を簡単に利用できるようにする 2. 元々on-chainロイヤリティをサポートしていなかったコントラクトがそれらを追加することを可能にする 実装は [こちら](https://github.com/manifoldxyz/royalty-registry-solidity) にあります。 on-chainロイヤリティの規格はEIP2981が最近では主流ですが、規格が定まる前に各マケプレ・発行ツールで実装されたNFTが存在するので、これらをまとめて扱えるようになる便利なコントラクトを提供してくれています。 - EIP2981 - Manifold and Foundation - Rarible - SuperRare - Zora (limited functionality) - Artblocks ### まとめ 全体的に、Thirdwebと比べると開発者フレンドリーというよりは非エンジニア向け≒アーティスト向けのツールだなと感じました。Dapp開発ツールとしてはNFT関連でも引き続きThirdwebを採用すると思います。 アーティストさんからの依頼があれば関連Dappを作成したり、コントラクトをより深掘りしてみようかと思います。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Gasless Dapps Guide [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#4 ガスレスで使えるDappsの作り方まとめ [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) July 31, 2023· 6 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff53f6fc19f59e9ea3fbd6e2da369c730b67bdefd-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDappsの4日目では、ガスレスでmintやtransferが可能なDappsの作成に取り組みます。 3日目ではサービス内ウォレットを作成しましたが、新たに作られたウォレットには元々ガス代となる資金が存在しません。非クリプトユーザーを対象としたユーザーにとっての快適な体験を提供するためには、ガス代を必要とせずにトランザクションを行える、いわゆるガスレスなDappsの開発が求められます。 ### **ガスレスの概要** EVM(Ethereum Virtual Machine)におけるガスレスな体験を実現する方法としては主に二つの方向性が存在します。 一つ目は、今回取り扱うメタトランザクションを利用して実現する方法です。メタトランザクションは、ユーザーがトランザクションを起こす際にガス代を直接支払うのではなく、別のエンティティ(リレイヤーと呼ばれる)がそのコストを負担するという仕組みです。ユーザーはトランザクションに対して秘密鍵で署名を行い、その署名をリレイヤー(Relay Server)に送信します。リレイヤーはガス代を支払い、トランザクションをブロックチェーンネットワークに送信します。次にコントラクトで署名が検証され、トランザクションが実行されます。 二つ目の方法は、独自のサイドチェーンやLayer2のチェーンを立ち上げ、チェーン全体のロジックでガス代を運営体が負担するというやり方です。このテーマについては、今後取り上げる予定です。 ### Thirdweb × OpenZeppelin Defender 毎度登場のThirdwebとOpenZeppelin Defenderというサービスを用いてDapps上の全てのトランザクションをガスレスにしていきます。 [こちらの記事](https://blog.thirdweb.com/guides/create-gasless-nft-drop/) を参考に進めます。 まず、Thirdwebを用いてNFTを用意します。 次に、Next.jsのプロジェクトを立ち上げます。 そして、ThirdwebのProviderを設定します。この部分は以前の記事で既に紹介しているので、ここでは割愛します。 次にOpenZeppelinにログインします。 [https://defender.openzeppelin.com](https://defender.openzeppelin.com/?ref=pontech.dev) 新しくRelayerを作成します。名前とチェーンを入力します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2eb236e1c72dad329400bd9fddd878df4badf703-2226x1050.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 作成できました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc79900edcbadd1f0edef976182d09195a6f5eba4-2928x538.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 次にAutotaskを作成します。 TriggerはWebhookに、codeには [Thirdwebが提供してくれているもの](https://raw.githubusercontent.com/thirdweb-dev/ozdefender-autotask/main/src/forwarder_handler.js?ref=blog.thirdweb.com) をコピペして貼り付けます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F87c01cc1a0cafe42813e3cdb498158996bd8cd5a-2166x478.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 環境変数にNEXT\_PUBLIC\_OPENZEPPELIN\_URL= `NEXT_PUBLIC_OPENZEPPELIN_URL=https://api.defender.openzeppelin.com/autotasks/secret-stuff` のようにAutotaskのwebhook urlを設定します。 ThirdwebのProviderに設定すればOKです。 ```javascript {children} ``` テストしてみましょう。 ```javascript "use client"; import { Web3Button } from "@thirdweb-dev/react"; export default function Home() { return (
{ contract.erc721.claim(1); }} > Claim
); } ``` 無事mintが行えることが確認できました! ### Thirdweb × Biconomy 次にBiconomyというサービスを使って実装していきましょう。 Thirdweb曰く、特定の機能をガスレスにするにはDefenderよりBiconomyが適しているそうです。「NFTのmintだけガス代を負担するがTransferなどそれ以外の機能はユーザーがガス代を入手する必要がある」というような設定が可能ということですね。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa6b6fe04eeb7c75300c31742b8ea2f0d56df9d6e-1656x368.png%3Fw%3D1656%26auto%3Dformat&w=3840&q=75) まず [https://dashboard-gasless.biconomy.io/auth/signup](https://dashboard-gasless.biconomy.io/auth/signup) にアクセスしてサインインします。 https://dashboard.biconomy.io/とは違うので気をつけてください(私も間違えました😅)。 Register a Dappからネットワークを選んでDappを登録します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6960a9d00288126767aff23d5e8798b33b0fc29d-674x752.png%3Fw%3D674%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ffac9000e9b0b43f9fa05d4fef93fa81353a48cb8-1710x1340.png%3Fw%3D1710%26auto%3Dformat&w=3840&q=75) コントラクトのアドレスとABIを設定してAddボタンを押します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7b041e1a9d0178dbb5cb3d77133a4658bbd2392e-1654x1220.png%3Fw%3D1654%26auto%3Dformat&w=3840&q=75) Dapp APIsタブからAddを押してMethodを選択します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4d67cdfebec055fb8dcd32efed30daf1f623a399-1568x1142.png%3Fw%3D1568%26auto%3Dformat&w=3840&q=75) Next.jsのプロジェクトを立ち上げてThirdwebの設定をします。 providersに以下の設定をします。 ```javascript "use client"; import { ThirdwebProvider, paperWallet } from "@thirdweb-dev/react"; export function Providers({ children }: { children: React.ReactNode }) { return ( {children} ); } ``` 特定のNFTを持っている人にだけガスレスにする、ということもできるようでした! ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F62ef02f6496655aa7eb350c06103d7a2b38b31cc-1570x1118.png%3Fw%3D1570%26auto%3Dformat&w=3840&q=75) ### Gelato + Safe Relay kit [Gelato](https://www.gelato.network/) は分散型の各種バックエンドを提供してくれているサービスです。 そのサービスの1つである [Gelato Relay](https://www.gelato.network/relay) を利用してガスレスのDappsが作れるようなので試してみましょう。 [こちらの記事](https://www.gelato.network/blog/gasless-transactions-gelato-safe-account-abstraction) を参考に進めていきます。 [Safe](https://app.safe.global/welcome) のwebサイトにいきます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fbbf87880c7bc011f1d231ae4c2c7312f34aa187d-2920x1496.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) テストネットのGoerliでSafe Accountを作成します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F893e4e66aef24735dadc3300566a8aaffa88d643-1660x1050.png%3Fw%3D1660%26auto%3Dformat&w=3840&q=75) ここでは1/1policyのままでOKです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F526a559f9d8e4951650f544da679107134e531a4-2430x1454.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff31c4497111961d7ceee78589e1fd32849168e4e-2376x1486.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Goerli上ではガス代なしで作れました(Mainnetでは不明) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb793491c7dc61b58fc1bdb5cacc633fd62413752-2460x1390.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F22dde771d221ec233a11a4b07d41cc3a077a0b50-1734x1082.png%3Fw%3D1734%26auto%3Dformat&w=3840&q=75) etherscanへ行き、Is this a proxyを押してコントラクトをverifyします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F03272f648abcf750317d6b7ef00cf7fefc2edcdf-730x352.png%3Fw%3D730%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8944950a1194907940b5db2fe1747e8f3efd3100-2352x936.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) https://relay.gelato.network/balance に行き、Gelatoのアカウントにデポジットします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb5f27559ac22fd3c5089e8bea862584b7a85a1e7-1722x908.png%3Fw%3D1722%26auto%3Dformat&w=3840&q=75) https://relay.gelato.network/apps でログインしてCreate New Appをします。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F15e536ef83bb2529b970a6ec15dd748eac8b68e0-1762x544.png%3Fw%3D1762%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F243d7a7fa6a4eb3a74391a76cb764e575d22bc44-1636x1258.png%3Fw%3D1636%26auto%3Dformat&w=3840&q=75) 記事内のコントラクトをデプロイして設定してみます。 ```javascript // SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; contract GelatoNFT is ERC721, ERC721URIStorage { using Counters for Counters.Counter; Counters.Counter private _tokenIds; string public constant gelatoInitialURI = "https://bafkreid6qtmeanbpfygu3e5bbw5fxfexas4dimaigsm6nbigji3naxtz74.ipfs.nftstorage.link/"; constructor() ERC721("GelatoNFT", "GNFT") {} function mintGelato(address to) public { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _mint(to, newItemId); _setTokenURI(newItemId, gelatoInitialURI); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721URIStorage) returns (bool) { return super.supportsInterface(interfaceId); } } ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb91810f8a9648f4c450ec3f3bc11a721f93574ae-1562x1294.png%3Fw%3D1562%26auto%3Dformat&w=3840&q=75) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F3331e7891ede0e606b1d0b41753dd8a24cc9dcd5-1836x1238.png%3Fw%3D1836%26auto%3Dformat&w=3840&q=75) 実行してみます。今回はフロントエンドからではなくnode.jsのバックエンドから実行しますが、フロントからでも同様にできるはずです。 ```javascript import { ethers } from "ethers"; import { GelatoRelayPack } from "@safe-global/relay-kit"; import Safe, { EthersAdapter, getSafeContract, } from "@safe-global/protocol-kit"; import { MetaTransactionData, MetaTransactionOptions, OperationType, RelayTransaction, } from "@safe-global/safe-core-sdk-types"; import dotenv from "dotenv"; dotenv.config(); const nftContractAddress = "0x180B60552B6f7A36DC09c63089D32674A99559D1"; const nftContractAbi = [\ {\ inputs: [],\ stateMutability: "nonpayable",\ type: "constructor",\ },\ 中略\ ]; const RPC_URL = "https://rpc.ankr.com/eth_goerli"; const provider = new ethers.providers.JsonRpcProvider(RPC_URL); const signer = new ethers.Wallet(process.env.PRIVATE_KEY!, provider); const safeAddress = "0x4de4cD64FBd9C0A44414C32528F554c2d1906293"; // Safe from which the transaction will be sent. Replace with your Safe address const chainId = 5; // Get Gelato Relay API Key: https://relay.gelato.network/ const GELATO_RELAY_API_KEY = process.env.GELATO_RELAY_API_KEY!; // Usually a limit of 21000 is used but for smart contract interactions, you can increase to 100000 because of the more complex interactions. const gasLimit = "1000000"; const nftContract = new ethers.Contract( nftContractAddress, nftContractAbi, provider ); // Create a transaction object const safeTransactionData: MetaTransactionData = { to: nftContractAddress, data: nftContract.interface.encodeFunctionData("mintGelato", [\ "0x68B38f944d2689537f8ed8A2F006b4597eE42218",\ ]), value: "0", operation: OperationType.Call, }; const options: MetaTransactionOptions = { gasLimit, isSponsored: true, }; // Create the Protocol and Relay Kits instances async function relayTransaction() { const ethAdapter = new EthersAdapter({ ethers, signerOrProvider: signer, }); const safeSDK = await Safe.create({ ethAdapter, safeAddress, }); const relayKit = new GelatoRelayPack(GELATO_RELAY_API_KEY); // Prepare the transaction const safeTransaction = await safeSDK.createTransaction({ safeTransactionData, }); const signedSafeTx = await safeSDK.signTransaction(safeTransaction); const safeSingletonContract = await getSafeContract({ ethAdapter, safeVersion: await safeSDK.getContractVersion(), }); const encodedTx = safeSingletonContract.encode("execTransaction", [\ signedSafeTx.data.to,\ signedSafeTx.data.value,\ signedSafeTx.data.data,\ signedSafeTx.data.operation,\ signedSafeTx.data.safeTxGas,\ signedSafeTx.data.baseGas,\ signedSafeTx.data.gasPrice,\ signedSafeTx.data.gasToken,\ signedSafeTx.data.refundReceiver,\ signedSafeTx.encodedSignatures(),\ ]); const relayTransaction: RelayTransaction = { target: safeAddress, encodedTransaction: encodedTx, chainId: chainId, options, }; const response = await relayKit.relayTransaction(relayTransaction); console.log( `Relay Transaction Task ID: https://relay.gelato.digital/tasks/status/${response.taskId}` ); } relayTransaction(); ``` 実行結果 [https://relay.gelato.digital/tasks/status/0x4d2deb76c40d4c8903380cdf00cab3331884c504ea4fd1cf16fea7f14ffab902](https://relay.gelato.digital/tasks/status/0x4d2deb76c40d4c8903380cdf00cab3331884c504ea4fd1cf16fea7f14ffab902) [https://relay.gelato.network/balance](https://relay.gelato.network/balance) からも確認できました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F34bfb644aef333ce98698084f95f67a06ea0b384-1606x682.png%3Fw%3D1606%26auto%3Dformat&w=3840&q=75) ### おまけ:自分で実装する方法 これらのサービスで行われていることは、当然自力でも一部簡略化して実装することは可能です。動画を紹介しておきます。 Gas-less Token Transfer - YouTube Smart Contract Programmer 62.2K subscribers [Gas-less Token Transfer](https://www.youtube.com/watch?v=rucZrL1nOO8) Smart Contract Programmer Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=rucZrL1nOO8&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 4:37•Live • [Watch on YouTube](https://www.youtube.com/watch?v=rucZrL1nOO8 "Watch on YouTube") Gas-less Token Transfer - Code \| Solidity 0.8 - YouTube Smart Contract Programmer 62.2K subscribers [Gas-less Token Transfer - Code \| Solidity 0.8](https://www.youtube.com/watch?v=jYNnatXRsBs) Smart Contract Programmer Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=jYNnatXRsBs&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 4:50•Live • [Watch on YouTube](https://www.youtube.com/watch?v=jYNnatXRsBs "Watch on YouTube") ### まとめ 以上今回は3つの実装方法をご紹介しました。 個人的にはOpenZeppelin Defenderが使い慣れているので今後も使っていくかと思いますが、どの方法を選んでも良いかと思います。 次回はweb3のウォレット接続の先に、既存のweb2のAuth(Firebase Auth)と連携してオフチェーンのユーザーデータ管理をする方法について解説していきます。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## On-chain Governance Basics [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#11 DAOの基礎中の基礎、On-chainガバナンスを実装する [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 09, 2023· 5 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ffa54c63e60d118aff03c9913a5e9f8297083b774-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDapps11日目はオンチェーンガバナンスについて見ていきます。筆者はDAOについてあまり知見が多いほうではないのですが、さすがに基本的な仕組みは理解しておこうということでやっていきます。 OpenZeppelinのGovernorコントラクトを作成し、ProposalやVoteがどのように機能するかを確認します。以下の公式のウォークスルーに沿ってやっていきます! [How to set up on-chain governance](https://docs.openzeppelin.com/contracts/4.x/governance) DeFi等の分散型プロトコルにおいて、初期は開発チームが意思決定を担いますが、徐々にトークンホルダーのコミュニティに移譲していきます。例えばパラメータの調整、コントラクトのアップグレード、トレジャリーの管理、他プロトコルとのアライアンス、grantの配布などが意思決定の対象です。 このガバナンスの仕組みは一般的にGovernorと呼ばれるコントラクトで実装されます。Compoundによって設計されたGovernorAlphaとGovernorBravoというコントラクトを元として、他プロトコルが採用しやすいように一般化したものをOpenZeppelinが用意してくれています。 hardhatのプロジェクトを作成します。 ガバナンストークンのコードを作成します(ウォークスルーからのコピペです)。ERC20とERC20Voteを継承したコントラクトです。 ```javascript // SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; contract MyToken is ERC20, ERC20Permit, ERC20Votes { constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {} // The functions below are overrides required by Solidity. function _afterTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._afterTokenTransfer(from, to, amount); } function _mint(address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._mint(to, amount); } function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) { super._burn(account, amount); } } ``` ここからは僕も詳しくない領域なのでOpenZeppelinの和訳中心になります。 コアのロジックはGovernorコントラクトによって提供されますが、まだ以下を選択する必要があります:1)投票力の決定方法、2)quorumに必要な投票数、3)投票時の選択肢とその投票の集計方法、4)投票に使用するトークンの種類。これらは、独自のモジュールを作成するか、より簡単にはOpenZeppelin Contractsから選択することによってカスタマイズ可能です。 1)投票力の決定方法には [GovernorVotes](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/governance/extensions/GovernorVotes.sol) モジュールを使用します。このモジュールは、提案がアクティブになった時点でのトークン残高に基づいてアカウントの投票力を決定するために、IVotesインスタンスにフックします。このモジュールは、トークンのアドレスをコンストラクタパラメータとして必要とします。また、このモジュールはトークンが使用するクロックモード(ERC6372)を検出し、Governorに適用します。 2)Quorumに必要な投票数を定義するために、 [GovernorVotesQuorumFraction](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/governance/extensions/GovernorVotesQuorumFraction.sol) を使用します。これはERC20Votesと連携して、提案の投票力が取得されたブロックの総供給量の割合としてQuorumを定義します。このモジュールは、パーセンテージを設定するためのコンストラクタパラメータが必要です。現在の多くのGovernorは4%を使用しているため、パラメータ4でモジュールを初期化します(これはパーセンテージを示し、4%の結果になります)。 3)投票者には3つの選択肢(For、Against、Abstain)を提供する [GovernorCountingSimple](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/governance/extensions/GovernorCountingSimple.sol) を使用します。また、法定議決に対してはForとAbstainの投票のみがカウントされます。 これらを取り入れたものが以下のコードです。また別途Timelockコントラクトをデプロイしておく必要があります。 ```javascript // SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "@openzeppelin/contracts/governance/Governor.sol"; import "@openzeppelin/contracts/governance/compatibility/GovernorCompatibilityBravo.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; contract MyGovernor is Governor, GovernorCompatibilityBravo, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl { constructor( IVotes _token, TimelockController _timelock ) Governor("MyGovernor") GovernorVotes(_token) GovernorVotesQuorumFraction(4) GovernorTimelockControl(_timelock) {} function votingDelay() public pure override returns (uint256) { return 7200; // 1 day } function votingPeriod() public pure override returns (uint256) { return 50400; // 1 week } function proposalThreshold() public pure override returns (uint256) { return 0; } // The functions below are overrides required by Solidity. function state( uint256 proposalId ) public view override(Governor, IGovernor, GovernorTimelockControl) returns (ProposalState) { return super.state(proposalId); } function propose( address[] memory targets, uint256[] memory values, bytes[] memory calldatas, string memory description ) public override(Governor, GovernorCompatibilityBravo, IGovernor) returns (uint256) { return super.propose(targets, values, calldatas, description); } function cancel( address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) public override(Governor, GovernorCompatibilityBravo, IGovernor) returns (uint256) { return super.cancel(targets, values, calldatas, descriptionHash); } function _execute( uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) internal override(Governor, GovernorTimelockControl) { super._execute(proposalId, targets, values, calldatas, descriptionHash); } function _cancel( address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) internal override(Governor, GovernorTimelockControl) returns (uint256) { return super._cancel(targets, values, calldatas, descriptionHash); } function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) { return super._executor(); } function supportsInterface( bytes4 interfaceId ) public view override(Governor, IERC165, GovernorTimelockControl) returns (bool) { return super.supportsInterface(interfaceId); } } ``` デプロイして、デプロイしたコントラクトを [Tally](https://www.tally.xyz/) というサービスに登録してフロントエンドから触れるようにしていきます。 [https://www.tally.xyz/add-a-dao/governor](https://www.tally.xyz/add-a-dao/governor) [https://www.tally.xyz/gov/dapps-everyday-dao](https://www.tally.xyz/gov/dapps-everyday-dao) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4d37ce7ca00d97eeddcf159deb75a5c84446b343-2932x1566.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) proposalを作成してみます。 [https://www.tally.xyz/gov/dapps-everyday-dao/proposal/create](https://www.tally.xyz/gov/dapps-everyday-dao/proposal/create) ウォレット接続されている状態で、TitleとDescriptionを入れます。add actionsはOptionalのようですが、proposalが可決された際に実行されるfuncitonを設定できるみたいです。なので例えばgrantでこのアドレスにこのトークンをいくらtransferするという設定をする、という使い方が考えられます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb37719d1aa372a7b290c450ceee4295bbfdef59f-1686x1162.png%3Fw%3D1686%26auto%3Dformat&w=3840&q=75) submit on-chainでtransactionを起こしてsubmitします。 [https://www.tally.xyz/gov/dapps-everyday-dao/proposal/16897753239432226472683593551970950174441949194318997902963568839291983321973](https://www.tally.xyz/gov/dapps-everyday-dao/proposal/16897753239432226472683593551970950174441949194318997902963568839291983321973) ちょっとここで自分のミスがあって、そもそもガバナンストークンにmint機能を付け忘れて誰もVoting Powerを持っていないということになってしまったので😅 他のプロジェクトの画面を参照させてもらいます。 [https://www.tally.xyz/gov/optimism/proposal/64930538748268257621925093712454552173772860987977453334165023026835711650357](https://www.tally.xyz/gov/optimism/proposal/64930538748268257621925093712454552173772860987977453334165023026835711650357) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcd1b1ad015009cca80717395bb95bfb6ebc4dda8-2940x5656.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ビジュアライゼーションもされていて面白いですね。 ↓否決されているものもありましたw [https://www.tally.xyz/gov/nounsdao/proposal/352](https://www.tally.xyz/gov/nounsdao/proposal/352) ### まとめ Onchainガバナンスを実現するための手順について調べてまとめました。Governorコントラクトの設計と [Tally](https://www.tally.xyz/) について学びました。これでクライアント企業さんから「DAO作りたいんだけど!」って言われても対応できますね!ちなみに [Charmverse](https://www.charmverse.io/) というTallyと似たようなサービスもあるらしいです。 [こちらの記事](https://note.com/yukkakiyo/n/n6775032f4561) が詳しかったのでご覧ください 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Dapps Wallet Creation Tools [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#3 サービス内ウォレットを作成できるツールまとめ [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) July 28, 2023· 6 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F3180deee8079daf78d3435cab223cf7cc559fbc3-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) 「まいにちDapps」の3日目では、サービス内ウォレットの導入方法について掘り下げていきます。 前回は、mintサイトからクレジットカードを用いて購入できる方法を説明しました。しかしせっかくクレジットカード決済に対応しても、ユーザーにMetamaskなどのウォレットを準備してもらう必要がある場合、非クリプトユーザーにとってのオンボーディングUXが大幅に低下してしまう可能性があります。そのため、サービス固有のウォレットを導入し、従来のWeb2と同様のUXを提供する方法を探求します。 今回もいくつかの方法を試していきましょう - Paper.xyzのEmbedded Wallet - Web3Auth - Crossmint - Privy ### Paper.xyzのEmbedded Wallet 前日に続いて [Paper.xyz](https://withpaper.com/) を使用します。PaperはNFTを中心としたDapps開発ツールで、現在はThirdwebに買収され統合が進められています。 [こちらの参考記事](https://blog.thirdweb.com/guides/how-to-use-paper-wallet/) に従って手順を進めていきましょう。 まず、 [https://withpaper.com/dashboard/embedded-wallets/auth-settings](https://withpaper.com/dashboard/embedded-wallets/auth-settings) にアクセスします。ログインを求められる場面で、メールアドレスを入力すると、7桁のワンタイムコードがメールで送信されます。これをペーストすることでログインができます。これこそが今日目指すUXです。 次に、Application NameとAllowlisted Domainsを入力します。localhostでテストするのでDomainに [http://localhost:3000](http://localhost:3000/?ref=blog.thirdweb.com) を入力します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc6cefffebb31c58dd9ce71365c9fd04268ec1bfa-1582x966.png%3Fw%3D1582%26auto%3Dformat&w=3840&q=75) Next.jsのプロジェクトを立ち上げます。 `npx create-next-app@latest` Thirdwebのセットアップをします。 `yarn add @thirdweb-dev/react` providers/Providers.tsxというファイルを作り、 ```javascript "use client"; import { ThirdwebProvider, paperWallet } from "@thirdweb-dev/react"; export function Providers({ children }: { children: React.ReactNode }) { return ( {children} ); } ``` Layout.tsxからProviderを読み込みます。 page.tsxでConnect Walletボタンを設置します。 ```javascript "use client"; import { ConnectWallet } from "@thirdweb-dev/react"; export default function Home() { return (
); } ``` メアドでログインが可能なConnect Walletボタンができました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb8450f9d26e2680698872ebeb37875a1f6da9cc1-948x432.png%3Fw%3D948%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F55786766c3330b9acf371960c78c5ae0a30a1b4f-1022x362.png%3Fw%3D1022%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8697bd5708e50724edb4d84ef76e8be04ec6c092-1004x860.png%3Fw%3D1004%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6c28cba13602b2e380faacd6ca512042b1da35cf-1266x750.png%3Fw%3D1266%26auto%3Dformat&w=3840&q=75) ウォレットログインが完了した状態になります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2f4a367dd0602b7d7f6cdb4095105da80ee4f518-942x762.png%3Fw%3D942%26auto%3Dformat&w=3840&q=75) ちなみに他のウォレットと選択制にすることも可能です。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F48582005d17e07b3f3d029dd90d31d00ac6e320c-1046x622.png%3Fw%3D1046%26auto%3Dformat&w=3840&q=75) 比較的シンプルに導入できたのではないでしょうか?Thirdwebを使うプロジェクトの場合は導入の手軽さから第一の選択肢になりそうです。現在は1000アクティブユーザーまでは無料で使えるようです。 ### Web3Auth 続いてweb2のAuthとweb3を繋ぐサービスとして人気のweb3Authを紹介します。 [https://dashboard.web3auth.io/home/overview](https://dashboard.web3auth.io/home/overview) にアクセスします。 Quick Startからプロジェクトを作成します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8652e9aed5b95140458e149d28bc1bb171a0f2b0-1570x1324.png%3Fw%3D1570%26auto%3Dformat&w=3840&q=75) Next.jsのプロジェクトを立ち上げます。 [https://web3auth.io/docs/integration-builder](https://web3auth.io/docs/integration-builder) を参考にコードを作成します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F89030b888c33858628b3ead02876a8cccb5da1e7-2898x1414.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) `yarn add web3@1.10.0 @web3auth/modal @web3auth/base` (web3のverを指定するのは [このエラー](https://web3auth.io/community/t/i-cant-understand-why-am-getting-providererror-provider-does-not-have-a-request-or-send-method-to-use/4905/3) に遭遇したためです) App.tsxの内容とweb3RPC.tsをコピーして持ってきます。 walletconnectのアップグレードの影響かエラーが出ていたので `@walletconnect/sign-client` も追加しました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Faa93c6eff5164dc7214081bee8b94ca6a4f16676-1316x1358.png%3Fw%3D1316%26auto%3Dformat&w=3840&q=75) ログインモーダルができました。 ポップアップでGoogleログインを要求されて、成功すると表示がされます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F36e15205c84b8803e36419e1211e6e5c814f22ea-1138x1266.png%3Fw%3D1138%26auto%3Dformat&w=3840&q=75) 個人的には以前同チームが開発するTorus Walletが使いづらかったイメージがあってあまり好印象ではなかったのですが、今やかなり利用率が高く洗練されたサービスになっている印象があります。 FirebaseAuthとのインテグレーションも次回以降で試してみようと思います。 ### Crossmint CrossmintでもPaperwalletと同様の機能があるようなので試してみましょう。 まずはこちらの動画を参考にバックエンドのチュートリアルを進めていきます。 How to use Crossmint's Wallet-as-a-service APIs - YouTube Crossmint 780 subscribers [How to use Crossmint's Wallet-as-a-service APIs](https://www.youtube.com/watch?v=DIy6A3WvQPY) Crossmint Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=DIy6A3WvQPY&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 7:52•Live • [Watch on YouTube](https://www.youtube.com/watch?v=DIy6A3WvQPY "Watch on YouTube") [https://staging.crossmint.com/console/projects/apiKeys](https://staging.crossmint.com/console/projects/apiKeys) にアクセスしてapiKeyを作成します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fba34fea779778e1f0825a06467bdaac71c3ed48e-1504x620.png%3Fw%3D1504%26auto%3Dformat&w=3840&q=75) [https://docs.crossmint.com/reference/create-wallet](https://docs.crossmint.com/reference/create-wallet) に遷移して右のAuthenticationにCLIENT SECRETとProject IDを入れます。 Walletの作成やNFTの発行がAPI経由でできました。特にメールアドレスの認証がないのでテキトーな文字列の実在しないメアドでウォレットが作れてしまうのがあまりよくないなと思いました。 そしてフロントエンドはサンプルが見当たらなかったので自分で作成してみました。 APIを作成してフロントエンドからメールアドレスを入力してPOSTします。 ```javascript import { NextResponse } from "next/server"; export async function POST(request: Request) { const data = await request.json(); const { email } = data; const body = { email: email, chain: "polygon", }; const response = await fetch( `https://staging.crossmint.com/api/v1-alpha1/wallets`, { method: "POST", headers: { "X-PROJECT-ID": "your project id", "X-CLIENT-SECRET": "your client secret", "content-type": "application/json", }, body: JSON.stringify(body), } ); const wallet = await response.json(); console.log(wallet); return NextResponse.json(wallet); } ``` ```javascript "use client"; import { useState } from "react"; export default function Home() { const [emailAddress, setEmailAddress] = useState(""); const [wallet, setWallet] = useState(""); const createWallet = async () => { const response: any = await fetch(`/api/create-wallet`, { method: "POST", body: JSON.stringify({ email: emailAddress, }), }); const result = await response.json(); console.log(result); setWallet(result.publicKey); }; return (
setEmailAddress(event.target.value)} />
{wallet ?

ウォレットアドレス:{wallet}

: <>}
); } ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F303a4d3b1d535480d95cb84bd9626fe5d7d5c5d7-1644x700.png%3Fw%3D1644%26auto%3Dformat&w=3840&q=75) 最近リリースされたばかりの機能のようなのでドキュメントやサンプルがPaperと比べて不足していると感じました。これから充実して行くでしょうが、現時点ではPaperを差し置いてCrossmintを採用する理由はないなと思いました。 ### Privy もう1つ見つけたサービスを紹介します。 Privyというツールで [デモのサイト](https://create-next-app.privy.io/) がこちらにあります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F02278b6fcbe2c267b05019926fc966538defd31f-1820x1210.png%3Fw%3D1820%26auto%3Dformat&w=3840&q=75) [認証トークンのフォーマットにDIDを採用している](https://docs.privy.io/guide/frontend/authorization) ところが良さそうだなと思いました。 [https://docs.privy.io/guide/quickstart](https://docs.privy.io/guide/quickstart) 公式ドキュメントが上記になります。 こちらも試してみたかったのですが、利用するのにフォームの記入(簡単なアンケートと、開発中のプロジェクトのURL)が必要だったので今回はパスします。 ### まとめ 以上今回は4つの実装方法をご紹介しました。これら以外にも様々なサービスがあり、サービス内でweb2と似たUXでウォレットを生成して使ってもらうことが容易になっているなと改めて感じました。 次回はユーザーがサービス内ウォレットを作成したのち、すぐにオンチェーンの動作ができるよう、ガスレスでトランザクションを起こせるDappsを作成していきます。 -----お知らせ------ 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025 Pontech.Inc SystemDarkLight ## NFT Royalties and Marketplaces [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#18 NFTのOnchain-Royaltyと独自マケプレの導入 [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 21, 2023· 5 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff627205fcf9b0caacbb09b74c9cb843e11896d5a-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) つい先日、OpenSeaがNFTの二次流通に対するCreator Feeを強制ではなく取引するユーザーの任意にすることを発表しました。 [Changes to creator fees on OpenSea](https://opensea.io/blog/articles/creator-fees-update) これに対して世間ではさまざまな反応が見られます。 Yuga LabsはOpenSeaのコントラクトをサポートしない方針を示しました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9daa0da148f97ece4888d92ac3910b2cd4391e04-1266x1508.png%3Fw%3D1266%26auto%3Dformat&w=3840&q=75) 今回はNFTのロイヤリティについて改めて整理したいと思います。 ### NFTのロイヤリティ問題とOpenSeaの奮闘の歴史 NFTが登場した初期には、共通のロイヤリティ規格は存在していませんでした。各マーケットプレイスが独自の分配の仕組みを実装しており、クリエイターへの報酬の流れは一貫していませんでした。 NFTコレクションのコントラクトにクリエイターフィーの情報を含めるロイヤリティ標準規格「EIP-2981」が登場し、マーケットプレイス側がこの情報に基づいてクリエイターフィーを支払う対応を始めました。しかしOpenSeaの競合となるBlurなどはマーケット手数料を0%に、一時的にクリエイターフィーを0%にしてOpenSeaからシェアを奪っていきました。マーケットプレイスマーケットプレイス 2022年OpenSeaはOpenSea Operator Filterを導入し一部のマーケットプレイスをブロックするコントラクトを含まない場合、OpenSeaでのクリエイターフィーは0%になるとの発表がありました。 この辺りはmiinさんの以下の記事が詳しいです。 [いま崩れはじめた「NFTはクリエイターにロイヤリティが還元され続ける」という神話](https://note.com/miin_nft/n/n539724ca1e6b) [OpenSea vs Blur、クリエイターフィーの現状について](https://note.com/miin_nft/n/n2addf288f278) この頃のOpenSeaの方針(特に既存のコレクションに対する扱い)は二転三転しエンジニアとして対応に混乱したことを覚えています。 ### ERC2981について 改めてERC2981とそれに対応したマーケットプレイスのコントラクトを見てみます。 [https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/common/ERC2981.sol](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/common/ERC2981.sol) 以下のrolaytyInfoという関数を実行して返ってくる値が支払われるべきクリエイターフィーということです。 ```javascript function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } ``` こちらはマーケットのサンプルコントラクトです。 [https://github.com/benber86/nft\_royalties\_market/blob/419571e1a966708785455e3ef3374d5d3be8b290/contracts/Marketplace.sol#L98](https://github.com/benber86/nft_royalties_market/blob/419571e1a966708785455e3ef3374d5d3be8b290/contracts/Marketplace.sol#L98) ```javascript function _deduceRoyalties(uint256 tokenId, uint256 grossSaleValue) internal returns (uint256 netSaleAmount) { // Get amount of royalties to pays and recipient (address royaltiesReceiver, uint256 royaltiesAmount) = token .royaltyInfo(tokenId, grossSaleValue); // Deduce royalties from sale value uint256 netSaleValue = grossSaleValue - royaltiesAmount; // Transfer royalties to rightholder if not zero if (royaltiesAmount > 0) { royaltiesReceiver.call{value: royaltiesAmount}(''); } // Broadcast royalties payment emit RoyaltiesPaid(tokenId, royaltiesAmount); return netSaleValue; } ``` ### 今後の流れ予想 1. コレクション独自のマーケットプレイス増加 2. 二次流通ロイヤリティ以外のマネタイズ増加 以前はOpenSeaでの取引高がコレクションの人気の指標として重要視されていましたが、NFT市場全体の注目度の低下もさることながらOpenSea自体の影響度も落ちているような気がします。コレクション独自のページで独自のマーケットプレイスを持つことも多くなると思います。 収益の柱として考えず、他のマネタイズを狙うほうが健全と言えます。#まいにちDappsではNFTの活用方法をたくさん提供しているので、アイデアのタネを提供できれば幸いです。 ### コレクション独自のマーケットプレイスを作成する ThirdwebのコントラクトとReactのSDKを使ってマーケットプレイスを作成してみましょう。 基本はこちらのブログを参考に進めますが、別画面で出品すると少しダサいので、OpenSeaのようにNFTの詳細画面内でリスティングしていきます。 [Create Your Own NFT Marketplace with TypeScript and Next.js](https://blog.thirdweb.com/guides/nft-marketplace-with-typescript-next/) まずマーケットのコントラクトをデプロイします。 [https://thirdweb.com/thirdweb.eth/MarketplaceV3](https://thirdweb.com/thirdweb.eth/MarketplaceV3) 今回の目的はNFTのロイヤリティの回収ですので、プラットフォームFeeを設定します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc8bea019814f04f2a63a424d308865586a99a954-2938x1384.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) Next.jsのプロジェクトを立ち上げます。 一気に飛ばしてしまってNFT一覧画面をトップページに、詳細画面を以下のコードで作りました。 ```typescript "use client"; import { useContract, ConnectWallet, useListings, useNFT, useAddress, } from "@thirdweb-dev/react"; import { useState } from "react"; export default function NFT({ params }: { params: { tokenId: string } }) { const nftContractAddress = "0xE71eE93Ad57c8b355e1bCDFe435B05673d8B4930"; const { contract } = useContract( "0xE71eE93Ad57c8b355e1bCDFe435B05673d8B4930" ); const { contract: marketContract } = useContract( "0xaEa0d74cEFc8D75Fa42Ab1e49B2a7122620128fC", "marketplace" ); const [sellingPrice, setSellingPrice] = useState(""); const { data: nft, isLoading, error } = useNFT(contract, params.tokenId); const { data: listings, isLoading: listingLoding, error: listingError, } = useListings(marketContract, { tokenContract: nftContractAddress, tokenId: params.tokenId, start: 0, count: 100, }); const address = useAddress(); const handleCancel = async (listingId: string) => { await marketContract?.direct.cancelListing(listingId); }; const handleSell = async () => { const listing = { assetContractAddress: nftContractAddress, tokenId: params.tokenId, startTimestamp: new Date(), listingDurationInSeconds: 86400, quantity: 1, currencyContractAddress: "0x0000000000000000000000000000000000000000", buyoutPricePerToken: sellingPrice, }; await marketContract?.direct.createListing(listing); }; const handleBuy = async (listingId: string) => { await marketContract?.direct.buyoutListing(listingId, 1); }; return (
{/* Product */}
{/* Product image */}
{isLoading ? ( <>...loading ) : ( {nft?.metadata.name )}
{/* Product details */}

{nft?.metadata.name}

Product information

{nft?.metadata.description}

{listings?.length && (

{listings![0].buyoutCurrencyValuePerToken.displayValue}{" "} {listings![0].buyoutCurrencyValuePerToken.symbol}

)}
{address ? ( <> {/* listingがあるとき */} {listings?.length ? ( <> {listings![0].sellerAddress != address ? ( <> ) : ( )} ) : ( <> {/* listingがないとき */} {nft?.owner == address ? ( <>
{ setSellingPrice(e.target.value); }} />
MATIC
) : ( )} )} ) : ( )}
); } ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ffb25070cb25fa2c4b252b7a971669836373c15ef-2932x1528.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ロジックとしては - ウォレットを接続していなければ **Connect Wallet** ボタンを表示 - 当該NFTのリスティングがない場合で - 当該NFTのオーナーが自分の場合、 **Sell** ボタン - 当該NFTのオーナーが自分以外の場合、 **Offer** ボタン - 当該NFTのリスティングがある場合で - 当該NFTのオーナーが自分の場合、 **Cancel** ボタン - 当該NFTのオーナーが自分以外の場合、 **Buy** ボタン \+ **Offer** ボタン という出し分けになります。(本当はあとOffer Acceptも必要ですね) マーケットコントラクトのロジックは [こちら](https://portal.thirdweb.com/react/react.useacceptdirectlistingoffer) を参照してください。 また、今回のコードは自前のデータベースを持たず、オンチェーンの情報をフロントエンドから都度参照しているので、パフォーマンスは低いものになっています。 ### まとめ 今回はNFTのロイヤリティ問題の詳細に触れ、ざっくり独自マーケットプレイスを作成する方法について解説しました。本番用に調整したコードでPontechホームページにも導入しようと考えています。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Rollup SDK Overview [技術記事](https://www.pontech.dev/category/tech) # Rollup SDKとRollup as a Serviceの比較・まとめ [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) April 24, 2024· 7 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fadbd52e27526bf3bfe1a9bdd85e38fa9b5a38de9-2940x1654.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) EthereumのLayer2のチェーンのTVLは右肩上がりで増えています。Dencunアップグレードの実装が完了してLayer2のガス代が大幅に低下しました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F8782c293a905217c4c86d1dc4533679576a3fcbe-2480x956.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) [https://l2beat.com/scaling/summary](https://l2beat.com/scaling/summary) DEXやCEXなどの取引所、NFTのマーケットプレイスなど、各種プロトコルが独自のLayer2ないしLayer3のチェーンを構築する動きも加速しています。例えば大手取引所の [OKXがLayer2に参戦する](https://www.okx.com/xlayer) ことを発表したり、Worldcoinも [World chainという独自のLayer2を準備中](https://www.theblock.co/post/289420/worldcoin-to-have-its-own-layer-2-blockchain-called-world-chain) だそうです。Coinbaseが運営するLayer2のBaseの取引高はWarpcastの流行もあり増加しており、Baseを親チェーンとするLayer3の [Degenチェーン](https://www.degen.tips/) も成功を収めています。 あなたの企業やプロジェクトが独自のLayer2を開発する場合、どのような選択肢があるのでしょうか?この記事ではRollup SDKとRollup as a Serviceを比較してまとめてみます。 そもそもLayer2・Rollupが何かについては [こちらのEthereum Foundationのドキュメント](https://ethereum.org/ja/layer-2/) をご確認ください。 ## Rollup SDKまとめ Rollupを開発している企業のいくつかは、そのソースコードを公開するだけでなく、SDKとして同様のLayer2ないしLayer3を構築する手順を簡単にしたパッケージを公開してくれています。 2024年4月現在、以下の4つのRollup SDKが公開されています。 [Altlayer](https://altlayer.io/raas) にまとめられている各チェーンの特徴を記載してみます。 #### [OP Stack](https://docs.optimism.io/stack/getting-started) OP Stackは、Optimism Collectiveによって開発された、L2ブロックチェーンエコシステムを構築するためのソフトウェアコンポーネントのセットで、Optimismを強化するために使用されます。 - 安価で信頼性の高いガス料金でカスタマイズ可能なL2をデプロイ - 許容的なMITライセンスでオープンかつ協力的 - L2市場でのBattle-Tested - Validiumモードサポート(Celestiaを介して)によるコスト削減 - Superchainへの参加が可能で、Optimismの将来のチェーンネットワークでブリッジング、ガバナンス、相互運用性を共有 #### [Arbitrum Orbit](https://arbitrum.io/orbit) Arbitrum Orbitは、ArbitrumのL2チェーン(Arbitrum One、Arbitrum Nova、Arbitrum Goerli、Arbitrum Sepolia)のいずれかを親チェーンとする専用チェーンをパーミッションレスに作成できる機能を提供します。 - 安価で信頼性の高いガス料金でカスタマイズ可能なL3をデプロイ - カスタムネイティブガストークンに対応 • 実績のあるフォールトプルーフが有効 - Validiumモードサポート(AnyTrustまたはCelestiaを介して)によるコスト削減 - Rust、C、C++(Stylusを介して)でスマートコントラクトを記述可能 - 設定可能なアクセス制御 #### [Polygon CDK (Chain Development Kit)](https://polygon.technology/polygon-cdk) Polygon Chain Development Kit(CDK)を使用すると、あなたのニーズに合わせたZK駆動のLayer 2を構築できます。CDKを通じて作成された各チェーンは相互に接続されており、ほぼ即時の確定性、無限のスケーラビリティ、統合された流動性プールを保証します。 - 安価で信頼性の高いガス料金でカスタマイズ可能なL2をデプロイ - ほぼ即時のトランザクション確定(zkプルーフを介して) - Validiumモード(zkValidiumまたはCelestiaを介して)によるコスト削減 - 設定可能なアクセス制御 - 相互運用性と統合された流動性のためのLXLYブリッジへのオプトインが可能 #### [ZK Stack](https://zkstack.io/) ZK Stackは、zkSync Eraのコードに基づいて、カスタムのZK駆動のL2およびL3(Hyperchainsと呼ばれる)を構築するために設計された、モジュラーなオープンソースフレームワークです。 - 許可条件のMITライセンスでオープンかつ協力的 - zkプルーフによるほぼ即時のトランザクション確定 - シーケンサーの選択からデータ利用可能性モード、トークノミクスの定義まで、モジュール性をサポート - セキュリティと信頼性を示す実績を持つBattle-Tested - 低遅延と共有流動性を誇る信頼できるHyperchainsネットワークにシームレスに接続 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fadbd52e27526bf3bfe1a9bdd85e38fa9b5a38de9-2940x1654.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 表にまとめると、このようになります。 Optimstic Rollupと比べるとZK Rollupはマシーンのスペックを必要とします。OP StackとArbitrum Orbitの大きな違いとしては、Arbitrum OrbitはArbitrum OneやNovaを親チェーンとするLayer3を構築する設計に対して、OP StackはEthereumを親チェーンとするLayer2を構築する設計という違いがあります。ZK StackもLayer3を構築する寄りの設計思想だと思います。 ## Rollup as a Serviceまとめ 上記のRollup SDKを用いて自力でチェーンを立ち上げることはできますが、経験が少ないと初期設定の難易度が高かったり、継続的な運用に不安を覚えることがあると思います。そこでRollup as a Serviceという主に特定のアプリケーション向けにカスタマイズされたRollupを容易に構築できる(裏側でRollup SDKの初期設定や運用を代行してくれる)サービスが存在します。 主要なRollup as a Serviceを比較してみます。 #### [Conduit](https://conduit.xyz/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F380a735365925491c7955b88f02112d986a2dde0-1582x933.png%3Fw%3D1582%26auto%3Dformat&w=3840&q=75) - OP StackとArbitrum Orbitに対応したRaaS、明確な月額料金を提示している。 - 採用プロジェクト: Degen Chainなど #### [Caldera](https://www.caldera.xyz/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fde3f692165294ef52f01defe8d33ae7c28d6facb-2940x3344.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) - 調査した中では唯一ネイティブのガストークンをUSDCやWBTCで設定できるサービス(現時点で) - 採用プロジェクト: Manta Pacific、zerion、KINTO、Loot、RARI #### [Zeeve](https://www.zeeve.io/rollups/) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F20e7b894df7fbff21fab029f62b0f46eaa025f48-2940x4326.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) - 今回調査した中で唯一4つすべてのRollup SDKに対応していたサービス - オフチェーンのDAレイヤーも複数から選択できる - 無料テスト期間が長い - 今回の範囲から外れるが、Avalanche SubnetとPolkadot ParachainsというAppchainsにも対応 #### Gelato ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9190adc6713240213c2096156dd2696b73311e1c-2940x2298.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) - Polygon CDKにも対応している - 採用プロジェクト: Astar zkEVM #### [AltLayer](https://altlayer.io/raas) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F144e2797e04ea2798a93a7dd410080e8c21895dc-1870x924.png%3Fw%3D1870%26auto%3Dformat&w=3840&q=75) - LPでは複数プラットフォームに対応していると見せかけて、ダッシュボードからはあまりよく分からなかった。要問い合わせ まとめた図表がこちらになります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9efed09bdaba3c953cd4086e50ef47c4a54d07d7-2940x1654.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) 個人的にはZeeveが対応範囲が広く、料金も明確で利用しやすい気がしましたが、例えばOptimistic系でカスタマイズをさほど必要としない場合、他の選択肢で十分というケースも多そうです。他プロジェクトの採用実績も考慮するべきかと思います。また、交渉次第で良い条件が引き出せるかもしれません。 ## まとめ Rollup SDKとRollup as a Serviceについて、選択肢を比較しました。調査した結果、想像より多くのプロジェクトがRaaSを利用しているという気付きを得ました(Rollup SDKを自分で構築しているかと想定していました)。 アプリ特化のブロックチェーンの構築を考えられている企業・プロジェクトの方は、ぜひ参考にしてみてください。 株式会社Pontechでは、Dapps開発の受託を請け負っております。本記事のように採用する技術やサードパーティのサービスの検討からお手伝いすることが可能です。 Dapps開発に関するご相談がございましたら、ぜひ当社まで [お問い合わせ](https://www.pontech.dev/contact) ください。 **関連記事** [Dapps開発におけるウォレット接続の選択肢まとめ・比較](https://www.pontech.dev/post/wallet-adaptors) [Dapps開発におけるNode as a Serviceの比較・まとめ](https://www.pontech.dev/post/node-as-a-service) [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Dynamic NFTs with Chainlink [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#14 Chainlinkを使ってDynamic NFTを作る [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 15, 2023· 3 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F4c46065150b0992b998965e271594d1510792b89-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDapps14日目はDynamic NFTを作っていきます。Dynamic NFTの定義は人それぞれかと思いますが、ここでは広く「メタデータが切り替わるNFT」としておきます。 ### Chainlink Automationを使う まずこちらのチュートリアルをやってみます。 [How To Create Dynamic NFTs Using Chainlink Automation \| Chainlink Engineering Tutorials](https://docs.chain.link/chainlink-automation/tutorials/dynamic-nft) こちらにコードがあるのでコピーしてRemixでデプロイします。 [https://github.com/smartcontractkit/smart-contract-examples/blob/main/dynamic-nft/2\_complete.sol](https://github.com/smartcontractkit/smart-contract-examples/blob/main/dynamic-nft/2_complete.sol) 上記のコードではIPFSに3段階の成長する花のメタデータを格納しておき、growFlower()という関数でTokenURIを更新するというものです。 ```javascript function growFlower(uint256 _tokenId) public { if (flowerStage(_tokenId) >= 2) { return; } // Get the current stage of the flower and add 1 uint256 newVal = flowerStage(_tokenId) + 1; // store the new URI string memory newUri = IpfsUri[newVal]; // Update the URI _setTokenURI(_tokenId, newUri); } ``` そしてChainlinkのAutomationを使う際に必要な関数を実装しておきます。checkUpkeepは定められた更新の間隔(interval)が前回の更新から経過していないか、つまり更新の必要があるかをbooleanで返却する関数です。 performUpKeepで実際に必要な更新の関数を実行します。ここではgrowFlowerを実行しています。 ```javascript uint256 lastTimeStamp; uint256 interval; constructor(uint256 _interval) ERC721("dNFTs", "dNFT") { interval = _interval; lastTimeStamp = block.timestamp; } function checkUpkeep( bytes calldata /* checkData */ ) external view returns ( bool upkeepNeeded, bytes memory /* performData */ ) { upkeepNeeded = (block.timestamp - lastTimeStamp) > interval; // We don't use the checkData in this example. The checkData is defined when the Upkeep was registered. } function performUpkeep( bytes calldata /* performData */ ) external { //We highly recommend revalidating the upkeep in the performUpkeep function if ((block.timestamp - lastTimeStamp) > interval) { lastTimeStamp = block.timestamp; growFlower(0); } // We don't use the performData in this example. The performData is generated by the Keeper's call to your checkUpkeep function } ``` コントラクトをデプロイしました。NFTのmintもしておきます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fffc9239243ae452f058315d9b19e53a715f5d49c-658x730.png%3Fw%3D658%26auto%3Dformat&w=3840&q=75) ChainlinkにUpkeepを登録していきます。 [https://automation.chain.link/mumbai/new](https://automation.chain.link/mumbai/new) ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F3835e25c0519087bf048927819f74ce399ec8f3c-2940x5828.png%3Frect%3D0%2C0%2C2940%2C4202%26w%3D2000%26auto%3Dformat&w=3840&q=75) 設定できて5分ごとに実行されることが確認されました(そのようにCRONで設定したからです)。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe21aff5d0f2e7207cdcba4e68aabd79673f1c0f7-2940x5006.png%3Frect%3D0%2C0%2C2940%2C3386%26w%3D2000%26auto%3Dformat&w=3840&q=75) メタデータも切り替わりました。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7aa3957f4dde5e9720f0c8b8975d735f4c937de2-2832x1516.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc0e941d23ea20b5e1018a8c189af8601ad31a5fa-2940x1444.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) もう1つ、ChainlinkのPriceDataFeedも組み合わせて、BullとBearで画像を切り替えるNFTというサンプルがあるのでこちらも掲載しておきます。 5\. Connect APIs to your Smart Contracts using Chainlink \| Road to Web3 - YouTube Alchemy 23.8K subscribers [5\. Connect APIs to your Smart Contracts using Chainlink \| Road to Web3](https://www.youtube.com/watch?v=hNdXSMKLDi4) Alchemy Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=hNdXSMKLDi4&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 1:24:28•Live • [Watch on YouTube](https://www.youtube.com/watch?v=hNdXSMKLDi4 "Watch on YouTube") Chainlinkを利用して実装できるその他のアイデアがまとまっているページも一度見てみてください。 [77+ Smart Contract Use Cases Enabled By Chainlink](https://blog.chain.link/smart-contract-use-cases/) ### まとめ ChainlinkのAutomationを使ってDynamic NFTのメタデータを更新する方法について解説しました。 Dynamic NFTの実装方法には以下の方法があると思います。 - メタデータを動的なサーバー管理にしてサーバー側でDynamicに切り替える - メタデータをIPFS等分散型DBに静的に管理にして、Updateする関数で切り替える - 定期実行を自分で行う - **定期実行をChainlinkに任せる←今回の方法** - メタデータをフルオンチェーンで管理してオンチェーンのロジックで切り替える 他の方法についてもどこかで解説できればと考えています。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## MUD and Autonomous World [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#17 MUDに入門してAutonomous Worldを触ってみる [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 18, 2023· 4 min read ![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F43ea1016daa44fa4ac6cf6d04dad0f6149692544-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) グローバルのハッカソンではAutonomous Worldというテーマがよく聞かれます。フルオンチェーンゲームの解釈を進めたオンチェーンの自律的な世界のことだと認識していますが、どのように作られているのか詳しくないので一緒に見ていきましょう! ### Autonomous Worldとは Autonmous Worldが何か、という話については以下の記事に詳しくまとまっていたのでぜひ参照してみてください。 [Autonomous Worldとは](https://note.com/syora/n/n8060cc166fa2) またEthereum naviさんの以下の記事もMUDに限らずオンチェーンゲーム全般の趣旨や課題・可能性について触れていて必読です! [オンチェーンゲームの誕生背景と概要、事例紹介、そして現状の課題から今後の発展可能性までを網羅的に解説](https://ethereumnavi.com/2023/03/26/what-is-on-chain-gaming/) [ETH Globalの「Autonomous Worldsハッカソン」でファイナリストに選出された10個のプロジェクトについて概観し、今後の可能性と課題について探る](https://ethereumnavi.com/2023/06/04/autonomous-worlds-by-ethglobal/) ### チュートリアル 今回はこちらのETHGlobalのAutonomous HackathonでのMUD開発者のチュートリアルを進めていきます。 Build with MUD and React - Kooshaba - YouTube ETHGlobal 29.8K subscribers [Build with MUD and React - Kooshaba](https://www.youtube.com/watch?v=tUBAZUM7a_A) ETHGlobal Search Watch later Share Copy link Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. More videos ## More videos You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. [Watch on](https://www.youtube.com/watch?v=tUBAZUM7a_A&embeds_referring_euri=https%3A%2F%2Fwww.pontech.dev%2F) 0:00 0:00 / 33:55•Live • [Watch on YouTube](https://www.youtube.com/watch?v=tUBAZUM7a_A "Watch on YouTube") まず [https://github.com/latticexyz/react-workshop-starter](https://github.com/latticexyz/react-workshop-starter) のレポジトリをgit cloneします。 pnpm install, pnpm devで立ち上げます。 Foundryのlocal chainに繋がったフロントエンドが立ち上がります。Reactのコンポーネントを作るチュートリアルにならないために、コンポーネントは用意してくれています。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa6fe5cced4661c4c655b2c1d6dd0b22be81ac6b0-2938x1660.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) チェーンデータをhookしてReact Appに反映・インタラクティブにしていく方法について学んでいきます。 今回はTODOリストを作っていきます。 まずデータストラクチャを作ります。packages/contracts/mud.config.tsを開きます。以下のようにToDoのschemaを追加します。 ```typescript import { mudConfig } from "@latticexyz/world/register"; export default mudConfig({ tables: { ToDo: { schema: { done: "bool", body: "string", }, }, }, modules: [\ {\ name: "UniqueEntityModule",\ root: true,\ args: [],\ },\ ], }); ``` 自動でコントラクトが再デプロイされるようです。 次にpackages/contracts/src/systems/ToDoSystem.solを開いて編集していきます。 ```javascript // SPDX-License-Identifier: MIT pragma solidity >=0.8.0; import { System } from "@latticexyz/world/src/System.sol"; import { addressToEntity } from "../Utils.sol"; import { getUniqueEntity } from "@latticexyz/world/src/modules/uniqueentity/getUniqueEntity.sol"; import { ToDo, ToDoData } from "../codegen/Tables.sol"; contract ToDoSystem is System { function addToDo(string memory body) public { bytes32 id = getUniqueEntity(); ToDo.set(id, ToDoData({body: body, done: false})); } } ``` todoを追加するためのaddToDoという関数を作成しました。 フロントエンドからこの関数を実行していきます。 コンポーネントは作成されているので、インポートします。 packages/client/src/App.tsx ```typescript import React from "react"; import "./index.css"; import { AppContainer, Container, Card, HeaderDiv, Subtitle, Title, Footer, TextLink, } from "./theme"; import { ToDoForm } from "./ToDoForm"; export const App = () => { return ( MUD x React Workshop Creating a todo list using MUD
MUD docs
); }; ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F86a6b3946be04863a4cc71e49826065227e17f5d-1304x746.png%3Fw%3D1304%26auto%3Dformat&w=3840&q=75) 上記の+ボタンを押しても何も起きないのでロジックを実装していきます。 ToDoForm.tsx ```typescript import { useState } from "react"; import { FormButton, FormField, FormFieldWrapper } from "./theme"; import { Plus } from "./theme/Plus"; import { useMUD } from "./MUDContext"; export function ToDoForm() { const [newToDo, setNewToDo] = useState(""); const { systemCalls: { addToDo }, } = useMUD(); return ( { setNewToDo(e.target.value); }} /> { addToDo(newToDo); setNewToDo(""); }} > ); } ``` 状態を確認するためにフロントに表示します。 ```typescript import React from "react"; import "./index.css"; import { AppContainer, Container, Card, HeaderDiv, Subtitle, Title, Footer, TextLink, } from "./theme"; import { ToDoForm } from "./ToDoForm"; import { useMUD } from "./MUDContext"; import { useEntityQuery } from "@latticexyz/react"; import { Has } from "@latticexyz/recs"; export const App = () => { const { components: { ToDo }, } = useMUD(); const toDoIds = useEntityQuery([Has(ToDo)]); return ( MUD x React Workshop Creating a todo list using MUD {toDoIds}
MUD docs
); }; ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fee7ed44fee60b8214bfd9d8459747b944f831a9d-1202x716.png%3Fw%3D1202%26auto%3Dformat&w=3840&q=75) id 0x01が表示されました。idからbodyに入れたstringのデータを取得して表示させます。 ```typescript {[...toDoIds].map((id) => { const toDoData = getComponentValueStrict(ToDo, id); return ; })} ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6592b8bf6a401259900bb47fb8dbd3963cea1729-1152x468.png%3Fw%3D1152%26auto%3Dformat&w=3840&q=75) ここまででaddToDoは完成です。次にチェックボックスを入れたらToDoをDoneにする必要があります。またSolidityから編集していきます。 ```javascript // SPDX-License-Identifier: MIT pragma solidity >=0.8.0; import { System } from "@latticexyz/world/src/System.sol"; import { addressToEntity } from "../Utils.sol"; import { getUniqueEntity } from "@latticexyz/world/src/modules/uniqueentity/getUniqueEntity.sol"; import { ToDo, ToDoData } from "../codegen/Tables.sol"; contract ToDoSystem is System { function addToDo(string memory body) public { bytes32 id = getUniqueEntity(); ToDo.set(id, ToDoData({body: body, done: false})); } function toggleDone(bytes32 toDoId) public { ToDo.setDone(toDoId, !ToDo.getDone(toDoId)); } } ``` 保存するとコントラクトが自動デプロイされフロントエンドは新しいコントラクトに接続されています(既存のToDoは無くなって見えます)。新しいworldに切り替わったので、古いworldに戻したければ戻すこともできるみたいです。 createSystemCalls.ts ```typescript const toggleDone = (id: string) => { worldSend("toggleDone", [entityToBytes32(id)]); }; ``` ToDoItem.tsx ```typescript export function ToDoItem({ id, body, done }: Props) { const { systemCalls: { toggleDone }, } = useMUD(); return ( {body} { toggleDone(id); }} /> ); } ``` ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fba2c3fd5d13c87f3a4c5d76eb283cd9f8c98aefe-1204x556.png%3Fw%3D1204%26auto%3Dformat&w=3840&q=75) TodoをDoneにすることができました。 次にチームでToDoを管理することを念頭に、TodoにOwnerをつけていきます。 ```javascript function addToDo(string memory body) public { bytes32 id = getUniqueEntity(); bytes32 owner = addressToEntity(_msgSender()); ToDo.set(id, ToDoData({body: body, done: false, owner: owner})); } ``` MUDではmsg.sender()ではなく\_msgSender()を使う必要があります。 ここで少しエラーが出てしまって今回のチュートリアルはここまでとなりました。。。 ただ全体的な流れと基本的な操作はつかめたと思います。 ### まとめ これでゲーム全体を作るのはなかなか根気のいる作業だなという所感ですが、Autonomous Worldを作るにあたってMUDは欠かせないツールだなと思いました。今後の開発体験の向上に期待です。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Web3 Wallets and Firebase [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) # まいにちDapps\#5 web3ウォレットとFirebaseAuthとを繋げる [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) [ponta](https://www.pontech.dev/author/ponta) August 01, 2023· 3 min read ![まいにちDapps#5 web3ウォレットとFirebaseAuthとを繋げる](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb5d55c35b28281ce9fab49ef537536f4a1bbe83e-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75) まいにちDappsの5日目は3日目で作成したサービス内ウォレットをより実用的なDappsとして開発するために、Firebase Authと連携してFirestoreでデータ管理をしていきます。 これまで作成したDappsはいずれもweb3ログインをさせるだけでした。web3ログインで得られるデータはオンチェーンのものに限られます。これでも十分成り立つDappsの要件はありますが、ユーザーごとにプライベートなデータ管理が必要だったりオフチェーンのほうが効率が良いケースがあります。その際は従来のオフチェーンのデータベース(クラウド)を利用したデータ管理とAuthでの権限管理をする必要があります。 ### Thirdweb × Firebase Auth [https://portal.thirdweb.com/auth/integrations/firebase](https://portal.thirdweb.com/auth/integrations/firebase) の記事を元に進めていきます。 Firebaseで新しいプロジェクトを作ります。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa3b8e6cc61412f068a650982f898b07de2f5b9e0-2940x1618.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) プロジェクトの設定>サービスアカウントから新しいキーを生成します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Ff6354629ca97ee61ca227f057caf0b591b333aca-2144x1158.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) `npx thirdweb create app --template firebase-auth ` でテンプレートから作成しちゃいます。中でやっていることは参考元の記事に書いてある通り、npm moduleのインストールやfirebase initの設定、状態管理の設定などです。 `.env.local ` ファイルを作成して上記firebaseの情報を環境変数に設定します。 firebaseのコンソールからAuthenticationを開始します。 `yarn dev` でlocalhostを立ち上げます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fbb2d717bc8c11eb9d654fda4654879fc216f6565-1932x910.png%3Fw%3D1932%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc840c387aaeeeaf656134dffe168f52601252b6e-1824x1128.png%3Fw%3D1824%26auto%3Dformat&w=3840&q=75) connect walletをしてさらにSign inをするとログイン状態が確認できます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F08c1015be7f5cd626185d35d94054345768d5007-2062x1114.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa727cfef2d0378c02ff4be3f48fe63cdceea2447-2174x694.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) なお、firestoreを開始してルールを以下に設定すると、ユーザーのデータは誰からも閲覧できるがユーザー本人しか編集できない、というルールを追加することができます。 ```bash rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // The wildcard expression {userId} makes the userId variable available in rules. match /users/{userId} { // Only allow users to update their own documents. allow create, update, delete: if request.auth != null && request.auth.uid == userId; // But anybody can read their profile. allow read; } } } ``` ### Web3Auth × FIrebase Auth [まいにちDapps#3](https://www.pontech.dev/post/dapps-everyday-3) で取り上げたWeb3Authも同様の連携が可能です。 こちらの記事を元に進めていきます。 [https://web3auth.io/docs/content-hub/guides/firebase#interacting-with-blockchain](https://web3auth.io/docs/content-hub/guides/firebase#interacting-with-blockchain) Firebaseのプロジェクトを作成してAuthenticationのmethodのgoogleログインを有効にしておきます。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fbf6b415f74a9258cd971a44b486ea11bbf556499-1552x690.png%3Fw%3D1552%26auto%3Dformat&w=3840&q=75) [web3Authのダッシュボード](https://dashboard.web3auth.io/home/overview) からplug and playでプロジェクトを作成します。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb10b211662a0d961bca48c3159cf7ffe082e5054-2240x1420.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ReactのプロジェクトをWeb3Authのテンプレートから作成します。 `npx degit Web3Auth/web3auth-pnp-examples/web-no-modal-sdk/custom-authentication/firebase-react-no-modal-example w3a-firebase-demo && cd w3a-firebase-demo && npm install && npm run start` firebaseのinit情報とWeb3AuthのClient IDを適切な場所に置くと出来上がりです。 ![Image](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F1a25808ca504d51db15f42441995e3748e583326-2066x1052.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75) ### まとめ 以上今回は2つの実装方法をご紹介しました。 ウォレット接続だけであればsdkを使ってすぐできますが、Firebase Authのようなweb2のAuthシステムとの連携は一手間必要なのでDapps開発エンジニアであれば押さえておきたいところです。 弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談は [こちらのフォーム](https://www.pontech.dev/contact) からお願いいたします。 また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください! [← View all posts](https://www.pontech.dev/blog) [![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/author/ponta) ### About ponta 2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。 Copyright © 2025Pontech.Inc SystemDarkLight ## Tech Articles [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fb1bbd1b50354af24617256719172ed89548d8bdf-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-ai-agent) [技術記事](https://www.pontech.dev/category/tech) ## [Crypto AI AgentとzkTLSを活用したユースケースと未来展望](https://www.pontech.dev/post/zktls-ai-agent) [「Crypto×AI Agent」の注目が高まる2024年末〜2025年に向け、幻滅期に見える今だからこそ本質的な開発が加速中。本記事では一般的なAI Agentとの違いや、zkTLSとの融合による可能性、具体的なユースケースと展望を詳しく解説します。Pontechが取り組む最新事例も必見です。](https://www.pontech.dev/post/zktls-ai-agent) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •January 14, 2025 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe3ba3ff384af116b65443f3c94159c26ba141626-2940x1592.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-app-dev-zkpass) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSプロトコルを使用したアプリケーション開発【zkPass編】](https://www.pontech.dev/post/zktls-app-dev-zkpass) [zkPassを用いたDapps開発の手順について解説](https://www.pontech.dev/post/zktls-app-dev-zkpass) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •December 03, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F2b7775a6230d49c4541af3c86f59c8d61d113027-1200x675.png%3Fw%3D1200%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-app-dev-reclaim-protocol) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSプロトコルを使用したアプリケーション開発【Reclaim Protocol編】](https://www.pontech.dev/post/zktls-app-dev-reclaim-protocol) [Reclaim Protocolを用いたDapps開発の手順について解説](https://www.pontech.dev/post/zktls-app-dev-reclaim-protocol) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •December 02, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F5dca715352fe54eca72a3aabb9b759fd972be647-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls-current-position) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSの現在地と実用化に向けた課題](https://www.pontech.dev/post/zktls-current-position) [本記事では、ユーザーのデータ主権を取り戻す革新的な技術zkTLSについて、技術的制約、UX改善の必要性、法的課題の3つの観点から深掘りします。Web3やプライバシー保護の未来に向けた最新の取り組みをぜひご覧ください。](https://www.pontech.dev/post/zktls-current-position) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •November 28, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F408aeb0783c5f805691b0a5fcd42fe4def1a4577-1792x1024.webp%3Fw%3D1792%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/think-about-zktls) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLSについての考察と期待する理由](https://www.pontech.dev/post/think-about-zktls) [TLS通信とゼロ知識証明を組み合わせたzkTLSが、Web2とWeb3をつなぐ革新的な技術として注目されています。現状の課題、ユースケース、採用の可能性を通じて、zkTLSがどのように新しい価値を創出するかを探ります。](https://www.pontech.dev/post/think-about-zktls) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •November 28, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F09f9e3ed1714e930967d419a88231d3c2b5b1cb4-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/zktls) [技術記事](https://www.pontech.dev/category/tech) ## [zkTLS技術の解説とETH Tokyoハッカソン参加レポート](https://www.pontech.dev/post/zktls) [ETH Tokyoハッカソンで受賞したzkCreditプロジェクトを解説。zkTLSとzkMLを組み合わせ、Web2とWeb3をつなぐ革新的な信用スコアシステムの可能性を探ります。DeFiやゲーム業界での応用例も紹介。](https://www.pontech.dev/post/zktls) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •September 02, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9d74d599a3ac1fbed90e6a08cad954a9d1d0157a-2786x1508.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/nft-minting-solution) [技術記事](https://www.pontech.dev/category/tech) ## [マーケットプレイス・国内向け発行ソリューションを利用したNFTの発行方法](https://www.pontech.dev/post/nft-minting-solution) [NFT(Non-Fungible Token)は、ブロックチェーン上で構築できる代替不可能なトークンです。\\ 本記事では、NFTマーケットプレイスと呼ばれるNFTの作成、出品、購入を行えるプラットフォームや、NFT発行に特化したアプリケーションを比較しながら、誰でも手軽にNFTを発行できる方法を紹介します!](https://www.pontech.dev/post/nft-minting-solution) ![Matzo](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa1180731f9bb31b8725afa4543fa058a3675cea1-876x744.png%3Fw%3D876%26auto%3Dformat&w=3840&q=75) Matzo •May 13, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b4f01fa09ecf7b5062c5ffe265cf7cef831fd92-2560x1600.png%3Frect%3D0%2C68%2C2560%2C1464%26w%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/nft-api) [技術記事](https://www.pontech.dev/category/tech) ## [Dapps開発におけるNFT APIの選択肢まとめ・比較](https://www.pontech.dev/post/nft-api) [NFTを活用したDappsの開発において、適切なNFT APIの選択は非常に重要です。本記事では、NFTミントサイト、マーケットプレイス、ウォレットなど、さまざまなDappsに適したNFT APIの機能を比較し、開発者が最適なAPIを選べるよう、APIの選び方のヒントをまとめます。](https://www.pontech.dev/post/nft-api) ![mizuno](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F812300fd2e4f4f99d805ed62b76d19e372b23c6f-3024x4032.jpg%3Frect%3D0%2C0%2C1709%2C2677%26w%3D2000%26auto%3Dformat&w=3840&q=75) mizuno •April 30, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fadbd52e27526bf3bfe1a9bdd85e38fa9b5a38de9-2940x1654.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/rollup-sdk-rollup-as-a-service) [技術記事](https://www.pontech.dev/category/tech) ## [Rollup SDKとRollup as a Serviceの比較・まとめ](https://www.pontech.dev/post/rollup-sdk-rollup-as-a-service) [あなたの企業やプロジェクトが独自のLayer2を開発する場合、どのような選択肢があるのでしょうか?この記事ではRollup SDKとRollup as a Serviceを比較してまとめてみます。](https://www.pontech.dev/post/rollup-sdk-rollup-as-a-service) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •April 24, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F97dba32d131fb408c75ea0b0cd61fcb6ee67611f-2940x1652.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/node-as-a-service) [技術記事](https://www.pontech.dev/category/tech) ## [Dapps開発におけるNode as a Serviceの比較・まとめ](https://www.pontech.dev/post/node-as-a-service) [独自のノードをセットアップするのは時間とコストがかかるため、2の選択肢を採ることが一般的です。このサードパーティによって提供されるノードとの通信ができるAPIをJSON RPC APIと言ったりします。またこのサービスのことをノード運用サービスやNode as a Serviceと呼びます。](https://www.pontech.dev/post/node-as-a-service) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •April 11, 2024 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fce4b185bf3c8d091622b19dfe4a61b4e983937dd-1920x1080.png%3Fw%3D1920%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/wallet-adaptors) [技術記事](https://www.pontech.dev/category/tech) ## [Dapps開発におけるウォレット接続の選択肢まとめ・比較](https://www.pontech.dev/post/wallet-adaptors) [Dapps開発におけるさまざまなウォレット接続のための開発ツールを比較し、各ツールの特徴、長所、短所を検討することで、開発者やプロジェクトマネージャーがプロジェクトの要件に最も適したウォレット接続方法を選択できるように情報を提供します。](https://www.pontech.dev/post/wallet-adaptors) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •April 03, 2024 Copyright © 2025Pontech.Inc SystemDarkLight ## NFT Creation Tools [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F585845a20f52c2f06b6d015953a6da608601a232-1600x900.png%3Fw%3D1600%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/dapps-everyday-8) [まいにちDapps](https://www.pontech.dev/category/dapps-everyday) [NFT](https://www.pontech.dev/category/nft) ## [まいにちDapps\#8 Manifoldの開発者向け機能で何ができるのか](https://www.pontech.dev/post/dapps-everyday-8) [クリエイター向けのNFT発行ツールとして人気のManifoldで提供されているDeveloper向けの機能を俯瞰して、どんなアプリケーションが作れるのか考察します。](https://www.pontech.dev/post/dapps-everyday-8) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •August 04, 2023 [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F110a170c7aaf60af6bf2576cf4f9cbf2573deea9-2880x1584.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/thirdweb-simple) [thirdweb](https://www.pontech.dev/category/thirdweb) [NFT](https://www.pontech.dev/category/nft) ## [ThirdwebでNFTを発行する一番シンプルな方法【初級者・非エンジニア向け】](https://www.pontech.dev/post/thirdweb-simple) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •December 14, 2022 Copyright © 2025Pontech.Inc SystemDarkLight ## NFT API Choices [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F6b4f01fa09ecf7b5062c5ffe265cf7cef831fd92-2560x1600.png%3Frect%3D0%2C68%2C2560%2C1464%26w%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/nft-api) [技術記事](https://www.pontech.dev/category/tech) ## [Dapps開発におけるNFT APIの選択肢まとめ・比較](https://www.pontech.dev/post/nft-api) [NFTを活用したDappsの開発において、適切なNFT APIの選択は非常に重要です。本記事では、NFTミントサイト、マーケットプレイス、ウォレットなど、さまざまなDappsに適したNFT APIの機能を比較し、開発者が最適なAPIを選べるよう、APIの選び方のヒントをまとめます。](https://www.pontech.dev/post/nft-api) ![mizuno](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F812300fd2e4f4f99d805ed62b76d19e372b23c6f-3024x4032.jpg%3Frect%3D0%2C0%2C1709%2C2677%26w%3D2000%26auto%3Dformat&w=3840&q=75) mizuno •April 30, 2024 Copyright © 2025Pontech.Inc SystemDarkLight ## NFT Minting Guide [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F9d74d599a3ac1fbed90e6a08cad954a9d1d0157a-2786x1508.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/nft-minting-solution) [技術記事](https://www.pontech.dev/category/tech) ## [マーケットプレイス・国内向け発行ソリューションを利用したNFTの発行方法](https://www.pontech.dev/post/nft-minting-solution) [NFT(Non-Fungible Token)は、ブロックチェーン上で構築できる代替不可能なトークンです。\\ 本記事では、NFTマーケットプレイスと呼ばれるNFTの作成、出品、購入を行えるプラットフォームや、NFT発行に特化したアプリケーションを比較しながら、誰でも手軽にNFTを発行できる方法を紹介します!](https://www.pontech.dev/post/nft-minting-solution) ![Matzo](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fa1180731f9bb31b8725afa4543fa058a3675cea1-876x744.png%3Fw%3D876%26auto%3Dformat&w=3840&q=75) Matzo •May 13, 2024 Copyright © 2025Pontech.Inc SystemDarkLight ## Pontech Company News [![Thumbnail](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fcc713c7c43cfbc575734186c4c6727dab4295ea5-812x476.png%3Fw%3D812%26auto%3Dformat&w=3840&q=75)](https://www.pontech.dev/post/established-company) [Company](https://www.pontech.dev/category/company) ## [株式会社Pontechを創業しました!](https://www.pontech.dev/post/established-company) ![ponta](https://www.pontech.dev/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fd8606e7e7a53cb4c0afde16781c0ac1dafb2056b-934x934.png%3Fw%3D934%26auto%3Dformat&w=3840&q=75) ponta •January 15, 2023 Copyright © 2025Pontech.Inc SystemDarkLight