ビットコイン・インスティテュート

8333以外のポートで実行する

bitcoinに-port= / -rpcport=のコマンドライン/設定ファイルオプションを追加する作業をしている。目的は、1台のマシンで複数のbitcoindを実行できるようにすることだ。少なくとも2つのBitcoin関連ウェブサービス(Bitcoin Faucetと、後で発表するサービス)を予定しており、完全に別のウォレットにしたいが、ホスティングのために複数のサーバーを借りたくはない。

使い方はこのようになる:

$ ./bitcoind getbalance  # TESTネットワークのFaucet bitcoind
40616.66159265000
$ ./bitcoind -datadir=/home/bitcoin/.bitcoinTEST2 getbalance
1000.000000000000
$ cat /home/bitcoin/.bitcoinTEST2/bitcoin.conf
rpcpassword=.....
port=18666
rpcport=18665

サトシは、bitcoin/bitcoindを非標準ポートで実行することを許可すると、設定を誤った場合に2つのbitcoinが同じデータベースを開いて書き込む可能性があり危険だと指摘した。これを防ぐために、<datadir>/db.logファイルをロックとして使用し、同時に1つのbitcoinだけが同じdatadirにアクセスできるようにした(boost::interprocess::file_lockを使用。これはクロスプラットフォームで、bitcoinがクラッシュしても正常に動作するとされている)。

この作業中に出てきた問題:

Windows GUIコードにwxSingleInstanceCheckerの呼び出しを残したため、Windowsでは異なるポートでリッスンする複数のGUI版bitcoinは動作しない。Windowsは使わないので…

2つのbitcoinを同じdatadirに向けた場合のエラー処理をきれいにする手間は省いた(ランタイム例外「Cannot lock db.log, is bitcoin already running?」が出る)。

パッチはhttp://pastebin.com/2e4hfXSSにある。Linuxでしかテストしていないので、Windowsで試してくれる人はいるか?

agaumoney 2010年7月27日19:00 UTC
ギャビン・アンドレセンの投稿(2010年7月27日14:08 UTC)

bitcoinに-port= / -rpcport=のコマンドライン/設定ファイルオプションを追加する作業をしている

良いね。さらに、ポートをバインドするアドレス用の-ip=オプションもあると良い。(rpcportは127.0.0.1にバインドするが、現在portは全IPアドレスである0.0.0.0にバインドする。マルチホームシステムで、内部アドレスにバインドするbitcoinとは別の外部アドレスにbitcoinをバインドしたい。)

SVNリビジョン125に対応した更新版のパッチはある?また、BerkeleyDBを排他モードで開いているなら、ファイルロックは不要ではないか? 排他モードでは開いていない――自分でテストして確認した。

エリック・スワンソンの投稿(2010年8月10日15:24 UTC)

SVNリビジョン125に対応した更新版のパッチはある?また、BerkeleyDBを排他モードで開いているなら、ファイルロックは不要ではないか? 排他モードでは開いていない――自分でテストして確認した。

DB_PRIVATEで開いている。

http://www.oracle.com/technology/documentation/berkeley-db/db/api_reference/C/envopen.html

エリック・スワンソンの投稿(2010年8月10日15:24 UTC)

また、BerkeleyDBを排他モードで開いているなら、ファイルロックは不要ではないか? 排他モードでは開いていない――自分でテストして確認した。

BerkeleyDBを排他的に開く方法はあるだろうか?

DB_PRIVATEは両方の悪いところだけを取ったものだ。DB_PRIVATEは排他的ではないが、他のプロセスが同時にアクセスしようとすると問題が起きる。

rev 153でDB_PRIVATEフラグを削除した。

サトシ・ナカモトの投稿(2010年9月12日17:40 UTC)

BerkeleyDBを排他的に開く方法はあるだろうか?

意図している目的は何?

もし二つのbitcoinクライアントが同じデータベースを同時に使うのを防ぐことなら、アプリケーションレベルの保護を採る必要がある。粗い手段としては、ロックファイルやlockというDBエントリなどがある。

もし他のすべてのアクセスを防ぐつもりなら、その目標は諦めたほうがいいと思う 😊 db4ツールがdb4データベースにアクセスできるようにしておくのは非常に有用だ。

db46_archive     db46_deadlock    db46_load        db46_stat
db46_checkpoint  db46_dump        db46_printlog    db46_upgrade
db46_codegen     db46_hotbackup   db46_recover     db46_verify

gavinのbitcointoolsのようなツールから読み取り専用でアクセスできるようにしておくのも、同じくらい有用だ。

MoneyTree 2011年1月19日23:41 UTC
ギャビン・アンドレセンの投稿(2010年7月27日14:08 UTC)

bitcoinに-port= / -rpcport=のコマンドライン/設定ファイルオプションを追加する作業をしている。目的は、1台のマシンで複数のbitcoindを実行できるようにすることだ。少なくとも2つのBitcoin関連ウェブサービス(Bitcoin Faucetと、後で発表するサービス)を予定しており、完全に別のウォレットにしたいが、ホスティングのために複数のサーバーを借りたくはない。

こちらも同じだ。なんとか2つのウォレットと2つのbitcoin.confインスタンスを作ることができた。

どちらも設定で異なるrcportを指定している(8332と8333)。

どちらか片方なら起動して問題なく動き、ウォレットを使うウェブサイトからも接続できる。

ところが…2つ目のbitcoinインスタンスを起動すると(私はWindowsを使っている)、2つ目のプロセスは約6 Mbまで膨らんで、そのまま死んでしまう…。つまり、それぞれのウォレットは単独ならちゃんと動くが、同時には動かない。

何が起きたかデバッグして確認する方法はあるだろうか? 設定でオプションを切り替えてみた(noircや、接続先を限定するオプションなど)が、違いはないようだ。

それでは。

MoneyTree

http://doubletrouble.bitcoinbet.com/

MoneyTreeの投稿(2011年1月19日23:41 UTC)

どちらも設定で異なるrcportを指定している(8332と8333)。

8333はハードコードされたP2Pポートだ。