FC2ブログ

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

どうも、ぺろりんです。

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

<< 2019年4月:#91-120


記事紹介まとめ(2019年5月:#121-151)

































































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

Keyword : ブロックチェーン blockcahin 暗号資産 仮想通貨 暗号通貨

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

どうも、ぺろりんです。

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

<< 2019年3月:#60-90
2019年5月:#121-151 >>


記事紹介まとめ(2019年4月:#91-120)































































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

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

「会員管理」機能付きの仮想通貨コントラクトをデプロイしてみる(後編)

どうも、ぺろりんです。

「会員管理」機能付きの仮想通貨コントラクトをデプロイしてみる(前編)」の続きです。

話題としては、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」にある「会員管理」機能付きの仮想通貨コントラクトでした。
やりたいのは、暗号資産(仮想通貨)が1つあって、これに「紐づくユーザーが各々会員情報を持つ」状況をコントラクトで表現することです。

前回はコントラクトをデプロイし、「暗号資産(仮想通貨)のコントラクト」と「会員管理のコントラクト」を紐づけるところまで動かしてみました。

今回は、送金の動作確認と、送金によって「会員管理」部分がちゃんと機能するかという動きをみていきます。


アドレスのまとめ


まずは前回に引き続き、使うアドレスをまとめておきます。

以下4つのアドレスが登場します。
・ユーザーA:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
・ユーザーB:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
・Membersのデプロイアドレス:0x692a70d2e424a56d2c6c27aa97d1a86395877b3a
・OreOreCoinのデプロイアドレス:0xdc04977a2078c8ffdf086d618d1f961b6c546222


「会員管理」機能付きの仮想通貨コントラクトの動作確認(その2)


送金


引き続き教科書に沿って、ユーザーAからユーザーBへ2000[oc]送金します。

ちなみになぜユーザーAから送金するのかというと、「OreOreCoin」をデプロイすると「デプロイ実行ユーザー」の残高に全OreOreCoinが付与される仕様になっていて、送金によってOreOreCoinを流通させるまではユーザーAしかOreOreCoinを持っていないためです。



では送金してみましょう。

送金するための「transfer」も「msg.sender」を含むので、実行ユーザーを気にする必要があります。
今回はユーザーAから送金するために、実行ユーザーをAにして「transfer」します。



各ユーザーの残高も無事に増減しています。



ユーザーAの「tradingHistory」を見るとカウントが増えているはずなんですが……なぜか更新されない……w(解決するのは後述)



会員ステイタスのランクアップ


会員情報が更新されないですが、めげずに教科書通り、取引を続けてみましょうw

ユーザーAからユーザーBへ、4回100[oc]を送金してみました。


まだ「tradingHistory」更新されないので、「coin」を確認したら値が入ってない……!w


先ほどアドレスを入れようとしたとき、「setCoin」に「onlyOwner」修飾子がかかっているのを忘れて「Members」のオーナーではないユーザーAで実行していた気がします。
「Members」のオーナーであるユーザーBを実行ユーザーにして、再度「setCoin」で「OreOreCoin」のアドレスを「coin」に代入してみます。

ちゃんと「coin」にアドレスが入りました。


再度ユーザーAからユーザーBへ、1回100[oc]を送金。


今度はちゃんと「tradingHistory」が更新されていました。


さらにユーザーAからユーザーBへ、100[oc]を送金を繰り返すと、「statusIndex」が「2」になりました。


ちなみに、「transfer」は送金の実行ユーザーを「msg.sender」で取得して「updateHistory」という「tradingHistory」更新のための関数を呼び出すので、送金を実行していないユーザーBの「tradingHistory」は更新されていません。



キャッシュバック機能の確認


ユーザーAへのキャッシュバック率を「getCashbackRate」で確認すると、ちゃんと「Silver」の「5」(%)になっています。


先ほど送金を数回した途中で(ボタンを押しすぎてw)「Silver」になってしまい、最後の送金にはキャッシュバックが反映されていました。
ユーザーAの残高に100×5%の5[oc]という端数が現れています。



「updateHistory」の実行ユーザーについて


「updateHistory」は「onlyCoin」という、「OreOreCoin」しか実行できないようにする修飾子がついています。
ユーザーではない「OreOreCoin」が実行するというのがどういうことなのか、個人的にはこれがちょっと気持ち悪くて考えてみました。

結論としては、「OreOreCoin」に定義された「transfer」が「updateHistory」を呼ぶとき、“msg.sender=OreOreCoinのアドレス”になっていると思われます。

このあたりの関数の呼び出しが、次の図のような構造になっていると考えるのが良いのかな、と思います。


「transfer」を呼ぶのはユーザーAなんですが、「updateHistory」は「OreOreCoin」が呼んでいると考える必要がありそうです。


まとめ


今回は、前編と後編に分けて「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」の「会員管理」機能付きの仮想通貨コントラクトで遊んでみました。

“暗号資産(仮想通貨)が1つあって、これに「紐づくユーザーが各々会員情報を持つ」状況をコントラクトで表現する”ことをやってみました。

このコントラクトのコードと動きを理解するにあたって、個人的には以下の点がポイントだと感じました。
(1)コントラクト名と関数名が入れ子になっていて、コードをしっかり追う必要があった。(「setMembers」は「OreOreCoin」、「setCoin」は「Members」内に定義されている)
(2)関数の定義に関わることから、実行ユーザーを気にする必要があった。(「msg.sender」や「onlyOwner」修飾子による)
(C)mapping型は「連想“配列”」なので、配列になっている。(これをポイントに挙げるのは、特に個人的な勉強不足ゆえですw)

……と、こんな感じの内容でした。
同じようなところで詰まった方のお役に立てれば幸いです。

それではこのへんで。

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

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

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

どうも、ぺろりんです。

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

<< 2019年2月:#32-59
2019年4月:#91-120 >>


記事紹介まとめ(2019年3月:#60-90)

































































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

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

「会員管理」機能付きの仮想通貨コントラクトをデプロイしてみる(前編)

どうも、ぺろりんです。

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

今回は、教科書的には「キャッシュバック機能付き仮想通貨コントラクト」の続きです。
書いているうちに長くなってしまったので、前編と後編に分けることにしましたw

本当ならもう少し早くこれをやりたかったんですが、今回の内容は個人的につまずく箇所がいくつかあったので、「コントラクトの継承と連携(他のコントラクトのメソッド実行)」という記事をはさんでみました。

今回やりたいのは、暗号資産(仮想通貨)が1つあって、これに「紐づくユーザーが各々会員情報を持つ」状況をコントラクトで表現することです。


以下では教科書にあるサンプルコードをデプロイして、動きを追いつつコードについて考えたことなどをコメントしていきます。
今回もBrowser-SolidityでJavaScript VMを使い、すべてweb上で動かします。


アドレスのまとめ


先に、今回使うアドレスをまとめておきます。

今回は、以下4つのアドレスが登場します。
・ユーザーA:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
・ユーザーB:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
・Membersのデプロイアドレス:0x692a70d2e424a56d2c6c27aa97d1a86395877b3a
・OreOreCoinのデプロイアドレス:0xdc04977a2078c8ffdf086d618d1f961b6c546222


「会員管理」機能付きの仮想通貨コントラクトのデプロイ


コントラクト(コード)の概要


先ほど大まかにご紹介した「やりたい」ことを、コードでどう表現されているかを軽く触れておきます。

コントラクトのコードとしては、だいたい以下のような構造になっています。
(1)所有者管理用コントラクト「Owned」、会員管理用コントラクト「Members」、会員管理機能付き仮想通貨コントラクト「OreOreCoin」の3つが1つの.solファイルに書かれている。
(2)(コードの見通しをよくする目的で)「Members」と「OreOreCoin」が「Owned」のサブコントラクトになっている。
(3)「OreOreCoin」に定義された関数の中で、「Members」で定義された関数を呼び出している

この(3)が、個人的にはポイントだと思っています。

さらに(後から出てきますが)動作させる上では、「Members」に定義された状態変数「coin」に「OreOreCoin」のデプロイアドレスを入れるので、(3)と合わせると「Members」と「OreOreCoin」が入れ子みたいな構造で動きます。
……これを理解するのに時間がかかった……(;´Д`)

各コントラクトは以下のような内容です。
・Owned…オーナーアドレス「owner」の定義と、オーナーアドレスの変更をする。
・Members…状態変数として会員情報を定義し、会員情報と取引履歴を更新する関数を持っている。
・OreOreCoin…暗号資産(仮想通貨)OreOreCoinを定義し、送金、ブラックリスト、キャッシュバック機能を、Membersの情報を使いながら実装する。

コード自体は「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」をご参照ください。


コントラクトのデプロイ


いつも通り、サンプルコードをコピペして、コンパイラのバージョンをコードに合わせてコンパイルします。


平和にコンパイルできましたw
初期の頃はコンパイラのバージョンがコードに合っていなくて(選べなかったのか、選ばなかったのかは忘れましたが)、そこそこWarningが出ていましたw


「会員管理」機能付きの仮想通貨コントラクトの動作確認(その1)


会員管理用「Members」コントラクトのデプロイ


まず、「Environment」を「JavaScript VM」にしつつ、教科書通りユーザーA(ここでのアドレス:0xca35b7d915458ef540ade6068dfe2f44e8fa733c)で「Members」をデプロイします。



今回は前の記事のように「new」していないので、いきなり「Members」をデプロイして「Owned」がデプロイされるのか気になっていましたが、「owner」にユーザーAのアドレスが入っているところを見ると、どうやらサブコントラクトをデプロイすると親コントラクトもデプロイされるみたいですね。


……というかむしろ、「Owned」がデプロイされているというよりも、「Owned」に(「クラス」的に)定義された部分はソースをコンパイルした時点で「Members」内でもデプロイできる状態になるので、“「Members」内に(継承された部分として)定義された「Owned」部分”がデプロイされて、“「Members」内に(継承された部分として)定義された”「owner」に値が入ったと考えるべきなのかな。
教科書的にも「MembersコントラクトのオーナーアドレスがユーザAであることを確認」と表現しているし、よく見たら「call to Members.owner」と出ていたりするので、ここでは「Members」の「owner」(=Members.owner)ってことみたいですね。


ちなみに、あとで使うので「Members」コントラクトのデプロイアドレス(0x692a70d2e424a56d2c6c27aa97d1a86395877b3a)もコピっておきます(´・ω・`)


会員ステイタスの作成


教科書通りにサクッと会員ステイタスをpushしていきます。




ここで使う「pushStatus」は「onlyOwner」修飾子がかかっているので、「Members」のオーナーしか実行できません。
なので、「各メンバーが自分でステータスを変更」ということはできません。

一応、教科書に沿って「Members」のオーナーをユーザーB(0x14723a09acff6d2a60dcdf7aa4aff308fddc160c)にしておきます。
この「transferOwnership」も「Members」のオーナーしか実行できません。(という意図なんだと思います。たぶん)

せっかくなので、まだオーナーになっていないユーザーBのアドレスで、ユーザーBが自分をオーナーにするように「transferOwnership」を実行してみましょう。

やってみると……やはりユーザーBはオーナーではないので怒られます。



気を取り直してユーザーAで実行すると、無事に「owner」がユーザーBのアドレスになります。





会員管理機能付き仮想通貨コントラクト「OreOreCoin」のデプロイ


例のごとく教科書に沿って、ユーザーAで「OreOreCoin」をデプロイします。



「OreOreCoin」のオーナーアドレスには、ちゃんとユーザーAのアドレスが入っています。


「OreOreCoin」のデプロイアドレス(0xdc04977a2078c8ffdf086d618d1f961b6c546222)も、後で使うのでコピっておきます。


「Members」と「OreOreCoin」の紐づけ


ここがなかなか理解できなかったのですが、「Members」と「OreOreCoin」を、各々のデプロイアドレスを使って紐づけていきます。

やることは以下の2つです。
(1)ユーザーBで、「Members」のデプロイアドレスを引数にして(「OreOreCoin」内で定義された)「setMembers」を実行する。
(2)「OreOreCoin」のデプロイアドレスを引数にして(「Members」内で定義された)「setCoin」を実行する。(こちらは「Members」のオーナーアドレスという意味で、ユーザーBで実行する必要があります)

まず(1)をやってみます。


次に、(2)を実行します。


上記(1)、(2)で、以下の図のようなことをしています。
(逆に混乱しちゃったら無視してくださいw)


私が理解するにあたって、以下がポイントでした。
(A)「setMembers」は「OreOreCoin」、「setCoin」は「Members」内に定義されている。(名前が入れ子になっていてややこしい)
(B)「setMembers」の定義には「msg.sender」が入っているため、実行ユーザーを気にする必要がある。(後述しますが、「onlyOwner」修飾子がついている「setCoin」も実行ユーザーを気にする必要があります)
(C)「coin」はただのaddress型だけど、「members」はmapping型なので“配列”になっている。(「mapping」は「連想“配列”」であることを忘れていて、当初スカラー量のイメージで読んでいたせいで理解がなかなか進みませんでしたw)

「会員ごとに会員情報を持つ」ことを、
(B)→会員アドレスと会員情報(=Members)の紐づけることで、会員が会員情報を持つこと
(C)→会員アドレスをインデックスとする配列(members)によって、会員ごとに情報を持つこと
という風に実装しています。

ここまでで、ユーザーBの「Members」コントラクトが準備できました。


前編はこのへんで、後編へ続きます。

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

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

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

この人とブロともになる

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

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