いくつかの提案
やあ、
まず最初に言わせてほしいのは、これは素晴らしいコンセプトだということだ。P2Pの通貨システムは、本当に長いあいだ夢見てきたものだ。
全面的に称賛し、尊敬している。
いくつか提案がある:
-
ビットコインのソフトウェアがピアとの接続を確立する際(クライアントTCPソケット)、クライアント側からハンドシェイク文字列を送信するようにしてほしい。現在はサーバー側(サーバーTCPソケット)がハンドシェイクを送信している。理由はもちろん匿名性だ。ISPがクライアントをポートスキャンしてこのプログラムを実行していることを検出するのはあまりにも容易だ。
-
ハンドシェイク時に何らかの暗号化を使用し(上記の要望に関連する)、DPI(ディープパケットインスペクション)の際にソフトウェアの正体を難読化してほしい。中国やイランのような自由でない(自由という意味での)国の人々のことを本当に考えている。
-
このシステムをウェブサイトに統合してインスタントサービスを提供するためのAPIが必要だ。シンプルなHTTPSの受領メカニズムがあれば大きな効果がある。クライアントが受信した支払いをすべての関連情報とともにHTTPS URLにポストし、ステータス更新を提供するようにしてほしい。また、送金メカニズムもあると良い。これにより、送金(およびバッチ送金)を自動化できる。ステータスはHTTPSの受領インターフェースを通じて返すことができるだろう。
-
固定ポート/ランダムポート。実行するポートをランダムに割り当てる設定を用意してほしい(非常に制限的なファイアウォールのために静的に設定できる機能も)。
-
UPnPサポート。クライアントが上流のルーターに自動的にポートフォワードを作成するようにしてほしい。デフォルトで有効にし、オプションメニューでオフにできるように。
-
*NIXシステム向けにヘッドレス(コンソールのみ)インストールをコンパイルできるようにしてほしい。また、ネットワークサービスとしてだけ実行できる機能も。制御用のtelnet接続可能なポート(あるいはUNIXソケットでも可)があれば良いだろう。
参考になる提案だ、ありがとう。
Mmadhatterの投稿(2009年12月9日05: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の人間で、その分野の専門知識を提供したい。
それでは! 😊
SNサトシ・ナカモトの投稿(2009年12月9日18:45 UTC)UPnPを試してみるのが楽しみだ。ほとんどのP2PクライアントはUPnPをデフォルトで有効にしているのだろうか?
管理インターフェースの最適な構成をまだ検討中だ。コマンドラインからバックグラウンドデーモンに通信して、受信トランザクションの照会や送金の開始を行う方法がよいかもしれない。その方が自動化に適している。あるいは80以外のポートでHTTPインターフェースを提供して、ブラウザーで管理する方法はどうだろうか?
フロントエンドは携帯電話のような非常に低いCPUパワーのクライアントでも実行できる。
これはモバイル向けの良いアプローチだ。PHP(任意の言語)が使用するプログラマティックAPIでWeb UIを提示すれば、リモート管理、モバイル、その他常時オンラインで静的IPを持てないあらゆるクライアントに対応できる。ウェブメールのようなものだ。ソフトウェアをインストールする必要がなく、ウェブサイトでアカウントを作成するだけで済むなら、新規ユーザーが始めやすくなるだろう。
MThe Madhatterアプリはダウンロード前にプリシードしておくことができる。プリシーディングはTOR+IRC問題も解決する。このシステムをI2P+TOR上で動かしたい人が出てくるのは分かっている。
ええ、十分な数の静的ノードができてシードリストをプリプログラムできるようになれば、IRCを段階的に廃止できる。一度シードされれば、IRCは必要ない。
MThe Madhatterまた、ブロックもプリシードしておけば、初回起動時にダウンロードする必要がなくなる。(28,000ブロックを低速ADSLでダウンロードするのは永遠にかかる。数百万ブロックになったらどれほどの時間がかかるか想像もつかない――一生かかるだろう。)
0.1.5では初回ブロックダウンロードが停滞する問題がいくつかあった。0.2にはスムーズに進むようにするコードが含まれている。1時間もかからないはずだと思う。0.2のリリースを急がないといけない。
ブロックは線形的に増加するので、数百万になるのは数十年先だ。理論的には、ブロックダウンロード時間は今から8ヶ月後にピークに達するはずだ。その頃にはムーアの法則がブロックチェーンよりも速く成長しているだろう。
MThe MadhatterCVSアクセスか何かをもらえないだろうか? (無理なら、パッチを送ることはできるか?)手伝いたい。
SourceForge上のSVNだ。PMまたはメールでSourceForgeのアカウントを教えてもらえれば、アクセス権を付与する。
MThe Madhatter私は主にLinux/BSDの人間で、その分野の専門知識を提供したい。
それは素晴らしい。私はその分野の専門知識が少ないからだ。例えば、Linuxで「システム起動時にBitcoinを開始する」機能を実装する最善の方法をまだ調べていない。Windowsでは、このオプションはスタートアップフォルダーにアイコンを追加/削除する。
了解、SFに登録してユーザー名を伝える。もう何年もSFを使っていないので慣れ直す必要がある。これで君たちが現在作業しているブランチ(0.2)にアクセスできるようになるのか?
バックエンドプロセスに必要なオプションについて考えていた。長いコマンドラインスイッチのセットと設定ファイル、どちらが良いだろうか。うーん…
世界中にたくさんのサーバーを持っている。FreeBSDで動作するバックエンドプロセスが完成すれば、常時稼働のシードを動かせる。
ダウンロードパッケージに日次のシードスナップショットを含めれば、ブートストラップが改善されると本当に思う。新規テストインストールで、アプリケーションが0接続/1ブロックのまま動かなくなるケースを見たことがある。debug.logを調べると、IRCサーバー(確かfreenode)が既に接続済みだと主張して、アプリケーションのシーディングを拒否していた。(一例にすぎないが。)
Nagios用のシンプルなネットワークモニタープラグインも有用だと思う。接続クライアントをエミュレートし、バックエンドプロセスから有効なステータスコードを取得できるものだ。アイデアはたくさんある。😊
いずれにしても、手伝いたい。時間は十分にあるし、こういうプロジェクトはとてもワクワクする。
参加させてくれてありがとう。😊
そうだ、SVNにはほぼリリース候補の0.2ソースがあり、Linux上でもビルド・実行が可能だ。FreeBSDではテストされていない。
MThe Madhatterの投稿(2009年12月11日04: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だけでは機能しない可能性があり、ディレクトリ全体をコピーする必要がある。
MThe Madhatterダウンロードパッケージに日次のシードスナップショットを含めれば、ブートストラップが改善されると本当に思う。新規テストインストールで、アプリケーションが0接続/1ブロックのまま動かなくなるケースを見たことがある。debug.logを調べると、IRCサーバー(確かfreenode)が既に接続済みだと主張して、アプリケーションのシーディングを拒否していた。(一例にすぎないが。)
なるほど、同じNATやVPN、またはISPが全員を数台のプロキシサーバー経由で接続している場合にそうなるだろう。これに対する修正をSVNにコミットした。「433」の名前が既に使用中エラー(エラー433だったかな?)を受け取った場合、アドレスではないランダムなユーザー名でリトライする。
MThe Madhatterいずれにしても、手伝いたい。時間は十分にあるし、こういうプロジェクトはとてもワクワクする。
ありがとう、どんな助けも本当にありがたい!
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をシンプルに保ちたいと思っている。
MThe Madhatter「Bitcoinを2つのアプリに分割するのが理想的だと思います。wxwidgetsのフロントエンド(ほとんど出来上がっているので)と、制御用TCPソケットにバインドするバックエンドです。ソースを読んで分離がどれくらい難しいか確認していますが、かなり簡単なはずだと思います。もちろんAPIの開発が必要になりますが。」
考えただけで頭が痛くなる。すべてのUIバックエンドをTCP接続経由にすると、すべてが2倍難しくなる。リストビューコントロールの動作方法のため、リストビューコントロールを更新し続けるためにUIと内部データ構造の間には非常に大きな帯域幅が必要だ。
コマンドラインでの制御の方が好ましい。それでリモート管理とバッチ自動化が実現できる。
提案:
支払いに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*&, <anonymous enum>, const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)’ uibase.h:673: note: candidates are: CGetTextFromUserDialogBase::CGetTextFromUserDialogBase(wxWindow*, wxWindowID, const wxString&, const wxPoint&, const wxSize&, long int) uibase.h:651: note: CGetTextFromUserDialogBase::CGetTextFromUserDialogBase(const CGetTextFromUserDialogBase&) ui.h:423: error: no matching function for call to ‘wxStaticText::SetLabel(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)’ /usr/local/include/wx-2.8/wx/mac/carbon/stattext.h:38: note: candidates are: virtual void wxStaticText::SetLabel(const wxString&) ui.h:424: error: no matching function for call to ‘wxTextCtrl::SetValue(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)’ /usr/local/include/wx-2.8/wx/textctrl.h:303: note: candidates are: virtual void wxTextCtrlBase::SetValue(const wxString&) ui.h:428: error: no matching function for call to ‘wxStaticText::SetLabel(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)’ /usr/local/include/wx-2.8/wx/mac/carbon/stattext.h:38: note: candidates are: virtual void wxStaticText::SetLabel(const wxString&) ui.h:430: error: no matching function for call to ‘wxTextCtrl::SetValue(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)’ /usr/local/include/wx-2.8/wx/textctrl.h:303: note: candidates are: virtual void wxTextCtrlBase::SetValue(const wxString&) make: *** [headers.h.gch] Error 1
誰かここについて教えてくれないか?
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:430: error: no matching function for call to ‘wxTextCtrl::SetValue(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)’ /usr/local/include/wx-2.8/wx/textctrl.h:303: note: candidates are: virtual void wxTextCtrlBase::SetValue(const wxString&)
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のセットアップが完了したら、これらのツールを含める予定だ。
それでは!
了解、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シードノード(地理的に分散したもの)をセットアップする予定だ。(現在はコンピューターラボの移転の最中だ)。
近いうちに、もう少し細かいクリーンアップやコンパイル修正を出せるはずだ。
それでは!