Bitcoin Core Wallet
Bitcoin Wallet은 bitcoin-cli, bitcoin-qt 등의 클라이언트에서 생성하여 사용한다. (주: 비트코인 월렛은 Desktop Wallet, Mobile Wallet, Web Wallet, Hardware Wallet 등 여러 가지가 있으며, 여기서는 가장 기초적인 Bitcoin Core desktop wallet을 설명한다.)
bitcoind (혹은 bitcoin-qt)를 사용하여 Initial Block Download가 완료되면, Wallet을 생성하여 Transaction을 수행할 수 있다.
bitcoin-cli 에서 Wallet 사용
bitcoin-cli 에서 Wallet을 생성하기 위해서는 createwallet 명령을 사용한다. createwallet 명령의 첫번째 파라미터는 월렛명을 지정하는 것인데, bitcoind 가 로딩하는 디폴트 월렛은 "" 와 같이 공백인 월렛(unnamed wallet)이므로, 아래와 같이 디폴트 월렛을 만들 수 있다.
$ bitcoin-cli createwallet ""
단, 테스트용이 아닌 실제 월렛의 경우에는 암호(passphrase)를 넣어 월렛을 보호해 주어야 하는데, 이를 위해 4번째 파라미터(passphrase)에 암호를 넣어 월렛을 생성하게 된다.
$ bitcoin-cli createwallet "" false false "mypasswordhere"
월렛에 암호(passphrase)가 걸린 경우에는, 지갑을 사용하는 케이스 즉 트랜잭션을 일으키는 명령 이전에 월렛을 Unlock 해 주어야 하는데, 이를 위해 다음과 같은 명령을 사용한다. 아래 walletpassphrase 명령의 첫번째는 암호이고, 두번째 300은 300초 동안 Unlock 하는 것을 나타낸다.
$ bitcoin-cli walletpassphrase "mypasswordhere" 300
Multiple Wallets
월렛을 여러 개 만들기 위해서는 createwallet "월렛명" 명령을 사용하면 된다. 예를 들어, 아래는 디폴트 월렛(unnamed wallet)에 추가적으로 "test2"라는 새로운 월렛을 만들고(createwallet은 생성후 자동으로 웰렛을 로딩함), listwallets 명령으로 월렛 리스트를 출력해 본 것이다.
$ bitcoin-cli createwallet "test2" (createwallet은 생성후 자동으로 로딩함) $ bitcoin-cli listwallets [ "", "test2" ]
월렛은 bitcoind를 재시작하면 디폴트 월렛만 로딩하는데, 다른 월렛을 로딩하기 위해서는 아래와 같이 loadwallet 명령을 사용할 수 있다.
$ bitcoin-cli loadwallet "test2" (매뉴얼 로딩)
만약 bitcoind 시작시 어떤 월렛(들)을 항상 로딩하고 싶으면, bitcoin.conf 파일 안에 wallet={월렛명} 을 넣으면 된다. 아래는 디폴트 월렛(공백)과 test2 월렛을 자동 로딩하는 옵션이다.
# bitcoin.conf wallet= wallet=test2
월렛을 여러 개 만든 경우에는, bitcoin-cli 명령 사용시 -rpcwallet="월렛명" 아규먼트를 사용하여 어떤 월렛을 사용할 지를 지정해 주어야 한다.
$ bitcoin-cli -rpcwallet="" getnewaddress (디폴트 월렛 사용) tb1qpw53gpdznxn87m87ajsywg3552yxmytrzuudjc $ bitcoin-cli -rpcwallet=test2 getnewaddress (test2 월렛 사용) tb1q6ftwx75fgp6u4acufmaxkr6yqk7hh2uj8qud8d
Wallet 파일
Bitcoin의 각 OS별 데이타 폴더는 다음과 같다.
Windows: %APPDATA%\Bitcoin\ Linux: $HOME/.bitcoin/ Mac OSX: $HOME/Library/Application Support/Bitcoin/
이 메인 폴더 밑에 testnet의 경우 testnet3 폴더(-datadir 옵션으로 변경 가능)를 생성하고, regtest의 경우 regtest 폴더를 생성한다. 예를 들어, Linux의 경우 testnet은 ~/.bitcoin/testnet3 데이타 폴더를 가지며, regtest은 ~/.bitcoin/regtest 데이타 폴더를 가진다.
Bitcoin Core의 월렛은 Bitcoin 데이타 폴더 안의 wallet.dat 에 들어 있다. 리눅스에서 mainnet의 경우 ~/.bitcoin/wallet.dat 에 디폴트(unnamed) 월렛이 저장되고, testnet의 경우 ~/.bitcoin/testnet3/wallets/wallet.dat 에 unnamed 월렛이 저장되며, regtest의 경우 ~/.bitcoin/regtest/wallets/wallet.dat 에 unnamed 월렛 파일이 저장된다.
다시 말하면, 리눅스에서 Bitcoin을 testnet 모드로 사용하는 경우, testnet 데이타 폴더는 ~/.bitcoin/testnet3/ 이고, 그 월렛 폴더는 ~/.bitcoin/testnet3/wallets/ 이며, (디폴트) unnamed 월렛 데이타 파일은 ~/.bitcoin/testnet3/wallets/wallet.dat 에 있다.
만약 복수 개의 월렛을 만들었으면, 월렛 폴더 밑에 "월렛명"의 디렉토리를 만들고 그 안에 wallet.dat 파일을 생성한다. 예를 들어, mainnet에서 "main2" 라는 월렛을 새로 만들었다면 ~/.bitcoin/main2/wallet.dat 파일이 생성되고, testnet에서 "test2" 라는 월렛을 만들었다면 ~/.bitcoin/testnet3/wallets/test2/wallet.dat 파일이 생성된다.
Wallet 백업
Wallet을 백업하기 위해서는 이 wallet.dat 파일을 복사하여 저장하면 된다.
(1) 만약 bitcoind (혹은 bitcoin-qt)가 실행되고 있지 않다면, OS의 Copy 명령으로 wallet.dat 파일을
복사할 수 있다.
(2) 하지만, 만약 bitcoind (혹은 bitcoin-qt)가 실행되고 있다면,
이들에 의해 월렛이 사용되고 있는 중이므로 데이타 복제가 완전하지 않을 가능성이 있으므로,
이 경우에는 아래와 같이 backupwallet 명령을 사용하여 백업한다.
$ bitcoin-cli backupwallet ~/wallet.backup
만약 복수 개의 월렛이 있는 경우에는 특정 월렛을 사용하도록 지정해야 하는데, 이를 위해 "bitcoin-cli -rpcwallet={월렛명}" 와 같이 -rpcwallet 옵션을 지정한다. 예를 들어, "test2" 월렛을 복사하기 위해서는 아래와 같이 실행한다.
$ bitcoin-cli -rpcwallet=test2 backupwallet ~/test2.backup
마찬가지로, unnamed 월렛을 지정하기 위해서는 -rpcwallet= 뒤에 아무것도 적지 않으면 된다.
$ bitcoin-cli -rpcwallet= backupwallet ~/wallet.backup $ bitcoin-cli -rpcwallet= getwalletinfo
Wallet을 Restore하기 위해서는 bitcoind 프로세스를 멈추고, 백업파일을 wallet 디렉토리(혹은 복수 월렛인 경우 특정 월렛 폴더)에 wallet.dat 파일명으로 복사한다.
Wallet 덤프
월렛에 있는 정보(private key 포함)들을 Plain Text로 덤프하기 위해서는 dumpwallet 명령을 사용할 수 있다. 이 명령의 출력은 private key들을 텍스트 파일에 노출하기 때문에, 테스트용 월렛이 아닌 경우 사용하지 않는 것이 좋다.
$ bitcoin-cli walletpassphrase "mypasswordhere" 300 $ bitcoin-cli dumpwallet ~/wallet1.txt
위와 같이 덤프된 월렛은 아래와 같이 import 할 수 있다.
$ bitcoin-cli importwallet ~/wallet1.txt
dumpwallet/importwallet 명령은 월렛 전체를 덤프하고 Import하는데, 하나의 private key만을 덤프하고 Import하기 위해서는 dumpprvkey/importprivkey 명령을 사용할 수 있다.
$ bitcoin-cli dumpprivkey tb1q96n797ddrnha2a7cyekn90h670p4thjan8tyz7 $ bitcoin-cli -rpcwallet=test3 importprivkey cPQTCz5ayty2wi9J6********ksXLBfhM45YbpmFZ78XiqFFsA81
Bitcoin Core의 Wallet은 기본적으로 BIP-32의 HD Wallet (hierarchical deterministic wallet) 인데, 위와 같이 외부의 private key를 import하면, 기존의 HD 키들과 더불어 추가적으로 이 키가 저장된다.
참고로, createwallet으로 월렛을 만들 때 세번째 파라미터(blank)를 true로 설정하면, HD 키가 없는 빈 월렛을 만들 수 있다.
$ bitcoin-cli createwallet "test4" false true