FC2ブログ

ブロックチェーン関連の記事紹介まとめ(2019年2月:#32-59)

どうも、ぺろりんです。

ブロックチェーンや暗号資産(仮想通貨)関連の記事や論文などのデイリー紹介ツイート、2か月目のまとめです!
ご興味ある記事があれば、ぜひ元記事も読んでみてください!

<< 2019年1月:#1-31
2019年3月:#60-90 >>


記事紹介まとめ(2019年2月:#32-59)

























































テーマ : ビジネスアイディア
ジャンル : ビジネス

Keyword : ブロックチェーン 仮想通貨 イーサリアム Ethereum 暗号資産 リップル blockchain

コントラクトの継承と連携(他のコントラクトのメソッド実行)

どうも、ぺろりんです。

「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」をテキストとして使った勉強のつづきです。(前回の記事はこちら

実を言うと今回はChapter 4の「会員管理」(これは次の記事へ)をやりたかったんですが、以前サラッと流し読みしたところがソースコードに出てきて詰まりましたw
というわけで、今回はChapter 3の「コントラクトの継承」と「他のコントラクトのメソッドを実行」というセクションに戻って理解を深めようと思います。

ここで私が理解したいのは「(1つのソースコードに)2つ以上のコントラクトが書いてあるときの動き」です。
これを「コントラクトの継承」と、「他のコントラクトのメソッドを実行」という2つの切り口から調べていきます。(テキストを参照しつつ)


前提知識

お恥ずかしながらオブジェクト指向言語の理解が浅くて、まず単語でつまずきましたw

なので、このへんからちゃんと理解しておこうかと思います。


「クラス」、「インスタンス」とは?

「クラス」は“鋳型”とか“設計図”にあたるもので、これをもとに作られた“実体”が「インスタンス」です。


「メソッド」とは?

実質的には関数だったりしますが、関数とは別の概念です。

オブジェクト指向では
・属性(どんなもの?)…a,b,cという性質を持つ
・操作(何ができる?)…X,Yという動作ができる
をひとまとめにした(a,b,c,X,Y)を1つの「オブジェクト」と考えます。

オブジェクトができる「操作」のことを「メソッド」と呼びます。

ちなみに、
〈オブジェクト〉.〈オブジェクト内の変数や関数名〉

と書くことで、〈オブジェクト〉内で定義された属性や操作を呼び出せます。


「継承」、「オーバーライド」とは?

オブジェクト指向では、親子関係をつけたクラスを定義することができます。

何がうれしいかと言うと、たとえば2つのクラスAとBを定義するときに、AとBには共通の性質Pがあったとします。

「性質Pを持った親クラスX」を作ってAとBをXの子クラスとすれば、子クラスは親クラスの性質を引き継ぐため、AとBの中で共通の性質Pを定義する必要がなくなります。

この「子クラスは親クラスの性質を引き継ぐ」性質を「継承」と呼びます。

子クラスの中で、継承した親クラスの変数などを上書きするのが「オーバーライド」です。

ここまでがオブジェクト指向についての前提知識です。
このへんの理解をちゃんとしておかないと分からない!(私だけか……?w)


「コントラクト」、「デプロイ」とは?

オブジェクト指向の言葉はすこし分かった気がしますが、今度はイーサリアムの言葉の理解も浅いことに気付きましたw
まだいまいち「コントラクト」と「デプロイ」のイメージがつかめてなかったので、これらも調べてみました。

ここまでオブジェクト指向の言葉を復習しておくと、以下のような理解ができるようです。
ブロックチェーンEthereum入門 3(NTTデータ先端技術株式会社)より)

オブジェクト指向言語との対比ではコントラクトのソースコードはクラスであり、デプロイはインスタンス化すること



(参考)
“たい焼き”であま~く理解するJava文法と言語仕様 (1/2)(@IT)
【PHP超入門】クラス~例外処理~PDOの基礎(Qiita)
Javaでインスタンスを使う方法【初心者向け】(TECHACADEMYmagazine)
メソッド (method)とは(「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典)
ブロックチェーンEthereum入門 3(NTTデータ先端技術株式会社)


コントラクトの継承

さて、ここまでの前提知識をもとに、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」へ戻ってきます。

コンパイラのバージョンをソースに合わせつつ、サンプルコードをコンパイルします。



このサンプルコードの概要としては以下のようなものです。
・1つのソースコードの中に
  ①コントラクトA
  ②AのサブコントラクトB
  ③コントラクトC
 という3つのコントラクトが書いてある。
・コントラクトCの中で、AとBをデプロイしている(「new」コマンドを使うことでデプロイできる)。

このサンプルコードで、コントラクトの継承について動きを見ていきます。

初心者の私としては、はじめは素朴に「上に書いてるAから順にSolidityでデプロイしていくべきなのかな?」と考えました。

しかしよく考えてみると、コントラクトCの中でAとBのインスタンスを作っている(デプロイしている)ので、コントラクトCだけデプロイすれば事足りるのでは?

……と思って、コントラクトCのみデプロイすることを試してみました。
Cだけ選んで、EnvironmentをJavaScript VMにしつつデプロイしてみます。



できたのはCだけです。


この状態で「c」と「getData」を押してみても初期状態という感じです。



ソースコードの中で、コントラクトAとBのインスタンスを作っている(中でnewしている)関数「makeContract」を押してみます。
この後ふただび「c」と「getData」を押してみると、値を拾っています。


今度は、はじめに考えていた通り、A、B、Cの順にすべてデプロイしてみました。



この状態で、青いボタンだけ押してみます。

特に何も値は入っていません。



ちなみにここで、BはAを継承しているため、Bの中では定義されていない「setA」と「a」のボタンがBのところにもあります。

ためしに、Aのところで
a=15
と設定して「setA」を実行してみます。


この直後にA、B、Cで青いボタンを押してみます。
すると、Aの「a」と「getData」の値のみ変わりました。



次に、Bのところで
a=20
と設定して「setA」を実行してみます。


この直後にもA、B、Cで青いボタンを押してみると、今度はBの「a」と「getData」の値のみ変わりました。



Aの中に定義された「a」をBの中でも定義していますが、これは別に、BがAの中で定義した「a」の値を参照する動きにはなっていないようです。

この時点でCの「makeContract」をするとどうなるでしょうか?
これを実行しつつ、Cの中の「c」と「getData」を押してみます。


Cの中ではあくまで
a=1
としてAとBのインスタンスを作成して計算しているので、先ほどAやBの中で設定した「a」とは関係なくCの中で計算されていることがわかります。

ちなみに、Cで「makeContract」した後も、AとBの中にある「a」と「getData」は変わっていませんでした。


どうやら、以下のようなことが言えるようです。
・AとBのインスタンスを中で作っているCだけデプロイすれば、AとBをデプロイしなくてもCは結果を出せる。
・A、B、Cをそれぞれデプロイすると、それぞれは独立に動く(設定した「a」の値は、あくまで各A、B、C内でのみ使われる)。

ちなみに、「new」コマンドを消して、Cの中でインスタンスを作らずAやBを呼んでみる……みたいなことを試したかったのですが、そもそもコンパイルできるコードにできず断念しましたw


他のコントラクトのメソッドを実行

次に、他のコントラクトのメソッドを実行するサンプルコードをコンパイルしてみます。


コードの概要としては、以下のようなものです。
・1つのコードに
  ①コントラクトA
  ②コントラクトB
 の2つが書いてある。
・コントラクトBの中で「コントラクトA」や「Aの中で定義した変数」を呼ぶけど、Aの“インスタンス化”(newコマンド)はやらない。

先ほどの「継承」ではコントラクトCの中でAとBをインスタンス化していたので、CだけデプロイすればAやBの中にあるデータを拾ってきました。

しかし今回はコントラクトBの中でAのインスタンス化はしていないので、おそらくBだけデプロイしても「Bで呼んでいる、Aの中で定義した変数」の値は拾えないでしょう……という想定のもと、まずはBだけデプロイしてみます。



ためしにBだけデプロイした状態で青いボタンだけ押してみると、どれも初期状態です。
(というかコントラクトAをデプロイしていないので、そもそもコントラクトAのアドレスを入れなさいという場所に何も入れられない……)


次に、Aもデプロイしてみます。



さて、Aのアドレスを入れて「setA」を押してから、Bの青いボタンを押してみます。



めでたく値を拾うことができました。

コントラクトAをデプロイしたときのアドレスを使うことでAとBが紐づいて、BからAの中で定義された変数の値を呼び出すことができました。

コントラクトBで定義されているsetA(A _a)の中では、setA(A _a)の引数として与えられたAのアドレス_aを
a = A(_a)

というようにセットします。

aNum()はa.num()を返すことで(numはコントラクトAの中で定義された状態変数)、Aで定義されたnumの値を返します。

〈オブジェクト〉.〈オブジェクト内の変数や関数名〉

とすることで〈オブジェクト〉内で定義された変数や関数が呼び出せることを思い出すと、「a = A(_a)」は「オブジェクト」になっているようです。

つまり、コントラクト名の引数にそのコントラクトのデプロイアドレスを指定したら「オブジェクト」化(もしくはインスタンス化)されるようです。

(参考)
インスタンスの考え方・クラス型変数・コンストラクタ・静的メンバ(Qiita)
【基本の基本】Javaのデータ型とは?と簡単な使い方まとめ(エンジニアの入り口)
Ethereum 外部コントラクトの呼び出し方法(Remix, MetaMask連携)(Qiita)


まとめ

オブジェクト指向言語に慣れている方だとそんなに困らないのかも知れませんが、私は慣れておらず詰まりながらいくつか試してみましたw
オブジェクト指向言語の本も手元に置いておく方が良さそうだなぁ。。

今回触ってみて、個人的には以下のような理解が得られました。
・1つのコード内に複数のコントラクトが含まれるとき、
 ①あるコントラクトXの中で別のコントラクトYをデプロイしているならば、XをデプロイすればYのデプロイは不要。
 ②それぞれのコントラクトを別々にデプロイすると、各々が独立して動く。
・コントラクトZの引数にそのコントラクトZのデプロイアドレスWを指定したZ(W)は「オブジェクト」化(インスタンス化)される。

デプロイアドレスがJavaなどで何にあたるのか分からないのですが、デプロイアドレスを引数に指定するとオブジェクト化するというのが分かったような分からないような……w

次ははりきって「会員管理」のところをやりますw

では今回はこのへんで~(´・ω・`)

テーマ : プログラミング
ジャンル : コンピュータ

Keyword : ブロックチェーン blockcahin 仮想通貨 暗号資産 イーサリアム Ethereum Solidity

ブロックチェーン関連の記事紹介まとめ(2019年1月:#1-31)

どうも、ぺろりんです。

ブロックチェーンや暗号資産(仮想通貨)関連の記事や論文などについて、Twitterで1日1つ紹介&コメントをつぶやく試みを2019年1月1日から始めてみました!
増えてくると見づらいと思うので、1か月ごとにツイートをこのブログにまとめていこうかと思います。

2019年2月:#32-59 >>


記事紹介まとめ(2019年1月:#1-31)

































































テーマ : ビジネスアイディア
ジャンル : ビジネス

Keyword : ブロックチェーン blockcahin 仮想通貨 暗号資産 イーサリアム リップル

「価値のインターネット」ってなんだろう?

どうも、ぺろりんです。

今回は、Rippleの言う「価値のインターネット」について自分なりに考えて再構築してみました。

抽象化して考えを再構築することで、より広い範囲に応用できるんじゃないかと思っています。

ここでは、「価値」を“資本主義経済における”「価値」であると考えることにします。
この前提で、まず経済学的に「価値」がどう考えられているかを調べ、「インターネット」がどんなものか考えた上で、「価値のインターネット」がどんなものか、どうあるべきものかを考えてみます。


価値とは何だろう?



結論

はじめに結論を書いておくと、資本主義経済において「価値=交換可能性」です。

資本主義経済の本質は「交換」で、この交換の動機は「差異」から生じます。
「差異」のある対象同士が「交換」されたとき、対象の「価値」が実現されます。

私の考えでは、この「差異」には以下の2種類が存在します。
(1)交換“対象”自体が持つ、“質”および“量”の差異
(2)交換対象の“所有者”が持つ、“主観価値”の差異

また、「交換」であるということは、以下のような点を含むことが重要だと考えています。
(A)絶対価値は存在せず、「価値」は常に相対的
(B)やり取りは一方的ではなく、常に2つ以上の対象(「交換するもの」と「交換されるもの」)が登場する


補足

経済学の本なんかには、ここで書いた「交換対象」は「商品」と書かれていたりします。
資本主義経済はこの「商品」の交換によって成り立っているわけですが、交換しようと思うのはなぜかというと、「自分が持っているもの」と「他人が持っているもの」に「差異」があるからです。
まったく同じものだったら交換する意味はありません。

経済学の価値論では、「価値」には「価値(or 交換価値)」と「使用価値」があると言います。

前者の「価値(or 交換価値)」は(1)につながる概念かと思います。
後者の「使用価値」は(2)に当たるもので、近年になって「効用価値」という考えが出てきた流れで「主観価値」とも呼ばれるようになったと理解しています。

(1)の「差異」はわかりやすいのですが、(2)の「差異」は経済学でも議論されるレベルで測定(というか定義)がむずかしいものです。

(2)の「差異」を考える上で、調べていた中で面白かったのが「マズローの欲求5段階説」を用いた話です。
これでもまだギャップがありますが、「主観価値」を定量化する足掛かりにはなりそうに思います。
少なくとも、「主観価値」とか「効用」とだけ言うよりは具体化されています。

(参考)
Textbook 資本主義経済の理論
市場経済と価値―価値論の新機軸 (明治大学社会科学研究所叢書)
限界効用価値説の展開と労働価値説との対比 : マルクス経済学と「限界革命」Ⅳ(山梨学院リポジトリ)
利益を生み出す「価格」の秘密(帝国書院)
経済学と労働価値説(九州大学)
文化と固有価値の経済学(J-Stage)
「価値」とは何か~あなたは価値を生み出せていますか~(Eureka!)
創造性における自己実現欲求と価値について―マズローの自己実現的創造性の検討―(CiNii)
マズロー=ウィルソン欲求理論が含意するもの(II)(明治学院大学)


インターネットとは何だったの?



結論

インターネットは、ひと言で表すなら「“データをやり取りするネットワーク”の、分散管理ネットワーク」です。


補足

Internetの単語自体も、「Inter-(間)Net(=Network)」というつくりをしています。

インターネット以前は、世界各地に点在する企業や学校などが各々が独自にコンピュータのネットワークを構成して、自分たちの中でコンピュータ同士のデータのやり取りをしていました。
インターネットの登場により、個々の組織で閉じていたネットワーク同士がデータのやり取りをできるようになりました。

そしてインターネットは、一元管理する「管理者」は存在しない「分散管理ネットワーク」になっています。

(参考)
平成11年版 通信白書 第1章 特集 インターネット コラム2 インターネット -「ネットワークのネットワーク」-(総務省)
インターネットって何?(総務省)
インターネットとは(日本ネットワークインフォメーションセンター)
【違い2】インターネットとネットワーク(OWLet)
Rippleプロトコル入門(Ripple総合まとめ)


じゃあ、価値のインターネットとは?



結論

私なりの結論としては、「価値のインターネット」とは「分散ネットワークにおける、データ差異の交換」です。

このとき、以下の点に注意する必要があります。
(1)分散ネットワークにおいて、データの一意性が保証されないといけない
(2)「交換」であるので、一方が“全取り”することはできない(「“0”と交換」という広義の解釈はアリだと思います)

すべての“モノ”や“コト”は何らかの方法でデータ化(もしくは「トークン化」)された時点からインターネット上でやり取りが可能になり、それらの差異はデータの一意性が保証された「価値のインターネット」上で「交換」が可能になります。


補足

これまで書いた内容から「価値のインターネット」は、「価値=交換可能性」にあたるデータを「分散ネットワーク」でやり取りするものだと言えます。

インターネット上でやり取りするのはあくまで「データ」で、「価値」の源泉が「差異」にあることから、やり取りされるものは「データの差異」であるはずです。
また、「価値」が実現されるためには「交換」される必要があります。

このような考えから、上記の結論に至りました。

(1)について、「交換可能性」の源泉である「差異」が、(コピペするようなノリで)消えたり簡単に現れたりしては困ります。
「差異」がなくなれば「交換」の動機はなくなるため、この「差異」はやり取り(=「交換」)の間、保存されないといけません。
これは分散ネットワーク上で、データの一意性が保証されていれば良いかと思います。

「データが一意であること」は「同じ時刻にそのデータが1か所にしか存在できない」わけです。
分散ネットワークにおいて、これはブロックチェーンによる「データの順序付け」により達成されます。

(2)について、一方が、もしくは交換の仲介者が“全取り”することを防ぐのは、RippleからすればInterledger Protocol(ILP)で実現できます。
私がここで言う「交換」は何らかの通貨で媒介してもしなくても良いと思っていますが、Ripple的にはXRPに仲介させて「交換」するのがベスト、ということになるのでしょうw

(参考)
価値のインターネット:何を意味し、どのような恩恵を人々に与えるか(Ripple)
Ripple Protocol Consensus Algorithm日本語訳(Qitta)
価値のインターネットとは(Ripple総合まとめ)
IoV(Internet of Value:価値のインターネット)とは・意味(HEDGE GUIDE)
ブロックチェーンがもたらす次の破壊と創造 第6回 日本銀行・副島豊、gumi・國光宏尚、アクセンチュア・高橋良之の3氏による鼎談(日経BizGate)
日本政府は“トークンエコノミー”を理解できていない(アゴラ)


まとめ



資本主義経済における「価値」を前提として、「価値のインターネット」がどんなものか自分なりに考えて再構築してみました。

私の結論としては、「分散ネットワークにおける、データ差異の交換」が「価値のインターネット」であるという考えに至りました。

これは以下のような考えからきています。
(1)インターネットであるからには「分散ネットワーク」でデータがやり取りされる
(2)価値の源泉が差異であることからやり取りされるべきは「データの差異」である
(3)価値を実現するためにやり取りは「交換」でなければならない

抽象化しすぎて無意味になっていたりすると悲しいですが(笑)、ブロックチェーン応用の足しにちょっとでもなれば良いなと思います(´・ω・`)

現状ある考えでの、もう少し具体化された応用というのがイケハヤさんの記事だったり赤メガネとコムギさんのVoicy配信だったりで取り上げられている「トークンエコノミー」の世界観だったりします。
これに関しては、「ポイント」との違いについて考えるのも面白いです。

……といったところで、今回はこのへんで。

テーマ : ビジネスアイディア
ジャンル : ビジネス

Keyword : ブロックチェーン blockcahin 仮想通貨 暗号資産 Ripple リップル 価値のインターネット

キャッシュバック機能付き仮想通貨コントラクトをデプロイしてみる

どうも、ぺろりんです。

新年あけましておめでとうございます。
昨年読んで下さった方もそうでない方も、本年もどうぞよろしくお願いします。

さて、だいぶ時間が空いてしまいましたが、引き続きEthereumのお勉強を「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」でやっていきます。

前回はブラックリスト機能付きの仮想通貨コントラクトで遊んでみました。
今回は上の教科書でこの次に書いてある、キャッシュバック機能付きの仮想通貨コントラクトをデプロイして遊んでみようかと思います。

コードはJavaScript VMを使って、ブラウザ上で動かします。


キャッシュバックの仕組み

キャッシュバックの仕組みとしては簡単です。

「setCashbackRate」というメソッドを通して、キャッシュバック率を変数「CashbackRate」に設定します。
送金時にこのキャッシュバック率分を、送金額から引いてやることで「キャッシュバック」を実現します。


コードのデプロイ

コンパイル

まずはコードをコンパイルします。
「Auto compile」にはチェックしてないんですが、どうも勝手にコンパイルされる……?


ちなみに、コンパイラをちゃんと選ばないと怒られます。
サンプルコードで
pragma solidity ^0.4.8;

となっているので、0.4.8のバージョンを選ぶとうまくいきました。



デプロイ

無事コンパイルできたので、デプロイしてやります。

まずは「Environment」を「JavaScript VM」にしてやって、VM環境に設定しておきます。


デプロイ時のパラメータを入力しつつ、「Deploy」を実行します。
文字は「"(ダブルクォーテーション)」で囲む必要があるので注意が必要です。


無事にデプロイできました。


今回の状態変数はこんな感じです。




キャッシュバックの動作確認

前回までのコードに“キャッシュバック機能”が付いたものなのでブラックリスト用の変数があったりしますが、気にせずキャッシュバック関連だけイジって遊んでみます。


今回使うアドレス

先に、以下で使いたいアドレスをまとめておきます。

Aさん、Bさん、Cさんとして、以下のアドレスを使うことにします。
Aさんはデプロイ時に使ったアドレスなので、オーナーアドレスとなります。

 Aさん: 0xca35b7d915458ef540ade6068dfe2f44e8fa733c
 Bさん: B 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
 Cさん: 0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db


各アドレスの初期残高確認

まずは初期状態を確認しておきましょう。

Aさんはオーナーアドレスなので、初期状態ではすべてのOreOreCoin( 10000 [oc])を所有しています。


Bさんの初期状態は 0 [oc]です。


同じく、Cさんの初期状態も 0 [oc]です。



OreOreCoinを流通させる

このままだと面白くないので、OreOreCoinをすこし流通させてみましょう。

まずはAさんからBさんへ 2000 [oc]プレゼントしてみます。




同様に、AさんからCさんへ 1500 [oc]プレゼントしておきます。




CさんからBさんに送金してみる(キャッシュバックなしの場合)

はじめに、キャッシュバック率が0の場合の挙動を見ておきましょう。

まずはBさんのキャッシュバック率が0であることを確認しておきます。
具体的には、「Account」をBさんのアドレスにして、「CashbackRate」の値を確認します。



たしかにBさんの「CashbackRate」が0であることがわかりました。

つぎに「Account」をCさんのアドレスにして、Bさんへ 500 [oc]送ってみます。





キャッシュバックなしなので、普通に送金されました。


CさんからBさんに送金してみる(Bさんがキャッシュバック率を設定した場合)

今度はBさんがキャッシュバック率 20% を設定した場合を見てみましょう。

「Account」をBさんのアドレスにして、「setCashbackRate」に「20」を入れて実行してやります。



これで、Bさんの「CashbackRate」というキャッシュバック率を表す状態変数の値が「20」(%)になりました。


この状態で「Account」をCさんのアドレスにして、再びBさんへ 500 [oc]送ってみます。



BさんとCさんの残高を確認すると、たしかにBさんへは2割引きの 400 [oc]が送金されたことがわかります。




まとめ

今回は、キャッシュバック機能付きの仮想通貨コントラクトをデプロイして遊んでみました。

詳しいコードは「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」を見ていただきたいのですが、やっていることは簡単で、送金時に
 (送金額)=(送金しようと設定した額) - (送金しようと設定した額)×(キャッシュバック率)
と計算した“送金額”を送金しています。

テキストではデプロイ時のアドレス(オーナーアドレス)と普通のユーザーだけで動作確認していたので、オーナーアドレス以外の普通のユーザー2人の場合で動作を見てみました。

次回はコントラクトの継承と連携についてです。

それでは今回はこのへんで。

テーマ : プログラミング
ジャンル : コンピュータ

Keyword : ブロックチェーン 仮想通貨 暗号資産 イーサリアム Ethereum Browser-Solidity Solidity

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
メールフォーム

名前:
メール:
件名:
本文: