post Image
アイドルとオタクがBitcoinで永久に消えないメッセージを刻む

概要

原宿を拠点とするアイドルグループの・・・・・・・・・が大阪で◯→●→🌏というイベントを実施しました。
その内容は、アイドルとオタクがBitcoinを使って世界にメッセージを刻むというもの。
刻まれたメッセージは消すことができず、永久に残り続けます。

本記事ではイベントの体験レポートから始めて、いったい何でこんな催しを開いたのか、Bitcoinとは何なのか、そしてなぜ永久にメッセージが残るのかを説明し、最後にそれを実装する方法を紹介します。

・・・・・・・・・については、前回の記事を参照してください。

イベントのレポート

・・・・・・・・・が東京を飛びだし、大阪に初めての遠征をしました。初日は大学での講義と、ライブ。二日目はライブと、ファンとの交流イベントというスケジュール。
講義とライブについては、あらかじめ詳しい情報が告知されていましたが、最後の交流イベントで何をするのかは、オタクにも、・ちゃんにも伝えられていませんでした。
事前に知らされていたのは、タイトルが◯→●→🌏ということだけ。

2017年2月5日、お昼の三時。◯→●→🌏は、道頓堀にある某たこ焼き屋さんにて行われました。イベントは前後半に別れ、前半では・ちゃんとたこ焼きを食べます。

たこ焼きを食べる・ちゃんの写真
たこ焼きを食べる・ちゃんの写真
たこ焼きを食べる・ちゃんの写真

たらふく食べたところで、前半が終わり後半に。
まず、下の資料が配られました。ご覧のとおり簡単な説明のみで、メッセージが世界に公開されるとは書かれていますが、「永久に刻まれる・消すことができない」というBitcoinのキモは伝えられていません。
説明資料のスクショ

これは自分が何をしているの分からない内に世界にメッセージが刻まれてしまっているという体験をつくりたかったためで、ユーザーが向き合うインターフェイスも、Bitcoinを意識させない、そっけないフォームにしました。

index.html

送信ボタン(●→🌏)をクリックすると、戻るリンクだけのページに遷移し、フォームの内容が刻まれます。
broadcast.html

資料が配られるやいなや、疑心暗鬼の声が会場を包みます。「Bitcoinって何?」「なんか怖い!」「Bitcoinって昔ニュースでやってたよね」

ここで、プロデューサーから追加の説明。「書く内容は自由ですが、一つだけルールを決めたいと思います」
「メッセージに・を含めてください」

ざわめきの中ノートパソコンが回され、いよいよ作業がはじまります。手順としてはオタクが6人いる・ちゃんの中から一人を選んで、二人で一緒に内容を考え、刻む。

・ちゃんの帰りのフライト時刻が近づいてるということもあり、相談時間は3分ほど。くわえてTwitterどころじゃない強い文字数制限。さらに・を含めるルール。そんな縛りの下で刻まれたメッセージが以下となりなす。

刻まれたメッセージの一覧
https://chainflyer.bitflyer.jp/Address/18975CmAnNGXLnSw8XfPnN1ENV5wkSnT72

これにて、その場はお開きとなりました。

いったい、このイベントは何だったのか

Bitcoinとは何か

本題に入る前に、まずはBitcoinについて説明します。

Bitcoin。それは、中心のないデジタル通貨です。これまでの電子マネーやポイント、アプリ内通貨は発行会社のコンピューターにのみ存在しました。もしも、その会社がデータを消してしまえば、あなたのお金は失われてしまいます。

Bitcoinでは、そのような絶対的な力を持った中央機関が存在しません。特定の会社や組織が運営しているのではなく、誰でも参加でき、誰にもコントロールができないオープンソース・プロジェクトです。
誰もあなたのお金を取り上げることができず、誰も取引を取り消せません。

Bitcoinにはメッセージを上乗せする機能があり、今回はそれを利用しました。そのメッセージは誰も書き換えられず、誰も消すことができません。

このイベントの真の意味

それでは、なぜBitcoinを用いたのか。このイベントの目的は何だったのか。イベントから六日後の2月11日、・・・・・・・・・運営がその意図を明らかにしました。

このイベントの真の意味
このイベントの真の意味

なぜ永久にメッセージが残るのか

ここまで当たり前の前提として受け入れてきましたが、そもそも、なぜ永久にメッセージが残るのでしょうか。
さしあたり、二つの根拠を示します。

 一つ目は、地理的な理由です。ビットコインの取引履歴は全世界に散らばった約6000台のコンピューターに発信され、保管されます(下図参照)。たとえ政府の取り締まりやハッキング、自然災害に見舞われても、すべての情報が消えることはありません。

 二つ目は、それらのコンピューターには取引履歴をずっと保ち続けるインセンティブがあるからです。ビットコインは10分に1度、新規のコインを一人だけに発行します。1このコインを手に入れる競争に加わるには、過去すべての取引履歴を持っていなければなりません。ビットコインの価値が保たれている限りは、誰かがレースに参加する(=取引履歴が残る)ことが期待できるのです。

