個人開発でRWAトークンを発行し、供給量の過半数(5.5億枚)をプログラムでロックするまでの技術スタック
【Solana/RWA】個人開発で5.5億枚のトークンをスマートコントラクトで完全ロックするまでの技術的知見と、メタデータ更新の沼
こんにちは、Jon & Coo Inc. のTakahashiです。
現在、Solanaブロックチェーンを活用した観光RWA(Real World Assets)プロジェクト**「Matsuri DAO」**を開発・運営しています。

本日、プロジェクトの大きなマイルストーンとして、発行したトークン($MTC)の過半数にあたる**5.5億枚(Total Supplyの約61%)**を、スマートコントラクトを用いて2027年まで完全ロックしました。
この記事では、プロジェクトの宣伝……ではなく、そこに至るまでに直面した**「Solanaのメタデータ更新の沼(0x5eエラー)」や、「なぜArweave(Irys)で永続化する必要があったのか」**という、Solana開発者なら一度はハマるであろう技術的な知見を共有します。
Web3開発、特にSolanaでのトークン設計やRWAに興味がある方の参考になれば幸いです。
1. 作っているもの:Culture OS
技術的な話の前に、少しだけコンテキストを共有させてください。
私たちは、日本の観光資産(体験、ガイド、場所)をオンチェーン化し、トークンエコノミーで回す**「Culture OS」**という基盤を作っています。
昨今、Solanaといえば「ミームコイン」の爆発的な流行が目立ちますが、私たちが目指しているのは**「実需(観光)」と「DeFi」を接続するRWAの社会実験**です。
- 観光客: アプリを通じて日本の文化体験(神社仏閣、ローカルな食事など)にアクセスする
- トークン: その決済や、コミュニティへの貢献報酬として機能する
このエコシステムを、中央集権的なDBだけでなく、ブロックチェーン上で透明性高く回すための設計を行っています。
2. 技術的なハマりポイント:メタデータの検証エラーと分散型ストレージ
SPLトークン(Solanaのトークン規格)を発行した後、SolscanやPhantomウォレットなどでロゴやSNSリンクを正しく表示させるためには、Metaplex規格に準拠したメタデータを更新する必要があります。
しかし、ここで多くの開発者が遭遇する**「検証エラー(Instruction Error: 0x5e)」**に私も大いに苦しめられました。
問題:中央集権サーバーと署名の罠
当初、私はメタデータ(JSONファイル)と画像データを、自社で管理しているPaaS(Railway)上に置いて参照させていました。
// ダメだった例(自社サーバー参照)
{
"uri": "[https://backend-api.railway.app/metadata/token.json](https://backend-api.railway.app/metadata/token.json)"
}
これでも表示されるケースはあるのですが、以下の問題が発生しました。
-
署名の検証エラー(0x5e):
UpdateMetadataAccountV2などのインストラクションを送る際、クリエイターの検証フラグ(Verified)を立てようとすると、オンチェーン情報と参照先の一貫性が厳密に問われ、トランザクションが弾かれることがあります。 - 永続性の欠如: もしRailwayのサーバーが落ちたり、私たちがドメインの更新を忘れたりすれば、トークンのロゴは消え、ただの「Unknown Token」になってしまいます。これではRWAとしての信頼性がありません。
解決策:Arweave (Irys) への完全移行
「Web3なのだから、データもWeb3に置くべき」という基本に立ち返り、すべてのメタデータ(画像、JSON)をArweave上の分散型ストレージにアップロードし、URIを書き換える決断をしました。
アップロードには、Solana開発で標準的に使われるIrys (旧 Bundlr) を使用しています。
// 修正後のメタデータ(Arweave)
{
"name": "Matsuri Coin",
"symbol": "MTC",
"description": "Real-world utility for Japan tourism...",
"image": "[https://gateway.irys.xyz/Fn](https://gateway.irys.xyz/Fn)...", // Arweave上の不変な画像リンク
"external_url": "[https://www.matsuri-dao.com](https://www.matsuri-dao.com)",
"uri": "[https://gateway.irys.xyz/7F](https://gateway.irys.xyz/7F)...", // Arweave上の不変なJSONリンク
"sellerFeeBasisPoints": 0,
"creators": [
{
"address": "AzkRxt...", // デプロイヤーのアドレス
"verified": 1, // ここをTrueにするのが最重要
"share": 100
}
],
"extensions": {
"website": "[https://www.matsuri-dao.com](https://www.matsuri-dao.com)",
"twitter": "[https://x.com/matsuri_dao_jp](https://x.com/matsuri_dao_jp)"
}
}
Irysの採用メリット:
Arweaveへのアップロードは確実性が高く、一度書き込めば半永久的にデータが残ります。これにより「サーバーレスで永続的にデータが残るWeb3トークン」としてデプロイが完了しました。
3. なぜ5.5億枚もロックしたのか(Streamflow)

技術的には、発行したトークンを開発者のウォレット(Phantomなど)に入れておくだけでも「保有」はできます。
しかし、それでは外部(投資家やユーザー)から見て、**「開発者がいつでもDump(売り抜け)できる状態」**と区別がつきません。
「私たちは本気です」と口で言うのは簡単ですが、ブロックチェーンの世界では Code is Law です。コードで証明しなければ意味がありません。
そこで、Solana上の主要なストリーミング決済プロトコルであるStreamflowを採用し、トークンをコントラクトに預け入れました。
ロックの設計仕様
- プロトコル: Streamflow
- 対象枚数: 550,000,000 MTC(総供給の約61%)
- クリフ(完全ロック)期間: 2027年6月1日まで
- ベスティング(解放): その後、時間経過とともにリニア(直線的)に解放
これにより、**「秘密鍵を持っていても、物理的にトークンを動かせない状態」**を強制しました。
私がもし悪意を持って売り抜けようとしても、トランザクションはコントラクトによって拒否されます。これが「トラストレスな信頼の担保」です。
4. まとめと「設計図」
Web3×観光の実装は、まだベストプラクティスがない荒野です。
メタデータ一つとっても、サーバー依存にするか分散型にするかで「資産としての強度」が変わります。
だからこそ、エンジニアとして挑戦する価値があると感じています。
今回のトークノミクスの詳細や、私たちが構築しようとしているエコシステム(Culture OS)の全貌、そしてSolanaとRWAをどう接続するかというアーキテクチャについては、ホワイトペーパーとして公開しました。
技術的な構成やロードマップに興味がある方は、ぜひ覗いてみてください。
「観光×ブロックチェーン」で世界をどうハックしようとしているか、その設計図がすべて書いてあります。
今後も、ZennではSolana開発の技術的な知見(Rustでのコントラクト開発や、インデクサ周りの話など)を共有していければと思います。
👇 ホワイトペーパー(公式サイト)
👇 X (Twitter) / 開発の進捗発信
Discussion