//tips
//Dapps理解
スマートコントラクトとは、契約にまつわる様々なリスクや課題を情報技術で解決しようという考え方で、自動販売機のように商品の売買の自動化をすると考えればわかりやすい。
また、電子マネーのオートチャージもスマートコントラクトの一つで、残高が設定額を下回ると自動的にチャージが行われる。これも一種のスマートコントラクトと言える。
DAppsとは非中央集権的アプリケーションdecentralized Applicationsの略で特定の企業や団体のサーバーに依存しないものを指す。
デジタル猫の売買価格が1300万円以上になるなどの話題になったcryptokittiesのほかオンラインvr上での不動産売買サービスを行なったdecentraland、トークンとして表現された絵画などの美術品売買マーケットbitpaintingなどが例として存在する。
実際DAppsを作っていくことになるとベースがわかるまではEthereumのテストネットを利用する形になるが、先でも利用していたRopstenはイーサのメインネットに一番構成が近いものの、ネットワーク維持にマイニングが必要であり、維持コストが高くつくこと、また、マイニングのインセンティブが低いので参加者が少なくなり、攻撃者に対して脆弱になってしまうなどの問題を抱えている。
その代替案として、kovanやRinkebyといったテストネットが用意されており、誰もが参加可能ではないといった制約がある反面、マイニングのコストがかからないProof of Authorityというコンセンサスアルゴリズムの仕組みを採用しているためブロック生成時間も短く、バリデータといわれる限られた信用できる人々の承認でブロック生成となる。
バリデータは住所や名前なども公開され身元調査で犯罪歴のない人が選出され、あらかじめDappsを使ってバリデータの追加や削除を投票にておこなうことになる。
Dappsを試すにはウォレットアプリケーションを事前に保有している必要があり、これがmetamaskの役割にあたる。
実際にウォレットに仮想通貨を入金しても、通貨のデータがウォレットに保存されるわけではなく、アカウントに紐づく残高を操作する鍵を管理するのがウォレットの役割となる。
自分の取引自体は個人を特定できない形でブロックチェーン上に全て記載されているので、そこから残高は逆残でき、取引実行の際の鍵の生成の役割をになっている。
こう考えるとprivatekeyなどのハッシュ生成の一部はスーパーコンピュータで確かやっていたかと思うのでmetamaskを運用する上でスパコンが必要となるのかもしれない。ここは要確認とする。
Dappsの作成にはsolidityというスマートコントラクトを実装するための言語が必要となってくるよう。
そもそもビットコインは素早く送金する目的で作られたのに対し、イーサはあらゆるプログラムをブロックチェーン上で動作させることを目的に作られているので内部構造が多少異なるということは覚えておく。
以前Gas(最小単位wei)というコストを使用したがこれは、送金コストだけでなく、プログラムの実行コストとしても機能する。ただ、ブロックチェーンを書き換えず閲覧のみをする関数はcallと呼ばれ、gasを発生させない。
イーサにはEtherの所持を記録するアカウントがあり、20bytesのアドレスを持っている。このアカウントデータはstate treeと呼ばれ、ブロック外に保存されているとのこと。毎回全てのtransactionを洗い直して集計しているわけではないよう。
Solidityで記述されるスマートコントラクトをバイトコードに変換して実行するEVMは、コンピュータモデルを数学的に簡略化したもので、どのようなプログラムでも実行できる。一方でそこで実行されるコードはネットワークやファイルシステム、他のスマートコントラクトなどにアクセスできず、単独で処理される。これは参照などが使えないのかも疑問なので実際の内容を見ていく。
solidityはイーサ上でスマートコントラクトを実装するために作られたオブジェクト指向の言語で、javascriptと似ているよう。
下記は、SimpleStorageコントラクトに整数を保存するstoredDataを追記し、functionを用いてbid関数を宣言している。
pragma solidity >=0.4.24<0.6.0;
contract SimpleStorage{
unit storeData;
function bid() public payable{
}
}
今まで経験した言語と若干異なる点があるが全く見たことがないものは出てこなさそう。
このsolidityを使用してスクリプトを理解する上でcryptozombieという面白いツールを見つけたのでさっっそくやってみることにする。
https://cryptozombies.io/jp/
フロントエンドの実装時にはweb3.jsと呼ばれるjavasciptのライブラリを用いてスマートコントラクトにアクセスする点でもjsとの相性が良さそう。
Solidityのコードはコントラクト内にカプセル化されている。コントラクトはイーサリアムアプリケーションの基本ブロックのこと。変数やファンクションはすべてコントラクトに属している。
Solidityのソースコードは全て”version pragma"で始まらなければならない。コードが使用するSolidityのコンパイラのバージョンを宣言する。pragma solidity ^0.4.19; という風に宣言。
uintというのは、符号なし整数のデータ型で、他にintという符号付整数もある。
構造体を使えば、複数のプロパティを持つ複雑なデータ型を作成することができる。
struct Person {
uint age;
string name;
}
Solidityでは、関数はデフォルトでpublicになっている。
function _addToArray(uint _number) private {
numbers.push(_number);
}
コントラクト内の他の関数からだけ呼び出して、numbers配列に格納できる。