morito

個人的に勉強したことのメモを投稿していく技術ブログ。最近はWebアプリ開発と量子コンピュータの勉強をしてます。

量子コンピュータ入門書、量子コンピュータ[図解雑学] を読んでみた

2日ぶりの更新になります。

量子コンピュータを勉強していくにあたって、
これからどのような知識が必要になるのか、
これまでにどのような研究がされているのか、
量子コンピュータの概要を知ることができるような入門書を探しました。

電気通信大学教授である西野哲郎氏による量子コンピュータ[図解雑学](ナツメ社)を読んだので レビューを書いてみます。

本の構成

本書の内容は下記の構成になっています。

Chaper1では
現在の基本的なコンピュータアーキテクチャの一つである
ノイマン型コンピュータが苦手な計算(因数分解、巡回セールスマン問題)と
量子コンピュータがどのような仕組みでそれらの問題を計算できるのか?
という点について、量子の基本的な原理の解説とともに整理しています。

Chapter2では
現在主流であるノイマン型コンピュータの歴史と簡単な仕組みを紹介し、
その計算能力の限界について
N=NP問題という計算機科学の未解決問題を取り上げ解説しています。

Chapter3では
量子コンピュータ研究の歴史を振り返る形で
量子コンピュータが脚光を浴びるまでのプロセスが解説されています。
特に量子力学における最大の未解決問題である観測問題についての解説は非常に面白かったです。
シュレティンガーの猫、コペンハーゲン解釈エヴァレット解釈など
SF映画にもよく出てくる単語の話もあります

Chapter3とChapter4では
量子コンピュータが行う量子計算とはどのようなものであるか解説しています。
量子計算には2通りの定義
「量子確率的な計算」「量子ビットに対するユニタリ変換の適応」があり、
量子コイン投げという問題を取り上げ、それぞれのChapterで解説しています。

Chapter5では量子回路の論理構成について解説しています。
図がとにかく豊富で、現状のコンピュータの論理構成との比較もあり、
非常に分かり易かったです。

Chapter6では
量子コンピュータを物理的にどう実現するのか、
過去の研究をいくつか紹介する形で解説しています。

感想

内容をざっと書き出しましたが、本書の特徴は
とにかく図が多いという点だと思います。
1ページごとに図が書かれています。

特にChapter1で取り上げられている干渉計の実験などは
図がなくてはなかなか理解しにくいところだったので
とてもありがたかったです。

また、Chapterごとの話のつながりがわかりやすいです。
現状のコンピュータの課題と量子コンピュータを使うことの利点、
それを量子計算でどう解決するのか?というストーリーが
整理しやすい構成になっています。

過去の研究などもセクションごとにわかりやすい図とともに
綺麗に整理されていて、量子コンピュータという分野の俯瞰的な知識を仕入れることができました

出典

量子コンピュータ[図解雑学] , 西野哲郎, ナツメ社

初学者による量子コンピュータ完全理解への道

アウトプットの習慣を身につけるべく

本ブログを開設してからの長い期間、
更新もせずに放置していましたがついに活用する時がきました

なぜか今、モチベがめちゃくちゃ高いので
いろいろと勉強したことを少しずつ知識のアウトプットにしていこうと思います

量子コンピュータの勉強したい

内容ですが、WEB系の開発のメモ書きや情報工学系の記事に加えて、
今個人的に熱い量子コンピュータに関する記事を投稿していく予定です

物理学の知識は高校物理でほぼ止まっているため、 間違った情報など混じってしまうかもしれません。
間違いの指摘などのコメント大歓迎です、よければ見ていってください!!!

【Ethereum】スマートコントラクトで乱数を実装する方法いろいろ

2/2019現在,スマートコントクト単一では乱数を生成できないので Ethereumコミュニティでは様々な工夫がされている

今回は、自分用のメモとしてスマートコントラクトでランダムな値を実現する方法を調査してまとめてみました 自分でやってみたりすると思うので実装など随時追記していきたいと思います

スマートコントラクトで乱数を実装する方法

複数のユーザーの入力値とハッシュ関数を使う

Ethereum におけるrandom numberの生成アルゴリズム

ユーザーにGasを消費させてしまう(比較的少なくはあるが)のでなにかインセンティブが必要

繰り返しハッシングによって作る

Participatory random numbers in Ethereum

