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のバイナリデータのハッシュ値だったのね。








2017年10月11日水曜日

[Bitcoin]世界一ビットコインをもっているビットコインアドレスを探せ!

すでにここ に答えがでていますが……

コードは長くなるので恥ずかしながらGithubにあげておきました。

RubyMySQLを使っています。

実行するマシンのスペックやネットワークの状態などにもよるのだとおもいますが、3日間くらいずっと動かしつづけてやっと2万ブロックくらいまで解析が進んだ感じです。
2017/10/11時点のブロック高が489354くらいなのでいつになったらおわるのかはわかりません。
全取引が公開されているのだから各ビットコインアドレスごとの残高もわかるはずです。
世界一のBitcoin持ちは誰なのでしょうか?

ビットコインアドレスはウォレットの中でいっぱい作られるらしいですし、アドレスから個人を結びつけることはできないので誰かまでは結局わかりません。

bitcoin-cliを使ってでてきたJSONを眺めてもなんだか理解が進まなかったので「世界一ビットコインをもっているビットコインアドレスを探せ!」をスローガンになんとなく作ってみました。

作ることでわかったことは

- 各ブロックの先頭のトランザクションはコインベーストランザクションと呼ばれるものらしく、これのvoutに報酬と手数料(各トランザクションのInputとOutputの差の総額)がvalueに入っているようです
- きっとマイナーのビットコインアドレスあてに送られているのでしょう(間違えて私のビットコインアドレス宛にこないかしら笑)
- 各トランザクションには手数料は明示されないという部分とごちゃごちゃに考えてマイナーの報酬を別途計算しないといけないのかなあとかおもっていましたが、そんなことをしないといけないとすると手数料とマイナーをどうやって結びつければいいんだという話になってしまいます
- vinは出金したことになるのでトランザクションIDとvout(何番目か?)から前のトランザクションのvoutをたどってここのvalueをaddressesに書いてあるaddressが使った(マイナス)ことにして、voutは入金になるのでこのvalueをaddressesに書いてあるaddressに足すことにすれば全アドレスの残高を導きだせるはずです
- 文字にするとごちゃごちゃしますがコードを書いてみたほうが理解が進んだ気がします
- "type": "nulldata"でaddressesがないvoutなんてものがありました
- トランザクションIDは06f36d781af55d4ab4665d791efed6d4e6a6b20571b0f9f8411c5db0c5308065です

Bitcoinを技術的に理解する
わかりやすかったです。
ありがとうございます。

各トランザクションの手数料はどこにいくのかといのがなかなかわからなくて、上のスライドの59ページにコインベーストランザクションの説明に「25BTC + 手数料」と書いてあったのを足がかりに以下の記事で間違いないとおもいました。

bitcoin wiki

A special kind of transaction, called a coinbase transaction, has no inputs. It is created by miners, and there is one coinbase transaction per block. Because each block comes with a reward of newly created Bitcoins (e.g. 50 BTC for the first 210,000 blocks), the first transaction of a block is, with few exceptions, the transaction that grants those coins to their recipient (the miner). In addition to the newly created Bitcoins, the coinbase transaction is also used for assigning the recipient of any transaction fees that were paid within the other transactions being included in the same block. The coinbase transaction can assign the entire reward to a single Bitcoin address, or split it in portions among multiple addresses, just like any other transaction. Coinbase transactions always contain outputs totalling the sum of the block reward plus all transaction fees collected from the other transactions in the same block.







[Bitcoin]Pay-to-Public-Key-Hash (P2PKH)を検証してみる

前のトランザクションのOutputをInputに使うわけですが、秘密鍵をもっている人だけがそのOutputを使うことができます。


↑こちらの本を読んでいるとコーヒーショップの支払いの例として
Outputにはlocking scriptに
OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKING
と書いてあって

Inputにはunlocking scriptに
<Cafe Signature> <Cafe Public Key>
と書いてあってこれらを組み合わせて

<Cafe Signature> <Cafe Public Key> OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKING
この検証scriptがTRUEになったら有効な秘密鍵をもっていることになるらしいです。

なんのことやらさっぱり? なので、具体的なデータをみてみます。

トランザクションID=07e8989e7bc46f87485b975f153a3887e76c3e63f0a0d88af70186bbf1ce8306

のInputの0番目が解錠条件を満たしているのかbitcoin-rubyは使わずにRubyの標準添付ライブラリ は使ってよいというしばりで検証してみます。
このトランザクションIDは本物のbitcoinで使われているトランザクションです。

BLOCKCHAIN
chainFlyer

このトランザクションIDは適当に選びました。

前提

bitcoindインストールして動かしておく必要があります。


OP_CHECKSIGをまだ理解できず、bitcoin-ruby 様の力をお借りしました。
理解して書き直したいとおもっています。



2017年10月10日火曜日

[Bitcoin]Genesisブロック

事前にBitcoin coreインストールしておきます。

"The Times 03/Jan/2009 Chancellor on brink of second bailout for bank"
をみたいのです。
一番最初のブロックにこう書いてあるらしく、2009/01/03以降に作られたことを証明しているのではないかと言われています。


↑バイナリを直接のぞくと先頭のほうにみえます。

Genesisブロックのトランザクションはそういうものらしいです。
Issues #3303


参考
https://en.bitcoin.it/wiki/Genesis_block







[Bitcoin]Bitcoin Coreのインストール

Bitcoin Coreをインストールしてみます。


コンピュータはmacOS High Sierra 10.13を使いました。doc/build-osx.mdを参考にします。Homebrewが必要なようです。




Bitcoin ClockUpMemo にいろいろなコマンドが紹介されています。







[Bitcoin]Bitcoinはじめました

私はBitcoin、ブロックチェーンのことをこれから勉強しようとしています。

これらを勉強中です。


1. ビットコインとブロックチェーン:暗号通貨を支える技術


2. いちばんやさしいブロックチェーンの教本 人気講師が教えるビットコインを支える仕組み

3. ブロックチェーン・プログラミング 仮想通貨入門



1番は必読の本らしいのですが最初私にはとっつきにくかったです。
2番⇒1番⇒3番と読み進めています。


ブロックチェーンについては
ソフトウェアデザイン 2017年 10 月号
の"書いて覚えるSwift入門 第30回 SD読者ならわかるブロックチェーン入門"が最初のとっかかりとしてわかった気にさせてくれました。
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]
Software Design (ソフトウェア デザイン) 2017年 10月号 [雑誌]
価格:1317円(税込、送料無料) (2017/10/10時点)