恐らく中国の人が作ったbsvupというライブラリを使ってみたが。(+ bitsocketのライブラリ紹介)

結論ご本人が提供しているWebサンプルでは動作したが、それ以外のサンプルを自鯖で動作確認することができなかった。
github.com

  • Private Keyからのパターン
  • Signerからのパターン

私がnodejs達者ではないのも原因だが、READMEのサンプルがそのままで動くものが一つもない。諦めずにmodulesの中も見て、そこにもサンプルのコメントがあるので試したがダメ。

unwriterのdatapayのようにサンプルコードをコピペしただけで動作が確認できるレベルではなかった。これがあまりにも簡単に動けば、bsv(moneybutton)モジュールやB://、D://プロトコルの学習が不要になるくらいのものだが、そう簡単にはいかないらしい。

もちろん黎明期であるため、本人に直接質問してもそこそこ質疑に答えてくれたりする。しかし今回はそうしなかった。

これを教訓にB://、D://プロトコルの動作を自身で確認をしつつ、自身でjsのapiを作成をしようと思った。apiは自分用。他人に使われると負荷に耐えられる立派なサーバがないため。

しかし、今あちこちでモジュールのラッピングライブラリの開発と公開が成され始めている。この中で根気よく更新し続けたり、シンプルで直観でも動くような分かりやすいライブラリが勝ち残っていくことになる。

例えばbitsocketのライブラリが直近共有された。
github.com

bitsocketはリアルタイムでbitcoin txを取得できる代物だ。これでtxの速さや、量を見たり、つまるところチャットの様なサービスを展開できる。今のところブロックチェーンでチャットサービスを展開したところでビジネスに直結しないためだれもお遊び程度しかいじってなさそうだが、データをアホほどため込むことになるチャットサービスのサーバ維持費がとてつもなく安くなる。そのうち出てくるだろう。

このように追いかけても追いかけても次々に誰かがどこかでmake and buildしている

sCrypt 学習用まとめ

slackはこちら
http://scryptworkspace.slack.comscryptworkspace.slack.com

開発者github(BCH時代のREADME)
github.com

他勉強しながらリファレンスなど記述を試みている方のgithub
github.com

BitCoin Scriptはブロックチェーンの仕組みやOP_RETURN上に絶賛構築中のプロトコル、それらを利用しやすくするライブラリなどいろいろ知り得た上で到達するべきところに思うので、一旦情報を軽く追いかけるだけで他に注力する。

Metanetでの構築は少し待つ(2020年3月現在)

以前は稼働し始めた感じでしたが、現在は各エンジニアが他に優先すべきプロジェクトに取り組んでおり、Metanet系のライブラリはちゃんと動かないみたい。

moneybuttonのbsvライブラリにはじまり、_unwriter氏のMetanariaエクスプローラーやAPI、さらにはそれらをより手軽に登録閲覧ができるplanterやtreehugger。

これらを試したかったが時期が悪かった。しばらくはMetanetを使わない構築で学ぶべきものを学ぶ予定。

metanaria.planaria.network
github.com
treehugger.bitpaste.app

ライブラリが稼働していれば、あまり根底の知識が無くても階層構造でページを作成できるようになる。
mnp(ブロックチェーンDNS)もこれからゴリゴリブラウザ制作者の頑張りを見守るフェーズ。
今すぐすぐよりほかが優先なのはそのためだろう。

Metanet抜きで各プロトコルのテストをしていこうと思う。B,C,MAP...
github.com

github.com
map.sv
ほかにもプロトコルがあったけど、忘れてしまった...

他キーの親子関係をテストしないといけない。metanetにもつながる。
docs.moneybutton.com
ニーモニックも復元とやらだから面白そうなので試してみたい。
docs.moneybutton.com

いまだになんのこっちゃなのが、ECDSAとSignatures。これの必要性が分からない。パラメータにsigとかあるんで必要なんでしょうけど...
学べば学ぶほど、ほったらかしていたところや、新発見が次から次へとでてくる。
docs.moneybutton.com
docs.moneybutton.com

21e8minerで少し遊んでみました?

そもそも21e8とは何か、そのマイニングとは?となります。これ情報が少ないのですが、21e8は簡単に言うと、魅惑的な、不思議な、話題になった文字列という感じです。

21e8が話題になったのは2018年で、当時は物議をかもしました。詳細については英語ニュース記事をお読みください。

www.coindesk.com

そんな話題がありつつ、魔法のワードとして盛り上がりました。

hex(Magic Number)にその指定のワードがあるとパズルが解ける遊びどう?ってのが21e8minerです。※違ったらすいません。
違うと言いますか、意味深な発言が多くて、それは将来の設計を元の発言のようです。知りたい人は知れる世界。

pow.market

こちらのサイトを見ると、unmined, minedと別れています。この未採掘のtxでhexがtargetになるものを総当たりで見つけ出します。

