toychainではじめるsqlite メモ書き

DBは三つで構成されている。

.schemaでテーブル構成が分かる。wallet, chain, txかな。

sqlite> .schema wallet
CREATE TABLE wallet (id INTEGER, xpriv, xpub, priv, pub, address, PRIMARY KEY (id));

sqlite> .schema chain
CREATE TABLE chain (id INTEGER, tx TEXT, parent JSON, edge JSON, spent INTEGER, PRIMARY KEY (id));

sqlite> .schema tx
CREATE TABLE tx (id TEXT, tx TEXT, genesis INTEGER, sent INTEGER, PRIMARY KEY (id));

はじめtxやろ!って見てみたが、見てもよく分からず、txとブロキャス前のtxだなぁ。これだけみてどうするんだろって思ってchainみた。

id: 62
tx: toyなtx
parent: [30]
edge: {
	"address":"発行したアドレス",
	"txId":"toyなtx",
	"outputIndex":1,
	"script":"76a9149ee03f3135f0b7b9ecabab953c3087a165b7764d88ac",
	"satoshis":1192
}
spent: 0

サンプルに1行抜いてきた。spentってのはutxo的なものだろうか。まぁ勝手に処理してくれるところはあとでしればいい。toychainの欠点はGETにあり、条件検索とかで引っ張ってきにくい。なので、もはやdb直で検索した方がいいと思っている。その際、chain.edgeがそれだなと分かる。因みにこのレコードは、公式のサンプルスクリプトを叩くと生成されるレコードです。内容はただの連番記述してtoyにブロードキャストしているだけです。つまり、公式にもほぼ同じものが記載されています(笑)。

と、眺めていたんですが、これはどうもあれらしい。ブロードキャスト前のbsv.Transactionでできるtxが、txTBLにあって、chainTBLもOP_RETURN的なものは格納していない。...なるほどどうりでpowpingでtoychainを使ってない訳です。あくまでtoychainはブロードキャスト前まで処理して、任意のタイミングでpushしてねってとこまでのものらしい。なので、OP_RETURNにいれるべきデータは別で自分で持っておいた方がいいっぽい。うーん、セカンドレイヤーはこの時は意識してなかったってことになるな...推理してもしょうがないけど。

どうりでGETが弱い訳だ。アップする前に参照して使うとかそんな想定してないと...。と、いうことでsqlite toychainはあくまでBCに上げるためのDB達でaddして、アップしないならaddのデータは自前で保管しておきなさいと。これだと、DBにぶっこんどいて、お好きにmbでアップしなさいとかわらなくね?どうする?

ちなみにtxTBL

id: toyのtx|
tx: ブロキャス前のhex(tx)|
genesis: 0|
sent: 0

genesisってのが上げたか、上げてないかみたいな。結局実行して試した人しか伝わらない書き方になったな。

DBを作る
# sqlite3 project.db
テーブルを作る
> create table user(id integer primary key autoincrement, type text, type_id integer, name text, mail text, avater text);
テーブルを確認する
> .table
> .schema
sqliteを抜ける
> .exit

エンジニアも触らない toy chain の世界

まえがき

sqliteなんて触る機会すくねーんだよ。使ったらまず「なんでsqliteで実装したんですか?」って言われるんだよ。

ほんだい

toy chainっていうものがあります。使用意図がまったくエンジニアをひきつけませんでした。
「自前でテストネット構築できるよ!」
「運営のタイミングでメインネットに上げられるよ!」
その手間、メインネットで直に実装するわ。
テストネットで動いてメインで動かなかったらどうすんだよ。
マニュアルあるけど、これメインでやってた方法まんまつかえるわけでもねーじゃねーか。

かだい

そうなんです。toyはtoyのまま使い道あるの?っていう臭いがプンプンしててほぼ誰も触ってない。
スラックでも一人だけ質問していました。それだけです。4か月前にね。

さいき

powpingが誕生しまして、セカンドレイヤーみたいなもんですよ。なんだこれはと。
世界にただ一つのパブリックブロックチェーンじゃねーのかよと。即座に絶賛してるやつ意味わかってるのかよと。
でもね、つくったことあるエンジニアなら分かるんです、直ちにビジネスしたいならこれは光であると。
bitcoin scriptも序章を執筆し始めたくらい。学んでもおっしゃこれじゃほれみろやーみたいのはできません!
話を戻します。

