BitCoinブロックチェーンに大きい?データをぶっっこんでみるテスツ

さて今回は画像をdatapayでぶっ込めるのかテスツです。
16進数にするなら画像だろうが、音声だろうが、動画だろうが入るはずなんですが、気になるのはお値段ですよね \(^0^)/

さてその前にですよ。僕らはbitdbを手に入れました。というかそのさらにビジュアライズなエクスプローラー。そしてbitstagramですよ。
そう、先に念のためにどうやって使用しているか確認するんですね!

bitstagramはURLがtxになっていました。
サンプルにこのお空のやつ引用させていただきます。
https://bitstagram.bitdb.network/m/raw/9aa7d98372890e2f929d9de9958fe7c6902a61d4a31df9e9ff12b454bb97cdc7

URLからTXは
9aa7d98372890e2f929d9de9958fe7c6902a61d4a31df9e9ff12b454bb97cdc7
と分かります。

ではレコードを拝見します。
https://genesis.bitdb.network/query/1FnauZ9aUH2Bex6JzdcV4eNX7oLSSEbxtN/ewogICJ2IjogMywKICAicSI6IHsKICAgICJmaW5kIjogewogICAgICAidHguaCI6ICI5YWE3ZDk4MzcyODkwZTJmOTI5ZDlkZTk5NThmZTdjNjkwMmE2MWQ0YTMxZGY5ZTlmZjEyYjQ1NGJiOTdjZGM3IgogICAgfQogIH0KfQ==

lb,lh2ってなんだろ。どうもそこに画像が入ってるっぽい

