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
730
NFTを取り巻く技術要素とAWS利活用 / Technology and AWS of NFT
rmanzoku
0
960
NFTを中心とした新しいゲームの形 / The new approach of gaming with NFT
rmanzoku
0
450
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
3Dシーンの圧縮
fadis
1
760
技術記事、 専門家としてのプログラマ、 言語化
mizchi
12
5k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.4k
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
230
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
260
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.7k
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
230
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
890
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
6.5k
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
320
Featured
See All Featured
We Are The Robots
honzajavorek
0
240
Building the Perfect Custom Keyboard
takai
2
790
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Navigating Weather and Climate Data
rabernat
0
220
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Automating Front-end Workflow
addyosmani
1370
210k
Paper Plane
katiecoart
PRO
1
51k
Agile that works and the tools we love
rasmusluckow
331
21k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
The Pragmatic Product Professional
lauravandoore
37
7.3k
Rails Girls Zürich Keynote
gr2m
96
14k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
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 !!