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

協力マイニング

18件のメッセージ BitcoinTalk マレク・パラティヌス, ribuck, grondilu, asdf, FreeMoney, farmer_boy, サトシ・ナカモト, RHorning, BitLex 2010年11月27日 — 2010年12月17日

GPUを搭載したコンピューターがマイニングに使われ始めてから、他の人々にとってマイニングは非常に困難になった。Bitcoinに参加して数週間だが、まだブロックを見つけられていない(3台のCPUでマイニング中)。多くの人が低速なCPUで個別にマイニングしていると、それぞれが仲間うちでも、さらにGPUを積んだ金持ち野郎どもとも競争することになる ;-)。なぜなら、全員が同じ範囲からsha256ハッシュを計算しているからだ。1000khash/sの2台の別々のCPUは、1台の2000khash/sのマシンと同じではない! しかし、公式Bitcoinクライアントのgetworkという新機能により、多くのコンピューターが協力して動作できるようになり、競合しなくなった。スタンドアロンのCPUマイナーができたので(jgarzikに感謝!)、getworkパッチが公式クライアントに入った今、アイデアがある:

貧しいCPUマイナーを一つのクラスターに統合し、ブロックを見つける確率を高めよう!

どう動くのか? ウェブページで登録し、ウォレットアドレスを入力して、CPU/GPUマイナー用のURLと個人用rpcuser/rpcpasswordを取得する。これらの認証情報でマイナーを起動すると、サーバーはクラスターの他のメンバーがまだ計算していないワークを送る。

しかし、クライアントが当選ハッシュを見つけた場合、ブロックの報酬全額(現在50BTC)は得られず、自分の計算量に比例した部分のみを受け取る。1日に1000khash/sを提供し、クラスター全体のパフォーマンスが20000khash/sで、ブロックを見つけるのに2日かかった場合、報酬は(50/20/2=)1.25BTCになる。

メリットは? 貧弱なスタンドアロンのコンピューターの場合、完全な50BTCの報酬を見つけるまで何週間も何ヶ月も待つ必要がある。このようなクラスターに参加すれば、毎日または毎週(クラスター全体のパフォーマンス次第で)少額のBitcoinを安定して受け取ることができる。

デメリットは? 中央機関(私)がブロックを自分のものにしないと信頼する必要がある。しかし、数週間ほど遊び半分でいじっていて、Bitcoinのアイデアに驚かされているので、今のところ誰からも盗むつもりはない :-)。

もう一つの問題として、誰かが非常に頻繁に新しいワークを要求するが、実際にはハッシュを計算していない可能性がある。その場合、非常に強力なCPUを持っているように見え、クラスターがブロックを見つけた場合に大きな報酬を受け取ることになる。しかし、不正行為者に対するシンプルな防御策がある:中央サーバーは時々「当選」ハッシュにつながるワークを送る。このハッシュを一致として返さないワーカーは永久にBANされる(ログイン/パスワードとIPアドレス)。これはマイナーにプルーフ・オブ・ワークを計算させることで解決された。もはやクラスターの一部でありながらハッシュを計算しないということは不可能だ。

興味ある?

ribuck 2010年11月27日14:35 UTC
マレク・パラティヌスの投稿(2010年11月27日13:45 UTC)

1000khash/sの2台の別々のCPUは、1台の2000khash/sのマシンと同じではない!

実際には、同じだ。性能の低いマシンが、性能の高いマシンと「競争」しているわけではない。どの難易度でも、ほかにいくつのマシンが生成しているかは関係さえない。ほかのマシンがみんなネットワークから抜けても、自分の生成するブロックの数は増えない(次の難易度の調整までは)。

大きく効くのは、難易度と自分のkhash/sだけだ。ネットワークの遅延による影響もいくらかあるが、たいしたものではない。

ribuckの投稿(2010年11月27日14:35 UTC)

どの難易度でも、ほかにいくつのマシンが生成しているかは関係さえない。

長い目で見ればそのとおりだ。でも、性能の低いCPUしかない人の多くは、そこからビットコインを1枚受け取るまでに何年もかかると分かって、マイニングを止めてしまうのだと思う。協力するマイナーの集まりに入っていれば、受け取る額は小さくても(たとえば集まりの性能の0.02%を出していれば0.01 BTC)、もっと頻繁に受け取れる。それが、マイナーを止めずにおく動機になりうると思う。

ビットコインの経済にとっては、マイニングをネットワーク全体に分散させ、速いGPUを持つ幸運な少数に任せきりにしないことが、きわめて大事だと思う。

ribuck

大きく効くのは、難易度と自分のkhash/sだけだ。

もちろんだ。集まりのkhash/sが多いほど、集まりの見つけるブロックが増え、メンバーへの支払いも頻繁になる。

