Slide 1

Slide 1 text

BLOCKCHAIN KYOTO#08 CRYPTOZOMBIES, EOS, TRUST Navigate : Space / Arrow Keys | - Menu | - Fullscreen | - Overview | - Blackout | - Speaker | - Help M F O B S ?  1 / 56

Slide 2

Slide 2 text

本日のお題 1 CryptoZombie 2 EOS 3 TRUST [ GitPitch @ github/mazarimono/block20181024 ]  2 / 56

Slide 3

Slide 3 text

参考ページ CryptoZombie Solidity EOS https://cryptozombies.io/ https://solidity.readthedocs.io/en/v0.4.25/index.html https://developers.eos.io/ [ GitPitch @ github/mazarimono/block20181024 ]  3 / 56

Slide 4

Slide 4 text

CRYPTOZOMBIEどんなものか? ゾンビゲームを作りながらSolidityを学ぶ。 全部コードを入力するわけでない。 https://cryptozombies.io/en/course/ [ GitPitch @ github/mazarimono/block20181024 ]  4 / 56

Slide 5

Slide 5 text

どんな知識??(1) CONTRACT内にコードを! コードはcontract内にカプセル化されている。 変数や関数はすべてコントラクトに属する。 [ GitPitch @ github/mazarimono/block20181024 ]  5 / 56

Slide 6

Slide 6 text

pragma solidity ^0.4.25; contract helloSolidity { function renderHelloSolidity () public returns (string) { return 'Hello Solidity!' } } [ GitPitch @ github/mazarimono/block20181024 ]  6 / 56

Slide 7

Slide 7 text

どんな知識??(2) 関数はデフォルトでpublic。誰でも呼び出せる。 コントラクトが誰でも呼び出せ、攻撃に対して 脆弱になる。 => privateにする(コード例:下) internalとexternal internalはprivateと同じだけど、コントラクトを 継承したコントラクトからは関数にアクセスで きる! publicはコントラクトの内部・外部ともに呼び出 せる。externalは外部から呼び出せるのみ。 [ GitPitch @ github/mazarimono/block20181024 ]  7 / 56

Slide 8

Slide 8 text

private使用例 // 可変長配列を作る。 uint[] numbers; // プライベート関数:関数名の後にprivateとつける。 関数はアンダースコアで始めるのが通例。 function _addToArray(uint _number) private { numbers.push(_number) } [ GitPitch @ github/mazarimono/block20181024 ]  8 / 56

Slide 9

Slide 9 text

internal使用例 contract Sandwitch { uint private sandwichesEaten = 0; // eat()という関数を作る。(internalで!) function eat() internal { sandwichesEaten++; } } // BLTはSandwitchを継承した contract BLT is Sandwitch { uint private baconSandwichesEaten = 0; function eatWithBacon() public returns (string) { baconSandwichesEaten++; // なのでeat()を使える。 eat(); [ GitPitch @ github/mazarimono/block20181024 ]  9 / 56

Slide 10

Slide 10 text

どんな知識??(3) 戻り値(returns)、関数の修飾子も関数の後に加え る 戻り値(returns): 戻り値の方を書いておく。 view修飾子: ブロックチェーンからデータを読み 込みのみできる。ブロックチェーン上で何もし ない。外部から呼び出される場合ガスなし。関 数から呼び出されて使われるとガス必要。 pure修飾子: ブロックチェーンから読み込みも書 き込みもできない。トランザクションを発生さ せない。 [ GitPitch @ github/mazarimono/block20181024 ]  10 / 56

Slide 11

Slide 11 text

戻り値 function _multiply(uint a, uint b) private pure returns (uint) return a * b; } [ GitPitch @ github/mazarimono/block20181024 ]  11 / 56

Slide 12

Slide 12 text

どんな知識??(4) [ GitPitch @ github/mazarimono/block20181024 ]  12 / 56

Slide 13

Slide 13 text

乱数の発生のさせ方 keccak256("aaaaa") [ GitPitch @ github/mazarimono/block20181024 ]  13 / 56

Slide 14

Slide 14 text