strをみると、編綴はないので、long base64, long hexかな(^^;

よし!!では"小さい"画像でやってみよう(笑)

test005.jsを作って、画像も同じ階層に入れます。
では150x150で。画像のサイズは13.6kb(13,931b)これ16進数にしてとりあえず長さ測ろう(笑)

89504e4...4ae426082

27863文字 27863bytes うーん1satoshiのfeeで投げて...3円くらい?何とも言えない。150pxだしな。画質にもよるか。今回はpngです。

参考
0.00000001
0.00027863

よしやってみよう。高くはない。

データペイ読み直したら(https://github.com/unwriter/datapay)
build:トランザクションを構築するため(ただし送信しない)
send:トランザクションの送信用
ってあった。テスト(build)して問題なければsendするんだね。

そしてついでに文字列やjsonも同時に送ってみるテスツ。ここまで出来ると色々データ設計できます。悪く言えばカオス。

var fs=require("fs");
var datapay = require('datapay');

fs.readFile("テスト画像.png",function(err,data){
	//Buffer(data).toString("hex")

	const tx = {
		safe: true,
		data: [
			 "0x6d02"
			,Buffer.from(data)
			,"テキストいれたり"
			,"jsonの配列入れたり"
		],
		pay: {
			key: "秘密鍵",
			feeb: 1
		},
	};

	datapay.send(tx, function(err, res) {//send build
		console.log(res);
	})
});

とりあえず実行!どりゃ!!!

"unconfirmed": -14211

あれ?予想より少ないぞ??画像でも抜けたんかな。
おぉお。。。おっぉおぉぉぉおおぉ!!!登録できてる臭いwwww
すぐにエクスプローラーでtxで検索して出てきました。いやふぅ

0.00014211なので1.5円以下でした。テキストとjsonも追加したけど。
これはちょっとやってみないと分からんもんですな!!ぎゃははワロチ

エクスプローラーで

{
  "v": 3,
  "q": {
    "find": {
      "tx.h": "トランザクション"
    }
  },
  "r": {
    "[.[] | .out[0] | { base64_png_img: .lb3} ]"
  }
}

ついでにリターンファンクションにjqとかつかって整形した。
OP_RETURN前の0ってなんだろう。datapayの時入ってる気がするぞ。あとで調べよう。
lb3が最初になるのがちょっと癖ある気がする。先頭のゼロがなくてもlb2だし。

しかしコードの記法覚えた。見やすいワロチ
画像はここで確認しました。
https://tomari.org/main/java/base64d.html

bitdbを活用しよう。

dbとquery使えたら便利ですよね。ということでbitdbを試します。
ノードを必ずしもたてる必要はない、APIを試してねということなのでAPIを試します。
sqlのベースはmongodbとのことで、その知識が使えます。

https://bitdb.network/

アカウントを作成してAPIキーをゲットします。これはDDos攻撃予防の為らしく、そこまで深い用途ではないそうです。

さて、html+jsのサンプルなどはありますが飛ばします。そこは重要ではないからです。

{
  "v": 3,
  "q": {
    "find": {
      "in.e.a": "ウォレットアドレス"
    }
  }
}

これです。in.e.aは入力のe...のアドレスです。で、エクスプローラーで見ます。
サンプルURLはこちら

https://genesis.bitdb.network/query/1FnauZ9aUH2Bex6JzdcV4eNX7oLSSEbxtN/ewogICJ2IjogMywKICAicSI6IHsKICAgICJmaW5kIjogewogICAgICAib3V0LmIwIjogeyAib3AiOiAxMDYgfSwKICAgICAgIm91dC5zMSI6ICJoZWxsbyIKICAgIH0sCiAgICAibGltaXQiOiAxMCwKICAgICJza2lwIjogMTAKICB9Cn0=

これはbitdbにあるサンプルをちょっと加工してOP_RETURNにhelloってあるレコード取得するんだけど、これだと自分と関係ないレコード沢山取れてしまいます。最初はこれ興味本位で見たりするけど、我に返ると、こんな他人のデータ何ていらん訳です

で、上の様に自分のサーバで発行したアドレスで絞り込む
あとはなんだこの沢山のbやらsやらはーですが、

bitdbのマニュアルを翻訳して眺めてもらうとなんとなく分かります。
https://docs.bitdb.network/docs/intro_v3#bitdb-101

こことかもね。
https://docs.bitdb.network/docs/query_v3
b0、b1、b2、b3、b4、...:これらを使用して、base64エンコーディングでプッシュデータを照会します
h0、h1、h2、h3、h4、...:これらを使用して、16進エンコーディングでプッシュデータを照会します
s0、s1、s2、s3、s4、...:これらを使用して、UTF8エンコーディングでプッシュデータをクエリします(s属性は全文検索用にインデックス化されます)

これ生のレコードと、マニュアルを見て(・_・D フムフムって確認していかないと頭に入らない。
で、たぶんselectしかない!データ入れるのはdatapayかな。

BSV OP_RETURNにテキストを入れてみるテスツ

まずデータいれます。
アドレスから手数料引かれるのをみます。
トランザクションみます。
刻まれたのを見ます。

moneybuttonに送金、OP_RETURN入れるっていうスクリプトはなさそうだったので、
(moneybutton向けに送金とテキスト入れるみたいなのはある。)
datapayを使う事にしました。datapayを最初にやらんかったのはmemo.cashに投稿するみたいな文面があったから。

いや、memo.cashには投稿したくないなぁと思った次第。でも多分勘違いでmemo.cashには投稿されない。
memo.cash内で検索したけど出てこなかったし、普通にそんな意味不明なライブラリ作らんでしょ(笑)
memo.cashのAPIを使用するみたいなニュアンスととらえました。違うかな。

今後容量が大きくなってもこのまま使えるかは調べないと分からない。
画像を上げるbitstagramがあるので、そっちがどうやってるか確認すればいいかな。
https://bitstagram.bitdb.network/

とりあえず今はそれを考えない。一歩ずつ。

で、最初にどっかからどっかへ送金してそれでテキストなり刻むと思ったんですが、基本OP_RETURN使うときは
宛先は空みたいです。そう、送金せずに手数料だけ払う。送金は自分から自分へ?みたいなイメージですかね。

あと、バグってんのかライブラリ間のバージョンが合わないのか宛先を指定しても自分から自分にしかいかんかった。
まぁ送る予定はないのでいいかな。

まずサーバにアドレスを用意します。それは作れればこんな感じでみれます。

https://api.bitindex.network/api/v2/addrs/balance?address=サーバにあるアドレス

{
  "data": [
    {
      "address": "サーバにあるアドレス",
      "confirmed": 0,
      "unconfirmed": 0
    }
  ]
}

そこに着金させると、確認待ちになる。

{
  "data": [
    {
      "address": "サーバにあるアドレス",
      "confirmed": 0,
      "unconfirmed": 10000
    }
  ]
}

10分待つと

{
  "data": [
    {
      "address": "サーバにあるアドレス",
      "confirmed": 10000,
      "unconfirmed": 0
    }
  ]
}

みたいになります。これは送金した側で大抵見れるtxでも体験できます。
https://blockchair.com/bitcoin-sv/transaction/送金したトランザクション
https://whatsonchain.com/tx/送金したトランザクション

では、ついにサーバにあるアドレスにbsvが届きましたので、OP_RETURNにテキスト刻んでみます。

test.js

var datapay = require('datapay')

const tx = {
	safe: true,
	data: ["0x6d02", "刻みたいテキスト"],
	pay: {
		key: "前回作った秘密鍵",
		feeb: 1
	},
};
datapay.send(tx, function(err, res) {
	console.log(res)
})

これでtxアドレスが出力される。すぐにウォレットアドレスを見てみると...

{
  "data": [
    {
      "address": "サーバにあるアドレス",
      "confirmed": 10000,
      "unconfirmed": -252
    }
  ]
}

こんな感じで確認中の送金ってことでマイナスになって、いずれconfirmedが減額されます。
さて、トランザクションアドレスをみてみると...どっちでも見れるけど、whatsonchainの方がOP_RETURNは少し見やすい。

OP_RETURNのASCIIはちょい文字化けしているが、まー読める。
Scriptは16進数エンコードなんで、デコード(HEX変換)すれば読める。

テキストがマルチで入るかはまだ試してません。0x6d02ってなに?って方は以下プロトコル読めばすっきり。
https://memo.cash/protocol

ライブラリを使えば、ほんの数行で、実施できる。無駄のないスクリプトを目指したそうで、最高に処理も軽くて速いはずです。実際に速かったです。
次は、容量を増やしてチャレンジしてみます。画像とか、ながーいテキストとか。それをさらに取得。

するとできますね、(すべてではないけど)サーバレスなシステムが。

BitCoinSVで変わるブロックチェーンエンジニアの未来と簡単なプログラム導入部分

色々学んでビットコインブロックチェーンするならBSV一択の状況です。
法律、特許周りなども加味すれば、客観的に見てもBSV一択の状況です。
仮想通貨に熱狂する方は金儲けと損したくない一心で盲目になっています。

多数の会社が特許戦争を水面下で進めており、ITトップ企業同様に特許の多い会社しか残らないと思います。
nChain,IBM,アリババ...マスターカードなんてのもあります。
中国の会社が非常に多いので、今後世界は中国中心に動くことが伺えます。

さて、本業で時間がないながらもジワジワ学習に励んでいます。
何となく人様のブロックチェーンサービスを利用し、ライブラリも増え、
日本でも両手で数えられるくらいですが技術ブログを公開してくれるエンジニアも出てきました。

私はそれらの方を参考に「で、できたよ!」って記事を書きます。
まずnode.jsを触ったことない方、数年とんと触ってない方は、サーバ設定で敷居があります。
centosも6なら7,8くらいにしといた方がいいです。多分ね。

私は久しぶり過ぎて、npm initでpackage.jsonを作る事さえせずに、モジュールはいらねーぞと苦闘していました(笑)
やったら思い出すんですけどね、あーやったわみたいな。

さてさて、まずやったのが、アドレスをサーバで生成することです。そして、そのアドレスに少額送金すること、
そしてそして、承認待ちからOKに変わる感動(^v^

一旦ここまでで。

まずnodeモジュール、以下インスコします。まぁ、素直に入らなかったけど、入りました(^^;

npm init
...
npm install -g bsv
npm install -g bsv-mnemonic
npm install -g datapay

でtest.jsつくって、まず秘密鍵つくりまーす。
参考:https://docs.moneybutton.com/docs/bsv-private-key.html

var bsv = require('bsv')
var Mnemonic = require('bsv/mnemonic')
var datapay = require('datapay')

let privateKey = bsv.PrivateKey.fromRandom('mainnet')
console.log(privateKey.toWIF())

この出力した秘密鍵を大事に取っておきます。
次は公開鍵、からのアドレスです。test2.js

let publicKey = bsv.PublicKey.fromPrivateKey(秘密鍵)
console.log(publicKey.toHex())

let address = bsv.Address.fromPublicKey(publicKey)
console.log(address.toString())

はい、アドレスできました。残高みたい。しかしmoneybuttonのbsvライブラリにはない模様。
で、APIをサクッと叩きます。

https://api.bitindex.network/api/v2/addrs/balance?address=作ったアドレス

{
  "data": [
    {
      "address": "作ったアドレス",
      "confirmed": 0,
      "unconfirmed": 0
    }
  ]
}

ここに少額どっかから送金テストします。
すると...

{
  "data": [
    {
      "address": "作ったアドレス",
      "confirmed": 100000,
      "unconfirmed": 0
    }
  ]
}

こんな感じで着金されます!確認待ちも10分かな。確認前なら即座ですね。fee次第でしょうけど。
さて次回はここから、op_returnにテキストぶち込んでトランザクション確認して、無事埋め込みを確認しまーす。

moneybuttonの設置の仕方。

これはすでにmoneybuttonを使っている方なら簡単です。

< script src="https://www.moneybutton.com/moneybutton.js" >< /script >< div class="money-button"
data-to="****"
data-amount="0.01"
data-currency="JPY"
>< /div >

単位はJPYとして量を0.01とすれば自動で0.01円相場で支払いにできます。
docs.moneybutton.com

ビットコインのパブリックチェーンサービスについて

planariaはビットコインの帳簿をやり取りするフレームワークみたいで、
設置サーバにビットコインアドレスを生成して、あーだのこーだのできる。


自分で送金してOPとかにメッセージ残してもいいし、すでに「B://」プロトコル
といったすでに用意されたノードを利用しても良い。


ビックブロックの方がトランザクション沢山残せて稼げるのかなとか、
その辺のエンジニア目線でブロックチェーンの仕組みが覗けて面白い。


よくわかってないけど、ブロックが大きい分には処理に問題はない気がします。
OPがデカいとそれ自体の速度はキツイはず。そのかわり一発でブロックが埋まる。
でいいのかな。まぁそんなの試していればいずれ分かる。


とりあえずジェネシスで閲覧取得してみたけど、遅い。消して速くはない。
帳簿の書き込みでマイナーは収益を得るが、閲覧は無料なので、速度はやはり
技術進歩と同時に成長していく必要がある。それかジェネシス以外のやつで
高速閲覧の方法でもあるのか、検索の条件が悪いだけか....。これもこれから
もっと試せば分かる。


IT企業がガチガチに企画サービスを開始するのはまだ現実的ではなく、きたる時代に
向けて新規事業準備や研究室などで徐々に実験、開発が進んでいくのではないだろうか。


できればデータセンターを事業にしている様な企業から参入が望ましい気がします。
マイナーがいて動く仕組みなので、そういった事業をしていないとインフラが他人
任せすぎる。また逆に、マイナーオンリーでも誰が使うねんって不安がでてしまう。
できれば同時に事業展開できる大企業が望ましいよね。

Planariaをcentos6にインストールする。

seo,amp,servicewokerと触ったり、携わったりしてきて、次はパブリックチェーンかなって。google cloud api機械学習系も面白い。

まず、nodejsをいれてないサーバは入れる必要があり、centos6はなにかとすでに時代遅れによる問題があるので、yumで解決はできないと思った方がいい。

もしすでにいれてるなら消す。まぁバージョンそれなりにあげていれば問題ないかも。

yum remove nodejs npm

ゴミも確実に消すなら

rm -rf /usr/local/bin/npm
rm -rf /usr/local/bin/npx
rm -rf /usr/lib/node_modules/
rm -rf /usr/bin/npm
rm -r /usr/local/lib/node_modules/
rm -rf /usr/local/bin/node
rm -rf /usr/bin/npm
rm -rf /usr/lib/node_modules/
rm -rf /root/.npm/
rm -rf /root/node*
rm -rf /root/.node-gyp/
rm -rf /root/.npm/
rm -rf /usr/bin/node
rm -rf /usr/local/include/node

nvmで入れます。

git clone git://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh
nvm help
nvm ls-remote
nvm install v10.15.3
node -v

qiita.com
hombre-nuevo.com
ほかの入れ方をいれろいろ試したがcentos6はいろいろ問題がある。バージョンに関してもv12だとまた最新過ぎて問題が起こる。

あとはクイックスタート通りに。
docs.planaria.network