grondilu 2010年11月27日16:43 UTC

協力マイニングは共産主義の一種じゃないか?

個人的に考えてみたが、意味がないし、思っているよりずっと難しいと思う。

最初は、マイニングできるノードが少数だけになるのは問題だと思っていた。今はもう気にしていない。たとえ1つのノードが新しいビットコインを全部掘っていても、たいして気にしない。そのノードが必要な仕事を全部、一番良いやり方でやってくれる。しかも、それより多くハッシュを計算できる誰でも、取って代われる。

grondiluの投稿(2010年11月27日16:43 UTC)

協力マイニングは共産主義の一種じゃないか?

協力が共産主義だと本気で思う? 協力マイニングに「みんなにタダのビットコイン」なんてものはない。

asdf 2010年11月28日14:44 UTC

これは素晴らしい!

将来、ブロックサイズが巨大になった時、これは大量の帯域幅とストレージを節約する。1つの「サーバー」ノードだけがブロックチェーンとトランザクションの洪水を受信するための太い帯域幅を必要とする。多くのクライアントが、そのインフラに何度も支払うことなくBitcoinに貢献できる。これは小規模なプレイヤーが市場に参加し続けられることを意味し、スケーリング問題全体をある程度解決する。すごい!

grondilu 2010年11月28日14:55 UTC

リモートシェルアクセスをレンタルする方がはるかにシンプルだと思うのは自分だけだろうか?

FreeMoney 2010年11月28日15:34 UTC
asdfの投稿(2010年11月28日14:44 UTC)

これは素晴らしい!

将来、ブロックサイズが巨大になった時、これは大量の帯域幅とストレージを節約する。1つの「サーバー」ノードだけがブロックチェーンとトランザクションの洪水を受信するための太い帯域幅を必要とする。多くのクライアントが、そのインフラに何度も支払うことなくBitcoinに貢献できる。これは小規模なプレイヤーが市場に参加し続けられることを意味し、スケーリング問題全体をある程度解決する。すごい!

ああ、それには気づかなかった。しかし正しいと思う。ハッシュされるのはヘッダーだけでいい。だからこのスキームには生成のばらつきを減らす以上の利点がある。とても良い。

farmer_boy 2010年11月28日15:58 UTC

最初はブロック内のハッシュがアドレスと独立していると誤解していたと思う。今では、sha256(ビットコインアドレス + 金額(値が暗黙的かどうかわからないので、この値は存在しないかもしれない)+ <答え>)のようなもので、望ましい性質(最終ゼロの数がその近似)を持つものを探していると理解している。ここで+はビットの何らかの連結演算子を意味する。

計算がそのようなものであれば、機能するかもしれないが、なぜ誰かが(あなたにとって)価値のないハッシュだけを送り、あなたに有用なものを送らないのかがわからない。このメカニズムにより彼らはあなたを破産させることができる。いずれにせよ、自然言語だけでこれらのトピックについてコミュニケーションするのは良くない方法だと思う。サーバーとクライアントで実行する予定の計算を、とにかく書き出してほしい。そうすれば、それが素晴らしいアイデアか欠陥のあるものかがわかる。各計算がどの目標を達成しようとしているかの注釈も、コミュニケーションに有用だ。

ノードから協力を強制するのは容易ではない。

ribuckの説明はまさにその通りだ。

プールオペレーターはgetworkを修正して、シェアの送付先アドレスという追加パラメーターを1つ受け取るようにできる。

プールオペレーターにとって簡単な方法は、次のブロックが見つかるまで待って、以下の割合で分配することだ: ユーザーのニアヒット数/全員からの合計ニアヒット数

そうすればより簡単かつ安全に開始できる。同じユーザーからの複数のヒットを1つのトランザクションにまとめられるという利点もある。ヒットの多くは通常同じ人からのものになるだろう。

即時報酬の方法は、各ニアヒットに対して即座に固定額を支払い、オペレーターがブロックが見つかるまでのニアヒット数の多寡によるランダムさのリスクを負うことだ。

どちらの方法でも、ブロックを解決するヒットを提出したユーザーは、例えば10 BTCのように、上乗せの追加額を受け取るべきだ。

新規ユーザーはBitcoinソフトウェアすら必要ない。マイナーをダウンロードし、mtgoxやmybitcoinでアカウントを作成し、入金アドレスをマイナーに入力して、誰かのプールサーバーに向ければよいのだ。マイナーが何かを見つけたと表示したら、しばらくしてアカウントにいくらかのコインが表示される。

マイナーの開発者は、ニアヒットの偽陽性を決して出さないようにする方が良い。ユーザーはプールオペレーターが不正をしていないかチェックするためにそれに依存する。マイナーが誤って何か見つけたと表示すると、ユーザーはアカウントを確認し、何もないのを見て、プールオペレーターに怒ることになる。

