Coconut Vault

ネットワークをオフにすれば、
スマホがビットコイン金庫になる

複雑で高価なハードウェアウォレット不要。
オフラインで安全にビットコインをセルフカストディ。

Coconut Walletを見る

ハードウェアウォレット級のデバイス
—耐久性と使いやすさを両立

ハードウェアレベルの保護
ハードウェアグレードの保護を基盤とした強固なセキュリティ。
セキュアスタートアップ
Vaultを使うにはアプリの再起動が必要です。
シークレット消去
痕跡を残さず秘密データを安全に消去します。
フェイルセーフリセット
解錠失敗時は待機時間が延長され、 試行回数を使い切るとアプリがリセットされます。
署名専用モード
必要なときだけシークレットを入力し、 デバイスを署名専用として使えます。
プライバシーモード
ビットコイン保有者であることを隠せます。
多層防御
複数の防御層が署名と保管をエンドツーエンドで保護します。

スマートフォンがハードウェアウォレット—
安全なの?

真のエアギャップはあらゆるデジタルの入口を塞ぎます。良い習慣を身につければ、専用ハードウェアウォレットと同等の物理的分離とセキュリティを実現できます。

Vaultをさらに安全に使う

Coconut Vaultは完全オフライン動作に設計されていますが、あなたの習慣と設定もセキュリティの一部です。これらの原則に従って、一般的なハードウェアウォレットを超えるセキュリティを実現してください。

ルール 01
Vault専用のデバイスを使用する

Vaultはオフライン署名デバイスとして設計されています。 他のアプリのインストールやWi-Fi/Bluetoothの切り替えは新たな攻撃ベクターを生む可能性があります。デバイスをオンラインにすることなく、オフラインのトランザクション署名のみに使用してください。 これだけでほとんどのリモート攻撃を防げます。

ルール 02
初回使用前に工場出荷状態にリセット

スマートフォンをVaultにする前に工場出荷状態にリセットしてください。 残存するアプリ、ログ、キャッシュを完全に削除します。 これにより意図しないバックドアやマルウェアの痕跡が消去され、信頼できる基盤が確立されます。

ルール 03
短いPINよりパスフレーズを推奨

4〜6桁のPINは署名デバイスには弱い場合があります。 複合パスフレーズはデバイスが物理的に奪われた場合のブルートフォースに対してはるかに強力です。 可能であれば8文字以上の強力な文字列を使用してください。

ルール 04
使用後は電源を切る

使用しないときは完全に電源を切ってください。 電源オフ時はメモリとストレージにアクセスできず、ファームウェアレベルの攻撃さえ大幅に困難になります。 この習慣だけで多くの物理的・ファームウェアの脅威を防げます。

Coconut Vaultユーザーの声

No matter how much Bitcoin you have, self-custody is a must. Don't be afraid—start with Coconut Vault. The Coconut team will guide you through every step. Bitcoin is the only asset you can truly control. Self-custody is the final step. If you're unsure, the Coconut team handles everything. Even people in their 70s find it a breeze.

X(Twitter)で見る →

改めて思いますね、Coconut最高すぎるw ハードウェアウォレット使ったことない方は是非Coconutから取り組んでみてください。課金は必要ですがその価値は大いにあります。

X(Twitter)で見る →

Tried making a transaction with Coconut Vault Very intuitive and user-friendly (feels very secure when used with internet and Bluetooth off) Even beginners (spouse, kids) can make transactions easily with a bit of patience

X(Twitter)で見る →
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } }
Coconut App
DON'T TRUST, VERIFY

オープンソース、
それ自体が
信頼の土台

ビットコインウォレットは必ずオープンソースであるべきだと信じています。 盲目的な信頼を強いることはしません。 代わりに、ご自身の目でコードを確認し、検証してください。

Not your keys,
Not your bitcoin

今すぐセルフカストディを始めましょう!

coconut.onl の .onl は、韓国語の「오늘(オヌル)=今日」の響きを意識したドメインです。 公式サイトは coconut.onl です。

公式配信は App Store と Google Play のみです。