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
実践ブロックチェーンゲーム/Blockchain Game in Practice
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Ryo Manzoku
December 17, 2018
Technology
1.9k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
実践ブロックチェーンゲーム/Blockchain Game in Practice
2018-12-17 blockchain.tokyo #15
https://blockchain-tokyo.connpass.com/event/110424/
Ryo Manzoku
December 17, 2018
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
ERC-721をかぞえて / Enumerate ERC-721
rmanzoku
3
8.8k
MCH+ Hackathon #1
rmanzoku
0
360
AWS上で動く世界No.1ブロックチェーンゲーム / No1 Blockchain Game on AWS
rmanzoku
1
3k
Other Decks in Technology
See All in Technology
AIチャット検索改善の3週間
kworkdev
PRO
2
180
新しいUbuntu/GNOMEが使いたいからXからWaylandへ移行頑張ってるの巻 2026-06-20
nobutomurata
0
160
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.9k
Lightning近況報告
kozy4324
0
220
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
140
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
130
[チョークトーク資料]AWS DevOps Agent を使いこなす / AWS Dev Ops Agent Chalk Talk AWS Summit Japan 2026
kinunori
4
770
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
270
不要なレビューをAIにまかせて AIコーディングの環境改善を加速した
shoota
1
270
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
200
SteampipeとExcel Power QueryでAWS構成定義書の作成を自動化する
jhashimoto
0
180
AI時代のコスト管理を考えよう〜明日から使える実践AWSノウハウ~
yoshimi0227
0
870
Featured
See All Featured
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
Making Projects Easy
brettharned
120
6.7k
Designing Experiences People Love
moore
143
24k
ラッコキーワード サービス紹介資料
rakko
1
3.7M
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
200
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Are puppies a ranking factor?
jonoalderson
1
3.6k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
30 Presentation Tips
portentint
PRO
1
330
Designing for Timeless Needs
cassininazir
1
260
Transcript
None
࣮ફϒϩοΫνΣʔϯήʔϜ 2018-12-17 blockchain.tokyo#15 @rmanzoku
ࣗݾհ Name: Ryo Manzoku @rmanzoku Work: double jump.tokyo inc Job:
Blockchain Engineer Sidework: SRE / Cloud Infrastructure Language: Golang / Python
https://mch.gg/
My Crypto Heroes֓ཁ My Crypto HeroesɺMCHɺϚΠΫϦ 2018-11-30 ਖ਼ࣜαʔϏε։࢝ EthereumΛར༻ͨ͠ϒϩοΫνΣʔϯήʔϜ ϫʔΧʔϓϨΠεϝϯτܕRPG
Ξηοτ(ERC721)Ethereum mainnet ʹͯཧ ήʔϜϩδοΫΦϑνΣʔϯαʔόʹ࣮ͯߦ PCͰεϚϗͰɺWallet͕ͳͯ͘༡Δ
My Crypto Heroes֓ཁ ήʔϜʹ͔͚͓ͨ࣌ؒۚɺ ͋ͳͨͷࢿ࢈ͱͳΔੈք Ethereumʹ͋ΔAssetϢʔβʔ͕ࣗ༝ʹѻ͏͜ͱ͕Ͱ͖Δ AssetΛҭ͢Δ͜ͱͰࢿ࢈ͱͯ͠ͷՁΛߴΊΔ͜ͱ͕Մೳ Assetͱͯ͠ύʔςΟʹฤͰ͖ΔHeroͱHero͕උ͢Δ Extensionͷ2͕ͭ͋Δʢ2018/12/16࣌ʣ AssetSmart
ContractʹΑͬͯൃߦ্ݶ͕ఆΊΒΕ͍ͯΔ
ࠓ͢͜ͱ HiCon2018Ͱൃදͨ͠༰ͷิ MCHͰՔಇ͍ͯ͠ΔSmart Contractͷղઆ ࠓͷEthereumͰɺήʔϜͷΑ͏ͳෳࡶͳϩδοΫΛ࣮͢Δͷ ෆՄೳ ͱ͍͑αʔϏεΛੈͷதʹग़͞Ͷ࢝·Βͳ͍ EthereumͷੈքͱήʔϜͷੈքΛܨ͙ٕज़ Թײ͕Θ͔Βͳ͔ͬͨͷͰطͷใ͔ΓͩͬͨΒ͢Έ·ͤΜ
ٕज़എܠ AssetΛΦϯνΣʔϯɺήʔϜΦϑνΣʔϯͱͯ͠اըʢ4݄ʣ Etheremonͷॿݴ͋ΓΦϯνΣʔϯʢEVMʣͰͷ࣮ํస ʢ6݄ʣ ʢࢲ͕δϣΠϯʣ Loom NetworkΛͬͨότϧβΛ࣮ࢪɺݱ࣌ͰͷΦϯνΣʔϯ ࣮Λஅ೦ʢ10݄ʣ େ෦ΛΦϑνΣʔϯԽʢ11݄ʣ
HiCon2018Ͱͷൃද https://mch.gg/hicon2018
HiCon2018Ͱͷൃද https://mch.gg/hicon2018
EVM on Loom SDK Loom݁ߏ͍ ϒϩοΫੜ1ඵ ͔͠͠ότϧॲཧʹ10ඵҎ্͔͔Δ ͦͷؒɺWriteͯ͢ϒϩοΫ ReadԿނ͔ॏ͍
HiCon2018Ͱͷൃද https://mch.gg/hicon2018
Eventϩʔυόϥϯαʔ Master LoomͷEventΛGoरͬͯɺSlave LoomʹॲཧΛ ྲྀ͢όον͕ಈ͍͍ͯΔ ൃͱͯ͠State-channelʹ͍ۙͣ ࣄ্࣮ͷϩʔυόϥϯαʔ ʢͦͦMaster/Slaveͬͯɺɺɺʣ EventΛरͬͯॲཧ͢ΔͷͰΤϯυΤϯυͩͱඵ͔͔ Δ͕ϒϩοΫͳ͘ͳΔ
SidechainͰͷݶք ͦͦϒϩοΫνΣʔϯͰ͋ΔҎ্ɺγϦΞϧॲ ཧͰ͔࣮͠ߦͰ͖ͳ͍ CPUར༻ޮѱ͍ ͍͍͑ͯͤͥ3ίΞఔ ότϧͷϩάΛు͖͗ͯ͢1ϲ݄Ͱ100GB͘Β͍σΟ εΫΛ৯͏ ͜ͷ࣌ظɺேཁܾ݅·ͬͯ༦ํʹ৽نαʔόʹσ ϓϩΠΈ͍ͨͳঢ়گͩͬͨ
HiCon2018Ͱͷൃද https://mch.gg/hicon2018
HiCon2018Ͱͷൃද https://mch.gg/hicon2018
None
None
MCHͷήʔϜੑ HeroΛETHͳͲͰखʹೖΕɺΫΤετʹ͔͍ใुͰ͋ ΔExtensionΛऩू HeroExtensionͷϨϕϧΛ্͛ߴқͷΫΤετ ઓ खʹೖΕͨHeroɺExtensionΛήʔϜऔҾॴͰചങ ॴ༗͢ΔHeroɺExtensionΛEthereum্సૹ
Main chainͰཧ͢Δͷ Hero/Extension Assetॴ༗ݖ Hero/Extension Assetൃߦ্ݶ Hero/ExtensionΛήʔϜͰར༻͢ΔͨΊͷGateway
Smart contractʹ͍ͭͯ Ethereum্ͰϩδοΫΛಈ͔ͨ͢ΊͷϓϩάϥϜ MCHͰಁ໌ੑ֬อͷͨΊEtherscanͰެ։ https://mch.gg/etherscan ࠓޙOSSҰ෦ϩδοΫʹ͍ͭͯϥΠηϯεܖ ͷݩɺଞࣾͰར༻Ͱ͖ΔΑ͏ʹඋ༧ఆ MCHۀքൃలͷͨΊੵۃతʹٕज़Λใެ։
ERC 721ͱ Ethereumͷඪ४ن֨ͷҰͭͰNon-Fungible TokenʢNFTʣΛنఆ ͨ͠ΠϯλʔϑΣʔε NFTͱɺସෆՄೳͳͷ CryptoKittiesΛൃʹEthereum্ͰToken/Assetͷॴ༗ݖͳͲΛن ఆ ࢀর࣮ͱͯ͠OpenZeppelinOSͷͷ͕༗໊ CryptoZombiesERC721
ERC20ͱൺֱ͞ΕΔ
Assetॴ༗ݖ ERC 721 NFT ͩΕ͕͜ͷAssetΛॴ༗͍ͯ͠Δ͔ AssetΛੜΈग़͢Mintॴ༗ݖΛҠৡ͢ΔTransferͳ Ͳ OpenZeppelin 2.0 RC1Λܧঝ
Hero/ExtensionͱʹERC721
Assetൃߦ্ݶ ERC 721ʹՃ࣮ ৽Hero৽Extension࣮࣌ʹࣄલʹൃߦΛηοτ Mint࣌ʹൃߦνΣοΫ Type͝ͱʹೳྗ͕͋ΓɺͦͷTypeͷൃߦ্ݶ͕ܾ·͍ͬͯΔ CryptoKittiesͳͲͱҧ͍ɺID͔Βೳྗ͕ܾఆ͢ΔΘ͚Ͱͳ͍ ͪΖΜՁͷߴ͍ͷ΄Ͳൃߦ͕গͳ͍ ৫ా৴ੈքʹ10ମ͔͠ੜ·Ε·ͤΜʂΛContractͰอূ
Assetൃߦ্ݶ mapping(uint16 => uint16) private extensionTypeToSupplyLimit; function setSupplyLimit(uint16 _extensionType, uint16
_supplyLimit) external onlyMinter { require(_supplyLimit != 0); require(extensionTypeToSupplyLimit[_extensionType] == 0 || _supplyLimit < extensionTypeToSupplyLimit[_extensionType], "_supplyLimit is bigger”); extensionTypeToSupplyLimit[_extensionType] = _supplyLimit; } function mintExtensionAsset(address _owner, uint256 _tokenId) public onlyMinter { uint16 _extensionType = uint16(_tokenId / EXTENSION_TYPE_OFFSET); uint16 _extensionTypeIndex = uint16(_tokenId % EXTENSION_TYPE_OFFSET) - 1; require(_extensionTypeIndex < extensionTypeToSupplyLimit[_extensionType], "supply over"); _mint(_owner, _tokenId); }
Asset Gateway ήʔϜͰAssetͷऔҾ͕ߦ͑ΔͨΊɺήʔϜͰѻ͍ͬͯ ΔAssetʹసૹͳͲߦ͑ͳ͍Α͏ϩοΫ͢Δඞཁ͕͋Δɻ Gateway contract͕͋ΓɺͦͷContractʹAssetΛTransfer ͢Δ͜ͱͰ࣮ݱ Deposit / Withdrawͱ࣮ͯ͠
OpenZeppelinOSͰɺContract͕ड͚औΔ߹ ERC721Receiver͕نఆ͞Ε͍ͯΔͷͰै͏ͱྑ͍
ͦͦͳͥGateway͔ Ethereum্Ͱͯ͢ͷϩδοΫΛ࣮͢ΔͱGasͳͲͷϢʔ βʔίετ͕͔͔ΔɺUXతʹਏ͍ PlasmaΛච಄ʹεέʔϦϯάٕज़ߟҊ͞Ε͍ͯΔͷͷ ࣮Քಇ͍ͯ͠Δͷ΄΅ͳ͍ ϝΠϯνΣʔϯͱʮεέʔϦϯάٕज़XʯΛܨ͙ٕज़͕ඞཁ Xʹ͖ͳݴ༿ΛೖΕΑ͏ MCHͰΦϑνΣʔϯ
ܨ͙ٕज़ ContractͷEventΛ͏ GatewayʹAsset͕Transfer͞Εͨͱ͍͏EventΛࢹ EventΛΫϩʔϧ͠ɺΦϑνΣʔϯͷgRPCΛ࣮ߦ͢Δ औΓ͜΅͕͠ා͍ͷͰఆظ࣮ߦ͢Δ TxHashΛͬͯႈੑΛอূ͢Δ
ͭ·ΓͨͩͷBatch
abigen Solidityͷίʔυ͔ΒGolangΫϥΠΞϯτίʔυΛࣗ ಈੜͯ͘͠ΕΔίϚϯυ https://github.com/ethereum/go-ethereum/wiki/ Native-DApps:-Go-bindings-to-Ethereum-contracts Event subscription͕·ͩ͑ͳ͍ͦ͏Ͱ͕͢ɺόο ν༻్ʹे͑Δ
$ abigen --abi token.abi -pkg main -type Token -out token.go
package main import ( "fmt" “log" “token” "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" ) func main() { // Create an IPC based RPC connection to a remote node conn, err := ethclient.Dial("/home/karalabe/.ethereum/testnet/geth.ipc") if err != nil { log.Fatalf("Failed to connect to the Ethereum client: %v", err) } // Instantiate the contract and display its name token, err := NewToken(common.HexToAddress("0x21e6fc92f93c8a1bb41e2be64b4e1f88a54d3576"), conn) if err != nil { log.Fatalf("Failed to instantiate a Token contract: %v", err) } name, err := token.Name(nil) if err != nil { log.Fatalf("Failed to retrieve token name: %v", err) } fmt.Println("Token name:", name) }
abigenΊͬͪΌศར ͦͦSolidity/web3abi͔Βࢉग़Ͱ͖ΔόΠτίʔυΛ ΓͱΓ͢ΔͷͰͦͷղऍΛ͢Δඞཁ͕͋Δ ϒϥβͷ߹web3.jsΛ͏ ͍ͭϝδϟʔόʔδϣϯ͕͋ΔΜͰ͠ΐ͏Ͷɺɺ αʔόͷ߹ɺNodeJSΛ͏͔ɺabigenͨ͠GoΛ͏ͷ ͕ݱঢ়ͷબࢶͰ ༨ஊͰ͕͢ɺethereum/go-ethereumϦϙδτϦ͔ͳΓಡ ΈࠐΉ͜ͱʹͳΔʢυΩϡϝϯτ͋·Γͳ͍ʣ
op, _ := crawler.GetCommandOptions() c, err := crawler.NewCrawler(op) c.FilterOpts.End, err
= c.SafeBlockNum(3) contract, err := gum_gateway.NewGumGateway(c.Contract()) iter, err := contract.FilterSold(c.FilterOpts, nil, nil) grpcClient := gateway.NewGatewayServiceClient(c.GRPC) for iter.Next() { e := iter.Event if e.Raw.Removed { fmt.Printf("level:info\tmsg:%s removed block\n", e.Raw.TxHash.String()) continue } input := &gateway.PurchaseInfo{ EthPurchaser: e.User.String(), EthAffiliator: e.Referrer.String(), EthAmountGwei: crawler.ToGwei(e.Value).Uint64(), TxHash: e.Raw.TxHash.String(), } if !op.DryRun { _, err := grpcClient.GumSale(context.Background(), input) if err != nil { if strings.HasPrefix(err.Error(), "rpc error: code = Unknown desc = Error 1062: Duplicate entry") { fmt.Printf("level:debug\tmsg:%s already affected\n", e.Raw.TxHash.String()) continue } return err } } fmt.Printf("level:info\tmsg:%s is affected \n", e.Raw.TxHash.String()) }
ߟྀ ԿͰ͍͏͕ႈੑ͕ॏཁ ྫ͑ɺΦϑνΣʔϯͰॲཧΛߦͬͨͱ͍͏͜ͱΛ Ethererum্ʹه͠Α͏ʹ࠶Tx͕ඞཁʹͳΔ EthereumͷTxHashΛͬͯΦϑνΣʔϯଆͰႈ ੑΛ୲อ͢Δ DBͷҰҙ੍Ͱ࣮ݱ
ߟྀ AssetΛϢʔβʔʹฦ͢߹ಉ͡ɻ ΦϑνΣʔϯͰTxHashతͳͷΛൃߦ͠ɺίϯτϥ ΫτʹΘͨ͢ɻ ίϯτϥΫτͰҰҙ੍ɺɺͱ͍ͨ͠ͱ͜Ζ͕ͩݱঢ় Eventൃߦ͍ͯ͠Δ͚ͩ όον্ͰEventΛݟͯႈੑΛ୲อ
ߟྀ SafeBlockͱ͍͏ߟ͑ ϒϩοΫνΣʔϯͳͷͰreorg͕͋Γ͑Δ nϒϩοΫܦͬͨΒ֬ఆͱΈͳ͢ Ϣʔβʔͷࢿ࢈ΛकΔͨΊʢ͜ͷล҉߸௨՟औҾ ॴ͞Μͷ΄͏͕ৄ͍ͣ͠ɺɺʣ γεςϜతʹ໊લ͍ͭͯͨΓ͠·͔͢Ͷʁ
·ͱΊ EthereumͰɺήʔϜͷΑ͏ͳෳࡶͳϩδοΫΛ࣮ ͢ΔͷෆՄೳ αʔϏεͱͯ͠ੈͷதʹग़ͨ͢ΊʹɺͲ͏͢Ε࣮ ݱͰ͖Δ͔ྗٕͰ͜ͳ͍ͯ͘͠ গͳ͍ࣄྫͩͱࢥ͏ͷͰԕྀͳ࣭ͯͩ͘͘͠͞ ͍ʂ
RE-BUILDING THE FUTURE OF GAMING WITH BLOCKCHAIN TECHNOLOGY
࣌ؒ༨ͬͨΒΔωλ ࣮ࡍʹMainnetͰΔͱ৭ʑπϥΠ OperatorRoleͷඞཁੑ CSઢͰͷGas gRPC-webΛͬͨSPAΞϓϦέʔγϣϯ ecrecoverͬͨϩάΠϯػೳ Loom SDKΫϥελߏங Loom Go
Plugin։ൃ αʔόʔϨεॖURLػ IPFSͷը૾ߘػೳ ERC721 Metadataʹ͍ͭͯ ϒϩοΫνΣʔϯήʔϜΤίγεςϜʹ͍ͭͯͷ࢛ํࢁ ຊʹ͓͚ΔNon Fungible Token αΠυνΣʔϯɺϦΞϧӡ༻ݶք