◇ まずブロックチェーンが初めての方へ……ブロックチェーン技術とは?

「数値」の増減を第三者が検証可能な状態で「ブロック」と呼ばれる塊に固めていく作業が基本です。
そしてそのブロックを大勢のノードで共有する仕組みになっております。
ブロックは一定の間隔で出現するように数学的に調整されており「ブロック生成時間」と呼びます。
そこで、出現したブロックに「数値の増減」を記録するのですが その記録の主が所有者であることを確認するための「署名」も一緒に刻まれており、 その署名により増減が所有者により行われた点を第三者のノードが検証することができるようになっております。
この地道な数値の増減が最後まで繰り返され最新のブロックを受信すると「同期完了」となって、そのときの数値が「残高」になります。このような流れでブロックチェーン……Web3.0/NFTが分散型として運用されております。
※ 各ブロックに残高自体が記録されていくわけではなく増減の点にご注意ください。変化量が刻まれます。

◇ 秘密鍵・公開鍵とは?

自分が指示したと示せる署名を可能とした鍵を秘密鍵と呼びます。
これは漏洩厳禁で漏れると第三者に署名されすべての残高を失います。
それに対し検証のみを可能とした鍵を公開鍵と呼びます。
検証のみなので相手に渡してコインを受け取ったり、
ノードに渡して署名が合っているかどうかの検証させることができます。
※ 秘密鍵から公開鍵の位置の計算は容易なのですが、その逆ができないようになっております。

◇ 数値の増減とは?

現在、手元に「Aキー」という鍵があります。
そこで任意のキーの残高を知るにはキーの公開鍵の性質を利用いたします。
「Aキー」が秘密鍵ならここから公開鍵を取り出します。(秘密鍵から公開鍵の位置の計算は容易)
「Aキー」が公開鍵ならそのままで大丈夫です。
この公開鍵から署名を検証できる形にリカバーしてチェーン上を辿っていくイメージです。
そこで最新のブロックが同期するまでそれらを解いた結果以下の増減が得られました。

◇ +100、-70、+200、+100、-150

0から計算していきますので結果は+180となります。
そして、この+180が「Aキー」を所有される方のコインとなります。
「Aキー」が秘密鍵だった場合は自分のコイン、
「Aキー」が公開鍵だった場合は第三者の誰かのコインになります。
アドレスから第三者の残高も知ることができるのが特徴です。
もちろん署名できるのは秘密鍵のみなのでコインを動かせるのは「自分だけ」です。

◇ ブロック生成……マイニングとは?

ハッシュ関数と呼ばれる任意の情報を256ビットなどの数値に変化させる「一方通行」の関数がございます。この「一方通行の性質」が非常に大切でこの性質でブロックチェーンのマイニングは成立しております。例えば「A情報」をハッシュ関数に入れると「Bハッシュ」が得られるとします。
そしてこの「Bハッシュ」から元の「A情報」に変換する関数はございません。
すなわち、ハッシュ関数に入れてみないとハッシュがわからない、この性質が大切となっております。
さらにこのBハッシュは「A情報」が「わずか1バイト」でも変化すると大きく変わる性質がございます。これにより、わずかに情報を変化させたときに、次にどのようなハッシュが来るのか……これが不明になっております。

これらの性質を活用し難易度に応じたハッシュ値を探す作業が「Proof of Work」と呼ばれております。
よく環境問題などで話題に上がる……あのファンだらけの機材がハッシュ計算を高速に処理いたします。
予測すらできないので、ひたすらにハッシュ計算を行って指定された値以下のハッシュ値を探すのです。そして正解がみつかったらすぐにネットワークへ通知します。
すると、そのハッシュ値が合っているのかどうかみんなで答え合わせ……検証をします。
ちなみに、この検証作業は「正解とされる値……nNonce」がわかっているため1回で済みます。
※ わざと誤った答えを送り続けるとネットワークから切断されます。Banリストに入るのでご注意ください。ところで、なぜマイニングなのか……そのハッシュを「最初にみつけた方」にのみ報酬があるからです。早い者勝ちで、みつけても遅れてしまうと「すでにそのブロックは存在します」で弾かれ報酬は0です。

◇ ブロックチェーン経由でウェブ構築

こちら にまとめました基本構造がデータ構造となります。

今後の方針はその基本構造の場所に記しましたmini filesystemです。
なおブロックサイズを増やしてブロックに書き込む方向性もありますが ネットワーク手数料が書き込みサイズに比例して上がるため 整合性に対してのみをハッシュ値で確認できる仕組みに改良いたします。
なお、mini filesystemではランダムアクセスに対応いたします。