zombiesにpushされたらnewZomieというイベン トが発生する。 event NewZombie(uint zombieId, string name, uint dna) function _createZombie(string _name, uint _dna) private { uint id = zombies.push(Zombie(_name, _dna)) - 1; NewZombie(id, _name, _dna); } [ GitPitch @ github/mazarimono/block20181024 ]  14 / 56

Slide 15

Slide 15 text

どんな知識??(5) データ型 ADDRESSとMAPPINGS address / 言わずと知れた Mappings / データを格納するときに使える方法の 一つ。キーバリューストア MSG.SENDER 全ての関数で利用できるグローバル変数の一 つ。 参考:Units(お金の単位)とグローバル変数 https://solidity.readthedocs.io/en/v0.4.25/units- and-global-variables.html [ GitPitch @ github/mazarimono/block20181024 ]  15 / 56

Slide 16

Slide 16 text

// アカウントの残高にuintを格納する mapping (address => uint) public accountBalance; // ユーザーidを基にユーザーの名前を参照格納する場合 mapping (uint => string) userIdToName; // 前がキー、後がバリュー。型を指定している感じ。 [ GitPitch @ github/mazarimono/block20181024 ]  16 / 56

Slide 17

Slide 17 text

これを利用すると、関数を呼び出したユーザー のaddressを参照できる。 solidityは外部の呼び出し元から関数を実行する との決まりがある。関数を呼び出すまでコント ラクトはブロックチェーンに何もしない。 mapping (address => uint) favoriteNumber; function setMyNumber(uint _myNumber) public { favoriteNumber[msg.sender] = _myNumber; } function whatIsMyNumber() public view returns(uint) { return favoriteNumber[msg.sender]; } [ GitPitch @ github/mazarimono/block20181024 ]  17 / 56

Slide 18

Slide 18 text

どんな知識??(6) REQUIRE 条件が違えばエラーを返す。 変数の格納 storageとmemoryの二つがある。 storageはブロックチェーン上に永久に格納され る変数。 多くの場合はsolidityが勝手に判断する。 状態変数はデフォルトでstorageに、関数内変数 はmemoryに。 [ GitPitch @ github/mazarimono/block20181024 ]  18 / 56

Slide 19

Slide 19 text

この例だと_nameのところに"Vitalik"と入力され ればHiと返す。 function sayHiToVitalik(string _name) public returns (string) require(keccak256(_name) == keccak256("Vitalik")); return "Hi!"; } [ GitPitch @ github/mazarimono/block20181024 ]  19 / 56

Slide 20

Slide 20 text

どんな知識??(7) 別コントラクトとのやり取り interfaceを宣言すると、別コントラクトの関数が 読み込める。 [ GitPitch @ github/mazarimono/block20181024 ]  20 / 56

Slide 21

Slide 21 text

// とあるコントラクト contract LuckyNumber { mapping(address => uint) numbers; function setNum(uint_num) public { numbers[msg.sender] = _num; } function getNum(address _myAddress) public view returns (u return numbers[_myAddress] }) } // 別コントラクト contract NumberInterface { function getNum(address _myAddress) public view returns (u [ GitPitch @ github/mazarimono/block20181024 ]  21 / 56

Slide 22

Slide 22 text

どんな知識??(8) CONTRACTS contractをethereum上にデプロイすると編集も更 新もできなくなる。 修正する方法はなく、別のスマートコントラク トを使うようにユーザーに伝えないといけな い。 外部のcontractを使った場合、それが影響した地 留守の出、その影響を受けないように作る。 [ GitPitch @ github/mazarimono/block20181024 ]  22 / 56

Slide 23

Slide 23 text

どんな知識??(9) OWNABLEコントラクト Ownable / 特別な権限を持つオーナーのみアドレス の更新ができるライブラリ。OpenZepplinのライブ ラリ。 onlyOwner / 修飾子。 https://github.com/OpenZeppelin/openzeppelin- solidity/blob/master/contracts/ownership/Ownable.sol [ GitPitch @ github/mazarimono/block20181024 ]  23 / 56

Slide 24

Slide 24 text

