Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ERC-721をかぞえて / Enumerate ERC-721
Search
Ryo Manzoku
August 27, 2019
Programming
8.8k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ERC-721をかぞえて / Enumerate ERC-721
Road To Devcon 3.0
https://ethereumjapan.connpass.com/event/142897/
Ryo Manzoku
August 27, 2019
More Decks by Ryo Manzoku
See All by Ryo Manzoku
ブロックチェーンゲーム開発におけるチェーンの選び方 / How to select a blockchain for BCG
rmanzoku
0
750
NFTを取り巻く技術要素とAWS利活用 / Technology and AWS of NFT
rmanzoku
0
960
NFTを中心とした新しいゲームの形 / The new approach of gaming with NFT
rmanzoku
0
460
NFTへの招待 / Invitation to NFT
rmanzoku
0
1.5k
Stringをどうにかする / Managing Solidity String
rmanzoku
0
1.4k
ブロックチェーン時代の認証 / Authentication in the Blockchain Era
rmanzoku
8
3.4k
MCH+ Hackathon #1
rmanzoku
0
360
AWS上で動く世界No.1ブロックチェーンゲーム / No1 Blockchain Game on AWS
rmanzoku
1
3k
ブロックチェーンゲームMyCryptoHeroesの作り方 / Architecture of My Crypto Heroes
rmanzoku
2
5k
Other Decks in Programming
See All in Programming
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
110
自作OSでスライド発表する
uyuki234
1
3.8k
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
550
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.4k
Foundation Models frameworkで画像分析
ryodeveloper
1
120
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
340
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
110
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
590
初めてのKubernetes 本番運用でハマった話
oku053
0
130
act2-costs.pdf
sumedhbala
0
110
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
5.8k
Designing for humans not robots
tammielis
254
26k
How to make the Groovebox
asonas
2
2.3k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
150
Prompt Engineering for Job Search
mfonobong
0
380
Marketing to machines
jonoalderson
1
5.6k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
230
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
200
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
GitHub's CSS Performance
jonrohan
1033
470k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Transcript
ERC-721Λ͔ͧ͑ͯ 2019-08-27 Road to Devcon 3.0 double jump.tokyoגࣜձࣾ ϦʔυΤϯδχΞ ຬ
྄
• Re-building the future of gaming with blockchain technology !!
• 20184݄ ۀ • ϒϩοΫνΣʔϯήʔϜઐۀ։ൃձࣾ • ैۀһ17ਓʢۀҕୗΛؚΉʣ • ϒϩοΫνΣʔϯʹҙͷ͋ΔΤϯδχΞΛੵۃ࠾༻தͰ͢ʂ double jump.tokyoגࣜձࣾ
• ຬ ྄ ʢManzoku Ryoʣ • double jump.tokyo ϦʔυΤϯδχΞ •
20187݄ΑΓ Πϯϑϥઃܭӡ༻ɺαʔόαΠυ։ൃɺ SmartContract։ൃɺϒϩοΫνΣʔϯٕज़ௐࠪͳͲΛ୲ • աڈʹιʔγϟϧήʔϜձࣾɺEdTechΞϓϦձࣾͰΠϯϑϥ ΤϯδχΞͱͯ͠AWSΛத৺ͱͨ͠ΫϥυΠϯϑϥ͔ΒΞϓ Ϧ·ͰͷશମઃܭɺߏஙɺվળΛܦݧ ࣗݾհ
None
• ຬ ྄ ʢManzoku Ryoʣ • double jump.tokyo ϦʔυΤϯδχΞ •
20187݄ΑΓ Πϯϑϥઃܭӡ༻ɺαʔόαΠυ։ൃɺ SmartContract։ൃɺϒϩοΫνΣʔϯٕज़ௐࠪͳͲΛ୲ • աڈʹιʔγϟϧήʔϜձࣾɺEdTechΞϓϦձࣾͰΠϯϑϥ ΤϯδχΞͱͯ͠AWSΛத৺ͱͨ͠ΫϥυΠϯϑϥ͔ΒΞϓ Ϧ·ͰͷશମઃܭɺߏஙɺվળΛܦݧ ࣗݾհ σβΠϯͷܦݧͳ͍ͷͰ SolidityͱWebύϑΥʔϚϯεͷΛ͠·͢ʂ
• Ϣʔβʔମݧͱ͍͏ҙຯͰɺࠓʹ͓͍ͯ ΦϯνΣʔϯͰαʔϏεશͯΛ࣮͢ΔͷෆՄೳ • Ethereum X.X ʹظʂ • “Read world”ʹαʔϏεΛఏڙ͢ΔͨΊʹɺΦϑνΣʔϯͱ
ͷΈ߹Θ͕ͤඞਢ • ʮERC-721τʔΫϯΛ͑Δʯͱ͍͏ྫͰ՝Λհ • WebύϑΥʔϚϯεͷ؍͔ΒUX՝Λײͯ͡Β͑Ε MyCryptoHeroesͷܦݧ͔Β͓Ͱ͖Δ͜ͱ
ࠓԕྀ͠ͳ͍͍ͯ͘ͱฉ͍ͯ·͢
• ͍ͬͯͳ͍ • 1͔ͭΒ9͍ͭ࣋ͬͯΔ • 10Ҏ্͍࣋ͬͯΔ • 2Ҏ্ͷίϯτϥΫτͷτʔΫϯΛ͍࣋ͬͯΔ • 10Ҏ্ͷίϯτϥΫτͷτʔΫϯΛ͍࣋ͬͯΔ
• ͕ࣗσϓϩΠͨ͠ίϯτϥΫτͷτʔΫϯΛ100ΞυϨεҎ্ ͕ॴ༗͍ͯ͠Δ ERC-721ͷτʔΫϯ࣋ͬͯ·͔͢ʁ
• ΥϨοτͱʁ • Metamask on Chrome • tokenPocket / GO
Wallet ଞϞόΠϧܥ • Opera • HTC Exodus / FINNY • Dapper • ࣗ࡞ ΥϨοτͳʹΛ͍ͬͯ·͔͢ʁ
• Βͳ͍ • ΥϨοτಠࣗϊʔυ • Infura.io • CloudFlare • ࣗલϊʔυ
͓͍ͷΥϨοτ͕ଓ͍ͯ͠Δϊʔυʁ
• MyCryptoHeroesͷհ • ERC-721ͱERC-721 Enumerableʹ͍ͭͯ • ERC-721 Enumerableͷ࣮ࡍͱ՝Λ௨ͯ͠”Real world”ͷϒ ϩοΫνΣʔϯαʔϏεΛߟ͑Δ
• MCH+ͷհ ͓ॻ͖
ʹ͍ͭͯ
https://mch.gg/start
• ήʔϜʹ͔͚͓ͨ࣌ؒۚɺ͋ͳͨͷࢿ࢈ͱͳΔੈք • ྺ্࢙ͷώʔϩʔΛूΊɺΞΠςϜΛ֫ಘ͠ɺότϧ͢Δ ϒϩοΫνΣʔϯRPGήʔϜ • ϒϩοΫνΣʔϯEthereum͓ΑͼࢄετϨʔδIPFSΛར༻ • Ethereum্ͰͷDailyActiveUserɾNFTऔҾྔ/औҾͰੈք1Ґ MyCryptoHeroesʢϚΠΫϦʣͱ
ήʔϜը໘
MyCryptoHeroesͷߏཁૉ &UIFSFVN 6TFS ϢʔβʔECDSAॺ໊༻ͷൿີ伴ͱ ରʹͳΔΞυϨεΛॴ༗ ήʔϜࢿ࢈ɺEthereum্Λਖ਼ͱͯ͠ཧ ॴ༗ใɺϢʔβʔͷΞυϨεʹ͋Δ ॴ༗ใΛ֬ೝ ήʔϜࢿ࢈Λ༻͍ͯήʔϜͰ༡Ϳ ࢿ࢈ΛҭͯΔ
MyCryotoHeroesͰ ɾήʔϜࢿ࢈Λͬͨ༡ͼͷఏڙ ɾETHʹΑΓήʔϜ௨՟Λൢച ɾ৽͍͠ήʔϜࢿ࢈ͷ༩ɺൢച ɾήʔϜࢿ࢈ΞʔτΛ༩
• ϒϩοΫνΣʔϯͷ՝Ͱ͋ΔεέʔϥϏϦςΟͱUXͷղܾ ͷͨΊήʔϜͱͯ͠ͷػೳΦϑνΣʔϯͰߏங • σδλϧΞηοτʹNFTʢERC-721ʣΛ࠾༻ • ήʔϜ௨՟ߪೖ෦ͱNFTؔ࿈ͷΈΦϯνΣʔϯ • NFTͷΞΠίϯ࡞ͬͨͷͰͬͯͶʂγʔϧ͋ΔΑʂ MyCryptoHeroesͷΞʔΩςΫνϟ
• 2018/9/21-10/1 ώʔϩʔϓϨηʔϧͷ࣮ࢪ • 2018/9/25-11/2 ότϧβͷ࣮ࢪ • Loom NetworkΛར༻ͨ͠ΦϯνΣʔϯότϧγεςϜ •
2018/10/23 gRPC-WebͷGAΛड͚࣮ͯͷมߋ • 2018/11/30 ຊϦϦʔε MyCryptoHeroesϦϦʔε·Ͱͷมભ
• EVMΛࡌͨ͠αΠυνΣʔϯٕज़Ͱ͋ΔLoom NetworkΛ࠾༻ • ΦϯνΣʔϯٕज़Λ༻͍ͳ͕Β࣮ߦແྉ&ߴ࣮ߦΛ࣮ݱ • ϒϩοΫνΣʔϯͰՁΛ୲อ͠ͳ͕ΒήʔϜͱͯ͠ͷUXΛ֬ อͰ͖ͨɺɺͣ ότϧβ։࢝ͷߏ &UIFSFVN
6TFS
• ϩδοΫͱͯ͠ΦϯνΣʔϯʢSolidityʣʹΑΔ࣮ߦՄೳ • ͨͩ͠ɺॏ͗͢Δ • 1ότϧʹ͖ͭ10ඵఔ͔͔Γɺͦͷؒશͯͷॻ͖ࠐΈ͕ϒ ϩοΫ͞ΕΔࣄଶ • ͞Βʹৄ͍͠ઓ͍ҎԼͷεϥΠυʹͯ •
https://mch.gg/hicon2018 • https://speakerdeck.com/rmanzoku/blockchain-game-in-practice ότϧβͷ݁Ռ
MyCryptoHeroesͷߏཁૉ &UIFSFVN 6TFS ϢʔβʔECDSAॺ໊༻ͷൿີ伴ͱ ରʹͳΔΞυϨεΛॴ༗ ήʔϜࢿ࢈ɺEthereum্Λਖ਼ͱͯ͠ཧ ॴ༗ใɺϢʔβʔͷΞυϨεʹ͋Δ ॴ༗ใΛ֬ೝ ήʔϜࢿ࢈Λ༻͍ͯήʔϜͰ༡Ϳ ࢿ࢈ΛҭͯΔ
MyCryotoHeroesͰ ɾήʔϜࢿ࢈Λͬͨ༡ͼͷఏڙ ɾETHʹΑΓήʔϜ௨՟Λൢച ɾ৽͍͠ήʔϜࢿ࢈ͷ༩ɺൢച ɾήʔϜࢿ࢈ΞʔτΛ༩
ERC-721ʹ͍ͭͯ
• EthereumͰNFTΛ࣮ݱ͢Δݱ࣮తͳඪ४༷ • ʮॴ༗ใʯʮৡʯʮৡݖͷҠৡʯΛنఆͨ͠Πϯλʔ ϑΣʔεΛ࣮͢Δඞཁ͕͋Δ • ඪ४༷Ͱ͋ΔͨΊɺERC-721Λ࠾༻ͨ͠ήʔϜɺαʔϏεɺ औҾॴͰՃ։ൃແ͠Ͱར༻Ͱ͖ΔΑ͏ʹͳΔ • ERC-721Λ࣮ͨ͠
= NFT ͱͳΔΘ͚Ͱͳ͍͜ͱΛҙ ERC-721ͱ
ERC-721 Interfaces pragma solidity ^0.4.20; interface IERC721 /* is IERC165
*/ { event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); function balanceOf(address _owner) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function approve(address _approved, uint256 _tokenId) external payable; function setApprovalForAll(address _operator, bool _approved) external; function getApproved(uint256 _tokenId) external view returns (address); function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
• ownerOfؔʹΑΓ͋ΔτʔΫϯIDͷॴ༗ऀ͕Θ͔Δ • balaceOfؔʹΑΓ͋ΔΞΧϯτͷ૯ॴ༗͕Θ͔Δ • τʔΫϯͷॴ༗ऀଞऀʹτʔΫϯΛৡͰ͖Δ • approveʹׂ͍ͭͯѪ • ͋ΔΞΧϯτͷॴ༗τʔΫϯIDҰཡऔಘͰ͖ͳ͍
ERC-721ͷͰ͖Δ͜ͱͰ͖ͳ͍͜ͱ
ࣗͷ࣋ͬͯΔΞηοτฒ͍ͨͰ͢ΑͶ
ERC-721 Enumerable
ERC-721 Enumerable Interface interface ERC721Enumerable is ERC721 { function totalSupply()
external view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); function tokenByIndex(uint256 index) external view returns (uint256); }
• ྻڍΛՄೳʹ͢ΔΦϓγϣϯ֦ு Enumerable • ownerͱindex͔ΒτʔΫϯIDΛऔಘͰ͖ΔtokenOfOwnerByIndexؔ ͕͋Δ • balanceOfͰͱ͚ͬͨͩtokenOfOwnerByIndexΛͿΜճͤΑ͍ɻ • ಡΈऔΓࢹ
• ҰཡΛऔಘͰ͖ΔΑ͏ʹͱStorageใΛอଘ • ॻ͖ࠐΈࢹ ERC-721 Enumerable
• to infura.io ྻ100ݸ • 60ඵ͘Β͍͔͔Δ • infra.ioΞϝϦΧʹαʔόʔ͕͋ΔͷͰɺຊ͔Βͩͱݫ͍͠ ͿΜ·Θͯ͠Έ·͠ΐ͏
• infuraͷϊʔυɺւ֎ʹ͋ΔͨΊϨΠςϯγ͕େ͖͍ • ͍ΘΏΔʮޫ͍ʯ • await͍ͯ͠Δ͔ΒͰʁ • ͦ͏Ͱ͢Ͷɻ ͕ɺຊͦ͜Ͱͳ͘100ݸϦΫΤετΛൃߦ͢Δ͜ͱ •
UXతͳͩͱͪΖΜฒྻԽ͖͢ • ͔͠͠HTTP1.1ͷϒϥβ6ຊఔ͔͠ฒྻԽͰ͖ͳ͍ ͠100ݸͷτʔΫϯΛ͍࣋ͬͯΔਓͩͬͨΒ
• ࠃʹ͋ΔϊʔυαʔϏε • ͘ͳͬͨʂ • ͨͩ͠ɺϢʔβʔ͕࣋ͭΥϨοτͷϊʔυΛαʔϏεఏڙऀ ͕ࢦఆͰ͖·͔͢ʁ • ίϯτϩʔϧෆՄೳͳྖҬͰͷղܾࡦແҙຯ ࠃʹϊʔυ͕͋ΕΑ͘ͳ͍ʁ
ࣗͷ࣋ͬͯΔΞηοτฒΔ͚ͩͰࠔ
• WebͷύϑΥʔϚϯεվળʹ͓͍ͯɺࣗͨͪͷίϯτϩʔϧ ՄೳͳൣғͰྗΛ͖͢ɺࣗͨͪͷίϯτϩʔϧՄೳͳൣ ғΛ૿͖͢ • Walletɺ伴ཧͷ؍͔ΒݴͬͯෆՄ৵Ͱ͋Δํ͕ྑ͍ • ૉʹಡΉͷͰͳ͘ɺϓϩΩγΩϟογϡΛಋೖ͖͢ • ͦͦϒϩοΫνΣʔϯͷʮঢ়ଶʯΩϟογϡͱ૬ੑ͕ྑ
͍ ಡΈऔΓύϑΥʔϚϯεʹ͍ͭͯ
• transferͷλΠϛϯάͰɺॴ༗ҰཡΛཧ͍ͯ͠Δ • https://github.com/OpenZeppelin/openzeppelin-contracts/ commit/d1158ea68c597075a5aec4a77a9c16f061beffd3 • Storageͷߋ৽ͳͷͰͪΖΜGas͕͔͔Γ·͢ɻ ERC-721 Enumerableͷ࣮ //
Mapping from owner to list of owned token IDs mapping(address => uint256[]) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex;
Gasൺֱද ERC-721 ERC-721 Enumerable ྻڍ ☓ ˚ mint Gas 66,878
158,461 transferFrom Gas 44,742 72,236 https://ropsten.etherscan.io/address/0x78b315eff64c865ad1d903cd771eb85f9bb2558c https://ropsten.etherscan.io/address/0x78b315eff64c865ad1d903cd771eb85f9bb2558c https://ropsten.etherscan.io/address/0xe18e82118b1a277d90beefe7ffd7421b606d0f83
• ίϯτϥΫτ্ͰྻڍΛ͏߹ඞਢ • transferFromΛ·ͱΊ࣮ͯߦ͢Δ • 20ݸ͘Β͍·Ͱߦ͚Δ • ID͝ͱʹuint256ΛׂΓͯͯͳʹ͔Λཧ͢Δ • 150ݸ͘Β͍·Ͱ͍͚Δ
• ͦͦuint256ͬͯͲ͏ࢥ͍·͔͢ Enumerable͑ͳ͍ͷʁ
• ࣗΛؚΉSmartContract͔ΒݺΕ͏ΔཁૉͷΈΛStorageʹ อଘ͖͢ • Smart Contract֎͔ΒݺΕ͏ΔͷEventͱ࣮͖ͯ͢͠ • ΦϑνΣʔϯαΠυνΣʔϯ • ERC-721ʹݶΒͣͦ͏͍͏ઃܭํΛݟ͔͚Δ
• ༨ܭͳཁૉɺকདྷʹΓϢʔβʔ༨ܭͳGasͷෛ୲Λڧ͍Δ ͜ͱʹͳΔ → ϢʔβʔମݧͷѱӨڹ SmartContractͷઃܭํ
• ϒϩοΫνΣʔϯ্Ͱͯ͢ͷॲཧ͢Δͷ͍͠ • WebύϑΥʔϚϯεͷGasͷ؍͔ΒϢʔβʔମݧͱ ͯ͠ݫ͍͠ͱݴΘ͟Δ͓͑ͳ͍ • ༷Λࣄલʹߟ͑ͯɺඞཁͳΒΦϑνΣʔϯͱซ༻͢Δ • ຊʹίϯτϥΫτͰྻڍ͢Δඞཁ͋Δͷ͔ʁ •
ͦΕΛೖΕΔ͜ͱʹΑͬͯશͯͷϢʔβʔ͕GasΛෛ୲͢Δ ͜ͱΛ಄ʹೖΕ͓ͯ͘ ERC-721 EnumerableΛ௨ͯ͡
• ERC-721Ͱ͔ͤͬ͘ن͕ܾ֨·͍ͬͯΔͷ͔ͩΒ͍͍ײ͡ʹͰ ͖ͳ͍ͷɺɺʁ • ϒϩοΫνΣʔϯͰσδλϧΞηοτཧ͍͚ͨͩ͠ͳΜ͚ͩ Ͳɺɺɺ • ϒϩοΫνΣʔϯήʔϜͬͯͳΜ͔ͩϒϧʔΦʔγϟϯΒ͍͠ ͡Όͳ͍ʁ ͱ͜ΖͰɺɺ
ʹ͍ͭͯ
• ʮήʔϜʹ͔͚͓ͨ࣌ؒۚɺ͋ͳͨͷࢿ࢈ͱͳΔੈ քʯͷ֦େΛࢦͯ͠ • NFT͕ήʔϜͱήʔϜΛඈͼӽ͑Δੈք؍ͷ࣮ݱʹΉ͚ͯ • MyCryptoHeroesͷϊϋΛϑϨʔϜϫʔΫͱͯ͠ఏڙ͢Δϒ ϩοΫνΣʔϯήʔϜ։ൃࢧԉϓϩάϥϜ • ϒϩοΫνΣʔϯήʔϜࢢͷࢀೖোนΛԼ͛Δ
MCH+ͱ
• ͪΖΜྻڍػೳఏڙ • ERC-721 Metadataػೳ • Approvalؔ࿈ • ͦͷଞӶҙ։ൃதʂ ERC-721ʹ·ͭΘΔAPIΛఏڙ༧ఆ
ERC-721 Interfaces pragma solidity ^0.4.20; interface IERC721 /* is IERC165
*/ { event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); function balanceOf(address _owner) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function approve(address _approved, uint256 _tokenId) external payable; function setApprovalForAll(address _operator, bool _approved) external; function getApproved(uint256 _tokenId) external view returns (address); function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
• ERC-721ʹ͓͍ͯɺtransferΠϕϯτඞਢ • ੜ·Ε͔ͯΒશͯͷtransferΛ͑ɺݱࡏͷঢ়ଶ໌͢Δ ΦϑνΣʔϯͰؤுΔྻڍ $ curl -s https://beta-api.mch.plus/inventory/ethereum/mainnet/ 0xd868711BD9a2C6F1548F5f4737f71DA67d821090/0xdceaf1652a131F32a821468Dc03A
92df0edd86Ea { "token_ids": [ 10021522, 10220372, 20270673, 20270688 ] }
ൺֱද ERC-721 ERC-721 Enumerable MCH+ ERC-721 ྻڍ ☓ ˚ ̋
mint Gas 66,878 158,461 66,871 transfer Gas 44,742 72,236 44,742
RE-BUILDING THE FUTURE OF GAMING WITH BLOCKCHAIN TECHNOLOGY !!