◇ データを一度でもブロックチェーンに書き込んだら消せないのが特徴です。

ブロックチェーンはあくまでデータを管理するブロックです。
例えば決済用に特別なものが書き込まれているなどではございません。
それゆえにシンプルな構造ですので容易に改良できて興味深いです。

◇ データを作ると、そのデータのハッシュが出ます。それがトランザクションIDとなります。

ただのデータであっても入力出力に関する構造を持ったブロックチェーン用のデータ構造は必須です。
そこにデータを乗せてトランザクションIDを取得しそれを「メモリプール」と呼ばれる場所に投げます。このメモリプールは、他のノードと常に同期されておりまして、 ブロック生成権利を獲得したノードがその地点で手元の「メモリプール」に存在するトランザクションをすべて解読のち 問題ないものについてはブロックに取り込んでそのブロックに報酬を付けてから(自分で加えます)、他からの承認を目指します。承認されるとそのブロックが新規となって登録されその中にあるトランザクションIDが有効となるわけです。なお、報酬をごまかしても他からの承認は得られません。(CheckProofRewardがあります) またブロックハッシュとトランザクションIDはハッシュですが異なるものです。
一つの承認されたブロックハッシュの中に複数のトランザクションIDが存在するという構造を持ちます。 そこでトランザクションIDとなったデータのサイズが問題になります。 なぜならこのサイズが大きいほどネットワーク手数料が高くなります。なおトランザクションを要求した間隔も手数料に関わってきます。短期間に連続すると高くなります。

◇ メモリプールから未承認になる場合です。

メモリプールはメモリ上に存在いたします。
それゆえに他のノードから同期を要求され同期されるまでは自分自身しか知りえない情報となります。
そのため同期する前に自分を閉じてしまう(プログラムを終了)と 他ノードとメモリからの同期要求が消えてしまい未承認のまま残ってしまう場合があります。
しかしトランザクションは生成されウォレット部に記録されていますから 未承認のまま残高は戻らずに承認もされずに……というトラブルがよくございます。

◇ SORAでは、アンロックのとき未承認トランザクションのチェックを自動で実施

未承認のまま残高が戻らないのは厳しいです。
なおバックアップ済みの過去のウォレットからトランザクションを再構築する手法で元には戻せます。
しかし事あるごとに全再構築は面倒です。
そこでSORAではウォレットをアンロックに移行させる際、未承認分のチェックを自動で実施いたします。そこに未承認が存在した場合、再度未承認分をメモリプールへ通知して承認を試みるロジックを入れております。

◇ 以下、分散型(Wen3.0/NFT ブロックチェーン)に関する資料です。書き残しておきます。

https://www.iuec.co.jp/blockchain/abouthash.html
https://www.iuec.co.jp/blockchain/autofile.html
https://www.iuec.co.jp/blockchain/bignum.html
https://www.iuec.co.jp/blockchain/cblockheader.html
https://www.iuec.co.jp/blockchain/cqueuefunctor.html
https://www.iuec.co.jp/blockchain/datastream.html
https://www.iuec.co.jp/blockchain/dbstream.html
https://www.iuec.co.jp/blockchain/fhs_under_development.html
https://www.iuec.co.jp/blockchain/full_to_stat_mapping.html
https://www.iuec.co.jp/blockchain/hash.html
https://www.iuec.co.jp/blockchain/i-sector.html
https://www.iuec.co.jp/blockchain/i-sector_NFT.html
https://www.iuec.co.jp/blockchain/mlock.html
https://www.iuec.co.jp/blockchain/mprotect.html
https://www.iuec.co.jp/blockchain/nbits_nonce.html
https://www.iuec.co.jp/blockchain/pay.html
https://www.iuec.co.jp/blockchain/pr_1.html
https://www.iuec.co.jp/blockchain/prevector.html
https://www.iuec.co.jp/blockchain/prevector_s.html
https://www.iuec.co.jp/blockchain/proof_system.html
https://www.iuec.co.jp/blockchain/secp256k1_fe_uint256.html
https://www.iuec.co.jp/blockchain/secure_allocator.html
https://www.iuec.co.jp/blockchain/secure_zeromemory.html
https://www.iuec.co.jp/blockchain/serialize.html
https://www.iuec.co.jp/blockchain/signature.html
https://www.iuec.co.jp/blockchain/thread.html
https://www.iuec.co.jp/blockchain/uint256.html
https://www.iuec.co.jp/blockchain/web_try_30.html