2017年10月24日火曜日

[Monacoin]testnet4で掘れたのでFaucetを作りました

[Monacoin]マイニングはじめました
のプログラムでtestnet4で掘れました。

これを配るFaucetを作りました

Monacoin testnet4 Faucet

ご自由にお使いください。

ページが表示されないときは、メンテナンス中かなにか不調となっているかもしれません。

念のため申し上げておきます。
本番ではありませんよ。
testnet4ですよ笑

【2017/11/07 23:03追記】
MonacoinのTestnet ← Ask Monaです。
1万コイン以上入金してくださった方がいてtestnetではありますがなんだかすごいことになっています。

Monacoinのtestnet4でいらなくなったコインはmsVB7uMdzAwgQuph5pL8Zb7aiYgjYoFH1q までお願いします。

2017年10月17日火曜日

[Monacoin]マイニングはじめました

Monacoin のマイニング開始しました。

本番ではまだブロックは作れておりませんが、testnetでは成功しました。
ソースコードはGitHubに公開しておきます。
TORIFUKUKaiou/ntgbtminer
※topic-monacoinブランチです。


以下、日記みたいなものです。

はじめ、ntgbtminer をRPC設定やアドレスをMonacoin用にtestnetで変えて動かしてみました。
Bitcoinではregtestでしかブロックをみつけたことはないのですが、Monacoinのtestnetは難易度が低いためなのか割りとブロックを見つけたというメッセージは表示されてはいてsubmitはしているのですがどうもそのままでは正しいブロックとは認識されませんでした。
Monacoin の公式ページに
なることが書いてあります。
私が持っているBitcoinの本の中ではみた記憶がありません。(私が見落としてだけかもしれませんが……)
きっとこの違いがあるのでしょうとぐぐってみたのですが、日本語のまとまった記事は見当たらず……
Lyra2RE(v2)なるアルゴリズムはリンク先に書いてあるそうです。
まったく理解できませんでした。

すでに多くの方が紹介されているマイニングソフトを黙ってインストールしたほうが早い(処理速度も速い)気もしましたが、もう少しがんばってみることにしました。

BitcoinMonacoinで何が違うのだろう?
ソースコードを眺めてみました。
このへんの違いがポイントのようです。

BitcoinCheckBlockHeader

MonacoinCheckBlockHeader
(ブログにはあっさり書いていますがここに行き当たるまでにどれだろうなあといろいろ探し回りました苦笑)

例のハッシュ値があるtarget_difficultyを下回っているかどうかの計算に使っているアルゴリズムが異なっているようです。
なるほど! それを公式ページでAlgorithmといっているわけなのね。

Bitcoin : sha256(sha256(block_header))
Monacoin : lyra2re2(block_header) ※Proof Of Workの計算のときだけこれが使われているようで、ブロックのハッシュ値はsha256(sha256(block_header))が使われているようです。


lyra2re2は理解できそうにないし、あきらめようかとおもいましたが、pipで公開されていました!

lyra2re2-hash 様と ntgbtminer 様を組み合わせればいけそうです!

Monacoin の中で使われているものと同じcのソースがPythonから使えるようになっているようです。(このへんの仕組みを理解できていないのでまた勉強したいとおもっています)

はい、できました。
TORIFUKUKaiou/ntgbtminer
※topic-monacoinブランチです。

submitblock しても取り込まれない場合もあるようです。
ほぼ同時に計算を誰かが終えてタッチの差で負けたとかそういうことでしょうか。

monacoin.confはこんな感じでした。

/Users/${USER}/Library/Application Support/Monacoin/testnet4 というフォルダができていました。

submitblockに成功していてもすぐに残高が増えるわけではないようです。
おそらくconfirmations数が後続に100個ブロックがつづいてcoinbaseトランザクションを使えるようになるのだとおもいます。
自分がsubmitblockしたブロックのconfirmations数が100を超えていることを確認して上のコマンドで確認したら、残高増えていました!
main chainでも見つかるといいな!



↑プログラムを書きたいときにどうしたらいいのだろう? をたいていのことを答えてくれます。


Python 2.7 のインストールに失敗

macOS High Sierraを使っています。
pyenvを使って2.7.14をインストールしようとしましたが失敗しました。



もう答えは書いてありますね。
指示されたページにいってみます。
以下のように実行したら成功しましたです。めだしめでたし。


[Bitcoin]おプション

(version v0.15.0.1)
で動かすと下記のようになります。


おプション
です。
文字列が書いてあるファイルがあってそれを修正してビルドしなおすと、「オプション」になりました。
よし、プルリクエストを送ろう!
とCONTRIBUTING.mdを読むと翻訳のプルリクエストはおくるべきではない(should not)と書いてありました。
プルリクエストを送りつけなくてよかったです。
日本の恥さらしになるところでした。

transifex というところで管理されているようです。
ここの内容をリリースのときに適宜自動的に取り込んでいるような感じらしいです。
せっかくなので私もアカウント登録して修正案をだしてみようとおもいました。

すでに修正されていました……
私の出る幕ではありませんでした……


2017年10月15日日曜日

BloggerでソースコードをSyntaxHighlighterでカッコよく表示する

いままでGist使ったり、自分でhtml書いたりしていたのですが、文明の利器を利用することにしました。

ぐぐってみるとSyntaxHighlighterというすばらしいものが見つかりました。
日本語でみつけた記事とGitHubに書いてあることがどうも違っていて、バージョン3とバージョン4で大きく違うようです。私が試行錯誤した点などを記しておきます。
私がみつけた記事の大半はバージョン3以前の話だとおもいます。
ここではバージョン4の話を書いています。

最初に結論を言っておくと、Buildingをしっかり読めば全部必要なことは書いてあります。
英語を適当に読むと私と同じようになんかいろいろ試行錯誤する羽目になります。

私はmacOS High Sierraを使っています。
Node.jsPython(2系)が必要です。
※ターミナルでpython -Vをタイプしたときに、2系がかえってくるようになっている必要があります。私はpyenvで3系をインストールしていてpython -Vが3系を返すようになっていました。いままで自分でPythonをインストールしたことがない方の場合はMacには2系があらかじめインストールされていますので気にする必要はありません。



他にも実は事前に必要なものがあるのかもしれません。
私のHomebrewの一覧を公開しておきます。
pyenv local systemはPythonを2系にするための設定です。不要な方には不要な手順です。
次のnpm installでエラーがでて気づきました。
私がはまったのは、buildの前にsetup-projectをしていなかったこと ⇒ これをしないと必要なものがダウンロードされずbuildで失敗します。
buildの際には--brushesと--themeの指定が必須のようですが指定していなかったこと ⇒ 特にエラーのようなものは出ずなんとなくファイルができていたのでいろいろいったりきたりしました。
成功すると./dist配下にファイルができています。
index.htmlはサンプルです。ブラウザで開いてみてください。

必要なものはsyntaxhighlighter.jsとtheme.cssです。
Bloggerの場合、[テーマ] - [HTMLの編集]で、</head>の直前にでもsyntaxhighlighter.jsとtheme.cssの読み込みを追加します。

  <script type="text/javascript" src="https://your-host.com/syntaxhighlighter.js"></script>
  <link type="text/css" rel="stylesheet" href="https://your-host.com/theme.css"/>
</head>
Bloggerを書くときには、HTMLのところで以下のような感じ書いていくとよいです。

<script class="brush: ruby" type="text/syntaxhighlighter"><![CDATA[
# ここにソースを書く
puts 'Hello, World'
]]></script>



最後にsyntaxhighlighter.jsとtheme.cssをどこに置いたらよいかということ(上ではyour-host.comと書いているところ)ですが、私はFirebase Hostingにおいています。
私のブログくらいのアクセス数なら無料で使えます苦笑

[Bitcoin]マイニングはじめました