まるでそれはPoWマイニングですね!それで21e8minerと言われる訳です。この未採掘txを公開する側のメリットはただの賞金問題主催者であって、見て遊ぶくらいでしょうか。マイナー側はハッシュパワーがあるならば、小遣い稼ぎになる感じです。と、言っても簡単なものはすぐに採掘され、難問はそもそも安いし、長いこと放置されます。

試しに採掘側と賞金を出す側をやって見ましたが、マイニングはサーバが重くなるし、採掘できないし、賞金は問題が簡単すぎてサクッと持っていかれてしまいました。とはいえ、難問設定してもまるでゴミみたいなtx面白いのか?というところであります。

ということで、もしご興味あれば皆さんもやって見てはいかがでしょうか。やり方が分からない?分からないならあえてやる必要もないです(笑)

github.com
github.com

興味がどうしてもあるなら以下の有料資料を買ってやってみてもいいかも!?
これ大事 → "Mine 21e8, or don't, whatever."
bit.sv

あ、たぶんgitでソースを読むのが一番価値があるわ。

あるBitcoinアドレスに関連したUTXOを見つけ出す bitdb query

https://api.bitindex.network/api/v2/addrs/balance?address=ADDRESS

このサービス便利だけど課金になってしまったって思ってたのよ。
でもね自分で調べればいいじゃないのって。

最初はUTXOを見つけて算出って何?みたいに思ってたんですが、

