MIZUHIKI Verified(本人認証済み)ソウルバウンドトークンのミント
MIZUHIKI Verified(本人認証済み)ソウルバウンドトークンは、KYC 審査結果のオンチェーン証明であり、認証済みユーザーの EVM アドレスに紐付けることができます。これにより、個人情報やオンチェーン上での紐付けを公開することなく、KYC 済み EVM アドレスを実現します。
MIZUHIKI Verified(本人認証済み)ソウルバウンドトークンは ERC-5484 規格に準拠しています。
SBT は、MIZUHIKI コンプライアンス・スイートを通じて KYC を完了したユーザーに対して、MIZUHIKI アイデンティティ SDK 経由でのみミントできます。事前にユーザーを認証するガイドの KYC 統合手順を完了していることをご確認ください。
MIZUHIKI Verified(本人認証済み)ソウルバウンドトークンの発行を統合する
ユーザーのアイデンティティが確認されたら、ユーザーの EVM アドレスに MIZUHIKI Verified(本人認証済み)ソウルバウンドトークン(SBT)を発行できます。
ユーザーには、EIP-4361 署名済みメッセージの形式でウォレット管理の証明を提供していただく必要があります。SBT を発行するには、以下の手順に従ってください:
- ユーザーが署名するノンスとメッセージ内容を取得する
- ユーザーのウォレットから署名済み EIP-4361 メッセージを取得する
- ユーザーのウォレットアドレス、メッセージ(
\x19Ethereum Signed Message:プレフィックスなし)、ノンス、署名を MIZUHIKI アイデンティティ SDK に送信する
1. ユーザーが署名するノンスとメッセージ内容を取得する
返される SIWE フィールドは EIP-4361 メッセージフィールドに対応しています。
- iOS
- Android
// After successful KYC verification, request the SIWE message fields
//
// SIWEMessage type in the MIZUHIKI Identity SDK
//
// public struct SIWEMessage: Codable, Sendable, Equatable {
// public let statement: String
// public let domain: String
// public let uri: String
// public let chainId: Int
// public let nonce: String
// public let issuedAt: String // "2025-12-01T21:34:56.789+09:00",
// public let expirationTime: String // 2025-12-01T22:04:56.789+09:00"
// }
do {
let siweMessage = try await appEnv.mizuhiki.generateSIWEMessage()
} catch {
print("❌ Failed to get SIWE message fields: \(error.localizedDescription)")
}
// After successful KYC verification, request the SIWE message fields
//
// SIWEMessage type in the MIZUHIKI Identity SDK
//
// data class SIWEMessage(
// val statement: String,
// val domain: String,
// val uri: String,
// val chainId: Int,
// val nonce: String,
// val issuedAt: String, // "2025-12-01T21:34:56.789+09:00"
// val expirationTime: String, // "2025-12-01T22:04:56.789+09:00"
// )
try {
val siweMessage = client.generateSIWEMessage()
} catch (e: Exception) {
println("❌ Failed to get SIWE message fields: ${e.message}")
}
2. ユーザーのウォレットから署名済み EIP-4361 メッセージを取得する
お好みのウォレット統合を使用して、ユーザーに構築した SIWE メッセージへの署名を求めてください。
WalletConnect(現 Reown)を使用する場合は、こちらのドキュメントを参照してください。
3. MIZUHIKI サーバーに署名を送信する
パラメーター
| パラメーター | 型 | 必須 | 説明 | 例 |
|---|---|---|---|---|
address | String | はい | EVM 互換ウォレットアドレス | "0x742...9a5c61" |
nonce | String | はい | リプレイ攻撃を防ぐためにメッセージに含まれる使い捨てノンス | gLMlRC...rMEYPw |
message | String | はい | EIP-191 プレフィックスなしの元のメッセージ | "I agree to a soulbound token (SBT) being issued to my account ..." |
signature | String | はい | メッセージのウォレット署名 | "0x1c5e...a4b2" |
walletAppName | String | 任意 | 署名に使用したウォレットアプリ名 | "MetaMask", "WalletConnect" |
- iOS
- Android
// After successful KYC verification, bind the user's EVM address
do {
let result = try await appEnv.mizuhiki.addAddress(
address: ethereumAddress, // User's wallet address
message: originalMessage, // SIWE message constructed in step 2 without EIP-191 prefix
nonce: nonce, // Nonce from step 1
signature: walletSignature, // Signature from user's wallet
walletAppName: "MetaMask" // Optional: wallet app identifier
)
// Handle successful SBT issuance
print("✅ SBT successfully issued to address: \(ethereumAddress)")
} catch {
print("❌ Failed to issue SBT: \(error.localizedDescription)")
}
// After successful KYC verification, bind the user's EVM address
try {
val result = client.addAddress(
address = ethereumAddress, // User's wallet address
message = originalMessage, // SIWE message constructed in step 2 without EIP-191 prefix
nonce = nonce, // Nonce from step 1
signature = walletSignature, // Signature from user's wallet
walletAppName = "MetaMask" // Optional: wallet app identifier
)
// Handle successful SBT issuance
println("✅ SBT successfully issued to address: $ethereumAddress")
} catch (e: Exception) {
println("❌ Failed to issue SBT: ${e.message}")
}
トラブルシューティング
よくある問題と解決策
問題:リクエストのバリデーションに失敗した
- 症状:
addAddress()がリクエストバリデーションエラーをスローする - 原因と解決策:
原因 解決策 署名フォーマットが無効 署名が 0xで始まる有効な16進数文字列であることを確認してくださいアドレスフォーマットが無効 アドレスが有効な EVM 互換フォーマット 0x...であることを確認してください
問題:署名の検証に失敗した
- 症状:
addAddress()が署名検証エラーをスローする - 原因と解決策:
原因 解決策 EIP-191 プレフィックスが含まれている MIZUHIKI サーバーに送信するメッセージから \x19Ethereum Signed Message:プレフィックスを削除してください誤ったメッセージに署名した MIZUHIKI サーバーが提供するフィールドを使用して、正しくフォーマットされた EIP-4361 メッセージに署名されていることを確認してください 署名フォーマットが無効 署名が 0xで始まる有効な16進数文字列であることを確認してください
サポートが必要な場合
上記で解決できない問題が発生した場合:
- SDK バージョンを確認: 最新の SDK バージョンを使用していることを確認してください
- サポートへ連絡: 以下の情報を添えて [email protected] にメールしてください:
- SDK バージョンとプラットフォーム(iOS/Android)
- 環境(モック/本番)
- 完全なエラーメッセージとスタックトレース
- 最小限の再現コードの例