いくつかの提案
やあ、
まず最初に言わせてほしいのは、これは素晴らしいコンセプトだということだ。P2P の通貨システムは長い間ずっと夢見てきたものだ。
完全に敬服し、尊敬している。
いくつか提案がある:
-
ビットコインのソフトウェアがピアとの接続を確立する際(クライアント TCP ソケット)、クライアント側からハンドシェイク文字列を送信するようにしてほしい。現在はサーバー側(サーバー TCP ソケット)がハンドシェイクを送信している。理由はもちろん匿名性だ。ISP がクライアントをポートスキャンしてこのプログラムを実行していることを検出するのはあまりにも容易だ。
-
ハンドシェイク時に何らかの暗号化を使用し(上記の要望に関連する)、DPI(ディープパケットインスペクション)の際にソフトウェアの正体を難読化してほしい。中国やイランのような自由でない(自由という意味での)国の人々のことを本当に考えている。
-
このシステムをウェブサイトに統合してインスタントサービスを提供するための API が必要だ。シンプルな HTTPS の受領メカニズムがあれば大きな効果がある。クライアントが受信した支払いをすべての関連情報とともに HTTPS URL にポストし、ステータス更新を提供するようにしてほしい。また、送金メカニズムもあると良い。これにより、送金(およびバッチ送金)を自動化できる。ステータスは HTTPS の受領インターフェースを通じて返すことができるだろう。
-
固定ポート/ランダムポート。実行するポートをランダムに割り当てる設定を用意してほしい(非常に制限的なファイアウォールのために静的に設定できる機能も)。
-
UPnP サポート。クライアントが上流のルーターに自動的にポートフォワードを作成するようにしてほしい。デフォルトで有効にし、オプションメニューでオフにできるように。
-
*NIX システム向けにヘッドレス(コンソールのみ)インストールをコンパイルできるようにしてほしい。また、ネットワークサービスとしてだけ実行できる機能も。制御用の telnet 接続可能なポート(あるいは UNIX ソケットでも可)があれば良いだろう。
参考になる提案だ、ありがとう。
madhatterの投稿(2009年12月8日 20:34 UTC)
- ビットコインのソフトウェアがピアとの接続を確立する際(クライアント TCP ソケット)、クライアント側からハンドシェイク文字列を送信するようにしてほしい。現在はサーバー側(サーバー TCP ソケット)がハンドシェイクを送信している。理由はもちろん匿名性だ。ISP がクライアントをポートスキャンしてこのプログラムを実行していることを検出するのはあまりにも容易だ。
良いアイデアだ。接続を受け入れる側は、有効なハンドシェイクを受信するまで何も送信しなければよい。どのようなポートスキャンでも、自発的に身元を明かさない無反応な接続しか得られないことになる。
すべての接続を SSL 化することは考えた。DPI に対しては SSL 以外のものは無意味だと思う。おそらくより良い直近の解決策は、TOR 経由で接続することで、これは 0.2 で可能になる。
0.2 以降の主な課題の一つだ。
ええ、常に同じポート番号だと、他のステルス機能もかなり無意味になる。
UPnP を試してみるのが楽しみだ。ほとんどの P2P クライアントは UPnP をデフォルトで有効にしているのだろうか?
管理インターフェースの最適な構成をまだ検討中だ。コマンドラインからバックグラウンドデーモンに通信して、受信トランザクションの照会や送金の開始を行う方法がよいかもしれない。その方が自動化に適している。あるいは 80 以外のポートで HTTP インターフェースを提供して、ブラウザーで管理する方法はどうだろうか?
この取り組みに感謝する。P2P 決済システムは長い間必要とされていた。
Shane
最近の P2P ソフトウェアはほとんどがデフォルトで UPnP を試行する。もちろん、(通常は)オプションで無効にできる。
うーん、俺もそれについて考えていた。最初のアイデアがおそらく最善だろう。そうすればサーバーデーモンを「ヘッドレス」で動かし、フロントエンドを自由に選べる。(フロントエンドの一つは、好みのウェブサーバーで動く PHP [または C++ CGI] プログラムにもできる)。
これにより、フロントエンドとバックエンドを別々のマシンで実行することも可能になる。(例:静的 IP を持つ Linux サーバーでヘッドレスで動かして受け取りを容易にし [IP モードでの支払い]、管理用のフロントエンドクライアントは Windows/Mac/その他で実行する)。フロントエンドは携帯電話のような CPU パワーの低いクライアントでも実行できる。nudge nudge 😉
もう一つ考えていることがある。シーディングだ。アプリはダウンロード前にプリシードしておくことができる。毎日プリシード済みの新しいアーカイブを準備できる。そうすれば IRC 接続は不要になる。(あるいはフォールバックとして使うこともできるだろう。IRC 接続のコードはまだ監査していない。いくつかのエクスプロイトを思いついたが、実際に存在するか確認するまでは言及したくない。)プリシーディングは TOR+IRC 問題も解決する。このシステムを I2P+TOR 上で動かしたい人が出てくるのは分かっている。😛
また、ブロックもプリシードしておけば、初回起動時にダウンロードする必要がなくなる。(28,000 ブロックを低速 ADSL でダウンロードするのは永遠にかかる。数百万ブロックになったらどれほどの時間がかかるか想像もつかない――一生かかるだろう。)
CVS アクセスか何かをもらえないだろうか?(無理なら、パッチを送ることはできるか?)手伝いたい。俺は主に Linux/BSD の人間で、その分野の専門知識を提供したい。
Cheers! 😊
サトシ・ナカモトの投稿(2009年12月9日 09:45 UTC)UPnPを試してみるのが楽しみだ。ほとんどのP2PクライアントはUPnPをデフォルトで有効にしているのだろうか?
管理インターフェースの最適な構成をまだ検討中だ。コマンドラインからバックグラウンドデーモンに通信して、受信トランザクションの照会や送金の開始を行う方法がよいかもしれない。その方が自動化に適している。あるいは80以外のポートでHTTPインターフェースを提供して、ブラウザーで管理する方法はどうだろうか?
フロントエンドは携帯電話のような非常に低いCPUパワーのクライアントでも実行できる。
これはモバイル向けの良いアプローチだ。PHP(任意の言語)が使用するプログラマティック API で Web UI を提示すれば、リモート管理、モバイル、その他常時オンラインで静的 IP を持てないあらゆるクライアントに対応できる。ウェブメールのようなものだ。ソフトウェアをインストールする必要がなく、ウェブサイトでアカウントを作成するだけで済むなら、新規ユーザーが始めやすくなるだろう。
「アプリはダウンロード前にプリシードできます。プリシードすればTOR+IRC問題も解決します。人々がI2P+TOR上でこのシステムを使いたがることは分かっています。」
ええ、十分な数の静的ノードができてシードリストをプリプログラムできるようになれば、IRC を段階的に廃止できる。一度シードされれば、IRC は必要ない。
「また、ブロックをプリシードしておけば、初回起動時にダウンロードする必要がなくなります。(遅いADSLで28,000ブロックをダウンロードするのは永遠にかかります。ブロックが数百万になったときにどれだけかかるか想像もできません──一生かかるでしょう)。」
0.1.5 では初回ブロックダウンロードが停滞する問題がいくつかあった。0.2 にはスムーズに進むようにするコードが含まれている。1時間もかからないはずだと思う。0.2 のリリースを急がないといけない。
ブロックは線形的に増加するので、数百万になるのは数十年先だ。理論的には、ブロックダウンロード時間は今から 8ヶ月後にピークに達するはずだ。その頃にはムーアの法則がブロックチェーンよりも速く成長しているだろう。
「CVSアクセスか何かをいただけますか?(無理なら、パッチを送ってもいいですか?)お手伝いしたいです。」
SourceForge 上の SVN だ。PM またはメールで SourceForge のアカウントを教えてもらえれば、アクセス権を付与する。
「私は主にLinux/BSDの人間なので、その分野の専門知識を提供したいと思います。」
それは素晴らしい。私はその分野の専門知識が少ないからだ。例えば、Linux で「システム起動時に Bitcoin を開始する」機能を実装する最善の方法をまだ調べていない。Windows では、このオプションはスタートアップフォルダーにアイコンを追加/削除する。
了解、SF に登録してユーザー名を伝える。もう何年も SF を使っていないので慣れ直す必要がある。これで君たちが現在作業しているブランチ(0.2)にアクセスできるようになるのか?
バックエンドプロセスに必要なオプションについて考えていた。長いコマンドラインスイッチのセットと設定ファイル、どちらが良いだろうか。うーん…
世界中にたくさんのサーバーを持っている。FreeBSD で動作するバックエンドプロセスが完成すれば、常時稼働のシードを動かせる。
ダウンロードパッケージに日次のシードスナップショットを含めれば、ブートストラップが改善されると本当に思う。新規テストインストールで、アプリケーションが 0 接続/1 ブロックのまま動かなくなるケースを見たことがある。debug.log を調べると、IRC サーバー(確か freenode)が既に接続済みだと主張して、アプリケーションのシーディングを拒否していた。(一例にすぎないが。)
Nagios 用のシンプルなネットワークモニタープラグインも有用だと思う。接続クライアントをエミュレートし、バックエンドプロセスから有効なステータスコードを取得できるものだ。アイデアはたくさんある。😊
いずれにしても、手伝いたい。時間は十分にあるし、こういうプロジェクトはとてもワクワクする。
参加させてくれてありがとう。😊
そうだ、SVN にはほぼリリース候補の 0.2 ソースがあり、Linux 上でもビルド・実行が可能だ。FreeBSD ではテストされていない。
madhatter2の投稿(2009年12月10日 19:59 UTC)FreeBSDで動作するバックエンドプロセスを実現できれば、常時稼働のシードを運用できる。
それは大きな助けになるだろう。TOR ユーザーはシードの取得方法を心配する必要がなくなり、IRC に依存しなくてもよくなる。
UI にアクセスしなくても、デスクトップ上に最小化されたウィンドウがあることを気にしなければ、いくつかのシンプルなモードで実行できる。(0.1.5 には -min オプションがないので、開いたウィンドウになる)
シードのみを実行する場合: bitcoin -min -gen=0
debug.log を見ることで、ある程度監視できる。停止するには、プロセスを kill してほしい。データベースは問題ない。
生成する場合: bitcoin -min -gen
生成された Bitcoin を取得するには、wallet.dat(バージョン 0.2 の場合)を UI 付きのマシンにコピーし、wallet.dat を入れ替えて、Bitcoin を起動し、コインをメインアカウントに送金する必要がある。(バージョン 0.1.5 では、“%appdata%/Bitcoin”ディレクトリ全体をコピーする必要がある。)wallet.dat のコピーに関して一つ注意点がある:コインを生成した瞬間や支払いを受け取った瞬間にプログラムを kill した場合、wallet.dat だけでは機能しない可能性があり、ディレクトリ全体をコピーする必要がある。
「初回ダウンロードパッケージに日次のシードスナップショットを含めることで、ブートストラッピングが改善されると本当に思います。ここでの新規テストインストールで、アプリケーションが0接続/1ブロックの状態で停止する事例を見ました。debug.logを調べると、IRCサーバー(freenodeだと思います)が既に接続されていると言って、アプリケーションのシードを拒否していることがわかりました。(一例です)。」
なるほど、同じ NAT や VPN、または ISP が全員を数台のプロキシサーバー経由で接続している場合にそうなるだろう。これに対する修正を SVN にコミットした。「433」の名前が既に使用中エラー(エラー 433 だったよね?)を受け取った場合、アドレスではないランダムなユーザー名でリトライする。
「いずれにせよ、お手伝いしたいです。時間はたくさんありますし、このようなプロジェクトはとても刺激的です。」
ありがとう、どんな助けも本当にありがたい!
Mac OS X 10.4.11/Intel 上で svn 0.2 のコンパイルがほぼ完了した(PPC970 マシンもあるので PPC ビルドも可能だ)。ウィンドウ表示は wxwidgets 経由のネイティブ Carbon だ!速い! 😉 新しい makefile(makefile.osx、もちろん makefile.unix ベース……autoconf の使用は検討した?)を作成し、header.h にいくつか ifdef を入れた。パッチがある。引き続きいじってみる。次は FreeBSD で試すかもしれない。
TOR と I2P のノードを大量に運用しているので、このアプリを同じサーバーに追加するのは簡単だ。😊
Bitcoin を 2 つのアプリに分割するのが理想的だと思う。wxwidgets フロントエンド(大部分はすでにある)と、制御用 TCP ソケットにバインドするバックエンドだ。ソースコードを読んで分割がどれだけ難しいか検討しているが、かなり簡単にできると思う。もちろん API の開発が必要になるが。
ソースコードをいじり続けて、何ができるか見てみる。
😊
提案:
コインは高速なマシンほど速く生成されるので、多くの人が GPU の演算能力も活用したくなるだろう。
そこで提案だが、ATI Stream と Nvidia CUDA を使った GPU コンピューティングサポートを実装してはどうか。
ネットワーク全体で 1日に生成される平均総コイン数は変わらない。速いマシンは遅いマシンよりも大きなシェアを得るだけだ。全員がより速いマシンを購入しても、以前より多くのコインを得ることはできない。
ネットワークのために、できるだけ長く GPU 軍拡競争を延期するという紳士協定を結ぶべきだ。GPU ドライバーや互換性を心配する必要がなければ、新規ユーザーが始めるのがずっと簡単になる。今は CPU だけの人が誰でもかなり公平に競争できるのが良いところだ。
Mac OS X 10.4.11/Intel上でsvn 0.2のコンパイルがほぼ完了した(PPC970マシンもあるのでPPCビルドも可能だ)。ウィンドウ表示はwxwidgets経由のネイティブCarbonだ!速い! 😉 新しいmakefile(makefile.osx、もちろんmakefile.unixベース……autoconfの使用は検討した?)を作成し、header.hにいくつかifdefを入れた。パッチがある。引き続きいじってみる。次はFreeBSDで試すかもしれない。
Mac サポートは良いな。wxWidgets はクロスプラットフォームで本当に効果を発揮している。
PPC は試さないでほしい。PPC はビッグエンディアンで、Bitcoin はリトルエンディアンだ。バイトスワップの可能性があるノードが存在すると、ネットワークのデバッグが困難になる無限のエンディアンバグが発生する。いずれにせよ PPC は衰退途上だ。
autoconf は検討した。autoconf は、makefile が泥沼化した大規模プロジェクトには必要だが、私たちはまだ十分に小さいので、なしの方が最適だと思う。できるだけ長く makefile をシンプルに保ちたいと思っている。
「Bitcoinを2つのアプリに分割するのが理想的だと思います。wxwidgetsのフロントエンド(ほとんど出来上がっているので)と、制御用TCPソケットにバインドするバックエンドです。ソースを読んで分離がどれくらい難しいか確認していますが、かなり簡単なはずだと思います。もちろんAPIの開発が必要になりますが。」
考えただけで頭が痛くなる。すべての UI バックエンドを TCP 接続経由にすると、すべてが 2倍難しくなる。リストビューコントロールの動作方法のため、リストビューコントロールを更新し続けるために UI と内部データ構造の間には非常に大きな帯域幅が必要だ。
コマンドラインでの制御の方が好ましい。それでリモート管理とバッチ自動化が実現できる。
autoconfを使うことは考えましたか?
将来ビルド自動化を目指すなら、autoconf ではなく cmake を選びたいですね。
提案:
支払いに IPv6 サポートを追加してほしい。
了解した。Mac PPC はどのみち EOL だ。コンソールモードがあれば素晴らしい。
えーと、コマンドラインオンリーモードはコンパイル時に選択できるということか? define で? それでグラフィカル UI の部分がオフになるのか?
認識を合わせておきたいだけだ。😊
「自然デフレーション」(俺はそう呼んでいる)について一つ質問がある。もう機能していない古いアドレスに送金できることに気づいた。要するに、そのコインは誰も請求できない。これによって自然なデフレ効果が生じないだろうか? つまり、コインの上限が 21,000,000 なら、送金ミスによってコインの数は徐々に減少していくのではないか?
実行時に UI なしで動作させるためのコマンドラインスイッチがある。メインウィンドウを作成しないだけだ。簡単な方法としては、ui.cpp の pframeMain->Show と ptaskbaricon->Show を無効にすることだ。ネットワークスレッドは UI が存在しなくても気にしない。他の UI は CheckDiskSpace でディスク容量が不足した場合のメッセージボックスだけだ。
次に、操作を行うために通信する別のコマンドラインユーティリティを用意する。名前を何にすべきかはまだわからない。
「自然デフレーション」…… 良い名前だな。はい、支払いのミスやデータの紛失により自然デフレーションが発生する。コインの生成は最終的に自然デフレーションを下回るほど遅くなり、純デフレーションが起こることになる。
了解した、ヒントをありがとう。今夜 FreeBSD 上で bitcoin 0.2/svn をコンソールオンリーモードで動かしてみる。メモやパッチなどを作成する予定だ。
FreeBSD で動くようになった! 近いうちにここに成果を投稿する。
$gmake -f makefile.fbsd
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o headers.h.gch headers.h
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o obj/util.o util.cpp
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o obj/script.o script.cpp
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o obj/db.o db.cpp
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o obj/net.o net.cpp
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o obj/main.o main.cpp
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o obj/market.o market.cpp
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o obj/ui.o ui.cpp
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o obj/uibase.o uibase.cpp
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -O3 -o obj/sha.o sha.cpp
g++ -c -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o obj/irc.o irc.cpp
g++ -O0 -Wno-invalid-offsetof -Wformat -D__WXGTK__ -DNOPCH -DBUILD_FREEBSD -I”/usr/include” -I”/usr/local/include” -I”/usr/local/include/db47” -I”/usr/local/include/wx-2.8” -I”/usr/local/lib/wx/include/gtk2-ansi-release-2.8” -o bitcoin -L”/usr/lib” -L”/usr/local/lib” -L”/usr/local/lib/db47” obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o obj/ui.o obj/uibase.o obj/sha.o obj/irc.o -Wl,-Bstatic -l boost_system -l boost_filesystem -l db_cxx -Wl,-Bdynamic -l wx_base-2.8 -l wx_gtk2_core-2.8 -l wx_gtk2_html-2.8 -l wx_gtk2_richtext-2.8 -l crypto -l gtk-x11-2.0 -l gthread-2.0 -l SM
$ file ./bitcoin
./bitcoin: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 7.2, dynamically linked (uses shared libs), FreeBSD-style, not stripped
誰かここについて教えてくれないか?
g++ -c -O0 -Wno-invalid-offsetof -Wformat -g -D__WXMAC__ -DNOPCH -DBUILD_MACOSX -I”/usr/include” -I”/usr/local/include/wx-2.8” -I”/usr/local/include” -I”/usr/local/boost_1_41_0” -I”/sw/include/db4” -I”/usr/local/ssl/include” -I”/usr/local/lib/wx/include/mac-ansi-release-2.8” -o headers.h.gch headers.h
ui.h: In constructor ‘CGetTextFromUserDialog::CGetTextFromUserDialog(wxWindow*, const std::string&, const std::string&, const std::string&, const std::string&, const std::string&)’:
ui.h:421: error: no matching function for call to ‘CGetTextFromUserDialogBase::CGetTextFromUserDialogBase(wxWindow*&,
誰かここについて教えてくれないか?
std::string から wxString への暗黙の変換が機能していないようだ。これはあらゆるところで使用されており、変換が動作する必要がある。
wxString は win32 の 16 ビット wchar と 8 ビット ansi のデュアルコンパイルをサポートするため複雑だ。Windows では「unicode」(つまり wchar)ビルドを使用した場合にこの問題が発生する可能性があり、その場合 wxString は wchar で std::string は char になる。
おそらく wxWidgets のコンパイル定義やビルド設定の問題だろう。configure でどのオプションを使用したか?
__WXMAC__が正しい定義かわからない。wxString を複雑にしているのは Mac Classic サポートかもしれないが、私たちは OSX だけが必要だ。__WXOSX__を試してみてほしい(または以下を参照)
http://docs.wxwidgets.org/stable/wx_cppconst.html
「wxWidgets には Mac OS への 2 つの移植があります。そのうちの 1 つ、wxMac には Classic と Carbon の 2 つのバージョンがあります。Classic バージョンは Mac OS バージョン 8 で動作する唯一のものです。Carbon バージョンは CFM または Mach-O(ELF のようなバイナリフォーマット)としてビルドでき、前者は OS 9 で動作し、後者は OS X でのみ動作します。最後に、OS X でのみ使用できる新しい Cocoa ポートがあります。まとめると:
* Classic と OS X を含むすべての Mac プラットフォームをテストしたい場合は、__WXMAC__と__WXCOCOA__の両方をテストしてください。
* OS X 上の任意の GUI Mac ポートをテストしたい場合は、__WXOSX__を使用してください。
* wxGTK や wxBase を含む Mac OS X 上の任意のポートをテストしたい場合は、__DARWIN__を使用してください」
了解、std::string の問題を調べてみる。最新バージョンの Ubuntu Linux でも同じ std::string の問題が出ている。だからこれは OSX だけの問題ではない。俺の本来のバックグラウンドは C であって C++ではないので、C++のデータ型やヘッダーなどの詳細についてはまだ「やりながら」学んでいるところだ。😊
wx/defs.h には__WXCOCOA__と__WXMAC__の define しかない(何か見落としているに違いない…wxwidgets をリビルドする必要があるかもしれない――試してみよう)。既存の define の組み合わせを試したが成功していない。もう一つの選択肢は OSX 上で gtk を使うことだが、ウィンドウ処理が遅くなるし、(個人的には)「見た目が悪い」。Carbon が OSX には最適だろう。動くまでハックし続ける。😊
FreeBSD 用の起動スクリプトも完成した。xorg の仮想フレームバッファを localhost で起動し、bitcoin を立ち上げて、X11 の画面出力を(モニターではなく)メモリーに格納するものだ。かなりの力技だが、bitcoin を擬似的な Unix デーモンとして実行できるようになる。このコードを 12時間以上動かしているが、メモリーリークやその他の異常は検出されていない。
また、bitcoin がクラッシュしたりポート 8333 で応答しなくなったりしたことを検出し、ページを送信して、デーモンを再起動するシンプルなネットワークモニターも用意した。この構成は理想的だ。世界中の自分が管理するサーバーにシードのデプロイを始めた。😊
一つ質問:debug.log を有効にするにはどうすればいい? bitcoin を停止して~/.bitcoin/debug.log を touch してから bitcoin を再起動してみたが、ファイルに書き込まれないようだ。何か見落としているだろうか?
SF のセットアップが完了したら、これらのツールを含める予定だ。
Cheers!
了解、SF に登録した。ユーザー名は「madhatter2」だ。
😊
最新バージョンのUbuntu Linuxでも同じstd::stringの問題が出ている。
それなら、wxWidgets のビルドまたは設定で何か異なることをしているはずだ。
wxWidgets の configure スクリプトでどのオプションを使用したか?私が使用したオプションは build-unix.txt に記載されている。
「一つ質問:debug.logを有効にするにはどうすればいいですか?Bitcoinを停止して~/.bitcoin/debug.logをtouchして、再度Bitcoinを起動してみましたが、ファイルに書き込まれることはありません。何か見落としていますか?」
そのようなことは聞いたことがない。debug.log に何か入っているか?ファイルを touch したなら、何か入っているはずだ。プログラムにファイルへの書き込みアクセス権はあるか?
デフォルトのビルドオプションを使った。あなたの txt ファイルにあるオプションを試してみる。FreeBSD では通常の ports システムからすぐに動作した。これは素晴らしい。同じ ports システムを通じて bitcoin をインストール(自分の目標)するのも簡単になることを意味する。
そう、debug.log には適切なパーミッションがある。ソースを読み直してみる。何か見落としているはずだ。
wxWidgets 2.9 を使って string の問題を回避した。デフォルト設定で動作した。
[madhatter@10 /home/madhatter/src/bitcoin]# diff -u headers.h.orig headers.h
--- headers.h.orig 2009-12-14 12:29:39.000000000 +0000
+++ headers.h 2009-12-14 12:41:08.000000000 +0000
@@ -35,7 +35,12 @@
#include <limits.h>
#include <float.h>
#include <assert.h>
+#ifndef BUILD_FREEBSD //malloc.h is part of stdlib.h on FreeBSD
#include <malloc.h>
+#endif
+#ifdef BUILD_FREEBSD
+#include <netinet/in.h>
+#endif
#include <memory>
#define BOUNDSCHECK 1
#include <sstream>
[madhatter@10 /home/madhatter/src/bitcoin]# cat makefile.fbsd
# Copyright (c) 2009 Satoshi Nakamoto
# Distributed under the MIT/X11 software license, see the accompanying
# file license.txt or http://www.opensource.org/licenses/mit-license.php.
ifneq "$(BUILD)" "debug"
ifneq "$(BUILD)" "release"
BUILD=debug
endif
endif
ifeq "$(BUILD)" "debug"
D=d
DEBUGFLAGS=-g
endif
INCLUDEPATHS= \
-I"/usr/include" \
-I"/usr/local/include" \
-I"/usr/local/include/db47" \
-I"/usr/local/include/wx-2.8" \
-I"/usr/local/lib/wx/include/gtk2-ansi-release-2.8"
LIBPATHS= \
-L"/usr/lib" \
-L"/usr/local/lib" \
-L"/usr/local/lib/db47"
LIBS= \
-Wl,-Bstatic \
-l boost_system -l boost_filesystem \
-l db_cxx \
-Wl,-Bdynamic \
-l wx_base-2.8 \
-l wx_gtk2_core-2.8 \
-l wx_gtk2_html-2.8 \
-l wx_gtk2_richtext-2.8 \
-l crypto \
-l gtk-x11-2.0 -l gthread-2.0 -l SM
WXDEFS=-D__WXGTK__ -DNOPCH -DBUILD_FREEBSD
CFLAGS=-O0 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)
HEADERS=headers.h util.h main.h serialize.h uint256.h key.h bignum.h script.h db.h base58.h
all: bitcoin
headers.h.gch: headers.h $(HEADERS) net.h irc.h market.h uibase.h ui.h
g++ -c $(CFLAGS) -o $@ $<
obj/util.o: util.cpp $(HEADERS)
g++ -c $(CFLAGS) -o $@ $<
obj/script.o: script.cpp $(HEADERS)
g++ -c $(CFLAGS) -o $@ $<
obj/db.o: db.cpp $(HEADERS) market.h
g++ -c $(CFLAGS) -o $@ $<
obj/net.o: net.cpp $(HEADERS) net.h
g++ -c $(CFLAGS) -o $@ $<
obj/main.o: main.cpp $(HEADERS) net.h market.h sha.h
g++ -c $(CFLAGS) -o $@ $<
obj/market.o: market.cpp $(HEADERS) market.h
g++ -c $(CFLAGS) -o $@ $<
obj/ui.o: ui.cpp $(HEADERS) net.h uibase.h ui.h market.h
g++ -c $(CFLAGS) -o $@ $<
obj/uibase.o: uibase.cpp uibase.h
g++ -c $(CFLAGS) -o $@ $<
obj/sha.o: sha.cpp sha.h
g++ -c $(CFLAGS) -O3 -o $@ $<
obj/irc.o: irc.cpp $(HEADERS)
g++ -c $(CFLAGS) -o $@ $<
OBJS=obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o \
obj/ui.o obj/uibase.o obj/sha.o obj/irc.o
bitcoin: headers.h.gch $(OBJS)
g++ $(CFLAGS) -o $@ $(LIBPATHS) $(OBJS) $(LIBS)
clean:
-rm obj/*
-rm headers.h.gch FreeBSD でビルドするには:
/usr/ports から必要なソフトウェアをすべてインストールし、makefile.fbsd を使ってコンパイルする。
「そのまま動く」。😊
良いな、FreeBSD で正常に動作しているか?
headers.h への変更をコミットした。一貫性のため、__BSD__を使用した。定義の完全なリストは http://docs.wxwidgets.org/stable/wx_cppconst.html にある。
#ifdef BSD
#include <netinet/in.h>
#endif
malloc.h は Windows でのみ必要なので、これ以上問題を起こさないように__WXMSW__セクションに移動する。
こんにちは。/*nix/i システム向けのヘッドレス/非 GUI モードの要望に賛同する。initscript や~/.bashrc(または同等のファイル)から Bitcoin ソフトウェアを起動し、バックグラウンドで静かに動作させることができると便利だ。
また、Win32 クライアントで wallet.dat ファイルの保存場所を変更する可能性はどうだろうか? 昨日、ZIP 圧縮された Windows 版 Bitcoin クライアントをいじっていて、これはポータブルアプリケーションとして使えるのではないかと思った。USB ドライブ上の TrueCrypt ボリュームに展開して、例えば外出先で数時間動かし、ボリュームをアンマウントする直前にシャットダウンするというアイデアを検討していたのだが、wallet.dat ファイルが C:\Documents and Settings\username\Application Data\Bitcoin ディレクトリに作成されてしまう。要するに、ポータブル版の Bitcoin を使って、ポータブルなウォレットを育てていくということだ。
現在可能なのは、オプションで「トレイに最小化」を設定し、bitcoin -min で起動して最小化状態で開始することだ。表示されるのはトレイ上の小さな(20x20)アイコンだけで、UI にアクセスしたい場合はダブルクリックできる。注意:64 ビット Karmic Koala でトレイアイコンが消えることがあるバグがある。64 ビットのせいか Karmic のせいかはわからないが、32 ビット Jaunty では問題なかった。
0.2 のリリースに間に合うように Linux の「システム起動時に Bitcoin を開始」機能を実装する時間がなかったため、グレーアウトされている。Linux ユーザーならとにかく手動で設定することを気にしないだろうと思った。正しく行うには -min スイッチを知る必要があるだろう。
-datadir=<ディレクトリ> スイッチでデータディレクトリの場所を指定できる。TrueCrypt USB ドライブに置くために既にそうしている人がいるのは知っている。
こんにちは。
FreeBSD 固有の細かい変更が SVN に追加されたのを見られて素晴らしい。ありがとう! 😊
時間が見つかり次第、より多くの bitcoin シードノード(地理的に分散したもの)をセットアップする予定だ。(現在はコンピューターラボの移転の最中だ)。
近いうちに、もう少し細かいクリーンアップやコンパイル修正を出せるはずだ。
それでは!
ネットワーク全体で 1日に生成されるコインの平均合計は同じままだ。速いマシンは遅いマシンより大きなシェアを得るだけだ。全員がより速いマシンを買っても、以前よりも多くのコインを得ることはない。
ネットワークのために、できるだけ長く GPU 軍拡競争を延期する紳士協定を結ぶべきだ。新規ユーザーが GPU ドライバーや互換性を心配する必要がなければ、参加のハードルがずっと低くなる。