どんな知識??(10) OPENZEPPLIN / コミュニティの検証を経た安全な スマートコントラクト。CROWDSALESに関しても 安全なコードが記載されている。 https://openzeppelin.org/ https://openzeppelin.org/api/docs/learn-about- crowdsales.html [ GitPitch @ github/mazarimono/block20181024 ]  24 / 56

Slide 25

Slide 25 text

どんな知識??(11) ガス ethereumではファンクションを実行するたび に、ガスと呼ばれる通貨を支払うことになって います。 実行に必要なガス量はそれを実行するためにど のくらいの計算資源が必要かに左右される。 例えばstorageへの操作は高コストなので、 というわけで無駄のないコードを作り、コスト カットを目指すのがsolidityの正しい書き方! gas tracker: https://etherscan.io/gastracker [ GitPitch @ github/mazarimono/block20181024 ]  25 / 56

Slide 26

Slide 26 text

どんな知識??(12) MODIFIER 修飾子を作る。 PAYABLE Etherを受け取ることのできる関数 [ GitPitch @ github/mazarimono/block20181024 ]  26 / 56

Slide 27

Slide 27 text

modifierで独自の修飾子を作り、関数に渡した。 引き数も設定できる。 mapping (uint => uint) public age; modifier olderThan(uint _age, uint _userId) { require (age[_userId] >= _age0); } function driverCar(uint _userId) public olderThan(18, _userId) } [ GitPitch @ github/mazarimono/block20181024 ]  27 / 56

Slide 28

Slide 28 text

msg.value / コントラクトにEtherが送られた金額 を見る。 関数にpayable修飾子がなく、Etherをweb3.jsから 送ろうとする場合、その関数はトランザクショ ンを拒否する。 contract OnlineStore { funcion buySomething() external payable { require(msg.value == 0.001ether); transferTinh(msg.sender) } } [ GitPitch @ github/mazarimono/block20181024 ]  28 / 56

Slide 29

Slide 29 text

どんな知識??(13) 引き出し関数 TRANSFER コントラクトに送られたEtherを引き出す。 [ GitPitch @ github/mazarimono/block20181024 ]  29 / 56

Slide 30

Slide 30 text

this.balanceはコントラクトに存在する残高の総 量。 contract GetPaid is Ownable { function withdraw() external onlyOwner { owner.transfer(this.balance); } } // 多すぎる支払いを返す関数も作れる。 uint itemFee = 0.001 ether; msg.sender.transfer(msg.value - itemFee); [ GitPitch @ github/mazarimono/block20181024 ]  30 / 56

Slide 31

Slide 31 text

どんな知識??(14) トークンについて イーサリウム上のトークンは、基本的にいくつ かのルールに従ったスマートコントラクトで す。 トークンは誰がどれくらい所有しているかを記 録するコントラクト、ユーザーが自分のトーク ンを他のアドレスに送ることができる機能が付 いている。 [ GitPitch @ github/mazarimono/block20181024 ]  31 / 56

Slide 32

Slide 32 text

どんな知識??(15) ERC20トークン 固有の機能がないため、一つのトークンが扱え ると、他の同規格のトークンもコントラクトア ドレスをデータベースに追加するだけで取り扱 える。 誤ってコントラクトアドレスにトークンを送金 すると、トークンを動かせなくなり、使えなく なる。 [ GitPitch @ github/mazarimono/block20181024 ]  32 / 56

Slide 33

Slide 33 text

どんな知識??(16) コントラクトアドレス 契約内容を実行するアドレス コントラクト => ブロックチェーンに書き込み => コントラクトの内容を実行 [ GitPitch @ github/mazarimono/block20181024 ]  33 / 56

Slide 34

Slide 34 text

どんな知識??(17) ERC223トークン コントラクトに対応していないトークンがコン トラクトアドレスに送金された際は、元の送り 主に自動的に返金する。ERC20トークンの問題点 を解決。 [ GitPitch @ github/mazarimono/block20181024 ]  34 / 56

Slide 35

Slide 35 text