RHorning 2010年11月28日16:52 UTC
ribuckからの引用(2010年11月28日14:07 UTC)
RHorningからの引用(2010年11月28日07:11 UTC)

……数十個ほどの軽減ハッシュを受け取った後で、ネットワークの難易度が急激に跳ね上がる、というタイミングでハッシュをリクエストしてしまった場合の話だ。これはハッシュファームサーバーの「オーナー」にとって潜在的な責任問題となり得る。「利益率」に大きく影響するからだ。

すまない、誤解しているようだ。サーバーの運用者は、勝ち取ったブロックに対して提出された軽減ハッシュにのみ報酬を払う。他人が生成したブロックに対して提出された軽減ハッシュには支払いはない。

難易度はブロックの途中で変わることはない。常に既知の時点で変わり、現在の難易度も常に正確に分かっている。だからここにリスクはない。

確かに自分の理解には誤りがあったようだ。ただ、勝ち取れなかったブロックに対して計算されたハッシュという観点では、別の副作用がある。それも明らかに「proof of work」の一種で、少なくともプールへの貢献努力を表している。ハッシュ計算という「誠意ある努力」が報酬なしで終わるべきだとは個人的には納得しきれない。だが、それも明らかにプールの「ルール」の一部となるだろう。事前に全員が合意していて、この点が明確であれば、その面では大きな問題は感じない。

しかし、成功し得るハッシュを除外すると、弱い参加者を追い出す傾向が出てくるだろう。また、現在のブロックに対する部分ハッシュ成功数に対して、実際に「勝ち取った」成功ブロック数は1/40の比率よりかなり少なくなるため、統計的にはサーバー運用者に有利な大きな偏りが生じると思う。こうしたプール構成では、より平凡なクライアントを使う場合、これらのルールでは成功したブロックハッシュに対して一人だけが報酬を得るのが普通になる、という状況が想像できる。別の言い方をすれば、平均すれば、こうしたルールのプールに加入するメリットは全くなく、ネットワーク本体で直接コインを生成した方がよほど効率的だ、ということになる。

繰り返すが、自分はあくまで自分の統計の理解に基づく推測をしているだけなので、実際の統計データをぜひ見てみたい。

サトシ・ナカモトの投稿(2010年11月28日16:03 UTC)

新規ユーザーはBitcoinソフトウェアすら必要ない。マイナーをダウンロードし、mtgoxやmybitcoinでアカウントを作成し、入金アドレスをマイナーに入力して、誰かのプールサーバーに向ければよいのだ。マイナーが何かを見つけたと表示したら、しばらくしてアカウントにいくらかのコインが表示される。

マイナーの開発者は、ニアヒットの偽陽性を決して出さないようにする方が良い。ユーザーはプールオペレーターが不正をしていないかチェックするためにそれに依存する。マイナーが誤って何か見つけたと表示すると、ユーザーはアカウントを確認し、何もないのを見て、プールオペレーターに怒ることになる。

「ニアヒット」を検証する際は、現在のルールに対して、ただし軽減された難易度で検証することになる。そのようなニアヒットが実際に成功ハッシュである統計的可能性もある。コインファームの「クライアント」の中で、ヒットについて「偽陽性」を継続的に報告するものは、ほぼ即座にそれと判定され、トロール扱いされ、もちろん報酬を得ることも認識されることもなく、サーバー運用者としてはそうしたクライアントをまとめてブラックリスト入りさせるか、少なくとも接続を切ることが利益となる。

それでも、マイナーの作者がこうした偽陽性を生み出すようなものを作ってはいけないという点については、サトシの言いたいことは分かる。これはマイニングクライアントに関しては、通常の経済理論で解決される問題だ。通信プロトコルだけを実装していて結果を出さないソフトウェアパッケージを作る者がいれば、そのユーザーはすぐに離れていく。

Bitcoinソフトウェア自体をインストールすることなく、自分のコンピューターにマイナーを入れられるという、このアイデアは大好きだ。これは、その気になれば携帯電話やその他のデバイスにマイナーを入れることすらできる、ということでもある(もちろんバッテリー寿命を食い尽くす代償はあるが)。コインを採掘する潜在的な方法を一気に広げ、この活動に参加できる潜在的なCPUのプールを拡大することにもなる。

ああ、ありがとうribuck。君のアイデアはきちんと理解できた。プール運用者宛のトランザクションがすでにハッシュデータに含まれているのは嬉しい。これでその方法でのチートは実質的に不可能だ。あとは偽陽性のケースを解決すればよいだけだ。

これでプール用ソフトウェアをこしらえるのに十分な情報が揃ったと思う。少し時間をくれ、作業中だ ;-) 。