$query = base64_encode('
{
  "v": 3,
  "q": {
    "find": {
      "out.e.a": "'.$address.'"
    },
    "limit": 1
  }
}
');

はい。最後の取引で指定のアドレスが振り込まれた額が残高です。間違いでした。加算しないといけない。
まぁ昨今のウォレットとかは、個々の傘下に大量のアドレスを都度都度発行するので、合計額みたいなの発行している運営側でないとかなり厳しい。なんか頑張ればいけるっぽいと聞いた気がするが...ふつうは無理だよね。

このクエリーはそうです。これです。
genesis.bitdb.network

今回は自前のサーバで出力するので、base64のにしてbitdb APIにリクエストします。
レスのc.0.out.e.aが指定アドレスのc.0.out.e.vが残高になります。

そです、これだけです。これだけのために課金APIは使えないね!

これまでのBitDB記事
online106.hatenablog.jp

bitcoin script "OP_3 OP_ADD OP_6 OP_EQUAL"

前提知識では、ロック、アンロックのスクリプトがあったと思います。
では実際にロックスクリプトを入れて、アンロックスクリプトを送ってみましょう。

これは知ってる人は知っている界隈で活躍されている方の教育?商材がありますのでそれを見てください。
検証込みで30円程度で揃います。動画が20円くらい、サンプルスクリプトが10円くらい。
こんなん流行りだしたら丁寧な日本語解説付けて数百円で販売しても沢山の人が買いそう。
streamanity.com

こちら解像度は低いですが、動画説明のリファレンスやサンプルなどを併用すれば分からないことはないと思います。

In the video I show how we can create an output that has a nonstandard script and how we can spend it again.

Here is an example of a successfully spend output:
https://whatsonchain.com/tx/36b8f60a3306e7a49a2d828bb4d262515065735efc8b32acabcf0fb78fbdc7a2

The link shown in the video to the page for creating the nonstandard output scripts:
https://sym.re/SrFMT9v

The source code is available on bit.sv (not yet available to all):
https://sym.re/4EU7ENr

streamanityは視聴分だけbsvを支払う動画サイトですが、結局このサンプルは全部見るし、何度か見ることがあると思う。
moneybuttonはBSVブロックチェーンサービスにおいて根幹を構築されている方々です。
私は_unwriter氏のライブラリから入りましたが、これもmoneybuttonをより用途向けや、簡単に使うためのライブラリで根幹にはmoneybuttonが存在します。

本題です。
bico.mediaはhtmlソースを見てもらうと分かりますが、moneyButton jsでロックスクリプトの入れ方が分かります。
自分は入れることが出来ても、それをどう試すか分からなかったので、本動画は非常にためになりました。

動画では
"OP_TRUE"
のパターンと
"OP_3 OP_ADD OP_6 OP_EQUAL"
をテストしてくれています。テストというか正解パターンのみ見れます。

OP_TRUEはOP_1と同じでtrueです。つまりなにもしなくてもアンロックされるという事です。
次は、3+x=6にならないとアンロックされないスクリプトです。答えは3なのでOP_3を入れると解除されます。
動画では解除したパターンしか見れないので、試しにワザと外してみました。OP_4です。

で、ブロードキャストというのをwhatsonchainのサービスで実行しています。これを行うことで、はじめて世の中のパブリックブロックチェーンに刻まれます。このときunlocking scriptがエラーの場合、公開されず400ステータスコードのエラーが返ってきます。datapayだとこの辺が意識しなくても公開処理までしてくれるので、やはり便利ですね。

qiita.com

locking scriptが簡単すぎると、すぐに取られてしまう恐れがあります。
例えば「OP_2 OP_EQUAL」で生成したアドレスなどです。
これらは悪意ある自動ボットから、容易に所有権を奪われる可能性が高いです。
そのため、少しは難易度の高いパズルにしましょう。

しかし難易度が高すぎるのも問題です。
なぜなら正しいスクリプトが分からなくなると、一生解除できなくなるからです。
それはビットコインの所有権を放棄したと同義で、セルフGOXに値します。

ビットコインの所有権については、必ずしも秘密鍵や署名が必要ではないことを知れたと思います。
これがビットコインの面白い仕様であり、難しいところでもあると思います。

これを応用すると、例えばある人の誕生日を知っている人や、秘密のフレーズを知っている人だけがビットコインの所有権を得ることができる、という仕組みも実現できます。

これはもう少し出来る人の動向を見守った方がいいかな。動作確認しただけで、いまいち活用の仕方が分からない。
複雑なlocking scriptに対して複雑なunlocking scriptで返す意味があるのかとか気になる。

Money Button OAuth を実装してみた

詳細には書きづらいので概要のみになります。

これjs版もあるそうですが、私はcurlAPI叩きまくる方。
導入の敷居としては他のOAuth実装経験あれば行けると思う。

まず英文のマニュアル。これを読めば経験者ならいけるはず。

docs.moneybutton.com

docs.moneybutton.com

まず最初にマネボアカウントの設定画面でcreate new appで
必要項目を埋めて、

  • Client identifier
  • OAuth identifier

を使用します。
OAuth redirect URLは入れておいてください。
まるでパスワードかのようにAPIで使います(笑)

まずはhtmlにログインしてなければマネボのログインボタンを出して、
そのとび先をauthorize API のURLにします。

https://www.moneybutton.com/oauth/v1/authorize?
  response_type=code&
  client_id=<your app oauth identifier>&
  redirect_uri=<your app redirect uri>&
  scope=<your selected scope>&
  state=<client generated random string>

stateはセキュリティのために自分で用意した文言を入れてAPIレスポンスでその値が返ってくるので照合します。
セッションIDでもいいかな...。

scopeなんですが、なんのこっちゃですが、ここで使用するAPIをいれます。その使用許可を下したアクセストークンが返ってくる仕組みです。
ここで指定しないAPIは権限がなく使えないので、ここでしっかり入れる必要があります。

一番手堅いのが"auth.user_identity:read users.profiles:read"です。
user_identity APIとprofiles APIがあればOAuthは実現できるためで、それ以外のAPIは必要に応じて追加しましょう。

これでマネボからリダイレクトURLに返ってくるので、そのGETパラメータをトリガーにログイン処理を開始します。

続いてはcurlでPOSTリクエストでtoken APIを実施します。これのレスポンスでアクセストークンが手に入ります。

curl --request POST \
  --url 'https://www.moneybutton.com/oauth/v1/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=authorization_code \
  --data client_id=<YOUR_APP_OAUTH_IDENTIFIER> \
  --data code=<YOUR_AUTHORIZATION_CODE> \
  --data 'redirect_uri=<same redirect uri that you used to get the auth code>'

で、そのままAPIを叩き続けます。続いてuser_identity APIです。これでマネボのユーザIDや名前が取得できます。
ここはGETになって、ヘッダーにアクセストークンを埋める必要があります。ここが少し癖があります。GETパラメータの方が楽なんですけどね...セキュリティの観点でしょうか...

curl --request GET \
  --url 'https://www.moneybutton.com/api/v1/auth/user_identity' \
  --header 'authorization: Bearer <YOUR_ACCESS_TOKEN>'

で、これだとマネボのメアドやサムネが手に入りません。いらないと言えばいらないんですが、折角なんで利用したいのであれば、ここでUser Profile APIです。

GETリクエストでscopeに"users.profiles:read"を指定します。headerにアクセストークンもいれます。ないと動かないと思う。試してないけど。

https://www.moneybutton.com/api/v1/users/{userId}/profile

これであとはこれらの取得データをセッションやら適所ユーザTBLにいれたらOAuthの完成です。
ログイン時間は1時間なので、延長させるためにアクセスの度に更新トークンを実施します。

curl --request POST \
  --url 'https://www.moneybutton.com/oauth/v1/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=authorization_code \
  --data client_id=<YOUR_APP_OAUTH_IDENTIFIER> \
  --data code=<YOUR_AUTHORIZATION_CODE> \
  --data 'redirect_uri=<same redirect uri that you used to get the auth code>'

これがうまく行かない場合はerror jsonが返ってくるので、サーバ側でもログアウト処理をいれるとよいでしょう。

と、こんな感じで微妙にコーディング量はありますし、やけにAPIにアクセスするのでマネボの負荷が気になりますが、完成です。