前の項と同じくユーザーの入力値(アドレス)を用いてハッシングを行う

ブロックチェーン変数を入力値としてもちいる

block.coinbase、block.difficulty、block.timestampなどのブロック変数をソースとして使用する方法がある

しかし、これらすべてのブロック変数はマイナーが操作できる可能性があるため,完璧ではない。

外部Oracle

Oraclizeのような外部オラクルを使用すると、スマートコントラクトから為替レート、天気予報、株価(random.orgなど)などのWeb APIからデータを要求可能になる。

このアプローチの主な欠点は、それらのAPIは集中管理されている点である。

signidice

signidiceは暗号化署名に基づいたアルゴリズムで、プレーヤーと胴元の2者のみが関与するスマートコントラクトでの乱数生成に適している。 アルゴリズムは次のように機能する。

  • signidiceはスマートコントラクトを呼ぶことによって賭けをする。
  • 胴元は賭けを見て、その秘密鍵でその賭けに署名し、そしてその署名をスマートコントラクトに送る。
  • スマートコントラクトは、既知の公開鍵を使用して署名を検証。
  • この署名は,それから乱数を生成するのに使用する。

Randao

randao -github

完全にrandomな数字を生み出すための smart contract RANDAO

【Ethereum】トランザクションのinputデータをdecodeする方法

コントラクト呼び出しのトランザクションの中身が気になって、いろいろ調べたので記録しておきます。
Ethereumのトランザクション構造は下図のようになっています。

f:id:sakanamori:20190202170008p:plain
Ethereumトランザクション構造
この中でもコントラクトに送信するDataの部分を見ていきます

今回使用したプログラムはERC20規格のトークコントラクトです。

pragma solidity ^0.4.24;
//Coinコントラクト----------------------
contract KilmyCoin {
  //状態変数の宣言
  string public name;                             // トークンの名前
  string public symbol;                           // トークンの単位
  uint8 public decimals;                          // 小数点以下の桁数
  uint256 public totalSupply;                     // トークンの総量
  mapping (address => uint256) public balanceOf;  // 各アドレスの残高

  //イベント通知
  event Transfer(address indexed from, address indexed to, uint256 value);

  //コンストラクタ
  function KilmyCoin(uint256 _supply, string _name, string _symbol, uint8 _decimals) {
    balanceOf[msg.sender] = _supply;
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
    totalSupply = _supply;
  }

  //送金
  function transfer(address _to, uint256 _value) {
    //不正送金チェック
    if (balanceOf[msg.sender] < _value) throw;
    if (balanceOf[_to] + _value < balanceOf[_to]) throw;

    //送信アドレスと受信アドレスの残高を更新
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;
    //イベント通知
    Transfer(msg.sender, _to, _value);

  }
}

 送信したトランザクションとその結果は下の図のとおりです。アドレスを引数にして所持トークンの量が返ってきています。ちなみに、今回の作業は全てRemixのJavascriptVM上で行いました。

f:id:sakanamori:20190202164122p:plain
トランザクション送信とoutput

さらに、下の図はRemixのログで確認したトランザクションの詳細である。

f:id:sakanamori:20190202160200p:plain
Remix上で確認したトランザクションの詳細

ここでinputとdecoded inputという項目があります。

inputは上の図だと省略されているのですが、略さずに書くとこのような16進数になります。

0x70a08231000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733c

後半のca35b7d915458ef540ade6068dfe2f44e8fa733cはトランザクションの引数として渡したアカウントアドレスですね。

そしてinputの内容はなんなのか?どうやってdecodeするのかという問題は
「Ethereum input data」でググった結果すぐに解決しました。

下のリンク先のサイトではコントラクトのABIとInputの16進数を入力するとdecodeしてinput dataを出力してくれます。そして、この出力結果がトランザクションコントラクト送信データの中身だと考えられます。
lab.miguelmota.com
GitHub - miguelmota/ethereum-input-data-decoder: Ethereum smart contract transaction input data decoder


f:id:sakanamori:20190202171203p:plain
解析結果

上の図が解析結果なのですが、見てわかるように、引数として渡したデータ以外にも、関数の名前と引数の型の情報が付加されていました。
これらの情報はコントラクトのABIコードから定義されるようです。ABIコードはコントラクトの仕様書のようなものです。今度、コントラクトの発行の手順についてもABI仕様を絡めて記事にしていきたいと思います。