Bitcoinのノード
Bitcoinの取引履歴を保管しているコンピューターの数と分布。2017年2月8日、https://bitnodes.21.co より

実装

Bitcoinでメッセージを刻むにはいくつかの方法234がありますが、今回はBitcoreというJavaScriptライブラリを使いました。

Bitcoreを使ったメッセージの記録については、こちらの記事に依っています。
ビットコインのブロックチェーンにデータを記録する(OP_RETURNの利用)

文字数カウントの部分は、こちらのコードを借用。Bitcoinに添付できるメッセージは80byteまでで、半角なら40文字、全角なら26文字、絵文字なら20文字。今回は全角を基準として半角52、全角26、絵文字13字にフォームの文字数を制限しました。
jQueryで入力フォームに文字カウント(カウントダウン)を設置する方法

【注意】二重投稿対策をしていないため、broadcast.htmlをリロードすると連投する仕様になっています。不特定多数に公開する場合は、必ず対策をしてください。

index.hmtl
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
  <script type="text/javascript">

  //制限文字数の設定
  var stopCount = 26;

  function strLength(strSrc){
    len = 0;
    strSrc = escape(strSrc);
    for(i = 0; i < strSrc.length; i++, len++){
      if(strSrc.charAt(i) == "%"){
        if(strSrc.charAt(++i) == "u"){
          i += 3;
          len++;
        }
        i++;
      }
    }
    return len;
  }

//文字数カウント
  function showLength( str,name ) {
    var strCount = Math.ceil(strLength(str).toString() / 2);
    if(strCount > stopCount){
      document.getElementById('submit').style.display = "none"; //全角換算で26文字を超えたら送信ボタンを消す。
      document.getElementById(name + "Inner").innerHTML = '<em style="color:#ff0000;">' + strCount + ' / 26 Over!</em>';
    }else if(strCount == stopCount){
      document.getElementById('submit').style.display = "";
      document.getElementById(name + "Inner").innerHTML = '<em style="color:#ff0000;">' + strCount + ' / 26</em>';
    }else{
      document.getElementById('submit').style.display = "";
      document.getElementById(name + "Inner").innerHTML = strCount + " / 26";
    }
  }
  </script>
</head>
<body>
  <form id="textForm" name="textForm" action="broadcast.html"> //フォームを送信したらbroadcast.htmlに遷移
    <input name="text" type="text" id="text" size="70" value="" onkeyup="showLength(value,id);"/>
    <span id="textInner">0 / 26</span>
    <input type="submit" id="submit" value="●→🌏" onclick="funcBtn();"> //submitボタンを押すと、funcBtnメソッドを実行
  </form>

  <script>
  function funcBtn() {
    localStorage.text = document.textForm.text.value; //フォームのメッセージをローカルストレージに保存
  }
  </script>
</body>
</html>

broadcast.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="bower_components/bitcore/bitcore-lib.min.js"></script>
<script src="bower_components/bitcore-explorers/bitcore-explorers.min.js"></script>

</head>
<body>
  <script>
  var bitcore = require('bitcore-lib');
  var explorers = require('bitcore-explorers');
  var insight = new explorers.Insight();

  var a_address = ""; //Bitcoinアドレス
  var privateKey = ""; //秘密鍵

  getUTXO(a_address, function(utxos){

        utxos.forEach(function(utxo){console.log(utxo.toJSON());});
        console.log(localStorage.text);

        //トランザクション生成
        var transaction = new bitcore.Transaction().fee(100000) //送金手数料。今回は0.001BTC=117円
          .from(utxos)
          .addData(localStorage.text) //ローカルストレージに保存したメッセージを添付
          .change("") //お釣り用アドレス
          .sign(privateKey)

        console.log("transaction",transaction.toJSON());

        broadcast(transaction, function(id){
          console.log(id);
    });

  });

  function getUTXO(address, done)
  {
    //utxosの取得
    insight.getUnspentUtxos(address, function(err, utxos) {
      if (err) {
        console.log(err);
      }
      done(utxos);
    });
  }

  function broadcast(tx, done)
  {
    //ブロードキャスト
    insight.broadcast(tx, function(err, id) {
      if (err) {
        console.log(err);
      }
       done(id);
    });
  }
  </script>
</body>
  <a href="index.html">戻る</a>
</html>

まとめ

メディア環境の変化に応じてアイドルも変化してきた歴史がある。
・・・・・・・・・運営はインタビュー5でそう語りました。
Bitcoinも一つの表現媒体と言えます。このコインが世のありかたを一変させるとき、アイドルもまた、それに適応するように変わっていくのかもしれません。
彼女への好意が、いつのまにか世界への好意にすり替わっているような、薄い膜のように世界を覆うアイドルへと。

追記

2018年6月9日、仙台市天文台にて、◯→●→🌏と同内容の企画🌕→⚫→🌏を実施。40人がメッセージを刻む。

刻まれたメッセージはこちらから確認できます。
https://chainflyer.bitflyer.jp/Address/1MLhbtWXrH8Y7FrHs3FnXnaCvbJw2USwQe

Dfd1FkBU0AA2gwp.jpg-large.jpeg


『 Bitcoin 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。