協調マイナーがほぼ完成した。すでに動作していて、かなり速い。「testnet」でテストしたが、私のIntel Atomでも大した負荷なく500Mhash/s以上のクライアントをさばける。あとはユーザー向けのウェブUIと、大量のコードクリーンアップが必要なだけだ。

jgarzikのcpuminer、m0mchilのpython miner、Diabloのjava minerとも問題なく動作している。ただ、ターゲット比較で1つ問題を見つけた。彼らのコードを理解した限り、見つけたhashとターゲットを完全には比較していない。つまり、公平な精算のために低難易度のブロックを多く取りたくて難易度をかなり低く設定すると、マイナーは正しいhash(現在のターゲットに対応するhash)を返してこない。

たとえばDiabloMinerだ。ターゲットをffff..ffff00に設定しても、末尾のゼロが8個未満のhashは返してこない。私が間違っているのかな、それとも本当に、低難易度のターゲットで正しく動くにはマイナーにパッチが必要なのかな?

末尾のゼロが8個のターゲットを設定すると(テストしたすべてのマイナーが正しく動作する設定)、約2mhash/sのコンピューターでは1時間あたり2ブロック程度しか出ず、これは個人的には、短期の公平な分配には少なすぎると思う。

みんな、こんにちは。自分のビットコインのマイニングサーバーをhttp://mining.bitcoin.czで始めた。テストネットで念入りに試したが、まだベータ段階のソフトウェアだ。それでも、すでに約600000khash/sの力が集まっていて、明日にはさらに増える。

サーバーは、上で議論した、サトシが成り立つと認めた原理にもとづいている。標準のgetwork()のインターフェースに従うCPU/GPUのマイナーなら、どれでも動く。jgarzikのCPUマイナー、m0mchilとDiabloのGPUマイナーだ。必要な情報はすべてサイトのトップページにある。

報酬の送り方:ブロックが見つかると、50BTCはマイナーのウォレットではなく、サーバーのウォレットに入る。マイナーはそれぞれ「送金のしきい値」を決められ、それが自分のウォレットへ送る最低の額になる。これで0.0001 BTCのような送金を避けられるはずだ。今は送金の定期実行のスクリプトを止めていて、最初の何回かの支払いは手作業で処理する。すべてがちゃんと動いているかを確かめるためだ。

興味があれば、アカウントを作り、ウォレットのアドレスを入れ、自分のワーカーを登録して、マイニングを始めてみてほしい! 不具合は何でも知らせてほしい。できるだけ早く対応する! この段階では、サーバーが短時間止まることがあるので、大目に見てほしい。たいていは、マイナーが自分で再起動して解決する。

最初のブロックを中央ヨーロッパ時間の8時16分に見つけた! (統計にタイムゾーンの計算か、せめてUTCの時刻を足さないといけないと気づいた。)ビットコインがウォレットに入ったら、最初のビットコインを送る :-)。でも、自分の計算上の報酬は、もうプロフィールのページで見られる。ブロックを見つけるのに4898のシェアが必要だった。

BitLex 2010年12月16日15:46 UTC

やった、もう2つ目のブロックを解いたみたいだ。

生成が成熟したら、ワーカーの統計は更新されるの? まだ見つけたブロックが0のままなんだけど。

BitLexの投稿(2010年12月16日15:46 UTC)

やった、もう2つ目のブロックを解いたみたいだ。

生成が成熟したら、ワーカーの統計は更新されるの? まだ見つけたブロックが0のままなんだけど。

そう、2つ目のブロックを16時10分に見つけた。http://blk.bitcoinwatch.com/b?h=97886を見てくれ。7時16分の1つ目はhttp://blk.bitcoinwatch.com/b?h=97834だ。

ワーカーの詳細の「Blocks」は、そのワーカーが見つけた有効なブロックだけだ。だから今は、2つのワーカーだけがBlockの欄で「1」になっている。統計はすべてリアルタイムだ。

最初の報酬を送った! ウォレットを確かめて、送金がうまくいったか知らせてほしい!

2010-12-17 01:38:22.037611
Testnet: False
Send 16.71 to 1CHwovmchLYrw9gAL7DUHnReDwyKySGjqg
Send 8.92 to 124TQXntz7akAYCrUxDjLuVg7fLGTJqcgt
Send 7.92 to 1JdEn5LeMREmAjcAi4KWf8EX6zkubqGn55
Send 1.66 to 13TSBH4wdchsMqFTwqyLjvPES99sZ96MaP
Initial balance: 50.0, sent total 35.21 for 4 people, time 0.3 sec

ほかに10人いて、送金のしきい値が今の報酬を上回っている。送金のスクリプトは問題なさそうなので、金曜日のうちに自動の送金を設定する。