morito

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

TruffleでES6構文を使えるようにする

はじめに

Truffleでスマートコントラクト開発をする際
テストやバックエンドサーバーの実装にはNodoJSをよく使うのですが
デフォルトだと最新のECMAcriptに対応していないのでBabelを導入します。

毎回やり方を忘れてしまうので、導入手順をメモとしてまとめておきます。

環境

truffleはインストール済みで、truffleプロジェクトディレクトリ内で作業する前提です。

  • macOS Catalina 10.15.2
  • node : v11.14.0
  • npm : 6.7.0
  • Truffle : v5.1.2

手順

必要なbabel関連モジュールのインストール

$ npm i babel-preset-env babel-register babel-polyfill

.babelrcを作成

$ touch .babelrc

truffleプロジェクトディレクトリ直下に.babelrcファイルを作成します。

.babelrc

{
  "presets": ["env"]
}

truffle-config.jsでbabel-register, babel-polyfillをrequire

truffleプロジェクトのの設定ファイルであるtruffle-config.jsの先頭行にrequireを挿入します。

truffle-config.js

require('babel-register')
require('babel-polyfill')

これでimport/exportなどの構文をTruffleのテストスクリプトなどで使えるようになります。

babel モジュールの説明

babelモジュールたちが何をしているのか知らなかったのでググりました。

babelとは

JavaScriptECMAScriptと呼ばれる標準によって定められた仕様にしたがって実装されています。
現在はes6(es2015以降のもの)と呼ばれる6番目のバージョンが主流となっているのですが、
各ブラウザでは実装されていない仕様が多くあります。
また、Nodejsで実行する際にもバージョンによって実行できる仕様が異なります。

babelはそのような新しい世代のJavascriptの標準仕様を古い実行環境でも使えるようにしてくれるトランスコンパイラです。

babel-preset-env

環境に合わせたトランスパイル(ある言語で書かれたコードを元に別の言語のコードを生成する)を行うプリセット 実行環境に応じてtranspileが必要な構文のpresetモジュールを自動でロードしてくれる。

babel-polyfill

babel-polyfill Polyfillはある機能をサポートしていないブラウザ上でその機能を実装するための小さいライブラリ群。構文だけでなくPromiseなどの新しい機能を実装可能にする。

babel-register

node.jsのrequire文をフックして、ファイルを読み込む直前にbabelでトランスパイルする

最後に

2年前くらいからこの方法でやってるけど
最近だともっといいやりかたあるかも

参考

【5分でなんとなく理解!】Babel入門 babel-preset-envで環境に合わせてJavaScriptをトランスパイルする

シュレーディンガー方程式入門のための波動方程式

シュレーディンガー方程式とは

フランスのド・ブロイはボーアの原子モデルをもとに電子波動説を唱え、粒子が波と同じような性質を持つといいました。

ド・ブロイが提唱した電子の波は
そのまま電子波とかド・ブロイ波ともよばれますが、
電子は物質を構成する素粒子の一つでもあり、
最近では他の素粒子にも同じような波動性が確認されたので
今では物質波と呼ばれています。

シュレーディンガーはド・ブロイの提唱した物質波に
興味を持ち波動力学として理論構築をおこないました。

波動性を示す物質が時間と共に他の位置に伝わっていくという挙動を計算するための式がシュレディンガー方程式です。

下記の数式で表されます


i\frac{h}{2\pi} \bullet \frac{\partial \psi}{\partial t}=H\psi

$$ i\frac{h}{2\pi} \bullet \frac{\partial \psi}{\partial t}=H\psi $$

ここで、
 i 虚数単位
 h プランク定数
 \psi (プサイ):波動関数
t:時間
Hハミルトニアン):エネルギーに対応する演算子

よくわからん記号が多いけどこの式を使うことで
原子核の周りにある電子がどういう軌道で動くのか
求めることができるらしい^^

数式を理解するために必要な知識

シュレーティンガーの方程式を理解するために
高校数学と物理学の復習をしました

複素数、指数関数、微分積分オイラーの公式などの
数学の知識に加えて、波動などの物理学が必要になります
特に波動関数を導くために高校物理で習った波動方程式などを
思い出しておくことは必須でした

情報学部なので数学のほうは大学でもまあまあやっていたのですが
物理は入試以降、全く触れてなかったので何も覚えてなかったです

今回は軽く復習した波動に関する式と用語を
備忘録としてまとめておきます

