Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Bitcoin Core v0.19とbitcoinrbハンズオン
Shu Kobuchi
December 13, 2019
Programming
1
210
Bitcoin Core v0.19とbitcoinrbハンズオン
ビットコインとか勉強会#36【Bitcoin Core v0.19とbitcoinrbハンズオン】
https://cryptocurrency.connpass.com/event/155804/
Shu Kobuchi
December 13, 2019
Tweet
Share
More Decks by Shu Kobuchi
See All by Shu Kobuchi
shukob
0
95
shukob
1
74
shukob
1
130
shukob
1
90
shukob
0
90
shukob
0
200
shukob
1
490
shukob
1
150
shukob
0
120
Other Decks in Programming
See All in Programming
naokioouchi
1
300
manfredsteyer
PRO
0
110
coa00
2
140
lovee
2
220
ntaro
0
170
grapecity_dev
0
180
makomakok
1
260
gernotstarke
0
390
borkdude
2
210
manfredsteyer
PRO
0
160
mrtc0
2
1k
ryosukes
0
1.4k
Featured
See All Featured
edds
56
9.4k
danielanewman
1
520
smashingmag
230
18k
chriscoyier
683
180k
jacobian
255
20k
matthewcrist
73
7.5k
tanoku
86
8.6k
vanstee
117
4.9k
3n
163
22k
mthomps
38
2.3k
stephaniewalter
260
11k
holman
288
130k
Transcript
#JUDPJO$PSFWϨϏϡʔͱ CJUDPJOSCϋϯζΦϯ ݄ ຊ҉߸௨՟Ϣʔβձɹখᔹप 4IV,PCVDIJ
ࣗݾհ খᔹपɹ4IV,PCVDIJɹ!TIV@LPCTIVLPCVDIJ Ԭݝ൧௩ࢢੜ·Εɹฌݿݝٶࢢɾๅ௩ࢢҭͪ ਆށେֶւࣄՊֶ෦ଔۀ ಸྑઌՊֶٕज़େֶӃେֶใՊֶݚڀՊम࢜ྃ ৽ଔͰՈిϝʔΧʔͰιϑτΣΞ։ൃ ͦͷޙ4*FSͰͷडୗ։ൃ લେࡕͷϕϯνϟʔͰ#JUDPJO8FC8BMMFUࢼ࡞։ൃ ʙ*5ϕϯμʔͷେࡕࢧࣾʹೖࣾ͠4& ʙϒϩοΫνΣʔϯͷاըਪਐͷͨΊ౦ژຊࣾసۈ
ʙϑϨηοπͷγχΞιϑτΣΞΤϯδχΞ w Ծ௨՟ࣄۀऀ͚ΥϨοτ։ൃͷޙɺݱࡏอकɾӡ༻Λ୲ 2
ίϛϡχςΟհ ຊ҉߸௨՟ϢʔβձɹIUUQTDSZQUPDVSSFODZDPOOQBTTDPN ʮϏοτίΠϯͱ͔ษڧձʯʢ݄̍ճɿฏʣ w ࣍ճ݄ௐத ʮ҉߸௨՟ಡॻձʯʢ݄̍ճɿฏʣ w ࣍ճ݄ௐத DSBTIBDBEFNZ *5ܥಈը৴
ʹͯϏοτίΠϯͱ͔ษڧձͷΞʔΧΠϒ৴த IUUQTDSBTIBDBEFNZDPNNVOJUZDSZQUPDVSSFODZ :PV5VCFνϟϯωϧʢษڧձʗಡॻձʣIUUQCJUMZZPVUVCFDDTUVEZ 3
(#&$ (P#MPDLDIBJO&OHJOFFSJOH$PNNVOJUZ IUUQTHPCMPDLDIBJOOFUXPSL ίʔυΛॻ͘͜ͱ͚͕ͩ#MPDLDIBJOΛਐԽͤ͞Δ ʮಈըͰֶͿϒϩοΫνΣʔϯʯͳͲίϯςϯπ๛ ݄ ʹ)BTI)VCͰ.FFUVQ 4
ϏοτίΠϯΦʔϓϯιʔε ϏοτίΠϯ #JUDPJO Φʔϓϯιʔε ୭Ͱ։ൃʹࢀՃՄೳʂ IUUQTHJUIVCDPNCJUDPJOCJUDPJO ϏοτίΠϯΛ͡Ίɺ҉߸௨՟ɾϒϩοΫνΣʔϯͷଟ͘044 ٕज़తʹ໘ന͍ʂʂ ϥΠτίΠϯ -JUFDPJO
#JUDPJOͷιʔείʔυ͔ΒϑΥʔΫ IUUQTHJUIVCDPNMJUFDPJOQSPKFDUMJUFDPJO ϞφίΠϯ .POBDPJO -JUFDPJOͷιʔείʔυ͕ϕʔε IUUQTHJUIVCDPNNPOBDPJOQSPKFDUNPOBDPJO ΠʔαϦΞϜ &UIFSFVN Φʔϓϯιʔε IUUQTHJUIVCDPNFUIFSFVNHPFUIFSFVN 5
ΞδΣϯμ #JUDPJO$PSFʹ͍ͭͯগ͠ 3FHUFTUϞʔυͰϋϯζΦϯ #JUDPJO$PSFW CJUDPJOSCϋϯζΦϯ ࣍ճ݄#JUDPJO$PSF CJUDPJOSC 3VCZPO3BJMTͰΞϓϦ։ൃ 6
8JOEPXTͷํͷࣄલ४උ 8JOEPXTͷํ6CVOUVΛΠϯετʔϧ͍ͯͩ͘͠͞ IUUQTXXXNJDSPTPGUDPNKBKQQVCVOUV OCMHHINTW BDUJWFUBCQJWPUPWFSWJFXUBC 6CVOUVͰ࣮ߦ TVEPBQUVQEBUF TVEPBQUVQHSBEF 7
#JUDPJO$PSF #JUDPJOϦϑΝϨϯε࣮ͷϊʔυ ެࣜΫϥΠΞϯτιϑτΣΞ ։ൃݴޠ$ গ͠1ZUIPOೖΔΑ͏ʹ CJUDPJOEͱ͍͏ 8
ϏϧυͱΠϯετʔϧ HJUDMPOFIUUQTHJUIVCDPNCJUDPJOCJUDPJO DECJUDPJO HJUUBH &OUFS͔ˣΩʔͰWΛݟ͚ͭΔ HJUDIFDLPVUW 6CVOUV IUUQTRJJUBDPNLFBDIJUFNTCCDDFG w ʮϏϧυͷલʹґଘ͢ΔQBDLBHFΛΠϯετʔϧʯ͔Βॱ൪ʹ࣮ߦ
.BD IUUQTCMPDLDIBJOKQCJUDPJOJOTUBMMCJUDPJOEPONBD NBLFʹ͕͔͔࣌ؒΔͷͰɺͦͷؒʹઆ໌ 9
ॳظىಈͱऴྃ ىಈ CJUDPJOESFHUFTUUYJOEFYEBFNPO ϒϩοΫνΣʔϯใΛࢀর CJUDPJODMJSFHUFTUHFUCMPDLDIBJOJOGP ఀࢭ CJUDPJODMJSFHUFTUTUPQ ੨ࣈλʔϛφϧʹଧͪࠐΜͰ࣮ߦ͢ΔίϚϯυ 10
CJUDPJODPOG -JOVYͷ߹ DEdCJUDPJO .BDͷ߹ DE6TFST\64&3^-JCSBSZ"QQMJDBUJPO4VQQPSU#JUDPJO OBOPCJUDPJODPOG·ͨWJCJUDPJODPOG ԼهΛίϐϖͯ͠อଘ 11 regtest=1 #
regtestϞʔυ༗ޮԽ txindex=1 # શͯͷTXΛऔಘ(ϑϧϊʔυ) server=1 # RPCΞΫηεՄೳʹ daemon=1 # ίϯιʔϧϩά͕ग़ͳ͍ rpcuser=hoge # RPCΞΫηεϢʔβ rpcpassword=hoge # RPCΞΫηεύεϫʔυ [regtest] # regtest༻ઃఆ rpcport=18332 # RPC༻port port=18333 # ଞͷϊʔυͱ௨৴͢Δport
࠶ىಈͯ͠ίϚϯυΛݟΔ CJUDPJOE CJUDPJODMJIFMQ CJUDPJODMJIFMQHFUCMPDLDIJBOJOGP 12
3FHUFTUϞʔυ 5FTUOFUແՁͳ#JUDPJOͷྲྀ௨͢ΔωοτϫʔΫ 1P8 1SPPGPG8PSL ܕͰϚΠχϯά͍ͯ͠Δ w ϒϩοΫੜִؒฏۉ͕ͩɺ҆ఆ͠ͳ͍ w ٸܹʹૣ͘ͳͬͨಈͰ͘ͳͬͨΓ 3FHUFTU։ൃ༻ͷωοτϫʔΫ
ҙͷλΠϛϯάͰϚΠχϯά͠์ʢίετ̌ʣ w ঝೝͱ͍͏ςετ͙͢ʹͰ͖Δ ωοτͷͳ͍ڥͰ͑Δ ෳܨ͛Δ͜ͱՄೳ w 3FPSHͷςετ؆୯ʹͰ͖Δ w #MPDLXJUIIPMEJOHBUUBDL ηϧϑΟογϡɾϚΠχϯά߈ܸ ؆୯ 13
3FHUFTUϚΠχϯάͱૹۚ CJUDPJODMJHFUOFXBEESFTT .T'9D:#-CJW'R-VSR-%SC&K7 BEESFTT.T'9D:#-CJW'R-VSR-%SC&K7 ΑΓޙ֤ࣗग़ྗ͞ΕͨΞυϨεͰஔ͖͍͑ͯͩ͘͞ CJUDPJODMJHFOFSBUFUPBEESFTTBEESFTT CJUDPJODMJHFUCBMBODF CJUDPJODMJHFUOFXBEESFTT /"T6RK&5UX;E#$U"%UUFN-35JB2 BEESFTT/"T6RK&5UX;E#$U"%UUFN-35JB2
ΑΓޙ֤ࣗग़ྗ͞ΕͨΞυϨεͰஔ͖͍͑ͯͩ͘͞ CJUDPJODMJTFOEUPBEESFTTBEESFTT DFFGFDEGEBDBCBDEFCDDE BEF 14
τϥϯβΫγϣϯͷࢀর UYJEDFFGFDEGEBDBCBDEFCDD EBEF ΑΓޙ֤ࣗग़ྗ͞ΕͨτϥϯβΫγϣϯͰஔ͖͍͑ͯͩ͘͞ CJUDPJODMJHFUUSBOTBDUJPOUYJE CJUDPJODMJHFUSBXUSBOTBDUJPOUYJE SBXUSBOTBDUJPO CJUDPJODMJHFUSBXUSBOTBDUJPOUYJE FDIPSBXUSBOTBDUJPO
CJUDPJODMJEFDPEFSBXUSBOTBDUJPOSBXUSBOTBDUJPO 15
ΞϦε͕Ϙϒʹ#5$ΛૹΔ Ҏલड͚औֹ͍ͬͯͨΛ߹ࢉͯ͠ɺ૬खʹૹΓɺ͓Γࣗ 59தʹهࡌͷͳֹ͍ ͜͜Ͱ#5$ ޙʹϚΠφʔ τϥϯβΫγϣϯͷߏ 16 ΞϦε Ϙϒ 5SBOTBDUJPO
59 */165 065165 ΞϦε Ωϟϩϧ ΞϦεˠϘϒ #5$ ΩϟϩϧˠΞϦε #5$ ΞϦεˠΞϦε ͓Γ #5$ #5$ σϏοτˠΞϦε #5$ #5$ σϏοτ ܭ#5$ ܭ#5$ ϚΠφʔ ωοτϫʔΫखྉ #5$ ˞59ʹهࡌͳ͍ ൿີ伴Λࠩ͠ࠐΜͰ ϩοΫղআɿిࢠॺ໊ ΞϦεͷ ൿີ伴 ΞϦεͷ ൿີ伴 ΞϦεͷ ެ։伴 Ϙϒͷ ެ։伴 ΞϦεͷ ެ։伴 ΞϦεͷ ެ։伴
3FMFBTF/PUFͷຊޠ༁CZ҆ໜږࢯ IUUQTCJUDPJODPSFPSHKBSFMFBTFT #JUDPJO$PSFWFSTJPO 17 $ bitcoin-cli getbalances { "mine": {
"trusted": 7699.99774240, "untrusted_pending": 0.00000000, "immature": 2500.00205560 } }
CJUDPJOSC CJUDPJOSVCZ IUUQTHJUIVCDPNMJBOCJUDPJOSVCZ CJUDPJOͷSVCZϥΠϒϥϦɺ#JUDPJOE CJUDPJODPSF ͱซ༻ ్த͔ΒDIBJOUPQF$50҆ໜږࢯ͕DPOUSJCVUFSʹ CJUDPJOSVCZͷ-JBO͕ཧΛΊͨͷͰɺ҆ࢯ͕৽ͨʹCJUDPJOSCΛΦʔϓ ϯιʔεͰ։ൃ։࢝ IUUQTHJUIVCDPNDIBJOUPQFCJUDPJOSC
ॻ੶CJUDPJOSVCZͰॻ͔Ε͍ͯΔ͕ɺҰ෦CJUDPJOSCͰͷίʔσΟϯάʹ Ԡ༻Մೳ 18
3VCZΠϯετʔϧ .BDͷ߹ IUUQTXXXPJBYKQSBJMT[BLLBO SBJMT@@@JOTUBMMBUJPO@PO@NBDPTYIUNM 6CVOUVͷ߹ IUUQTXXXPJBYKQSBJMT[BLLBO SBJMT@@@JOTUBMMBUJPO@PO@VCVOUIUNM 3VCZΠϯετʔϧ·ͰʢʮHFNSDͷ࡞ʯͷखલSVCZW·Ͱʣ 3BJMTΠϯετʔϧෆཁ ίʔυதͷWFSʹஔ͖࣮͑ͯߦ
19
CJUDPJOSCΠϯετʔϧ IUUQTHJUIVCDPNDIBJOUPQFCJUDPJOSC 3&"%.&ΛಡΜͰΠϯετʔϧ 20
JSC 3VCZରܕϞʔυ CJUDPJOSC JSC SFRVJSFCJUDPJO #JUDPJODIBJO@QBSBNTSFHUFTU #JUDPJO,FZHFOFSBUF #JUDPJO,FZHFOFSBUFQSJW@LFZ #JUDPJO,FZHFOFSBUFQVCLFZ 21
.OFNPOJD #JUDPJO8BMMFU.BTUFS,FZHFOFSBUF 22 irb(main):035:0> mk = Bitcoin::Wallet::MasterKey.generate => #<Bitcoin::Wallet::MasterKey:0x00000000019d8d10 @mnemonic=["shed",
"horror", "bleak", "destroy", "shield", "salute", "dose", "blast", "aim", "orphan", "crawl", "model", "salon", "fall", "amount", "repair", "unfold", "craft", "wall", "mean", "strong", "obtain", "holiday", "couple"], @seed="2a462344bbeafbc81996bd3bb93beb3eb0db9e1826de4dfab165e2d6714bf37f8a4ade6195579ae686365dd467e8687791 9bca0740f58eaa1beb393bb557471e", @encrypted=false, @salt=""> irb(main):036:0> mk = Bitcoin::Wallet::MasterKey.generate.mnemonic => ["rocket", "habit", "slam", "pioneer", "ethics", "client", "outer", "name", "alarm", "bulb", "visa", "special", "index", "shadow", "tube", "bronze", "focus", "skin", "deposit", "climb", "tattoo", "chimney", "anger", "daring"]
#JUDPJO4DSJQU -*'0 -BTU*O'JSTU0VU ͷ୯७ͳεΫϦϓτ 'PSUIͷΑ͏ͳٯϙʔϥϯυه๏ #JUDPJO5SBOTBDUJPOʹඞؚͣ·ΕΔ #JUDPJO$PSF CJUDPJOE ϥΠϒϥϦΛ͏ͱɺ#JUDPJO4DSJQUΛҙࣝ͠ͳ ͯ͘ɺϓϩάϥϜॻ͚Δ
6OMPDLJOH4DSJQUͱ-PDLJOH4DSJQUΛಉ࣌ʹ࣮ߦ ਖ਼࣮͘͠ߦͰ͖Ε6OMPDLJOH4DSJQUͰ-PDLJOH4DSJQUΛղআͯ͠ɺτϥϯ βΫγϣϯͷ༗ޮੑΛࣔͤΔ 23 6OMPDLJOH4DSJQU -PDLJOH4DSJQU
୯७ͳྫ 6OMPDLJOH4DSJQUɺ-PDLJOH4DSJQUͷॱͰ࣮ߦ͢Δ ελοΫʹσʔλͱ01ίʔυΛೖΕ͍ͯ͘ 01ίʔυΛελοΫʹೖΕͨͱ໋͖ྩʹԠͯ͡Լͷσʔλͭ·ͨෳ ʹରͯ͠ԋࢉ͢Δ 24 -PDLJOH4DSJQU 6OMPDLJOH4DSJQU 01@"%%01@&26"-Λ࣮ߦ
01@"%% Ճࢉ ༗ޮ 01@&26"- 01@"%%01@&26"- ಉ͔ ͍͠
#JUDPJO4DSJQU TDSJQU#JUDPJO4DSJQUGSPN@TUSJOH 01@"%%01@&26"-z TDSJQUSVO TDSJQU#JUDPJO4DSJQUGSPN@TUSJOH 01@"%%01@&26"-z TDSJQUSVO 25
irb(main):017:0> script = Bitcoin::Script.from_string("2 4 OP_ADD 6 OP_EQUAL").run => true irb(main):018:0> script = Bitcoin::Script.from_string("2 3 OP_ADD 6 OP_EQUAL").run => false irb(main):019:0> script = Bitcoin::Script.from_string("2 4 OP_ADD 6 OP_EQUAL") => #<Bitcoin::Script:0x0000000001be1c10 @chunks=["R", "T", "\x93", "V", "\x87"]> irb(main):020:0> script.run => true
ࢀߟʣ11, 1BZUP1VCMJD,FZ TJHൿີ伴Λ༻͍ͯੜ͞ΕΔॺ໊ɺ1VC,ެ։伴 26 -PDLJOH4DSJQU 6OMPDLJOH4DSJQU TJH1VC,01@$)&$,4*(Λ࣮ߦ TJH 1VC, TJH
1VC, 536& ༗ޮ $)&$,4*( TJH 1VC,01@$)&$,4*( ॺ໊Λݕূ
ࢀߟʣ11,) 1BZUP1VCMJD,FZ)BTIʢ11,ͷൃల൛ʣ ެ։伴ϋογϡΛ༻͍Δ͜ͱͰΞυϨεΛ͘දݱͰ͖Δ TDSJQUʢʣͰͷݺͼํ͋Δ 27 -PDLJOH4DSJQU TDSJQU1VC,FZ 6OMPDLJOH4DSJQU TDSJQU4JH TJH
TJH1VC,01@%6101@)"4)1VC,)BTI01@&26"-7&3*': 01@$)&$,4*(Λ࣮ߦ TJH 536& 1VC, TJH 1VC, TJH 1VC, 1VC, 1VC, 1VC,)BTI TJH 1VC, 1VC,)BTI 1VC,)BTI TJH 1VC, 1VC,)BTI 1VC,)BTI TJH 1VC, 01@%61 )"4) ෳ 01@&26"- ͍͠ TJH1VC, 01@%6101@)"4)1VC,)BTI 01@&26"-7&3*':01@$)&$,4*( ಉ͔ 4)"ͷޙ 3*1&.% ෳ
ࢀߟʣ11,)ʢଓ͖ʣ Γ11,ͱಉ͡ 28 -PDLJOH4DSJQU 6OMPDLJOH4DSJQU TJH 1VC, TJH 1VC,
536& $)&$,4*( TJH1VC, 01@%6101@)"4)1VC,)BTI 01@&26"-7&3*':01@$)&$,4*( ॺ໊Λݕূ
ࢀߟʣϚϧνγά NPGOʢOਓதNਓͷॺ໊ͰϩοΫղআͰ͖ΔʣϚϧνγά Α͋͘ΔPGͷྫ 29 -PDLJOH4DSJQU TDSJQU1VC,FZ 6OMPDLJOH4DSJQU TDSJQU4JH 01@TJH"4JH#1VC,"1VC,#1VC,$01@$)&$,.6-5*4*( )"4)
01@TJH"TJH# 1VC,"1VC,#1VC,$ 01@$)&$,.6-5*4*( 536& TJHOBUVSF# 1VCMJD,FZ$ $)&$,.6-5*4*( TJHOBUVSF" 1VCMJD,FZ# 1VCMJD,FZ"
CJUDPJOSC༻ JSC ԼهͷίʔυΛෳߦؙ͝ͱίϐϖ 30 irb(main):001:0> require 'bitcoin' => true irb(main):002:0>
require 'net/http' => true irb(main):003:0> require 'json' => false irb(main):004:0> Bitcoin.chain_params = :regtest => :regtest irb(main):005:0> RPCUSER="hoge" => "hoge" irb(main):006:0> RPCPASSWORD="hoge" => "hoge" irb(main):007:0> HOST="localhost" => "localhost" irb(main):008:0> PORT=18332 => 18332 irb(main):011:0> def bitcoinRPC(method,param) irb(main):012:1> http = Net::HTTP.new(HOST, PORT) irb(main):013:1> request = Net::HTTP::Post.new('/') irb(main):014:1> request.basic_auth(RPCUSER,RPCPASSWORD) irb(main):015:1> request.content_type = 'application/json' irb(main):016:1> request.body = {method: method, params: param, id: 'jsonrpc'}.to_json irb(main):017:1> JSON.parse(http.request(request).body)["result"] irb(main):018:1> end => :bitcoinRPC require 'bitcoin' require 'net/http' require 'json' Bitcoin.chain_params = :regtest RPCUSER="hoge" RPCPASSWORD="hoge" HOST="localhost" PORT=18332 def bitcoinRPC(method,param) http = Net::HTTP.new(HOST, PORT) request = Net::HTTP::Post.new('/') request.basic_auth(RPCUSER,RPCPASSWORD) request.content_type = 'application/json' request.body = {method: method, params: param, id: 'jsonrpc'}.to_json JSON.parse(http.request(request).body)["result"] end
CJUDPJO31$Ͱ#JUDPJO$PSFΛૢ࡞ JSC NBJO CJUDPJO31$ bHFUCMPDLDIBJOJOGP` <> BEESFTTCJUDPJO31$ bHFUOFXBEESFTT <>
CJUDPJO31$ HFOFSBUFUPBEESFTT < BEESFTT> 31 irb(main):019:0> bitcoinRPC('getblockchaininfo',[]) => {"chain"=>"regtest", "blocks"=>259, "headers"=>259, "bestblockhash"=>"537f9822f97e2110fa8d04d7676855eef5c7628c425a2a2e271a49d6a0741480", "difficulty"=>4.656542373906925e-10, "mediantime"=>1574683242, "verificationprogress"=>1, "initialblockdownload"=>true, "chainwork"=>"0000000000000000000000000000000000000000000000000000000000000208", "size_on_disk"=>108511, "pruned"=>false, "softforks"=>{"bip34"=>{"type"=>"buried", "active"=>false, "height"=>500}, "bip66"=>{"type"=>"buried", "active"=>false, "height"=>1251}, "bip65"=>{"type"=>"buried", "active"=>false, "height"=>1351}, "csv"=>{"type"=>"buried", "active"=>false, "height"=>432}, "segwit"=>{"type"=>"buried", "active"=>true, "height"=>0}, "testdummy"=>{"type"=>"bip9", "bip9"=>{"status"=>"started", "bit"=>28, "start_time"=>0, "timeout"=>9223372036854775807, "since"=>144, "statistics"=>{"period"=>144, "threshold"=>108, "elapsed"=>116, "count"=>116, "possible"=>true}}, "active"=>false}}, "warnings"=>""}
࣍ճ༧ࠂ ࠓճֶΜͩ͜ͱΛੜ͔ͯ͠ɺ3VCZPO3BJMTʹͯ#JUDPJO8FCϢʔβΠϯλʔ ϑΣʔεΛ։ൃ 32
ίϛϡχςΟհ ຊ҉߸௨՟ϢʔβձɹIUUQTDSZQUPDVSSFODZDPOOQBTTDPN ʮϏοτίΠϯͱ͔ษڧձʯʢ݄̍ճɿฏʣ w ࣍ճ݄ௐத ʮ҉߸௨՟ಡॻձʯʢ݄̍ճɿฏʣ w ࣍ճ݄ௐத DSBTIBDBEFNZ *5ܥಈը৴
ʹͯϏοτίΠϯͱ͔ษڧձͷΞʔΧΠϒ৴த IUUQTDSBTIBDBEFNZDPNNVOJUZDSZQUPDVSSFODZ :PV5VCFνϟϯωϧʢษڧձʗಡॻձʣIUUQCJUMZZPVUVCFDDTUVEZ 33