Slide 1

Slide 1 text

getho Hackathon ϋϯζΦϯ

Slide 2

Slide 2 text

ࣗݾ঺հ ໊લ: ࠤ౻ େี(@st_dsk) ձࣾ: Popshoot, Inc ݴޠ: Golang, Swift, ೔ຊޠ, ӳޠ ࢓ࣄ: Server/Infra ΤϯδχΞ, iOS

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ 1. ΠʔαϦΞϜʹ͍ͭͯ 2. εϚʔτίϯτϥΫτʹ͍ͭͯ 3. DApp։ൃπʔϧʹ͍ͭͯ 4. gethoʹ͍ͭͯ 5. ؆୯ͳτʔΫϯͷ࡞੒ͱσϓϩΠ 6. ToDoΞϓϦͷ঺հ

Slide 4

Slide 4 text

ࠓ೔࿩͢͜ͱ 1. ΠʔαϦΞϜʹ͍ͭͯ 2. εϚʔτίϯτϥΫτʹ͍ͭͯ 3. DApp։ൃπʔϧʹ͍ͭͯ 4. gethoʹ͍ͭͯ 5. ؆୯ͳτʔΫϯͷ࡞੒ͱσϓϩΠ 6. ToDoΞϓϦͷ঺հ

Slide 5

Slide 5 text

ΠʔαϦΞϜʹ͍ͭͯ • Ծ૝௨՟ͷҰछ(ETH) • ΞϓϦέʔγϣϯϓϥοτϑΥʔϜ • BTCͱETHͷҧ͍? • BTC͸௨՟ͱͯ͠ͷ໾ׂ͕ϝΠϯ • ETH͸ΞϓϦέʔγϣϯΛಈ͔͢ ͨΊͷͷ೩ྉ(Ψε)

Slide 6

Slide 6 text

ࠓ೔࿩͢͜ͱ 1. ΠʔαϦΞϜʹ͍ͭͯ 2. εϚʔτίϯτϥΫτʹ͍ͭͯ 3. DApp։ൃπʔϧʹ͍ͭͯ 4. gethoʹ͍ͭͯ 5. ؆୯ͳτʔΫϯͷ࡞੒ͱσϓϩΠ 6. ToDoΞϓϦͷ঺հ

Slide 7

Slide 7 text

εϚʔτίϯτϥΫτʹ͍ͭͯ • εϚʔτίϯτϥΫτ • ΠʔαϦΞϜͰಈ͘ΞϓϦέʔγϣϯ • ϊʔυʹঢ়ଶΛ࣋ͭ • ίϯτϥΫτΞυϨε • ։ൃݴޠ • Solidity, Vyper ͳͲ

Slide 8

Slide 8 text

Solidity • Solidity • εϚʔτίϯτϥΫτΛ࣮૷͢ΔͨΊͷݴޠ • EVMίʔυʹίϯύΠϧ͞ΕΔ • JavascriptϥΠΫ

Slide 9

Slide 9 text

Solidity pragma solidity ^0.4.24; contract SimpleStore { uint value; function set(uint _value) public { value = _value; } function get() public constant returns (uint) { return value; } }

Slide 10

Slide 10 text

Solidityݴޠ࢓༷ boolean • true or false uint v = 123 !true // => false v == 123 // => true v != 123 // => false v == 123 && true // => true v == 123 || false // => true

Slide 11

Slide 11 text

Solidityݴޠ࢓༷ intergers • (u)int • (u)int8 ~ (u)int256 • int/uint͸(u)int256ͷΤΠϦΞε uint x = 3 x = x + 5 // => 8 x = x * 5 // => 40 x = x / 5 // => 8 x = x % 5 // => 3

Slide 12

Slide 12 text

Solidityݴޠ࢓༷ address • 20byteͷ஋(ΠʔαϦΞϜΞυϨε) • address or address payable(>=0.5.0) address payable x = address(0x123); address myAddress = address(this); if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);

Slide 13

Slide 13 text

Solidityݴޠ࢓༷ array uint[2] fixedArr; fixedArr[0] = 10; // [10, 0] arr.length; // 2 string[] arr; arr.push("apple"); // [apple] arr.push("banana"); // [apple,banana]

Slide 14

Slide 14 text

Solidityݴޠ࢓༷ struct struct Person { address addr; string name; uint8 age; } Person memory p = Person(address(0xabc...), "Vitalik", 24); p.age // => 24

Slide 15

Slide 15 text

Solidityݴޠ࢓༷ mapping mapping(address => uint) public balances; balances[msg.sender] = 100; balances[msg.sender] // => 100;

Slide 16

Slide 16 text

