BTCのUTXOからBCHのトランザクションを作成する

# はじめに
２０１７年８月１日にbitcoin(BTC)から分裂によって誕生したBitcoin Cash(BCH)。
BTCをbitflyerなどの取引所に預けた方は、取引所側で分裂の対応をされていると思いますが、個人の端末やハードウェアウォレットなどを使われる方は、分裂対応を手動で行う必要があります。

というわけで、そのやり方をご紹介します。

# 実行環境
実行日: 2017-10-29
環境: MacOS Sierra 10.12.6
bitcoind: 0.15.0
# 準備
今回、トランザクションの作成にはBCCSpliterを使います。
https://github.com/NicolasDorier/BCCSpliter

## 環境構築

* .NetCoreをインストール

BCCSpliterは、.Netフレームワーク上で動作しますので、.Netをインストールします。brewにはありませんので、公式サイトからダウンロードしてインストールします。

https://github.com/dotnet/core/blob/master/release-notes/download-archives/1.0.4-sdk-download.md
Versionは1.0.4で良いようです。

dotnetのパスを通し、dotnetが実行できることを確認します。

```
[ 17-10-29 19:30 ] ~
osada@mbp17e% ln -s /usr/local/share/dotnet/dotnet /usr/local/bin

[ 17-10-29 19:30 ] ~
osada@mbp17e% dotnet

Microsoft .NET Core Shared Framework Host

  Version  : 1.1.0
  Build    : 928f77c4bc3f49d892459992fb6e1d5542cb5e86

Usage: dotnet [common-options] [[options] path-to-application]

Common Options:
  --help                           Display .NET Core Shared Framework Host help.
  --version                        Display .NET Core Shared Framework Host version.

Options:
  --fx-version <version>           Version of the installed Shared Framework to use to run the application.
  --additionalprobingpath <path>   Path containing probing policy and assemblies to probe for.

Path to Application:
  The path to a .NET Core managed application, dll or exe file to execute.

If you are debugging the Shared Framework Host, set 'COREHOST_TRACE' to '1' in your environment.

To get started on developing applications for .NET Core, install the SDK from:
  http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
```
* BCC spliterのインストール

公式サイトにしたがって、手順通りに実行していきます。

```
[ 17-10-29 19:31 ] ~
osada@mbp17e% git clone https://github.com/NicolasDorier/BCCSpliter
Cloning into 'BCCSpliter'...
remote: Counting objects: 187, done.
remote: Total 187 (delta 0), reused 0 (delta 0), pack-reused 187
Receiving objects: 100% (187/187), 61.49 KiB | 282.00 KiB/s, done.
Resolving deltas: 100% (99/99), done.

[ 17-10-29 19:31 ] ~
osada@mbp17e% cd BCCSpliter
[ 17-10-29 19:31 ] ~

osada@mbp17e% git submodule init
Submodule 'NBitcoin' (https://github.com/MetacoSA/NBitcoin/) registered for path 'NBitcoin'

[ 17-10-29 19:32 ] ~/BCCSpliter
osada@mbp17e% git submodule update
Cloning into '/Users/osada/BCCSpliter/NBitcoin'...
Submodule path 'NBitcoin': checked out 'f4f9249fd21352e6a4f05614ce37e1737f12b418'

[ 17-10-29 19:33 ] ~/BCCSpliter
osada@mbp17e% dotnet restore
（省略）
  NuGet Config files used:
      /Users/osada/.nuget/NuGet/NuGet.Config
  
  Feeds used:
      https://api.nuget.org/v3/index.json
  
  Installed:
      23 package(s) to /Users/osada/BCCSpliter/BCCSpliter/BCCSpliter.csproj

[ 17-10-29 19:33 ] ~/BCCSpliter
osada@mbp17e% dotnet run
Couldn't find a project to run. Ensure a project exists in  /Users/osada/BCCSpliter.
Or pass the path to the project using --project

[ 17-10-29 19:34 ] ~/BCCSpliter
osada@mbp17e% cd BCCSpliter/

[ 17-10-29 19:34 ] ~/BCCSpliter/BCCSpliter
osada@mbp17e% dotnet run
Interactive.cs(120,26): warning CS0168: The variable 'ex' is declared but never used [/Users/osada/BCCSpliter/BCCSpliter/BCCSpliter.csproj]
info: Configuration:  Using HOME environment variable for initializing application data
info: Configuration:  Creating data directory
info: Configuration:  Configuration file set to /Users/osada/.bccspliter/Main/spliter.config
info: Configuration:  Creating configuration file
info: Configuration:  Network: Main
info: Configuration:  Data directory set to /Users/osada/.bccspliter/Main
info: Configuration:  Configuration file set to /Users/osada/.bccspliter/Main/spliter.config
fail: Configuration:  RPC connection settings not configured
```
あれ、RPCコネクションが設定できないというエラーが。
エラー解消のために、設定ファイルをいじります。
Macの場合はホームディレクトリのドットフォルダ以下に設定ファイルがあります。

