Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Crytptozombie, EOS, Trust

F3eb7cf23caf810b30aa798e335039d0?s=47 Hide Ogawa
October 24, 2018
230

Crytptozombie, EOS, Trust

2018年10月23日に行ったBlockchainKyotoにおけるプレゼン資料。

Cryptozombie、EOSに関してはやってみてのメモ。

Trustは信頼の形が変わりつつあり、それが近ごろのサービスの在り方、分散化の流れに深くかかわっているという話をまとめた。

F3eb7cf23caf810b30aa798e335039d0?s=128

Hide Ogawa

October 24, 2018
Tweet

Transcript

  1. BLOCKCHAIN KYOTO#08 CRYPTOZOMBIES, EOS, TRUST Navigate : Space / Arrow

    Keys | - Menu | - Fullscreen | - Overview | - Blackout | - Speaker | - Help M F O B S ?  1 / 56
  2. 本日のお題 1 CryptoZombie 2 EOS 3 TRUST [ GitPitch @

    github/mazarimono/block20181024 ]  2 / 56
  3. 参考ページ 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
  4. CRYPTOZOMBIEどんなものか? ゾンビゲームを作りながらSolidityを学ぶ。 全部コードを入力するわけでない。 https://cryptozombies.io/en/course/ [ GitPitch @ github/mazarimono/block20181024 ] 

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

    5 / 56
  6. pragma solidity ^0.4.25; contract helloSolidity { function renderHelloSolidity () public

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

    publicはコントラクトの内部・外部ともに呼び出 せる。externalは外部から呼び出せるのみ。 [ GitPitch @ github/mazarimono/block20181024 ]  7 / 56
  8. private使用例 // 可変長配列を作る。 uint[] numbers; // プライベート関数:関数名の後にprivateとつける。 関数はアンダースコアで始めるのが通例。 function _addToArray(uint

    _number) private { numbers.push(_number) } [ GitPitch @ github/mazarimono/block20181024 ]  8 / 56
  9. 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
  10. どんな知識??(3) 戻り値(returns)、関数の修飾子も関数の後に加え る 戻り値(returns): 戻り値の方を書いておく。 view修飾子: ブロックチェーンからデータを読み 込みのみできる。ブロックチェーン上で何もし ない。外部から呼び出される場合ガスなし。関 数から呼び出されて使われるとガス必要。

    pure修飾子: ブロックチェーンから読み込みも書 き込みもできない。トランザクションを発生さ せない。 [ GitPitch @ github/mazarimono/block20181024 ]  10 / 56
  11. 戻り値 function _multiply(uint a, uint b) private pure returns (uint)

    return a * b; } [ GitPitch @ github/mazarimono/block20181024 ]  11 / 56
  12. どんな知識??(4) [ GitPitch @ github/mazarimono/block20181024 ]  12 / 56

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

    56
  14. 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
  15. どんな知識??(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
  16. // アカウントの残高にuintを格納する mapping (address => uint) public accountBalance; // ユーザーidを基にユーザーの名前を参照格納する場合

    mapping (uint => string) userIdToName; // 前がキー、後がバリュー。型を指定している感じ。 [ GitPitch @ github/mazarimono/block20181024 ]  16 / 56
  17. これを利用すると、関数を呼び出したユーザー の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
  18. どんな知識??(6) REQUIRE 条件が違えばエラーを返す。 変数の格納 storageとmemoryの二つがある。 storageはブロックチェーン上に永久に格納され る変数。 多くの場合はsolidityが勝手に判断する。 状態変数はデフォルトでstorageに、関数内変数 はmemoryに。

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

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

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

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

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

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

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

     26 / 56
  27. 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
  28. 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
  29. どんな知識??(13) 引き出し関数 TRANSFER コントラクトに送られたEtherを引き出す。 [ GitPitch @ github/mazarimono/block20181024 ] 

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

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

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

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

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

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

    / 56
  37. 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
  38. どんな知識??(20) スマコンのセキュリティ オーバーフロー uint8 number = 255; number++; [ GitPitch

    @ github/mazarimono/block20181024 ]  38 / 56
  39. どんな知識??(21) コメント // 1行コメント、 /* 複数行コメント netspec ///のあとに @title 、

    @authorはそのままの意味、@noticeはユ ーザー向け、@devは開発者向けの更なる解説。 @param、 @return 関数の各@パラメーターに ついて記述。 [ GitPitch @ github/mazarimono/block20181024 ]  39 / 56
  40. どんな知識??(22) WEB3.JS ユーザーがDAppとやり取りできるベーシックな ウェブページを作る際に使うJavascriptのライブ ラリ。 DAppを運営するのに、自分でノードを運用する 必要はなく、サードパーティーのInfuraを使うと 良い。 API経由で利用可能。 [

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

    ブラ ウザ拡張機能使いたくないなぁ・・・ [ GitPitch @ github/mazarimono/block20181024 ]  41 / 56
  42. WEB3.JS INFURA METAMASK https://web3js.readthedocs.io/en/1.0/ https://infura.io/ https://metamask.io/ [ GitPitch @ github/mazarimono/block20181024

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

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

    Development Toolkit)をダウンロードするの 30分くらいかかる。 https://qiita.com/OMOIKANESAN/items/1ffc06ef6283befc435 [ GitPitch @ github/mazarimono/block20181024 ]  45 / 56
  46. https://developers.eos.io/eosio-home/docs/how-it-all- fits-together [ GitPitch @ github/mazarimono/block20181024 ]  46 /

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

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

    マペーパー。 [ GitPitch @ github/mazarimono/block20181024 ]  50 / 56
  51. [ GitPitch @ github/mazarimono/block20181024 ]  51 / 56

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

    技術によって起こる「信頼の変革」だ! [ GitPitch @ github/mazarimono/block20181024 ]  52 / 56
  53. [ GitPitch @ github/mazarimono/block20181024 ]  53 / 56

  54. 見終わったら次にAirbnbのファウンダーJoe Gebbiaのトー めた。 この人はレビューやコメント、適量の情報開示が信頼の度 えるということを話していた。 知らない人は危険だということを、適切なデザインにより うとしている。 しかし、銃で撃たれるかもしれない、アメリカで知らない るというサービスがうまく行ったというのは凄い意味があ も。

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

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