Πϯϑϥཧෆཁͷ'JSFCBTFͱ (,&Ͱ࣮ݱ͢ΔϞόΠϧΞϓϦ։ൃJune 10th, 2019Tomokazu Kozuma
View Slide
Tomokazu Kozuma@Tomokazu106౦ژۀେֶେֶӃଔۀޙɺαΠόʔΤʔδΣϯτͰεϚϗήʔϜͷαʔόɺΠϯϑϥશൠΛ୲ɻϒϩοΫνΣʔϯԾ௨՟ʹ͍ٕͭͯज़ϒϩάΛॻ͍ͯΔ͏ͪʹத͠ɺຊ৬ͱͯ͠ྗ͢ΔͨΊʹ(JODPʹೖࣾɻ(JODPͰૹۚϓϩτίϧͷ࣮ɺϒϩοΫνΣʔϯϊʔυӡ༻ɺϋʔυϑΥʔΫରԠͳͲ෯͘୲ɻ
։ൃͷͷલʹʜ(JODPʹ͍ͭͯ
UUUWallet MiningSolutionϞϯΰϧͰͷԾ௨՟ϚΠχϯάϒϩοΫνΣʔϯͷαʔϏε։ൃˍ࣮ূ࣮ݧαϙʔτ҆৺ɾ҆શͷԾ௨՟ΥϨοτϒϩοΫνΣʔϯʹಛԽͨ͠ݚڀɾ։ൃΛߦ͍ɺΥϨοτϚΠχϯάͳͲΛࣄۀԽ
UUϒϩοΫνΣʔϯʹಛԽͨ͠ݚڀɾ։ൃΛߦ͍ɺΥϨοτϚΠχϯάͳͲΛࣄۀԽUWallet MiningSolutionϞϯΰϧͰͷԾ௨՟ϚΠχϯάϒϩοΫνΣʔϯͷαʔϏε։ൃˍ࣮ূ࣮ݧαϙʔτ҆৺ɾ҆શͷԾ௨՟ΥϨοτ
Ծ௨՟ΥϨοτͱ[[ࢿ࢈Λಈ͔͢͜ͱ͕Ͱ͖Δൿີ伴Λཧ[[ൿີ伴͕औΒΕΔʹࢿ࢈͕౪·ΕΔԾ௨՟ͷૹडۚɾऔҾཤྺɾߴΛཧαʔόܕͱΫϥΠΞϯτܕ͕͋Δ
ΫϥΠΞϯτܕΥϨοτΞϓϦϢʔβʔͷͰࢿ࢈Λ҆શʹཧෳϒϩοΫνΣʔϯʹରԠ͍͔͘͢Γ͍͢6*69
ϦϦʔε#$)ରԠ-5$ରԠ931ରԠ¥10,000,000,00&5$ରԠྦྷܭೖֹۚۚμϯϩʔυԯԁ10050,000 DL+ࠃ།ҰͷϚϧνϒϩοΫνΣʔϯରԠ%&9ػೳϙʔτϑΥϦΦػೳඋ
ࣄۀऀ͚ΥϨοτγεςϜUࢿ࢈ϚϧνγάͰཧUൿີ伴ϢʔβʔͷͰ҆શʹཧUෳϒϩοΫνΣʔϯʹରԠ
ಠࣗͷݎ࿚ͳΠϯϑϥશͯͷϒϩοΫνΣʔϯϊʔυΛࣗΒཧӡ༻ϒϩοΫνΣʔϯͷσʔλΛ ݕࡧ͢ΔγεςϜΛࣗୡͰߏஙߴ͍εέʔϥϏϦςΟNode Block Explorer Scalability
(JODPͷઆ໌Ҏ্
ϞόΠϧΞϓϦͷٕज़બఆ
ϦϦʔε·Ͱͷ։ൃνʔϜ[[όοΫΤϯυΤϯδχΞਓJ04ΤϯδχΞਓ
݄ ݄ ݄ ݄ ݄ཁ݅ఆٛЌ൛։ൃЌ൛ʢ&5)ʣϦϦʔεW։ൃਖ਼ࣜ൛ʢ#5$ʣϦϦʔε։ൃεέδϡʔϧ
[[[ൿີ伴ͷ҆શͳཧ௨՟ରԠ ΫϥΠΞϯτͰ࣮ϒϩοΫνΣʔϯϊʔυӡ༻ ,VCFSOFUFT (,&ɾϚϧνϒϩοΫνΣʔϯɾՄ༻ੑϒϩοΫΤΫεϓϩʔϥͷߏஙɾૹडۚͷऔҾཤྺ'JSFCBTFɾΞυϨε௨՟ผͷߴཧΥϨοτʹඞཁͳͷ
[[ྗ͖͢ൿີ伴ͷཧɺ௨՟ରԠɺ6*69ϊʔυӡ༻ͱϒϩοΫΤΫεϓϩʔϥॏཁ͚ͩͲෛ୲ΛݮΒ͍ͨͦ͠ͷͨΊʹ(,&ͱ'JSFCBTFΛར༻ॏཁͳ͜ͱʹྗ͍ͨ͠
(,&ΛͬͨϒϩοΫνΣʔϯϊʔυӡ༻
[[• "͕#ʹૹͬͨͱ͍͏ཤྺʢτϥϯβΫγϣϯʣΛอ࣋• ୭ͷڐՄͳ͘ӡ༻Ͱ͖தΛ֬ೝͰ͖Δ• ϊʔυੈքதͰӡ༻͞Ε͍ͯͯɺ૬ޓʹσʔλΛड͚͢͜ͱͰಉ͡σʔλΛಉظϒϩοΫνΣʔϯͱΥϨοτΛ։ൃ͢Δ্ͰϒϩοΫνΣʔϯ্ͷσʔλʹৗʹΞΫηεͰ͖Δ͜ͱ͕ॏཁ
[[[ϒϩοΫνΣʔϯϊʔυͷӡ༻Ͱେࣄͳ͜ͱՄ༻ੑ֤ϊʔυͷόʔδϣϯΞοϓͷ͢͠͞3%͕͍͢͠
[• ঢ়ଶΛίʔυͰઃఆˠએݴతઃఆ• มߋΛՃ͑ΒΕͳ͍৽نͰ࡞Γ͢ˠ*NNVUBCJMJUZ• ࢦఆͨ͠ঢ়ଶʹࣗಈͰम෮ˠηϧϑώʔϦϯά[• શͯͷΠϯϑϥΛZBNMϑΝΠϧͰཧͰ͖ɺ$*πʔϧΛͬͯσϓϩΠՄೳ• ߏங͖͢Ϧιʔεଟ͍ͷͰΠϯελϯεΑΓίϯςφͷํ͕։ൃӡ༻ָ͕• ىಈ͕ૣ͍ͷͰ࡞ͬͯյͯ͠ͷ3%͕Γ͍͢બఆཧ༝,VCFSOFUFTͷಛ
[(,&ͷಛ• ,VCFSOFUFTͷϑϧϚωʔδυαʔϏε• ΫϥελʔͷΦʔτεέʔϦϯά• ,VCFSOFUFTͷࣗಈΞοϓάϨʔυ• 4UBDLESJWFSʹΑΔϩΪϯάϞχλϦϯά
[ଞࣾϑϧϚωʔδυ,VCFSOFUFTͱͷҧ͍• ϩΪϯάϞχλϦϯάͷ༻ʹՃઃఆඞཁͳ͍• *OHSFTTʹࣗಈͰ-ͷ-#ׂ͕ΓͯΒΕΔ• Φʔτεέʔϧͷઃఆ0/0''ͷΓସ͑ͷΈ• ,VCFSOFUFTͷࣗಈόʔδϣϯΞοϓʢ0/0''ͰΓସ͑Մೳʣ[(,&ͳΒઃఆͳ͠ʹ͙͢ʹ͍࢝ΊΒΕΔ
(JODPͰ࣮ࡍʹͲͷ͘Β͍༻͍ͯ͠Δ͔
EngineKubernetesBitcoin BitcoinBitcoin CashBitcoin CashLitecoin LitecoinXRP XRPEthereum EthereumClassicEthereumClassicEthereumཤྺ༻Bitcoin BitcoinBitcoin CashBitcoin CashLitecoin LitecoinXRP XRPEthereum EthereumClassicEthereumClassicEthereumૹۚ༻ڥ͋ͨΓϊʔυ
%FWFMPQɿ5FTUOFU 4UBHJOHɿ-JWFOFU 1SPEVDUJPO-JWFOFUBitcoin BitcoinBitcoin CashBitcoin CashLitecoin LitecoinXRP XRPEthereum EthereumClassicEthereumClassicEthereumBitcoin BitcoinBitcoin CashBitcoin CashLitecoin LitecoinXRP XRPEthereum EthereumClassicEthereumClassicEthereumBitcoin BitcoinBitcoin CashBitcoin CashLitecoin LitecoinXRP XRPEthereum EthereumClassicEthereumClassicEthereumBitcoin BitcoinBitcoin CashBitcoin CashLitecoin LitecoinXRP XRPEthereum EthereumClassicEthereumClassicEthereumBitcoin BitcoinBitcoin CashBitcoin CashLitecoin LitecoinXRP XRPEthereum EthereumClassicEthereumClassicEthereumBitcoin BitcoinBitcoin CashBitcoin CashLitecoin LitecoinXRP XRPEthereum EthereumClassicEthereumClassicEthereum[• શڥͰϊʔυҎ্Λӡ༻• ϒϩΫνΣʔϯಛԽͷϔϧενΣοΫػೳ• ಠࣗͷϑΣΠϧΦʔόʔػೳશڥ
[Bitcoin)FBMUI$IFDL 4FSWJDF#MPDL)FJHIUBitcoinBitcoinEngineKubernetes [࠷৽ϒϩοΫΛಉظͰ͖͍ͯͳ͍߹-#͔Β֎͢-BUFTU#MPDLϒϩοΫνΣʔϯಛԽͷϔϧενΣοΫػೳ
[Bitcoin)FBMUI$IFDL 4FSWJDF/PEF"BitcoinBitcoinEngineKubernetes/PEF# /PEF$[ಉظͰ͖͍ͯͳ͍ϊʔυʹਖ਼ৗͳϊʔυΛڭ͑ଓͤ͞Δ/PEF$ʹ"Λڭ͑ΔಠࣗͷϑΣΠϧΦʔόʔػೳ
[CircleCIEngineContainer$MPVE #VJMEEngineKubernetesStackdriver$POUBJOFS 3FHJTUPSZᶄϏϧυ5FTUᶅ*NBHFΛϏϧυᶆ*NBHFΛొ ᶇ1PEͷ*NBHFͷߋ৽GitHubᶃϚʔδͨ͠ΒΩοΫ(,&ͷσϓϩΠ
,VCFSOFUFTΛͬͯͷར[[[ϚΠΫϩαʔϏεͱͯ͠ಠࣗͷػೳΛՃ͍༷͢͠ʑͳछྨͷϦιʔεཧͱσϓϩΠ͕༰қ(,&ͳΒॳظઃఆ͕ॆ࣮͍ͯ͠ΔͷͰ͙͢ʹຊ൪ར༻Ͱ͖Δ
'JSFCBTFΛͬͨϒϩοΫΤΫεϓϩʔϥͷߏங
[• ϒϩοΫνΣʔϯͷσʔλΛݕࡧ͢ΔγεςϜ• ϒϩοΫνΣʔϯϊʔυࣗମʹॊೈͳݕࡧγεςϜ͕ͳ͍• ϒϩοΫνΣʔϯϊʔυߴෛՙʹ͑ΒΕͳ͍• ΥϨοτʹݶΒͣϒϩοΫνΣʔϯΛͬͨαʔϏεΛ࡞ΔʹϚετͳػೳϒϩοΫνΣʔϯϒϩοΫΤΫεϓϩʔϥ 5Y ߴϒϩοΫΤΫεϓϩʔϥʔͱʁ
ϒϩοΫΤΫεϓϩʔϥʔͰେࣄͳ͜ͱ[[[શͯͷϒϩοΫνΣʔϯͰͷ౷ҰతͳΠϯλʔϑΣʔεσʔλݕࡧͷ͢͠͞ϦΞϧλΠϜʹมߋΛऔಘͰ͖Δ
[[ଞࣾϒϩοΫΤΫεϓϩʔϥࣗࣾϒϩοΫΤΫεϓϩʔϥ#JUDPJOͷΤΫεϓϩʔϥ&UIFSFVNͷΤΫεϓϩʔϥ3JQQMFͷΤΫεϓϩʔϥɾ ɾ(JODPͷϒϩοΫΤΫεϓϩʔϥ̍ͭͰෳରԠ
ϒϩοΫΤΫεϓϩʔϥʔΛࣗ࡞͢Δཧ༝ଞࣾ ࣗࣾϝϦοτ ͙͍࢝͢ΊΒΕΔશϒϩοΫνΣʔϯͰ*'Λ౷ҰϦΞϧλΠϜʹऔಘ͢Δ߹*'Λ౷ҰσϝϦοτ ϒϩοΫνΣʔϯຖʹ*'͕มΘΔ ϒϩοΫνΣʔϯͷਂ͍ཧղͱ࣮
ϒϩοΫΤΫεϓϩʔϥͷߏஙͷมભ
[• ("&$MPVE%BUBTUPSFΛ༻• "1*࣮ɺΠϯλʔϑΣʔεͷࡲΓ߹Θͤʹ࣌ؒΛফඅ• ϦΞϧλΠϜʹσʔλऔಘ͢Δʹ͞Βʹ͕͔͔Δ• ਓ͕গͳ͍ͨΊྗ͍ͨ͠ΥϨοτͷ։ൃʹूதͰ͖ͳ͍Cloud DatastoreϒϩοΫΤΫεϓϩʔϥ։ൃॳظ
[• N#BB4ɿϞόΠϧόοΫΤϯυαʔϏε• αʔόαΠυͷ։ൃΛݮ͢ΔͨΊʹϓογϡ௨ͳͲ ൚༻ػೳΛΫϥυαʔϏεͱͯ͠ఏڙ• "VUI %BUBTUPSFʢ'JSFTUPSFʣ 4UPSBHF 'VODUJPOT• .FTTBHJOH "OBMZUJDT 3FNPUF$POpH )PTUJOH'JSFCBTFͱʁ
[• αʔόϨεͰཧίετແ͠• άϩʔόϧϨϕϧͷεέʔϦϯάੑ• ϦΞϧλΠϜΞοϓσʔτ• ΦϑϥΠϯαϙʔτ• $MPVE'VODUJPOTͳͲଞαʔϏεͱͷ࿈ܞ$MPVE'JSFTUPSFಛ
[Cloud DatastoreϒϩοΫΤΫεϓϩʔϥ'JSFTUPSFͰͲ͏มΘ͔ͬͨ
[$MPVE'JSFTUPSFʹͯ͠ಘΒΕͨϝϦοτ• ΞΫηε͢Δ͜ͱͰHFUTFUܥͷ"1*͕ඞཁͳ͍• XFCTPDLFUͷ࣮ͳ͠ʹϦΞϧλΠϜͳมߋΛऔಘͰ͖Δ• Πϯϑϥͷෳࡶੑ͕ͳ͘ͳΔ• αʔό։ൃཧςετΛݮ• ͦͷ݁Ռɺൿີ伴ͷཧɺෳ௨՟ରԠɺ6*69ͷ࣮ʹઐ೦
'JSFTUPSFͬͯΈͯͷݟ
'JSFTUPSFΛͬͯΈͯͷݟ[[ϥϯχϯάίετӡ༻ίετΞΫηείϯτϩʔϧ
ϥϯχϯάίετӡ༻ίετ
['JSFTUPSFͷඅ༻ײ• શڥ߹Θͤͯສԁఔ• ىಈ࣌ؒͰͳ͘ݺͼग़͠ճͱอଘσʔλྔʹ՝ۚ͞ΕΔ• ແྉ͕͋ΔͷͰɺϦϦʔε·ͰίετΛ͑Δ͜ͱ͕Ͱ͖Δ• ແྉσΠϦʔ3FBEສճɺ8SJUF%FMFUFສճ• ϦϦʔεલ݄ສԁఔͱελʔτΞοϓʹ༏͍͠
['JSFTUPSFͷԽ• σʔλͷԽκʔϯؒͰࣗಈͰෳ͞ΕΔ• ϚϧνϦʔδϣϯͰͷԽઃఆՄೳ• ࡞࣌ʹεϖοΫͷઃఆ͕͍Βͳ͍• ؆୯ʹ͍࢝ΊΒΕͯͦͷ··ຊ൪ӡ༻͕Ͱ͖Δ• 'JSFTUPSFͳΒΠϯϑϥઐͷΤϯδχΞඞཁͳ͍
['JSFTUPSFͷεΩʔϚΠϯσοΫε• εΩʔϚϨεͳͷͰϚΠάϨʔγϣϯ͕͍Βͳ͍• "MUFSจͳ͍ͷͰࣗྗͰόονΛ࣮͢Δඞཁ͕͋Δ• ୯ҰϑΟʔϧυͷΠϯσοΫεࣗಈͰுͬͯ͘ΕΔ• ෳϑΟʔϧυʹର͢ΔΫΤϦෳ߹ΠϯσοΫε͕ඞਢ
[ӡ༻ϝϯόʔ• ࠷ऴతʹΞϓϦΤϯδχΞͷΈͰӡ༻• %#ઃܭϊϋ͕ඞཁͳͷͰ૬ஊ͠ͳ͕ΒਐΊΔ• ΞϓϦΤϯδχΞͷൣғ͕͘ͳΔ͕ খ͍͞νʔϜͰεέʔϧ͢ΔαʔϏεΛ࡞Δ͜ͱ͕Ͱ͖Δ
'JSFTUPSFͷΞΫηείϯτϩʔϧ
['JSFTUPSFͷΞΫηείϯτϩʔϧ• ΫϥΠΞϯτ͔Β'JSFTUPSFʹΞΫηεՄೳ• ΞΫηεʹ"1*Ωʔ͕ඞཁ• "1*ΩʔΫϥΠΞϯτʹຒΊࠐΉͷͰ୭Ͱ֬ೝՄೳ• ୭ͰΞΫηεͰ͖ΔͨΊSVMFTͰ੍ޚ["1*ΩʔͰΞΫηε
[FirestoreCloudRules"1*ΩʔͰΞΫηε• SFBEXSJUFݖݶ• σʔλͷόϦσʔγϣϯ'JSFTUPSFSVMFT
[match /Users/{uid} {allow get: if someCondition();allow create: if someCondition();}function someCondition() { … }SFBE୯ҰEPDΛऔಘ͢ΔHFUͱෳऔಘ͢ΔMJTUXSJUFDSFBUF VQEBUF EFMFUFSFBEXSJUFݖݶ
[match /Users/{uid} {allow update: ifrequest.resource.data.keys().hasOnly(["name", "age"])&& request.resource.data.name is string&& request.resource.data.name != ""&& request.resource.data.age == resource.data.age}'JSFTUPSFͷมߋલͷσʔλɿSFTPVSDFEBUB'JSFTUPSFͷมߋޙͷσʔλɿSFRVFTUSFTPVSDFEBUBܕɿJOU TUSJOH CPPM UJNFTUBNQͳͲLFZɿIBT"MM IBT0OMZ IBT"OZσʔλͷόϦσʔγϣϯ
['JSFCBTF-PDBM&NVMBUPS• ݄ʹ'JSFTUPSF-PDBM&NVMBUPS͕ൃද• SVMFTͷςετϩʔΧϧڥ͚ͩͰ݁• ଞਓͷ࡞ۀΛҙࣝ͠ͳͯ͘ྑ͘ͳͬͨͷͰSVMFTͷՃɾमਖ਼͕͘͢͠ͳͬͨ• ςετ࣮ߦ࣌ؒʹݮ
'JSFCBTFͷͦͷଞͷػೳʹ͍ͭͯ
[• ϓογϡ௨• Ϋϥογϡϩάʢ*TTVFԽ4MBDL௨ʣ• Ϣʔβʔߦಈϩάͷه• ڧ੍Ξοϓσʔτ• 'JSFTUPSFͷόοΫΞοϓͱ#JH2VFSZ࿈ܞ• ϞχλϦϯάΥϨοτҎ֎ͷػೳ
[FunctionsCloudᶃσʔλ͕ߋ৽͞ΕͨΒ'VODJUPOTΛىಈ ᶄ.FTTBHJOHʹ௨ᶅ.FTTBHJOH͔Βʹ௨FirestoreCloudMessagingCloudϓογϡ௨
[ΫϥογϡϩάᶃΫϥογϡϩάΛ௨FunctionsCloudᶄ'VODUJPOΛىಈᶆ(JU)VCʹJTTVF࡞CrashlyticsGitHubSlackᶇ4MBDLʹ௨ᶅ'VODUJPO͔Β֤छαʔϏεʹ௨
[ᶃΞΫγϣϯΛ&WFOUʹϓογϡAnalyticsFunctionsCloudᶄ&WFOUΛτϦΨʔʹىಈ֎෦ APIᶅ֎෦"1*Λ࣮ߦʢࠂͷଌఆʣΞΫγϣϯͷαϚϦΛݟΕΔϢʔβʔߦಈϩάͷه
[ڧ੍ΞοϓσʔτConfigRemoteᶃىಈ࣌ʹ3FNPUF$POpH͔Β࠷όʔδϣϯΛऔಘ04ผʹ࠷όʔδϣϯΛઃఆɾJ04Wɾ"OESPJEW
['JSFTUPSFͷόοΫΞοϓͱ#JH2VFSZ࿈ܞSchedulerCloudFunctionsCloudᶃ#BDLVQ"1*Λ࣮ߦStorageCloudᶄ#BDLVQϑΝΠϧ͕࡞͞ΕΔBigQueryᶅ#BDLVQϑΝΠϧͷ࡞͕ྃޙ ɹ#JH2VFSZϩʔυ͢Δ"1*Λ࣮ߦ
[4UBDLESJWFS-PHHJOH.POJUPSJOHEngineKubernetesStackdriverFunctionsCloudSlackᶅᮢΛ͑ͨΒ௨ᶄ4UBDLESJWFSͰϞχλϦϯάᶃࣗಈͰ4UBDLESJWFSʹूܭ͞ΕΔ
4UBDLESJWFS-PHHJOH
4UBDLESJWFS&SSPS3FQPSUJOH
4UBDLESJWFS.POJUPSJOH
·ͱΊ[[[(,&Λ͏͜ͱͰେͳϦιʔεཧ͕༰қʹͳΔ'JSFCBTFͳΒখ͍͞νʔϜͰεέʔϥϒϧͳαʔϏε։ൃ͕Ͱ͖Δ݁Ռͱͯ͠伴ཧɺ௨՟ରԠɺ6*69ͳͲॏཁͳ͜ͱʹ࣌ؒΛ͑Δ