```
/Users/osada/.bccspliter/Main/spliter.config
```

bitcoindにRPC接続するためのuserやpassword、urlなどを設定します。
わからないときは、bitcoin.confを確認して、同じものを設定すれば良いです。
~/Library/Application\ Support/Bitcoin/bitcoin.conf


```
####Common Commands####
#Connection to the bitcoin core wallet. BCCspliter will try to autoconfig based on default settings of Bitcoin Core.
rpc.url=http://localhost:18332/
rpc.user=osada
rpc.password=password
#rpc.cookiefile=yourbitcoinfolder/.cookie
#bcc.endpoint is optional, NBitcoin will try to connect to a random node for broadcasting your transaction
#bcc.endpoint=ip:port
```

というわけで、再度実行。

```
[ 17-10-29 19:38 ] ~/BCCSpliter/BCCSpliter
osada@mbp17e% dotnet run
info: Configuration:  Using HOME environment variable for initializing application data
info: Configuration:  Configuration file set to /Users/osada/.bccspliter/Main/spliter.config
info: Configuration:  Network: Main
info: Configuration:  Data directory set to /Users/osada/.bccspliter/Main
info: Configuration:  Configuration file set to /Users/osada/.bccspliter/Main/spliter.config
info: Configuration:  Testing RPC connection to http://localhost:18332/
info: Configuration:  RPC connection successfull
info: Configuration:  Bitcoin Core version detected: 150001
BCCSpliter 1.0.0
Copyright (C) 2017 BCCSpliter

  select         Select UTXOs to dump, you can use `list` command to see which 
                 to dump

  dumphd         Dump from external hd private key or BIP39 mnemonic (Using 
                 P2SH/BIP45/1-1, please ask me for broader support)

  dumpprivkey    Dump from a BIP58 formatted private key (typically used with 
                 paper wallet)

  unselect       Unselect UTXOs to dump

  exit           Quit.

  list           Get the current status of UTXOs

  dump           Dump selected UTXOs, and lock those UTXO in the BTC wallet

  help           Display more information on a specific command.

  version        Display version information.

>>> 

```

動きました！
ここで、"list"と入力すると、現在保有するBTCのUTXOのtxidが表示されます。

```
>>> list
------------------------
Selectable UTXOs in your wallet for next dump
	d3ef9916b5836fcd02f4903a7f893f0f1d389c8850d77e1c5d8d57508774712f-1	0.00035520
Type `select <outpoint>` to select one of those UTXO, or `select all` to select all of them
Once you selected your outpoints, use `dump <Destination on BCC>` to dump
------------------------
------------------------
Selected UTXO in your wallet scheduled for the next dump
Total: 0.00000000 BTC
`dump <Destination on BCC>` will dump all those UTXOS
------------------------
>>> 
```

といっても、現在BTCをほとんど保有していないと、上のように表示されます。
（0.00035520 BTCしか持っていません 笑）
ただ、２０１７年8月1日以前にBTCのUTXOを保有していて、かつ、その日以降で、BTCのUXTOを使ってトランザクションを作っていた場合、BTCの世界では送金されていますが、BCCの世界は未送金のままになっています。

そこで、listで表示されないUXTOを使ってBCCのトランザクションを作ってみようと思います。

## 秘密鍵抽出

対象となるUTXOを持つBTCアドレス**1MUKdKHiq266rVrkpQbCw32YaA2UjTzbA3**に対応する秘密鍵を抽出します。

