A New Standard for Self-Custody

셀프 커스터디의
새로운 기준

오늘 바로 코코넛으로
비트코인 셀프 커스터디를 시작하세요

Coconut Vault
Coconut Wallet

서명 기기와 보기 전용 지갑의
완벽한 분리

보안성과 사용성, 둘 다 포기하지 않았습니다. 의도적으로 서명기코코넛 볼트와 보기 전용 지갑코코넛 월렛으로 나누어 비트코인을 가장 안전하게 관리합니다.

Coconut Vault
Coconut Vault

서명 기기

공기계에 설치해 완전한 오프라인 환경에서 사용합니다. 외부와 연결되는 즉시 사용이 중단됩니다.
Coconut Wallet
Coconut Wallet

보기 전용 지갑

평소 사용하는 휴대폰에 설치해 사용합니다. 비트코인 노드로부터 정보를 실시간으로 조회합니다.
트랜잭션 보내기

세상에서 가장 쉬운
트랜잭션 보내기

STEP 1
STEP 1
월렛에서 트랜잭션 만들기
STEP 2
STEP 2
볼트로 스캔하기
STEP 3
STEP 3
볼트에서 서명하기
STEP 4
STEP 4
월렛으로 서명된 정보 스캔하기
STEP 5
STEP 5
네트워크에 제출하기

충분히 연습 후
시작하세요

코코넛 학습용 앱은 비트코인 셀프 커스터디를 처음 시작하는 여러분을 위해 만들어졌습니다.

실습을 통해 반드시 알아야 할 개념을 쉽고 빠르게 익혀, 막연한 두려움을 없애고 무지와 실수로 인해 소중한 비트코인을 잃는 일이 없도록 도와드립니다.

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

오픈소스,
그 자체로
신뢰에 기반한

비트코인 지갑이라면 무조건 오픈소스여야 한다고 믿습니다. 저희를 맹목적으로 믿어달라고 강요하지 않겠습니다. 대신 직접 확인하고 검증해 주세요.

비트코인 셀프커스터디 알아보기

비트코인 셀프커스터디(셀커)란 무엇인가요?

비트코인 셀프커스터디(셀커)는 비트코인을 사용할 수 있는 개인키를 본인이 관리하는 방식입니다. 개인키와 복구 정보의 보관도 사용자의 책임입니다.

코코넛 월렛과 코코넛 볼트는 어떻게 다른가요?

코코넛 월렛은 잔액을 조회하고 트랜잭션을 만드는 보기 전용 비트코인 지갑입니다. 코코넛 볼트는 전용 공기계에서 오프라인으로 트랜잭션에 서명하는 앱입니다. 온라인 조회와 오프라인 서명을 분리해 사용합니다.

코코넛으로 비트코인 셀프커스터디를 어떻게 시작하나요?

먼저 공식 튜토리얼에서 기기 준비와 사용 방법을 확인하세요. 코코넛 월렛과 볼트는 이 페이지의 App Store 또는 Google Play 링크로 설치할 수 있습니다.

튜토리얼 →

Not your keys,
Not your bitcoin

지금 바로 셀프 커스터디 하세요!

App Store와 Google Play를 통해서만 공식 배포됩니다