2017年12月29日金曜日

[Expo][Publish][2017/12/29 14:30 現在] はじめてのPublishが失敗する => Unhandled JS Exception: TypeError: undefined is not an object (evaluating 'this._subscribableSubscriptions.forEach') => 回避策

最近、React Nativeをやっています。
ワンソースでiOS、Android両対応アプリが作れるという優れものです。

その中で知ったExpoPublishingを使ってアプリを公開してみました。
ローカルでは動いていたので問題ないとおもいましたが、問題ありました……

端末に表示されているエラーメッセージを打ち込むとそのものズバリの情報がみつかりました。
Unhandled JS Exception: TypeError: undefined is not an object (evaluating 'this._subscribableSubscriptions.forEach')

2017/12/29 14:30 現在で3日前に起票されたようで現在進行系の問題のようです。
そのうち自然と解決されるのだとおもいますが、とりあえずここに書いてある回避策を試してみたところ無事Publishできました!

Publishしたアプリはこれです。

回避方法

1. node_modules/react-native/Libraries/Components/Subscribable.js にパッチをあてる
2. uglify-esを3.3.2にする(これがなにものなのかをわかっていないので本当に必要なのかどうかわかっていませんが、問題が報告されているページに書いてあったのでやっておきました)

私はyarnを使っています。

追記

Videoだけのアプリであれば細工せずともPublishして問題なく起動できました。
元の記事読むとreact-navigationの文字がみえます。
いまのところ私の経験則ですが、以下のような感じなのではないかとおもいます。

react-navigation使っていない => 特に細工は不要
react-navigation使っている => 上記の回避策が必要?





[Expo][React Native]WEB+DB PRESS Vol.102のサンプルコードへのプルリクエストを承認していただきました

最近、React Nativeをやっています。
ワンソースでiOS、Android両対応アプリが作れるという優れものです。

その中で知ったExpoを使って、



↑ この本に書いてある天気予報アプリをExpoで作って(写経して)みます。

はい、できました!
GitHub にソースコード公開しておきます。

ExpoにPublishingしたアプリ
weatherforecast
Expo mobile appをインストールしていただいて、QRコードを読み込むと動作確認していただけます。
androidはNexus 5(android 6.0.1)で動きました。
iOSはすみません、実機持っていないのでシュミレータのみでの確認です。
たぶん動くとおもいます。

作って(写経して)いるときに一箇所詰まった箇所がありました。
たとえば北海道を選んだときに天気予報が表示されないのです。
しばらく頭を抱えましたが、検索につかっている文字列を変えてあげればよさそうということがわかりました。
せっかくなのでオリジナルのほうにもプルリクエストさせていただいたところ、すぐにマージしていただきました。
ありがとうございます!



2017年12月23日土曜日

[Electron]憧れのWindows/Mac GUIアプリをつくる

Electron を使いました。

作ったものは↓です。
electron_autorace


プロジェクトの紹介ページはGitHub Pages 使いました。
クール!

他に利用させていただいた主なものは、
React
react-player
material-ui
です。

JavaScriptにはあまり明るくない状態ではじめていまも全然明るくないのが、仕事でReact Native使おうかなあとかおもっていろいろ調べているうちに、憧れ(?)のWindowsやMacで動くGUIアプリが作れるということを知り勉強がてらつくってみました。

node.js
npm
babel
webpack
yarn

はじめてみると↑いろいろな言葉がでてきてうわー たいへんだー と怖気づきそう、いや怖気づきました

JavaScript
習うより慣れろ
見る前に飛べ
です。

JavaScriptをさらっと復習するには
A re-introduction to JavaScript (JS tutorial)
ここがいいとおもいます。

こちらにありますようにいろいろあったようです。
JavaScriptの歴史

そしてどんどん進化していっているようです。

JavaScriptはよく知らない(もちろん他の言語は知っている……)けど、Reactさわってみようかなという方には私が買った本をオススメできるとおもいます。
ただしどんどん進化するのでその点はご留意ください。














2017年11月28日火曜日

[Android] Lombokを使っているプロジェクトでAndroid Studioのバージョンを3.0.1にあげて、薦められるがままにGradleのバージョンを4.1にあげるとアプリの実行ができなくなった

What is Lombok?

公式ページの感じがいつのまにか随分かわったLombokです。

参考

(ながーいコードをとてもコンパクトにできる例がかいてあります)