Solidityݴޠ࢓༷ forจ for(int i = 0; i < 20; i++) { // do something }

Slide 17

Slide 17 text

Solidityݴޠ࢓༷ ifจ uint a = 1; uint b = 2; if (a == b) { // do something } else if (a != b) { // do something } else { // do something }

Slide 18

Slide 18 text

Solidityݴޠ࢓༷ Time 1 == 1 seconds 1 minutes == 60 seconds 1 hours == 60 minutes 1 days == 24 hours 1 weeks == 7 days

Slide 19

Slide 19 text

Solidityݴޠ࢓༷ Block, Transaction Properties • blockhash(uint blockNumber) returns (bytes32) • block.gaslimit: uint • block.number: uint • block.timestamp: uint • tx.gasprice: uint

Slide 20

Slide 20 text

Solidityݴޠ࢓༷ ͦͷଞ • msg.sender: address payable • msg.value: uint • now: uint

Slide 21

Slide 21 text

Solidityݴޠ࢓༷ storageͱmemory • storage • ϒϩοΫνΣʔϯ্ʹ࢒Δ • gas͕͔͔Δ • memory • ϒϩοΫνΣʔϯ্ʹ࢒Βͳ͍ • gas͕͔͔Βͳ͍

Slide 22

Slide 22 text

Solidityݴޠ࢓༷ Function function () {internal|external} [pure|view|payable] [returns ()] • pure, view, payable • pure: storage΁ͷΞΫηεෆՄ • view: storage΁ͷࢀরͷΈՄ • payable: ETHͷૹۚ෇͖

Slide 23

Slide 23 text

Solidityݴޠ࢓༷ Modifier • ؔ਺࣮ߦ࣌ʹ೚ҙͷॲཧΛ࣮ߦ͢Δ contract A { address owner; modifier onlyOwner { require(msg.sender == owner); _; } function doSomething() public onlyOwner { // do something if owner } }

Slide 24

Slide 24 text

ࠓ೔࿩͢͜ͱ 1. ΠʔαϦΞϜʹ͍ͭͯ 2. εϚʔτίϯτϥΫτʹ͍ͭͯ 3. DApp։ൃπʔϧʹ͍ͭͯ 4. gethoʹ͍ͭͯ 5. ؆୯ͳτʔΫϯͷ࡞੒ͱσϓϩΠ 6. ToDoΞϓϦͷ঺հ

Slide 25

Slide 25 text

DApp։ൃ4େπʔϧ • ݴޠ(solidity, vyper) • ϑϨʔϜϫʔΫ(truffle, emberk) • IDE(Remix, EthFiddle) • ςετ༻ϒϩοΫνΣʔϯωοτϫʔΫ(ganache, getho)

Slide 26

Slide 26 text

DApp։ൃπʔϧ • web3.js • Truffle • OpenZeppelin • MetaMask

Slide 27

Slide 27 text

DApp։ൃπʔϧ web3.js • ϊʔυʹΞΫηε͢ΔͨΊͷϥΠϒϥϦ var Web3 = require('web3'); var web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider('http://127.0.0.1:8545')); (web3.eth.getBalance("0x...");

Slide 28

Slide 28 text

DApp։ൃπʔϧ Truffle • εϚʔτίϯτϥΫτΛ։ൃ͢ΔͨΊͷϑϨʔϜϫʔΫ $ truffle init $ truffle compile $ truffle migrate

Slide 29

Slide 29 text

DApp։ൃπʔϧ OpenZeppelin • εϚʔτίϯτϥΫτͷςϯϓϨʔτɺϥΠϒϥϦ • ERC20, ERC721, SafeMathͳͲ

Slide 30

Slide 30 text

DApp։ൃπʔϧ MetaMask • ϒϥ΢β΢ΥϨοτ • ETH΍τʔΫϯͷ࢒ߴࢀরɺૹۚ • web3ͱ࿈ܞ΋Մೳ

Slide 31

Slide 31 text

ࠓ೔࿩͢͜ͱ 1. ΠʔαϦΞϜʹ͍ͭͯ 2. εϚʔτίϯτϥΫτʹ͍ͭͯ 3. DApp։ൃπʔϧʹ͍ͭͯ 4. gethoʹ͍ͭͯ 5. ؆୯ͳτʔΫϯͷ࡞੒ͱσϓϩΠ 6. ToDoΞϓϦͷ঺հ

Slide 32

Slide 32 text

getho DApp։ൃͷͨΊͷ։ൃϓϥοτϑΥʔϜ ಛ௃ - ςετ༻ϒϩοΫνΣʔϯωοτϫʔΫ - εϚʔτίϯτϥΫτͷ࣮ߦ؀ڥ

Slide 33

Slide 33 text

getho Dashboard • ؆୯ʹىಈ • τϥϯβΫγϣϯཤྺ • σϑΝϧτΞΧ΢ϯτ

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

getho ίϯτϥΫτ࣮ߦ • GUI্Ͱ࣮ߦ • ࣮ߦ݁Ռ

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

ࠓ೔࿩͢͜ͱ 1. ΠʔαϦΞϜʹ͍ͭͯ 2. εϚʔτίϯτϥΫτʹ͍ͭͯ 3. DApp։ൃπʔϧʹ͍ͭͯ 4. gethoʹ͍ͭͯ 5. ؆୯ͳτʔΫϯͷ࡞੒ͱσϓϩΠ 6. ToDoΞϓϦͷ঺հ

Slide 38

Slide 38 text

؆୯ͳτʔΫϯͷ࡞੒ͱσϓϩΠ • ࡞Δ΋ͷ • ERC20τʔΫϯ • ։ൃ؀ڥ • Node • Truffle • OpenZeppelin • getho

Slide 39

Slide 39 text

લ४උᶃ • gethoΞΧ΢ϯτੜ੒ • ͪ͜Β͔Β => https://getho.io

Slide 40

Slide 40 text

લ४උᶄ • Πϯετʔϧ $ brew install node // Windows or Linuxͷ৔߹͸దٓ $ npm install -g truffle $ npm install -g openzeppelin-solidity

Slide 41

Slide 41 text

લ४උᶅ • σΟϨΫτϦੜ੒ $ mkdir ~/HackathonToken $ cd ~/HackathonToken • truffleͷॳظԽ $ truffle init

Slide 42

Slide 42 text

contractsʹϑΝΠϧΛ௥Ճ $ touch ./contracts/HackathonToken.sol $ vim ./contracts/HackathonToken.sol // ΤσΟλΛ։͘

Slide 43

Slide 43 text

HackathonTokenͷ࣮૷ pragma solidity ^0.4.24; import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol"; contract HackathonToken is ERC20, ERC20Detailed { constructor( string name, string symbol, uint8 decimals, uint256 initialSupply ) ERC20Detailed(name, symbol, decimals) ERC20() public {} }

Slide 44

Slide 44 text

migrationsʹϑΝΠϧΛ௥Ճ $ touch ./migrations/2_deploy_hackathon.js $ vim ./migrations/2_deploy_hackathon.js // ΤσΟλΛ։͘

Slide 45

Slide 45 text

σϓϩΠ༻ͷmigrationίʔυΛ࣮૷ var hackathon = artifacts.require("./HackathonToken.sol"); module.exports = function(deployer){ var name = "Hackathon Token"; var symbol = "HKT"; var decimals = 18; var initialSupply = 1000000e18 deployer.deploy(hackathon, name, symbol, decimals, initialSupply, { }) }

Slide 46

Slide 46 text

truffle.jsʹωοτϫʔΫͷ௥Ճ $ vim ./truffle.js // ΤσΟλΛ։͘ module.exports = { networks: { getho: { host: ".getho.io/jsonrpc", port: 80, gas: 4712388, network_id: 1010 } } };

Slide 47

Slide 47 text

gethoʹσϓϩΠ $ truffle migrate --network getho // => gethoͰτϥϯβΫγϣϯ֬ೝ

Slide 48

Slide 48 text

ίϯτϥΫτΛgethoʹొ࿥ $ brew tap popshootjapan/homebrew-getho $ brew install getho // or go get github.com/popshootjapan/getho $ getho login $ getho upload ./build/contracts/HackathonToken.json \ -s // => gethoͰίϯτϥΫτ࣮ߦ ※ getho؅ཧը໘্͔Β΋ొ࿥Ͱ͖·͢

Slide 49

Slide 49 text

ࠓ೔࿩͢͜ͱ 1. ΠʔαϦΞϜʹ͍ͭͯ 2. εϚʔτίϯτϥΫτʹ͍ͭͯ 3. DApp։ൃπʔϧʹ͍ͭͯ 4. gethoʹ͍ͭͯ 5. ؆୯ͳτʔΫϯͷ࡞੒ͱσϓϩΠ 6. ToDoΞϓϦͷ঺հ

Slide 50

Slide 50 text

ToDoΞϓϦͷ঺հ • WebΞϓϦέʔγϣϯ http://:3000/ • ιʔείʔυ https://github.com/daisuke310vvv/web3todo

Slide 51

Slide 51 text

ϋοΧιϯΛ ָ͠Έ·͠ΐ͏ʂʂ