どんな知識??(18) ERC721トークン ノンファンジブル(代替不可能)トークン。 様々なデータを含むことができる。例えば、ク リプトキティ。 そういえばPEPE CASHとかあったなぁ(遠い目 [ GitPitch @ github/mazarimono/block20181024 ]  35 / 56

Slide 36

Slide 36 text

どんな知識??(19) ERC721トークンの移動のロジック 2つの異なる移転の方法を持つ。 [ GitPitch @ github/mazarimono/block20181024 ]  36 / 56

Slide 37

Slide 37 text

1 トークン所有者が送り先(address)、送りたいト ークン(uint256)をtransfer関数を使って送る。 2 approveを使って1と同様のことを行う。誰がト ークン受け取りを許可されたのかがmapping (uint => address)にてコントラクトに記録。さら に, トークンの受け手がtakeOwnership関数を呼び 出し。msg.senderが所有者からトークンの受け取 りを許可されているか確認し、承認済みの場合 は受け手にトークンを送る。 function transfer(address _to, uint256 _tokenId) public; // function approve(address _to, uint _tokenId) public; // 2 function takeOwnership(uint256 _tokenId) public; [ GitPitch @ github/mazarimono/block20181024 ]  37 / 56

Slide 38

Slide 38 text

どんな知識??(20) スマコンのセキュリティ オーバーフロー uint8 number = 255; number++; [ GitPitch @ github/mazarimono/block20181024 ]  38 / 56

Slide 39

Slide 39 text

どんな知識??(21) コメント // 1行コメント、 /* 複数行コメント netspec ///のあとに @title 、 @authorはそのままの意味、@noticeはユ ーザー向け、@devは開発者向けの更なる解説。 @param、 @return 関数の各@パラメーターに ついて記述。 [ GitPitch @ github/mazarimono/block20181024 ]  39 / 56

Slide 40

Slide 40 text

どんな知識??(22) WEB3.JS ユーザーがDAppとやり取りできるベーシックな ウェブページを作る際に使うJavascriptのライブ ラリ。 DAppを運営するのに、自分でノードを運用する 必要はなく、サードパーティーのInfuraを使うと 良い。 API経由で利用可能。 [ GitPitch @ github/mazarimono/block20181024 ]  40 / 56

Slide 41

Slide 41 text

どんな知識??(23) ユーザーが秘密鍵で署名する必要性が・・・ ==> 自分で管理しない。有名なのは Metamask! MetamaskはChromeとFirefoxのブラウザ拡張機能 で、ユーザはアカウントと秘密鍵を安全に管理 し、そのアカウントをWeb3jsを使っているウェ ブサイトとやり取りすることが可能。 ==> ブラ ウザ拡張機能使いたくないなぁ・・・ [ GitPitch @ github/mazarimono/block20181024 ]  41 / 56

Slide 42

Slide 42 text

WEB3.JS INFURA METAMASK https://web3js.readthedocs.io/en/1.0/ https://infura.io/ https://metamask.io/ [ GitPitch @ github/mazarimono/block20181024 ]  42 / 56

Slide 43

Slide 43 text

SOLIDITY OPENZEPPELIN ETH GAS STATION https://solidity.readthedocs.io/en/v0.4.25/common- patterns.html https://openzeppelin.org/ https://ethgasstation.info/index.php [ GitPitch @ github/mazarimono/block20181024 ]  43 / 56

Slide 44

Slide 44 text

2. EOSに関して 1年間ICOをして話題になった。 初めはERC20トークンだったが、今は自前のプラ ットフォーム コンセンサスアルゴリズムはDPOS アプリの運用するとしてもコストかからんし良 いかなぁ。 [ GitPitch @ github/mazarimono/block20181024 ]  44 / 56

Slide 45

Slide 45 text

GETTING STARTEDを途中まで・・ 得た知見 Windowsには今のところ対応していない。 WebAssembly(WASM)を使っている。 =>アプリの高速化を目指したもの?よく分からない。 C++が良いみたい。ほかの言語の対応もサードパーティー が行っている。 dockerで環境を作る。 CDT(Contract Development Toolkit)をダウンロードするの 30分くらいかかる。 https://qiita.com/OMOIKANESAN/items/1ffc06ef6283befc435 [ GitPitch @ github/mazarimono/block20181024 ]  45 / 56

Slide 46

Slide 46 text

https://developers.eos.io/eosio-home/docs/how-it-all- fits-together [ GitPitch @ github/mazarimono/block20181024 ]  46 / 56

Slide 47

Slide 47 text

cleos / ブロックチェーンにつながれ、ウォレット も運用できるコマンドラインツール keosd / EOSIOのカギをウォレットに安全に置く。 nodeos / nodeを動かす [ GitPitch @ github/mazarimono/block20181024 ]  47 / 56

Slide 48

Slide 48 text

動かしてみた ウォレットは問題なく作れた。 でもハローワールドは書いている通りではできなかった githubにあるハローワールドだとできた。 しかし、2.2のStep5のCreate Tokenという面白そうなとこ めなくなった。 環境を壊して何度もやってみようかと思う。 https://github.com/EOSIO/eos/blob/master/contracts/hello/ https://developers.eos.io/eosio-home/docs/token-contract [ GitPitch @ github/mazarimono/block20181024 ]  48 / 56

Slide 49

Slide 49 text

3. TRUST 新聞を読んでたら「TRUST」って本が出ているということ を知った(先週土曜日)。 レビューシステムやブロックチェーンによって「分散され 信頼」が生まれて、世の中が再構築されている様子を 分析し、信頼の本質に迫っている本らしい。 TEDに著者のレイチェルボッツマンさんのトークがいくつ We've stopped trusting institutions and started trusting stran https://www.nikkei.com/article/DGXKZO36688620Z11C18A0M https://www.ted.com/talks/rachel_botsman_we_ve_stopped 83765 [ GitPitch @ github/mazarimono/block20181024 ]  49 / 56

Slide 50

Slide 50 text

内容 19世紀くらいまで信頼はlocalで築かれるものだ った。 その後、機関、巨大企業が仲介した。 人びとが都市部に集まった。そのため、権威が それをになった。契約書、規制、保険など。 最近は大企業などの信頼を裏切る事件が多く起 こっている。 フォルクスワーゲンのガス不正、カトリックの 性的虐待、銀行による金融恐慌、金持ちのパナ マペーパー。 [ GitPitch @ github/mazarimono/block20181024 ]  50 / 56

Slide 51

Slide 51 text

[ GitPitch @ github/mazarimono/block20181024 ]  51 / 56

Slide 52

Slide 52 text

内容2 信頼を裏切っても大企業などの権威は誠実に謝 罪することがない。 機関への信頼はデジタル時代には向かない。 信頼を作る新たな流れが生じている。 トップダウンで、不透明なものではなくなり始 めている。 blockchainでその流れがより強化されている。 第三者が介在しなくても良いというところで信 頼に革命を起こすのではないか。 技術によって起こる「信頼の変革」だ! [ GitPitch @ github/mazarimono/block20181024 ]  52 / 56

Slide 53

Slide 53 text

[ GitPitch @ github/mazarimono/block20181024 ]  53 / 56

Slide 54

Slide 54 text

見終わったら次にAirbnbのファウンダーJoe Gebbiaのトー めた。 この人はレビューやコメント、適量の情報開示が信頼の度 えるということを話していた。 知らない人は危険だということを、適切なデザインにより うとしている。 しかし、銃で撃たれるかもしれない、アメリカで知らない るというサービスがうまく行ったというのは凄い意味があ も。 信頼に関しても、移民が多い米国と、ほぼ移民のない日本 https://www.ted.com/talks/joe_gebbia_how_airbnb_designs 4414 [ GitPitch @ github/mazarimono/block20181024 ]  54 / 56

Slide 55

Slide 55 text

日本でも企業の不祥事は後を絶たないし、政府 に対する信頼が揺るがないのがちょっと変だな と思う。 もしかしたらドラスティックに起こるかもしれ ない。 というか、ドコモの列に関してなんとかせいと か政府が言い出しているから・・・ 信頼の変革が起こっているという視点を入れる のは面白い。 [ GitPitch @ github/mazarimono/block20181024 ]  55 / 56

Slide 56

Slide 56 text

<終了> [ GitPitch @ github/mazarimono/block20181024 ]  56 / 56