御朱印インボイスNFT — スマートコントラクト
参拝記録をブロックチェーン上に永久保存するERC-721スマートコントラクト。 天気・時間帯・おみくじ・奉納金額などの参拝データを完全オンチェーンで管理。
goshuin-ar-hounouの奉納決済システムと連携するNFTコントラクト。参拝証明をインボイス(領収書)として機能するNFTとして発行する。
| 普通の領収書 | インボイスNFT |
|---|---|
| 紙やPDFで発行 | ブロックチェーンに永久記録 |
| 改ざん可能 | 改ざん不可能 |
| 発行者が潰れると消える | 永久に残る |
| 再発行できない | 世界中から確認できる |
struct HounouRecord {
string shrine; // 神社名
string date; // 参拝日時(和暦)
string weather; // 天気(clear / rain / snow)
string timeOfDay; // 時間帯(morning / midday / evening / night)
string blessing; // おみくじ(心願成就・大吉福徳など)
string lang; // 言語(ja / en)
uint256 amount; // 奉納金額(円)
uint256 timestamp; // ブロックタイムスタンプ
}NFTのメタデータはIPFSの静的ファイルではなく、APIで動的生成:
tokenURI → https://goshuin-ar-hounou.vercel.app/api/metadata?tokenId=N
↓
コントラクトから参拝記録を読み取り
↓
{
"name": "御朱印インボイスNFT #42 — 黄昏時の雨天 — 厄除開運",
"description": "令和7年3月21日、黄昏時に飛梅天満宮を参拝。",
"image": "ipfs://...",
"attributes": [...]
}
| 日付 | NFT名称 | 画像 |
|---|---|---|
| 1月1日〜3日 | 新春大吉 | 疾風迅雷(金色) |
| 毎月25日 | 天神縁日 | 疾風迅雷 |
| 毎月1日 | 朔日奉拝 | 疾風迅雷 |
| 晴れの日 | 疾風迅雷 | 疾風迅雷 |
| 雨の日 | 雲外蒼天 | 雲外蒼天 |
| 雪の日 | 不撓不屈 | 不撓不屈 |
| 称号 | CID | 意味 |
|---|---|---|
| 疾風迅雷 | bafybeigbxuy... | 晴れ・力強い参拝 |
| 雲外蒼天 | bafybeihljyb... | 雨・希望の参拝 |
| 不撓不屈 | bafybeiebgib... | 雪・不屈の参拝 |
| 項目 | 値 |
|---|---|
| コントラクト名 | GoshuinInvoiceNFT |
| シンボル | GOIN |
| Sepoliaアドレス | 0x3A637bD5a5Ff49667Ff279BDa263c9118e7b2a03 |
| オーナー | 0x0a4a4F7F8D69Af17F8Dc69cadeBc5eD1B2e90716(goshuin-dev) |
| 本番予定チェーン | Polygon zkEVM |
Node.js: 22.x
Hardhat: 2.22.0
OpenZeppelin: 4.9.6(5系はHardhat 2と非互換)
Solidity: 0.8.28(evmVersion: cancun)
npm install
cp .env.example .env
# .envにSEPOLIA_RPC_URLとPRIVATE_KEYを設定npx hardhat compile# ターミナル1
npx hardhat node
# ターミナル2
npx hardhat run scripts/deploy.js --network localhost
npx hardhat run scripts/mint.js --network localhostnpx hardhat run scripts/deploy.js --network sepolia
npx hardhat run scripts/mint.js --network sepolianpx hardhat run scripts/deploy.js --network polygonZkEVM| スクリプト | 説明 |
|---|---|
| scripts/deploy.js | コントラクトをデプロイ |
| scripts/mint.js | テスト用NFTを3枚ミント |
| scripts/transfer-ownership.js | オーナー権限を移譲 |
| scripts/metadata/ | テスト用メタデータJSON |
5系(最新)はmcopyオペコードを使用
→ Hardhat 2のparis EVMと非互換
→ 必ず@4.9.6を指定すること
npm install @openzeppelin/contracts@4.9.6
// ERC721 + ERC721URIStorageの多重継承で必須
function _burn(uint256 tokenId)
internal override(ERC721, ERC721URIStorage) {
super._burn(tokenId);
}本番ウォレット(MO_world)→ 資産保管
goshuin-dev → NFTミント専用(最小限のETHのみ)
# 1. hardhat.config.jsにpolygonZkEVMネットワーク追加済み
# 2. .envにPOLYGON_ZKEVM_RPC_URLを設定済み
# 3. Polygon Bridgeでブリッジ(約0.005 ETH)
# 4. デプロイ
npx hardhat run scripts/deploy.js --network polygonZkEVM
# 5. Vercelの環境変数を更新
# - SEPOLIA_RPC_URL → POLYGON_ZKEVM_RPC_URL
# - 各APIのCONTRACT_ADDRESSを新しいアドレスに変更- goshuin-ar-hounou — ARアプリ・奉納決済システム
- ar-goshuin-demo — ベースARアプリ(公開中)
MAGATOKI Laboratory