Subscribed unsubscribe Subscribe Subscribe

ダメ人間オンライン

あまり信用しないほうがいい技術メモとか備忘録とかその他雑記

いまさらBitcoinの仕組みについて調べてみた

Bitcoinって聞いたことあるけど「アーハン、ネット上の仮想通貨みたいなやつなんでしょ。あとなんかハッシュめっちゃ計算する必要があるとかなんとか」ぐらいの理解で 、「儲かる!」「いや、今はもう儲からない!」とかは耳に入ってたけどあまり興味もてなかった。

けど先週末あたりに Monacoin をきっかけに急に興味持ち始めて色々調べてみた。

Bitcoinとは

ざっくり言うと P2P型の決済網及び暗号通貨 とのこと。

俺の下手くそな説明見るよりこれ見たほうが早い
Bitcoin-ビットコイン-とは何か?
ビットコインの採掘とは実際には何をしているのか?

元となった論文(pdf)
http://www.bitcoin.co.jp/docs/SatoshiWhitepaper.pdf

公式FAQ
Bitcoin P2Pベースの仮想通貨 - ビットコイン

氏名とか口座番号とかなくても気軽に送金・受取ができるようになるのは良い。

よくわからなかったとこ

上記の資料読んだり他にもwebでもろもろ調べたり、実際にpool(採掘場)に登録してcoin採掘してみたりしたけど仕組み的によくわかんないとこがでてきた。

ハッシュ値計算中に貨幣取引トランザクションを追加する必要が出た場合

ある時点での取引トランザクションを含めたブロックでハッシュ値計算をしてる最中に新たなトランザクションが追加された場合、次の計算はそれを加えるべきか無視して次のブロック計算にまわしていいのか、加えてしまった場合また1から計算しないといけないので無駄になるのではないか、とか明記されていないことについて疑問に思った。

結論から言うとこの疑問自体が間違ってて、新たなトランザクションが追加された場合は普通にそれを加えて計算すればよい。
というのもハッシュ値の計算には複数パラメータが必要で、そのパラメータの中にブロック生成の時間(unixtime)が含まれているので1秒毎にハッシュ計算元の値は変化する。
これは全マイナー同様なので採掘の性能として重要なのは単純に1秒間の演算処理能力だけである。なのでどっちみち変化するのでトランザクション追加したところで何も変わらない。すごく乱暴に言うと1秒毎にヨーイドンを繰り返してるようなもの。
重要なのは1秒間にどれだけの数のNonceを試行できるかということ。

Block hashing algorithm - Bitcoin

pool(採掘場)利用時、支払先アドレスがpoolのものになるのでnonceを除いた計算元のハッシュがユニークにならずnonceがかぶったりするのでは?

ソロマイニングだと支払先アドレスが自分のものになるので生成するハッシュは(ほぼ)必ずユニークになるが、poolだとその部分が固定になっちゃうのでnonceがかぶったりするのどうしてるんだろうと思った。

poolが各nodeに「あなたはnonce何番から~」とか指示したりしてるのかなとか、nonceはインクリメンタルじゃなくランダムな数値を使って試行してるのかなとか考えて MPOS とか cpu-miner とかのソースコードを適当に読んでみたけどそうではなさそうだった。

pool利用時はstratumっていうプロトコル使っててそこのドキュメントにそれっぽいことが書いてあった。
Stratum mining protocol - mining.bitcoin.cz

Extranonceという値を用いてcoinbaseのトランザクション(のserialization)をユニークにしてるらしい。
この例で言うとScryptSigかScriptPubKeyのことなんかな?トランザクションの生成のとこはちゃんと読んでないから間違ってるかもやけど。
http://blockexplorer.com/tx/51d37bdd871c9e1f4d5541be67a6ab625e32028744d7d4609d0c37747b40cd2d

へーなるほどーって思ったけど英語誤読してる可能性もワンチャンある。

ブロックに含めるトランザクションがMerkle TreeのRoot Hashだけで良い理由

基本的にnode間ではブロックチェーンだけやりとりしてるから Root Hash だけあったところで詳細なトランザクションの検証をあとからするには情報が足りないのではと思った。

どっかに明記されてたわけじゃないけど、マイナー(採掘)ノードじゃなく財布ノードのほうで分割してデータ持ったりしてんじゃないかな。以上。

おわりに

だいたい理解できたつもりでいる。

あとはBitcoinはいいけど、Litecoin とか Monacoin は SHA-256 じゃなく scrypt って方式でやってるらしい。よく知らないからこれもちゃんと調べときたい。ググってもちゃんとした情報見つけられなくてよくわかんなかった。

採掘は今Monacoinだけでやってて、だいたい 300kh/s ぐらい。
Monacoin はまだできたばっかで利用用途とか考えたりするのがおもしろそう。投げ銭推奨派なのでこの先楽しみ。Monacoinについてはまた別途書く。たぶん。

気軽に投げ銭してくれてもいいんですよ?