波動系の用語って直感的に理解しにくくない?

波動に関する数式と用語

用語

周期:T

時間的に周期的に繰り返す波の1周期の時間

波長:\lambda

空間的に周期的に繰り返す波の1周期の長さ

周期も波長も波動の1周期のことを言っていたんですね
波の1周期とは連続する波の山から山、谷から谷のことです
f:id:sakanamori:20201025205359p:plain

振動数:\nu

媒質が1秒間に往復する回数。周期とは逆数の関係にある。

ヘルツ(Hz)とかはこれのこと


\nu = \frac{1}{T}

波の速さ:v

振動数\nuと波長\lambdaをかけると速さvになります


v=\nu\lambda

角振動数:\omega

角周波数または円運動ともいう。2\pi秒間の振動回数を表す
振動数\nu2\pi

角速度(ベクトル)と同じ数値だが、シュレーディンガー方程式ではスカラー量として扱う。


\omega=2\pi\nu=\frac{2\pi}{T}

波数:k

2\pi\lambdaで割った数値


k=\frac{2\pi}{\lambda}

2\piの中に何波長含まれているかを表すもの

振動と波動に関する数式

単振動の変位

周期的に変化する運動である等速円運動ですが
これを直径に射影した動きを表した式が単振動の式になります
ググってみるとわかりやすいGIFがいっぱい出てくる

初期値0、振幅Ay軸に射影した場合の式は


y=A\sin\omega t\tag{1}

波動方程式

単振動は直線上で行ったり来たりを繰り返すのみですが、
波動は伝わっていくものです。

原点以外の任意の点でどのような振動になるかを表したのが波動方程式

波動方程式では任意の点xの時刻tにおける変位y(x, t)は以下のように表します。


y(x,t)=A\sin 2\pi (\frac{t}{T}-\frac{x}{\lambda})\tag{2}

この式を導くため、
単振動波における、任意の点$x$の波について考えてみます。 f:id:sakanamori:20201025205302p:plain

xにある波も元は原点で発生したものが伝わってきたものです。
考え方を変えると、点xでは過去における原点の振動が再現されているということになります。

原点では単振動の式(1)で表される振動をしているので、
この式をもとに(2)式を導いていきます。

まず\omega=2\pi\nu=2\pi Tを使って(1)式を変形します
また、原点はx=0なので、変位y=(x,t)は、


\begin{align}
y(0, t)&=A\sin\omega t  \\\\
&=A\sin \frac{2\pi t}{T} \tag{3}
\end{align}

となります。

次に、点xにおける変位y(x, t)を考えるのですが,
xでは何秒前の原点の振動が再現されているのでしょうか?

この点xの波の伝わる速さをvとすると、原点から点xに到達するまでに\frac{x}{v}秒かかります。つまり、\frac{x}{v}秒前の振動が点xで再現されています。

なので、点xにおける変位y(x, t)


y(x, t)=y(0,t-\frac{x}{v})=A\sin2\pi\frac{(t-\frac{x}{v})}{T}

となり、計算すると


\begin{align}
y(x, t)&=A\sin\frac{2\pi}{T}(t-\frac{x}{v}) \\\\
&=A\sin2\pi(\frac{t}{T}-\frac{x}{vT}) \\\\
&=A\sin2\pi(\frac{t}{T}-\frac{x}{\lambda})=(2)
\end{align}

綺麗に(2)式の形に変換することができました。

そして波動関数

ここまで、波動方程式を導くところまでを復習しました。

これらの式はシュレーティンガー方程式の波動関数\psi中に含まれています。

式(2)から2\piを消去するように\omegakを使って変形すると


\begin{align}
y&=A\sin(\omega t-kx)\\\\
&=-A\sin(kx-\omega t)
\end{align}

となります。そして、波動関数\psiは以下の式です


\psi=A\cos(kx-\omega t)+Ai\sin(kx-\omega t)=Ae^{i(kx-\omega t)}

高校で習う波動方程式波動関数の中に含まれていることがわかると思います。

波動方程式を、複素数と指数関数を用いることで、空間的に拡張し減衰や増幅まで表せるようにしたものが、シュレーティンガー方程式のなかでもちいられていることがわかるとおもいます。

参考

http://www.wakariyasui.sakura.ne.jp/p/mech/tann/tannsinn.html

http://hooktail.sub.jp/wave/sinWave1/

マンガでわかる量子力学

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

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仕様を絡めて記事にしていきたいと思います。