はじめに
正月早々、某先輩のミームコインに1万円を突っ込み、見事に溶かしました。
仕事中にチャートが爆上がりしているのを見て「これはいける!」と飛び乗ったものの、3時間後に業務を終えて確認すると、資産は半分以下。 「ここで売ったら負けだ」という謎の意地でホールドし続けた結果、翌日には 10,000円が500円(-95%) になっていました。
しばらく虚しい気分でしたが、ふと自分で仮想通貨を作る側に回れないかなと思い立ちました。
まずはブロックチェーンを、気晴らしも兼ねて使い慣れた Google Apps Script (GAS) で自作し、私のもとを去った栄一が無駄ではなかったと思いたいです。
ブロックチェーンの仕組み:なぜ「改ざん」がバレるのか
”改ざんできない”から成り立つとされる仮想通貨。
その理由とされるブロックチェーンですが、その正体はシンプルに言えば 「ハッシュ値で数珠つなぎにされたリスト」 です。
手順
データ化:
「誰が誰にいくら送った」という情報をJSON等にまとめる。
ハッシュの作成:
そのデータをもとに、SHA-256などのアルゴリズムで「唯一無二のハッシュ値」を計算する。
チェーン化:
次のブロックを作る際、「1つ前のブロックのハッシュ値」をセットで書き込む。
もし過去のデータを1文字でも書き換えると、そのブロックのハッシュがガラッと変わります。すると、次のブロックでも一致しなくなり、それ以降の鎖がすべてバラバラになります。 複数人で同時計算することで、改ざんした人だけ、おかしな値が出る。これが「改ざんが即座にバレる」理由です。
仮想通貨は割と古い技術の新しい活用事例だった
勉強して驚いたのは、個々の技術自体は決して最新ではないということです。
ハッシュ化: 1970年代から存在
ブロックの連鎖: 1991年には論文が発表済み
そこに2008年、サトシ・ナカモト氏が 「分散型(みんなで監視し合う)」 と 「報酬(マイニング)」 という構造を加えたことで、特定の管理者がいない「ビットコイン」という画期的なシステムが完成したという歴史的背景があるそうです。
マイニング
複数人で同時に計算を行う→これがマイニングです。
じゃあ誰がこんなことをやっているのか?→報酬でコインを貰いたい人たちです!
同時に計算を競って最初に計算を終え、その値が正しかった場合、少額のコインがもらえる仕組みです。今も多くの人がコイン求めてコンピュータを走らせ続けています。
マイニング、コインを掘り当てるというのがしっくりきますね。
具体の計算内容
特定の条件を満たすハッシュ値が出るまで、ひたすら数字を入れ替えて計算し続ける作業をしています。
計算式
以下の5つの材料を混ぜ合わせて1つの長い文字列を作り、それをハッシュ関数である SHA-256 にかけます。
$$
Hash = \text{SHA-256}(\text{Index} + \text{PrevHash} + \text{Timestamp} + \text{Data} + \text{Nonce})
$$
式を構成する各変数の役割は以下の通りです。
・Index(インデックス): ブロックの連番。
・PrevHash(前のハッシュ値): 一つ前のブロックのハッシュです。これがチェーンをつなぐ役割をします。
・Timestamp(タイムスタンプ): ブロックが生成された時間。
・Data(データ): 送金記録などの、ブロックに格納されるメインの情報。
・Nonce(ナンス): 正解が出るまで 0, 1, 2... と値を増やし続けます。
システム側で【難易度(Difficulty)】というフィルターを設定し、正解の確率を操作します。
計算順序
プログラムの内部では、以下のような「総当たり計算」が行われています。
- 固定データを用意: Index, PrevHash, Timestamp, Data を固定する。
- ナンスをセット: 最初は Nonce = 0 とする。
- ハッシュ計算: 全ての材料をまとめてハッシュ化する。
- 判定:
- 正しい数値か?
- No の場合: ナンスを +1 して ステップ3に戻る。
- Yes の場合: 次のステップへ進む。
- 完了: 条件を満たした瞬間の「ナンス」と「ハッシュ値」をブロックに記録し、ネットワークへ伝搬する。
次の計算へ
今作成したハッシュをPrevHashに入れ込み、それを元に次のハッシュを求める計算が始まります。
マイニングは高度な計算というよりは、条件に合うまでひたすらサイコロを振り続けるような、確率に基づいた総当たり計算によって成立しています。
GASでブロックチェーンを実装してみる
スプレッドシートを台帳に見立て、この仕組みを再現してみます。 GASでは Utilities.computeDigest を使うことで、簡単にSHA-256ハッシュを計算できます。
1.設定・データ入力エリア
const DIFFICULTY = 2; // 難易度(2〜3を推奨。5以上にするとフリーズします)
const MY_TRANSACTIONS = [
{ sender: "System", receiver: "YourName", amount: 10000, memo: "利確" },
{ sender: "YourName", receiver: "Senpai", amount: 1, memo: "エアドロ" },
{ sender: "Senpai", receiver: "YourName", amount: 0, memo: "あげない" },
{ sender: "YourName", receiver: "Ether", amount: 500, memo: "勉強代" },
//ここに取引の情報を入れます。好きなだけ行を増やせます!
];
2. メイン実行関数
createMyBlockchain関数の実行で動きます。
function createMyBlockchain() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.clear();
sheet.appendRow(["Index", "Timestamp", "Data (JSON)", "Previous Hash", "Hash", "Nonce"]);
const myChain = new Blockchain(DIFFICULTY);
// ジェネシスブロック(0番目)を書き込み
console.log("ジェネシスブロックを生成中...");
writeToSheet(sheet, myChain.chain[0]);
// 設定したデータをループで順次追加
MY_TRANSACTIONS.forEach((data, i) => {
console.log(`ブロック ${i + 1} を採掘中... (Data: ${data.memo})`);
myChain.addBlock(data);
writeToSheet(sheet, myChain.getLatestBlock());
});
console.log("✅ すべてのブロックが正常に連結され、スプレッドシートに記録されました!");
}
3. 計算処理
/**
* ブロック単体の設計図
*/
class Block {
constructor(index, data, previousHash = '') {
this.index = index; // 何番目のブロックか
this.timestamp = new Date().toISOString(); // 作成時間
this.data = data; // 取引内容(誰が誰にいくら送ったか)
this.previousHash = previousHash; // 【重要】一つ前のブロックのハッシュ(鎖の連結点)
this.nonce = 0; // マイニングで正解を出すために書き換える変数
this.hash = this.calculateHash(); // このブロック自体のハッシュ値(指紋)
}
/**
* ハッシュ値を計算する(ミキサーにかける処理)
*/
calculateHash() {
// 1. 全ての材料を一つの文字列に合体させる
const input = this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce;
// 2. GAS標準のSHA-256アルゴリズムで計算(バイナリデータが返る)
const rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, input);
// 3. 読めるように16進数の文字列(abc123...)に変換して返す
return rawHash.map(b => ('0' + (b & 0xFF).toString(16)).slice(-2)).join('');
}
/**
* マイニング処理(当たりが出るまでひたすら計算)
*/
mineBlock(difficulty) {
// 目標となる文字列を作成(例:難易度2なら "00")
const target = Array(difficulty + 1).join("0");
// ハッシュの先頭が "00" で始まらない限り、ループを抜けない
while (this.hash.substring(0, difficulty) !== target) {
this.nonce++; // 1. ナンスを1増やす(ここが変数の更新)
this.hash = this.calculateHash(); // 2. 再計算して新しいハッシュを出す
}
// ループを抜けたら、先頭に0が並ぶ「正解のナンス」が見つかったことになる
}
}
/**
* チェーン全体の管理を行う設計図
*/
class Blockchain {
constructor(difficulty) {
this.difficulty = difficulty;
// 最初のブロック(ジェネシスブロック)を作って配列に入れる
this.chain = [this.createGenesisBlock()];
}
/**
* 最初のブロックを作成(前のハッシュが存在しない特別なブロック)
*/
createGenesisBlock() {
const genesis = new Block(0, "Genesis Block", "0");
genesis.mineBlock(this.difficulty); // 最初のブロックもマイニングが必要
return genesis;
}
/**
* 現在のチェーンの最後尾を取得
*/
getLatestBlock() {
return this.chain[this.chain.length - 1];
}
/**
* 新しいブロックを鎖に追加する
*/
addBlock(newData) {
// 1. 最新ブロックのハッシュを取得して、新しいブロックの「previousHash」にセット
const newBlock = new Block(
this.chain.length,
newData,
this.getLatestBlock().hash // ここで鎖がつながる!
);
// 2. 新しいブロックのマイニングを実行(計算競争)
newBlock.mineBlock(this.difficulty);
// 3. 正解が出たらチェーン(配列)に追加
this.chain.push(newBlock);
}
}
4.シートへの書き込み
/**
* シートへの書き出しと画面更新を強制する補助関数
*/
function writeToSheet(sheet, block) {
sheet.appendRow([
block.index,
block.timestamp,
JSON.stringify(block.data),
block.previousHash,
block.hash,
block.nonce
]);
// これを入れると、実行中にスプレッドシートの行が1つずつ増えるのが見えます
SpreadsheetApp.flush();
}
createMyBlockchain関数の実行を動かしてみてください。スプレットシートに計算結果が表示されるはずです。
index 連番
timestamp 実行時間
Data 取引履歴
previousHash 前の行のハッシュ
Hash その行で計算して算出したハッシュ
Nonce カウントアップした繰り返し計算回数
これを複数人が行い、計算結果のハッシュの一致を見るわけですね。
ビットコインのマイニングできるんじゃね?
GASでブロックチェーンの一部であるマイニングの計算を再現することができました。
ここでふと「これGASでビットコインのマイニングをすれば、失った栄一を取り返せるのでは?」と思いました。
できるんでしょうか?
計算速度の絶望的な差:
Googleのサーバー(GAS)での計算は、プロのマイナーが使う専用マシン(ASIC)に比べると、アリと新幹線くらいの速度差があります。一円も入ってこないです。
規約の壁:
そもそもGoogle Cloudの利用規約ではマイニング行為は禁止されています。無理に実行すれば、収益どころかGoogleアカウントが吹き飛びます。
大枚を稼ぐには、スプレッドシートではなく、専用の爆速マシンを買うのが正解のようです。
Bitaxeと検索するとマイニングマシンが出てきます。
いい勉強になりました。今後の目論見
1万円の損失をきっかけに、ブロックチェーンの「データの整合性を守る技術」を理解することができました。
しかし、ただ勉強して終わるのも寂しいものです。
せや、外部のマインングはダメでも、この仕組みを使って社内で感謝を送り合う『サンクスコイン』とかを勝手に運用し始めたら面白いのでは……?
というわけで、「GASブロックチェーンを使って、勝手に社内専用仮想通貨を作ってみた」
気分が乗ったらお届けしようと思います。
それはそうとして、私は一刻も早く栄一を取り戻すべく、1月14日に備えて某先輩コインを買い増しすることにします。
ほな、まずは5000円追加〜(※投資は自己責任で!)