そうはいってもですね...
「セカンドレイヤーは運営が無料で提供できます。で、メインに上げたい時だけ個人に請求できます。」
これよ、なぜこれをライトニングでやらねーんだと。ここが天才な点です。

まぁもっというと、セカンドレイヤーである必要がない。なんでもかんでもBCだと、なんにするにしても金が掛かる。
これだと無理だから間口広めましょうと。

ちなみにpowpingはtoychainではなく、新たにビルドしているそうです。でもこれtoychainの派生というか上位互換でできています。
これがあの人の頭にあったのか、資本が入って入れ知恵されたのか分かりませんが、非常にいい所をついてきました。

もともといきなりフルは受け入れられない。これは私にも結構皆さんの頭にもあったはずです。
ハーフとか、ハイブリッドなサービスからでないといけないと。

一つにですね。ログインがmbアカウントってパンピーにはもう敷居高いですよ。この辺は頭ブロックチェーンな人は無視しがちです。
無視しているというか最初の作品は極力完全体で作りたいってのもあります。no dbで行きたい。実際できます。

わかりますよね。極力なんでも乗せたいのです。だって、ブロックチェーンwikipediaです!ってPJTがあったとしましょう。
そこで大事な解説部分は、PJTのサーバのDBにしかありませんって、それワイブロですよね。そこはチェーンに上げろよと。
そして編集出来ろよ、削除出来ろよと...そこまでできてブロックチェーンサービス作ったと言えるエンジニアだろと。

ただこれ、やるとめっちゃレスポンス遅いんです、手数料もわりと高いんです。なので勉強はするけど、時間がワイに追いついてからだなと。
いつものように最先端ひた走っちゃう悪い癖だなと思ってた訳ですよ。

でもtoychainならBCに触れながら、ある程度考えれば無料でサービスを提供できます。課金部分は別に考えることができます。
それじゃこれまでのサービスと変わらないじゃないかと言えますが、コロナくらい大きな動機がないと人って舵取らないんで、その日まではこれ何だと思います。

あとがき

toychainまわりの覚えるためのメモ書きのつもりで雑談で終わってしまった。

なんとなく、ここらへん入れてる。 react歴 2ヶ月

npm install -g npm
npm init -y
npm install --save react react-dom next
npm install

npm i next-compose-plugins
npm i eventsource
npm i next-iron-session
npm i isomorphic-unfetch
npm i router
npm install @material-ui/core --save
npm i @material-ui/lab
npm i material-ui-popup-state

npm install --save @tinymce/tinymce-react
npm i react-device-detect
npm i -S sqlite3
npm install react-hammerjs --save
npm i sse
npm i -g pm2
npm i react-copy-to-clipboard

こうメモ書きするより、package.json保管してnpm installすればいいんだなと思った2か月目。

なぜ AUTHOR IDENTITY PROTOCOL (AIP)が本人である証明になるか

他所のこの人だなーこのコンテンツだなーっていうAIPをコピってですね。まるまるOP_RETURNにぶっこんでもそれ本人と言えるの??って単純な話です。AIPぶっこむ分データ量かかるわけですよ。

もちろんそんな誰でも思いつく偽装で問題でるはずないんですが、だと思うという理解で実装してもあたまおかしいので勉強することに。

AIPはルールで、肝はここ

[Signing Algorithm]
何のアルゴリズム使うの?

[Signing Address]
どのアドレスでそれしてんの?

[Signature]
その結果の著名はこれ

です。

アルゴリズム BITCOIN_ECDSA とは

BITCOIN_ECDSAでやる。それはマネボのbsv.jsでできる。
docs.moneybutton.com

privateKeyとpublicKeyがあります。秘密鍵と、公開鍵。sshと同じですね。

何らかのデータを秘密鍵を用いてECDSAで暗号化します。で、公開鍵で検証するとこれは正しいと判定できます。

どうやって判定するなどの理論はすっとばして、それを検証するプログラムがあるんです。

  • bsvには、bsv.crypto.ECDSAの署名と検証を含む、ECDSA と呼ばれるオブジェクトがあります。
  • 最も重要な2つの方法は sign、およびverifyです。
  • 署名を生成するには、秘密鍵とデータが必要です。
  • 署名を検証するには、公開鍵、署名、および検証するデータが必要です。

AIPのルールに従う必要があるのか?

暗号化と復号化以外にアドレスがあると、復号が万が一解かれてもそれがネックになる?...のであればまぁ分かる。でも出どころの保証ができてなくね?つまりAIPの形式が必要最低限って訳ではなさそう。