Bitcoinと言えばやっぱりマイニングですよね。
成功するかどうかは別としてプログラムをかける方なら、特別なハードウェアは不要で誰でもマイニングをすること自体はできます。

nonceを変えながら条件を満たすブロックを作ればいいのです。
これだけ聞くと自分でそれほど長くないプログラムを書いてそれを実行すると私は運がいいので当たるだろうとおもってしまいます。
実際にはオートレースの三連単(336通り)もなかなか当たらないのですが、桁が途方もなく大きいとなんだか自分だけは引き当てられる気がしてくるので不思議です。

Bitcoin coreインストールしておく必要があります。
他にはPython 2系を使います。

理論的なところは他の記事に譲ることとしまして、私の理解を開陳いたします。
Bitcoinを技術的に理解する

regtestで検証してみます。
regtestとはなんだろうというのは以下の記事をご参照ください。

Bitcoinを使ったアプリケーションのテスト環境

regtest環境

私のコンピュータはMacなのですが、bitcoin.confを書き換えます。
オプションの意味は bitcoind --help でご確認ください。

# /Users/${USER}/Library/Application Support/Bitcoin/bitcoin.conf
Bitcoin coreを開始します。 /Users/${USER}/Library/Application Support/Bitcoin/regtest
ウォレットとブロックチェーンなどのデータはここに保存されます。
これをノード1と呼ぶことにします。

ビットコインアドレスもあります。
本番やtestnetだと自動的に他のノードとつなぎますがregtestではつながりません。
今回はマイニングを試したいのでgetblocktemplateコマンドが通らないといけません。
そのためにはもう1つノードが必要なようです。
とりあえず同じマシンでもう1つノードを動かしてみます。
場所はどこでもいいとおもうのですが以下はmacOS High Sierraの場合の例です。
ノード2のウォレットとブロックチェーンなどのデータは指定したディレクトリに保存されます。
bitcoin-cliの実行結果はノード1での話になるようです。 getblocktemplateの結果が変わりました。
ブロックを1個作ってみます。
blocksが1になっています。 ブロックの中身をみてみます。
トランザクションの内容をみてみます。
"value": 50.00000000をmjZ48ydjRa7nhp1zpwjbbudS8dVPbP8qAsが使えるようになっています。
mjZ48ydjRa7nhp1zpwjbbudS8dVPbP8qAsは一体だれだ???
ノード1 ノード2 どちらにもありませんがこのあとすぐにノード1 ⇒ ノード2への送金(トランザクション)をやってみて、送金はできるのでlocking scriptをノード1の秘密鍵で解錠できるのでしょう。

まだ残高は0です。
ブロックが100個作られると使えるようになるそうです。
そこで100個ブロックを作ってみます。
ノード1は最初のコインベーストランザクションが残高になっています。
ノード2の残高は0のままです。
ノード2のほうもbitcoin-cliでなにかオプションかなにか渡せばいけるのかもしれませんがよくわからなかったのでcurlで実行しています。
ノード1のビットコインアドレスからノード2のビットコインアドレスに10.0あげてみます。 以下Rawtransactions群のコマンドを使っていますが、sendtoaddress使うと簡単に送金トランザクションを発行してくれます。 コマンドの一覧はbitcoin-cli helpで確認できます。 ここではRawtransactions群のコマンドを使ってみます。 Outputにはノード1のビットコインアドレスへのおつりを返します。 Outputの合計が50.0にならない分の差額はマイナーへの手数料です。 それではトランザクションを作ってみます。 ↑ vinのscriptSigのところは空なのでまだ署名はされていません。
前のトランザクションのアウトプットに署名をすることで自分が使えることを示すって寸法です。

署名してみます。
↑正しそうです。