```
[ 17-10-29 19:46 ] ~
osada@mbp17e% bitcoin-cli dumpprivkey 1MUKdKHiq266rVrkpQbCw32YaA2UjTzbA3
L1dc...（省略）
```
この**L1dc...**が秘密鍵です。
（この端末のbitcoindで秘密鍵を管理している前提です。秘密鍵は人に教えてはいけません！！）

ちなみに、このUTXOを生成したトランザクションは以下で確認できます。
https://blockchain.info/tx/b41a73550bcbff51a7427be388681d85d5f717cbc3fb047da6180805093bf0bc

# トランザクション作成
抽出した秘密鍵を使って、BCCSpliterからトランザクションを作成します。
ここで送金先に指定するアドレスは、以下です。
**3LGpwdVg9V8VMUrahT8c5CNuPMCDWZryXp**

秘密鍵を指定してトランザクションを使うときは、"dumpprivkey"を使います。

dumpprevkey <秘密鍵> <送金先アドレス>

```
[ 17-10-29 19:46 ] ~/BCCSpliter/BCCSpliter
osada@mbp17e% dotnet run
（省略）
>>> dumpprivkey L1dc...（省略） 3LGpwdVg9V8VMUrahT8c5CNuPMCDWZryXp
info: Main:           Found 1 coins
info: Main:           Dump transaction created 0100000001bcf03b09050818a67d04fbc3cb17f7d5851d6888e37b42a751ffcb0b55731ab4000000006b483045022100a2ffd99011c40e1e24875ce41802a824e9c56c41c51339ab31bc0de11974e77d02203a1279139dd2454ba81b1550b96b9abc0f2d6009dd9918dcfe48082a1dc3051e412102c8a78c6be5093ce3923874bbbd6d15e8cb769acb03a0e07f2710ba4bb62a36d5ffffffff0160d08e090000000017a914cbd73d778b693e80487d82d198fb8f8b015085218700000000
info: Main:           Dump transaction ID 5b3320e0515956ea98632cf841e2646176e53e7d3500221a6402d896a2df9428
Are you sure to dump 1.60400000 BCash coin to 3LGpwdVg9V8VMUrahT8c5CNuPMCDWZryXp ? (type `yes` to continue)
```

秘密鍵に対応するトランザクションが見つかり、それをBCCで送金するためのRawTransactionが生成されます。
0100...というものがRawTransactionですね。


BCCSpliterから「BCCとして送って良いか？」と聞かれますので、yesと答えます。

```
yes
info: Main:           Connecting to a BCC node...

^C
```

が、いつまでたってもBCCのノードとお話できないので、停止（Ctrl-C）して、別の方法でブロードキャストします。

# トランザクション送信

* 送信

RawTransactionを、Webからブロードキャストします。
BCCを熱烈に支持したViaBTCのサイトに、RawTransaction発信機能があります。
ここから送信しましょう。
https://pool.viabtc.com/tools/BCC/broadcast/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42671/3886f646-911d-e2bc-6d03-eb36c9301ebc.png)

他にも同様のサイトがありますので、お好みでご利用ください。

* 確認

なぜかViaBTCのブロードキャスト機能では、ブロードキャストの成否は表示されますが、トランザクションIDが表示されません。
そこで、confirm状況の確認は、別のサイトで、アドレスを指定して確認します。

https://blockchair.com/bitcoin-cash/address/3LGpwdVg9V8VMUrahT8c5CNuPMCDWZryXp

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42671/cd75079f-da79-02a0-4605-1f994eea1e5c.png)

1 confirmationいただきました！

# おわりに

今回は、BTCとして送金済みのUXTO（それはUTXOと言うのか？）からBCCのトランザクションを作る紹介をしました。
BTCのUTXOが残っている場合は、単にUTXOを指定して"dump"をすれば良いようです。

もしかすると、こういった眠っているBCCは世の中にたくさんあるのかもしれませんね！
10年後くらいに埋蔵金のようにすごい価値になってたりして。

ちなみに、このdumpでの生成のされたトランザクションの手数料の設定方法がわかっていません。
手数料の調整方法が必要な方は、別のサイト？を探してみてください。