まるコピして本人になりすまして偽装txしたらをどうすんの?っていう問題はこの投稿内容をキーにしていればほぼ偽装防止できる。やっと合点いった。ずっと後回しにしていた。逆にそれをキーにして、ECDSAを発行することは最低必須条件になる。

あとは検証してみれば分かるけど、データ量に応じてECDSAも長くなるのかなぁ?ってこと。普通に考えるとそうなる。となるとデカい画像や動画にはまだコスト面で厳しそうだなぁ。

ちなみにほぼ偽装防止と言ったのは、発言内容を偽装してなりすますケースは防止できるけど、発言まで同じにしたら本人の発言として別のところに生むことができてしまう。これで困る事ってあまりないけど...だからSigning Addressをキッカケにするのかな?これがあるとどこの誰が著名の仕組みりようしているかアドレスで追いかけれて、「いや、それうちだけど、こんなところにtx残さないよー」「だったらこのtxと同じ著名を作ってみせてよ、あなたが本物ならね?」って確認取れるって話?それならすごいな。結局AIPのカタチがベストかも(笑)

nextjs(reactjs) + bitsocketに決めた話

先に要点

nextjs9.4時点でwebsocketサンプルが少ない。
一旦なんちゃってchat風のプロトタイプは出来た。
nextjs関係ない実装になったけど。

はじめに

昨今のbitcoinエンジニアはnodejsを使います。
ライブラリなどのサンプルもnodejsかpython
Deno(デューノ) v1がでたけどフレームワーク
などもまだなので、Twetchも使っているnextjsを
使うことにした。

プログラミング言語の情勢(特にjavascript)

いくつかの記事をみました。
https://note.com/erukiti/n/na654ad7bd9bb
日本でシェアのあるPHP。これがWebsocket系に弱い。
まぁjsでやればいいんだけど...。それどころか情勢を見ると、
PHPでよくね?第一筆頭のRubyは超急速にシェアを失っている。
フルスタック型?のプログラムがもうオワコンのようだ。

nodejs(nextjs)について

こういう便利ライブラリの知識が皆無。
確かこういうのあるよね?みたいな知識を育まないといけない。

npm install eventsource
npm install classnames
npm install sass
npm install remark remark-html
npm install date-fns
npm install gray-matter

一見遠回りだが、nodejsを用いてブロックチェーンツールを使った方が非常に楽で便利になる。恐らく1か月後には開発スピードが追い付く。サンプルもあるし、質問を投げても当然答えてくれる人が多い...と思う。unwriterもまだ古いライブラリを使っていると度々アラートを流しますがnodejsで構築してないと、どうにもこうにもbitsocketは使えないんですよ。

雑談

そうそうなんでこう舵を切ったかというと、unwtiterのツールが古いものから徐々に障害起こしたり、復旧もしぶしぶやっている感があり、新しいの使ってくれと毎回アナウンスしていたからです。そう、もはや先月使ったものがまともに動かない事態に(笑)。あなたはこの世界に飛び込みますか?mbが作成したbsvライブラリはv2を開発中で、そこも結構なインパクトになると思う。もう学習予定が山積みになっているし、共有したところで来月には動かなくなっているかもしれない。

それにnodejsは序章でbitcoinエンジニアはその先のbitcoin scriptでマイナーというスーパーコンピュータにプログラム処理を極力預けなくてはいけない。そこまでできないと、ワイブロになる。それブロックチェーンでなくてもいいよね?と。セキュリティ確保もここが肝だと思う。学習最終到達地点だと思う。最初にここだけやっても何も作れないので、ある程度作ってから、こここれで置き換えられるんじゃね?というやり方で、皆やっていくんじゃないかと妄想している。

実際世の中にあるビットコインブロックチェーンサービスはブロックチェーン使っているから処理が遅いアプリと、ブロックチェーンはごく一部で、使ってる風だから処理が遅くないアプリがほとんどです。これはマイナーのスペック向上と、コンテンツがマイナーをうまく利用する必要があります。

今回冒頭に記載したチャットもどきのプロトタイプはTwetchの投稿をリアルタイムで取得して表示する感じです。あとはテストで何かしらnextjsでブロックチェーンにデータをアップできたら、やり取りは成立します。

ビジネスで考えると合理的にユーザへのサービスを向上(UX)させるのですが、趣味と思想と学習を兼ねて作りたいので、フルブロックチェーンを目指していきたい。

追記

