Google スプレッドシート上でブロックチェーンの基本的な部分を作成してみました。
暗号方式はsha256でPoW が入っていないゆるい感じの説明です。
#「もしかして渡した値」「入れ替わってる!?」
ブロックチェーンの最大の特徴は、情報が改竄されにくいところにあります。
実装したスプレッドシートは、以下にあります。
https://docs.google.com/spreadsheets/d/1muiirzfygEoKxGl28XX8FICKQgw7apeIyyy_FFRCjcs/edit?usp=sharing
スプレッドシートには、情報となる名前と、横のsha256にはハッシュ値が入っています。
chain欄は改竄されていなければ、TRUEとなっています。
名前が変わるとハッシュ値が変わります。
ハッシュの生成にはGoogle スプレッドシートのスクリプト作成しています。
function SHA256 (input) {
var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, input);
var txtHash = '';
for (i = 0; i < rawHash.length; i++) {
var hashVal = rawHash[i];
if (hashVal < 0) {
hashVal += 256;
}
if (hashVal.toString(16).length == 1) {
txtHash += '0';
}
txtHash += hashVal.toString(16);
}
return txtHash;
}
#あんた今、夢を見とるな?
では、名前を入れ替えて、情報を改竄してみます。
名前を入れ替えるだけのちょっとした変更です。見た目では気づかないかもしれませんね。
ただし、ハッシュ値は違うものになり、FALSEとなりました。
chainは入力された時の生成されたハッシュ値と現在のハッシュ値とで比較しています。
=EXACT(B2,SHA256(B1&A2))
ここで、B1とA2が足しあわされてハッシュ値としていますね。
B1を見ると前のハッシュ値を示しています。これがブロックチェーンと言われる基本的な部分です。
#ブロックチェーンは組み紐のように繋がっている
ブロックチェーンと呼ばれるのは作成したブロックは、前の世代の情報を含んでいます。前の前の世代のブロックは、その前前前世のハッシュを含み繋がっています。
ハッシュは、情報によって固定した値が出力され、情報が違うと違う値が出力される性質があります。また、出力された値からは元の値には戻せない不可逆的な性質を持っています。
では、検証として、一部分だけ書き換えてchainをすべてTRUEにするにはどうしたらいいでしょうか。試しにハッシュも改竄してみましょう。同じ行のハッシュも再生成してこれで改竄完了ですね。
でも、待ってください。ハッシュの生成には前の行のハッシュを含んでいます。
ということは、ハッシュを書き換えると次の行でchainはFALSEになります。
つまり、一部だけ改竄ということはできなくて、書き込んだ以降の行をすべて改竄しないといけないことがわかります。書き込みがあるほど、過去の情報の改竄が容易でなくなりますね。
#組み紐を編む
Googleのスクリプトを使って、ハッシュ生成処理を組んでいます。Googleスクリプトでは、onEditで編集のカラムがわかります。そして、setValue で好きなカラムに静的な値を書き込むことができます。
function onEdit(event){
var ss = event.source.getActiveSheet();
var ar = event.source.getActiveRange();
if(ar.getColumn() == 1){//最初の列のみを処理
cv = ar
var chain = SHA256("" + cv.offset(-1,1).getValue() + cv.getValue())
if( cv.offset(0,1).isBlank() ){
cv.offset(0,1).setValue(chain);
}
}
}
#まとめ
- ブロックチェーンで一部の改竄は容易でない。
- スプレッドシートでいちよ表現できる。
- 君の名は、もう一回見たい。(ステマではない)
#おまけ:複数人から過半数の同意を得るには?
実はこのスプレッドシートは、分散して管理するには完全ではありません。
スプレッドシートをコピーして値を追記していった場合はどれが本物でしょうか。
多数決にしたとして、1人で沢山コピーしてしまえば成り立ちません。
別の技術の一つとして、PoW(Proof of Work) という仕組みがあります。書き込み時に、ハードウェア限界性能で制限をつけてしまう方法です。
スプレッドシート上でも出来ないことは無さそうなので、気が向いたらと思います。
#参考と実際に使われているブロックチェーン情報
http://block-chain.jp/tech/bitcoin-blockchain/