まだ減ってはいません。
送ってみます。
ノード1は残高が減りました。
ノード2を確認してみます。
confirmation=0で確認してみると、残高が増えています。
を実行するとさきほどのトランザクションが1個含まれています。
このトランザクションを含むブロックをマイニングしてみます。
前置きが長くなりました……
トランザクションはなくてもマイニングはできるのでここまでの手順は不要といえば不要なのですがそこはまあまあ、Bitcoinの授受をやってみました。
実際本番のBitcoinでもブロック高20,000台のブロックはコインベーストランザクションしか入っていないブロックばかりです。

いよいよ本題です。


コマンドだけではできないのでプログラムが必要です。
自分でも作ってみたのですが、エンディアンがどうのこうのでけっこう苦労します。
ブロックを作ってsubmitblockしてエラーが返ってきて、そのキーワードをググると下記に行き当たりました。
bip-0022.mediawiki
一応regtestでは受け入れてもらえるものはRubyで作れはしましたが……
自分で書いたのは150行くらいで難しいところはbitcoin-ruby様です。




今回はntgbtminer様を使います。 Python 2系で書かれた430行くらいのプログラムです。 nightminer から ntgbtminer に鞍替え 〜 簡単なpythonプログラムを使ってbitcoinの採掘を試してみる、その5 をたいへん参考にさせていただきました。
ありがとうございます。
↓この記事を書いたときに使ったソースのコミットIDです。
先頭の方の以下のように書き換えてノード2がマイニングすることにしてみます。
最後のほうを書き換えます。
第1引数はgenesisブロックの"The Times 03/Jan/2009 Chancellor on brink of second bailout for bank"みたいなメッセージのことです。
第2引数は今回はノード2のビットコインアドレスを指定します。

マイニングを無限に続けるので、今回はブロックを1個みつけたらbreakするようにしました。
マイニング難易度は低いのですぐに掘り当てます。
bitcoin-cli getblockchaininfoを実行するとblocksが1個増えていることを確認できます。


=> コインベーストランザクションとさきほど送信したトランザクションが含まれていることが確認できます。


まだノード2の残高には含まれていません。

100ブロックconfirmationされると増えるはずです。
ノード2の残高を確認してみます。
10(ノード1からもらった) + 0.00001(手数料) + 50(報酬)になっています!

最後にntgbtminer様で作ったブロックの先頭のトランザクション(コインベーストランザクション)を見てみます。
vin[coinbase]のところを確認します。
先頭の0x01は、次に続く1byteがブロックの高さを表すことになっています。
次の0x66は10進数で102で確かにブロックの高さが合っています。
746f726966756b75206b61696f75はたとえばirbで実行すると、さきほど指定した文字列になっています。
本番のbitcoinでは2017/10/15現在のブロック高が43万くらいなので先頭は03でブロック高は3byte続いています。
10分に1回くらいで新しいブロックが作られるのでそのペースで行くと、300年後までは03(ブロック高3byte)なのだそうです。

ntgbtminerはブロックを探す処理自体は本番でも動きます。
動かす際には一番最後の行を自分のビットコインアドレスにするのを忘れないようにしてください。
デフォルトは作者のビットコインアドレスが指定されているようです。

もし仮にブロックを見つけたときに送信したブロックが本番で受け入れてもらえるのかどうかはわからないです。
regtest環境でOKだったんで大丈夫だとはおもいます。
天文学的に低い確率なのでブロックを探し当てることは難しいのでしょうけど、私は宝くじは積極的に買いに行くタイプなので動かすだけ動かしています。
追加のライブラリは不要ですし、処理を見る限り問題ないとおもうのですが、使う際は自己責任でお願いします。






2017年10月12日木曜日

[Bitcoin]マークルルートを調べてみる

ブロックにはマークルルートというものがあります。

私は疑り深いので、あるブロックのマークルルートが本当に正しいのかをRuby標準添付ライブラリだけを使うというしばりで確認してみたいとおもいます。
(P2PKHはこのしばりが失敗におわりました。今回はどうでしょうか)

前提

Bitcoin coreインストールしておく必要があります。






合いましたよ! おっかさん!

あとtxidってtransactionのバイナリデータのハッシュ値だったのね。