勉強する前に宣言するからこうなるんだが、nextjsはサーバサイドjsなので、websocketやeventsourceとは相性が当然の事悪い。チャットなのが特にそうで、たまたまチャットで始めてしまったが、幸か不幸か早々壁にぶち当たった。ブログや掲示板程度ならよいが、相互疎通系非同期系はnextjsなしのreactでいくか、場合によってはjqueryの方が良い。

さらに追記

苦節数十日。実装できました。もはやブロックチェーンよりreactばかり学習しています。

OP_PUSH_TX

ロックスクリプトコントラクトをデータとコードの2つの部分に分割する

OP_PUSH_TXを使用すると...
コードはメソッドであり、データはオブジェクトのメンバー変数...

要はロック解除すればデータは更新できる。
サンプルとしてカウンターが紹介されています(testnetです)。

medium.com

github.com

ロック解除する権限があれば、数字を更新したtxを生み出せる。
が、今のところここだけなのでまだピンと来ない。これから画像をセピアにしたり、辞書を引くみたいに構築できるのか?という話です。bitcoin scriptを用いないなら出来るんですが、bitcoin scriptで出来たらヤバい。

いまのところ例えばjqueryブロックチェーンにアップしてそれを参照するとかはできる。でもプログラムの実行自体は閲覧ブラウザのパソコンや運営サーバで処理しないといけない。もしbitcoin scriptで出来るのであればブロックチェーン上でプログラム処理済みのものが返ってくる。

...聞いてみようかな。将来的にできるものなのか...限界があるのか...大事よね...

bitbus2.0を使う

_unwriter氏が直近推している。というか他が手に回らないので、最新のツールを使ってくれという感じでいつも言っている。
性能もいいみたいだから使おう。なによりクエリーで$gtとか仕様上は使えるはずなのにgenecisで今は使えないので、bitbusでいけるか試す必要がある。まぁ使えなくても何とかなる気がするからいいんだけども。

docs.bitbus.network

これまで通りトークンを取得して、APIなのでどんなプラットフォームでもいけますよという超便利なビットコインクローラーです。
ドキュメントでいきなり"blk.i": { "$gt": 609000 }とあって動いてるgifがあるのでまぁーいけるでしょう!!

というかいままで

https://genesis.bitdb.network/q/1FnauZ9aUH2Bex6JzdcV4eNX7oLSSEbxtN/...

だったのを

https://txo.bitbus.network/block

にすればいいくさい?

GET形式からPOSTになったので地味に取得コーディングを変えんといけん。でも以前やった。curlを使えばいい。
何でやったかと思えばmoneybuttonのoauthだ。サンプルを公開したいがライブラリを使用しているので、ライブラリ毎公開する気はないので、今回もやりましたよー記事です。

しかしできねぇ!{"error":"invalid query"}になる!

・・・
・・・
・・・

おかしいぞ!って思って、nodejsのサンプル実行したら動いたので、何かしらcurlの送り方がおかしいっぽい。クッソ!!!!
でもnodejsのサンプルで「$gt」は動いた。小さな目的達成。そもそもドキュメントにaggregate以外使えるとある。まぁバグとかこれまでのはあったんすよ。
とりまPHPでもいけるように頑張る。世界はPHP眼中にない(笑)

・・・
・・・
・・・

ぎゃー、わかった。javascriptのサンプルqとかfindがなぜか囲いがねぇ。「"」で囲ったら余裕だった。ざけんな!

それ以外にもPOSTデータって大抵複数あるので、大方キーバリューの配列構成なんだけど、jsonのクエリー一つで完結しているのでPOSTデータを配列でいれてはいけない。
PHPのhttp_build_queryでだいたいエンコードするもんだけど、それもやるとおかしくなるのでやらない。無駄を極限まで省くためかは謎。まぁ動けばいい。

取れたと思ったら、大きなデータはBitFSに託されたみたいで一遍にとれない。うーむ、仕方ない。
bitfsやってなかったのでよくわからんけど、バイナリデータを持ってこなくても取得したアドレスを指定すれば描画されるっぽい。
これはこれで画像とかなら自前のサーバに負荷が掛からなくていいかも?暗号化とかしたら取得して復号化しないといけないけどね。

bitfs.network


そんな感じで、bitbus2.0 + bitfsでございました。最近外部jsとかチェーンにあげてそれを読むとかしてる人とかいてサーバレス近づいてきてます。しかし進展早いからキツイ。かといって遅れて入れば入るほど過程が飛びまくって分からんかもしれんね。