エラー内容

Android Studioのバージョンをあげると、Gradleのバージョンもあげるといいことだらけだからユーあげちゃいなよとバージョンアップを薦められます。
古いままだとある日を境に使えなくなる恐れがあるのでニューウェーブには常に乗ります。

そうして実行すると、
Project Sync, Clean, Rebuildでは問題は出ずに、Runしようとすると上のエラーがでます。
バージョンあげただけなのにー と泣きたくなります😢

解決方法

annotationProcessorの明示が必要なんだそうです

app/build.gradle



app/lombok.config


参考



2017年11月27日月曜日

詰将棋 2017/11/27

将棋ウォーズ やっているときによく似た感じの局面になりました。
それを詰将棋にしてみました。







画像はShogipic様で作らせていただきました。






2017年11月19日日曜日

[Monacoin][Bitcoin]余ったtestnetのコインをぴったりどこかに送る

testnetで得たコインをぴったりfaucetに戻したりしたくなることはないでしょうか。

Monacoin testnet4 Faucet
Bitcoin TestNet Sandbox

sendtoaddress ですと自動的に計算された適切な手数料が設定されるため、微量のコインが残ってしまいます。

そこで自分で手数料を適当に設定したトランザクションを作って送ってみることにいたします。
Rubyで書いてみました。



bitcoin-ruby を使った例

今回の用途ではMonacoinでも使えます。




標準添付ライブラリのみ

手数料が適切に設定されていないとブロックに取り込んでもらえない可能性がありますのでご留意ください。
私自身はtestnetでしか実行したことないです。



2017年11月12日日曜日

[Monacoin]アドレスと秘密鍵が漏洩したら(Monacoin編)

testnet4での話です。

mwZU2vtfAtupgH2NXRKEUBf3bMT7RSs6Ugの秘密鍵が漏洩したとします。
秘密鍵はcNbXBAD9NJikLztiqTnbhUifXv3w2EwqS4uhHhgBpKB1XzuGQx7Zです。

このアドレスのUTXOはbeefc5e2ac70616968713444c43cda01f765f22344a08ab119d8947c31624c38の0番目です。
100.43 Monaあります。

作業の流れ

  1. createrawtransaction => 未署名トランザクションの作成
  2. importprivkey => 秘密鍵のインポート
  3. signrawtransaction => 未署名トランザクションに署名
  4. sendrawtransaction => 署名トランザクションの送付


以下、msVB7uMdzAwgQuph5pL8Zb7aiYgjYoFH1q宛に送金する例です。
UTXO beefc5e2ac70616968713444c43cda01f765f22344a08ab119d8947c31624c38 は未使用(100.43 Mona)のままです。
どうぞお使いください。








[Bitcoin]Bitcoin Core version 0.15.1 リリース

release-notes-0.15.1.md

Bitcoin Core version 0.15.1 released







2017年11月7日火曜日

[Bitcoin]アドレスと秘密鍵が漏洩したら

アドレスと秘密鍵が漏洩したら残高を持っていかれます。
testnet3でやってみましょう。

アドレスmhdVLfiFtumw5RwyahUoWVkcpEpBK8sARLの秘密鍵は30c5864a8b3ba4ce0749eafa907d3fafab3a572dedb60964aabf5f3086ae8d40です。
このアドレスはbitcoinjのウォレットでつくりました。

さらっと書いていますがけっこう大胆なこと言っています。
(testnet3なので価値なんてないのでそれほど大胆ではないのかもしれません)

アドレスと秘密鍵を運良く? 手に入れたらBLOCKCYPHER等でアドレスで検索をして、UTXOを特定してください。
そしてそのUTXOから自分のアドレス宛に送金するトランザクションを作ってブロードキャストしてください。

他人のものを盗むというか自分の秘密鍵が盗まれないようにしないといけないとおもいました。
(どうやって気をつければいいんだろう)

このまま放置しておきますので、持っていきたい方は持っていってください。
bitcoin-rubyで持っていく例を書いておきます。

bitcoin-rubyをインストールしておいてください。


↑この本参考にしましたー


2017年11月6日月曜日

[Bitcoin][Ruby]送金プログラム

コマンドでやるときはこんな感じ。


bitcoin-rubyを利用して書くとこんな感じ。



↑この本参考にしましたー


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 様の力をお借りしました。
理解して書き直したいとおもっています。