A New Standard for Self-Custody
セルフカストディの
新しい基準
今日から Coconut で
ビットコインのセルフカストディを始めましょう


Coconut が特別な理由
署名デバイスと閲覧専用ウォレットを
完全に分離
セキュリティも使いやすさも、どちらも諦めていません。意図的に署名デバイスCoconut Vaultと閲覧専用ウォレットCoconut Walletに分け、ビットコインを可能な限り安全に管理します。

Coconut Vault
署名デバイス
専用端末にインストールし、完全オフラインで使用します。外部と接続した瞬間、利用は停止します。

Coconut Wallet
閲覧専用ウォレット
普段使いのスマートフォンにインストールします。ビットコインノードから情報をリアルタイムで取得します。
トランザクションを送る
世界でいちばん簡単な
送金フロー

STEP 1
Wallet でトランザクションを作成

STEP 2
Vault でスキャン

STEP 3
Vault で署名

STEP 4
署名済みデータを Wallet にスキャン

STEP 5
ネットワークにブロードキャスト
練習用アプリ
十分に練習してから
始めましょう
Coconut の練習用アプリは、ビットコインのセルフカストディを初めて始める方のために作られました。
実践で押さえるべき概念を分かりやすく素早く学び、漠然とした不安を減らし、 知識不足やミスで大切なビットコインを失わないようサポートします。
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(),
),
);
}
}

DON'T TRUST, VERIFY
オープンソース、
それ自体が
信頼の土台
ビットコインウォレットは必ずオープンソースであるべきだと信じています。 盲目的な信頼を強いることはしません。 代わりに、ご自身の目でコードを確認し、検証してください。
ビットコインのセルフカストディについて
ダウンロード
Not your keys,
Not your bitcoin
今すぐセルフカストディを始めましょう!
coconut.onl の .onl は、韓国語の「오늘(オヌル)=今日」の響きを意識したドメインです。 公式サイトは coconut.onl です。
公式配信は App Store と Google Play のみです。