Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
BlockchainTokyo23.pdf
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
biga816
November 29, 2019
Technology
420
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
BlockchainTokyo23.pdf
biga816
November 29, 2019
More Decks by biga816
See All by biga816
Euler Finance Hacking Incident
biga816
0
730
BuidlMeetupVol2.pdf
biga816
0
45
Service Worker Cache Problems
biga816
1
1.8k
Consider how distributed IPFS is
biga816
2
5.4k
Centralized Dapps to read from Dapps game
biga816
1
2.5k
Usage of ethereum libraries for dapps
biga816
0
4.6k
Other Decks in Technology
See All in Technology
継続的なAIコスト最適化
bgpat
1
340
フロントエンドカンファレンス関西2026 - 速すぎるUIに、待ち時間を
teamlab
PRO
0
130
AI コーディングと人間の認知スループット / CTO Night & Day 2026 Morning Session / AI Coding and Human Cognitive Throughput
prog893
4
1.1k
Optunaの最新リリースv5.0について
pfn
PRO
0
120
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
330
AI時代のPRレビューにどう向き合うか?
kairim0
1
240
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
Classmethod Company Deck
satoshi7
1
690
夫婦で子育てするための育児標準化
codmoninc
PRO
0
350
QA4AI 2026-Oct 生成AI時代の品質保証
tokuty
1
860
触りたくないデータに、どう触るか AI時代のRBACアクセスガバナンス
ivry_presentationmaterials
0
270
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
1.1k
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
The SEO Collaboration Effect
kristinabergwall1
1
590
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
270
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
Building an army of robots
kneath
307
47k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
How GitHub (no longer) Works
holman
316
150k
Typedesign – Prime Four
hannesfritz
42
3.2k
4 Signs Your Business is Dying
shpigford
187
23k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Transcript
%BQQTʹ͓͚Δ ΞʔΩςΫνϟͱͭΒΈ BLJIJSP UBOBLB
%BQQ։ൃ4QFDJBMʂ
%BQQ։ൃ4QFDJBMʂ
%BQQ։ൃ4QFDJBMʂ
αϒίϯςϯπ࢝·Γ·͢
ࣗݾհాதতത !CJHB #6*%-ϒϩοΫνΣʔϯΤϯδχΞɻ ৽ଔͰΞΫηϯνϡΞʹೖࣾޙɺ4*8&#ϞόΠϧΞϓϦͷ։ ൃϦʔυΛ୲ɻ ʹ.U(09Ͱશࣦͯͬͨ͜ͱ͔ΒϒϩοΫνΣʔϯʹ ֮ΊɺԼΞΠυϧ͚%"QQTͳͲΛख͕͚ͨɻ ݱࡏ#6*%-ʹͯ4)*&%-ͷ։ൃΛ୲͍ͯ͠Δɻ 5ZQF4DSJQU͕͖ɻ
։ൃͨ͠ΞϓϦέʔγϣϯͨͪ
اۀ͚ͷίϯαϧɾ։ൃଟ࣮ࢪத
ΞʔΩςΫνϟΛߟ͑Δ
%"QQTΞʔΩςΫνϟͷλΠϓ ϑϩϯτ݁ܕ Ψεߦܕ ΧετσΟܕ Φʔφʔϑϧݖݶܕ
ϑϩϯτ݁ܕ .FUB.BTLͳͲͷϒϥβΥϨοτΛ༻͍ͯΫϥΠΞϯτଆ ͔ΒτϥϯβΫγϣϯΛൃߦ͠ɺαʔόʔଆॲཧΛඞཁͱ͠ͳ͍ λΠϓ Front Node Server DB Tx
Ψεߦܕ .FUB.BTLͳͲͷϒϥβΥϨοτΛ༻͍ͯΫϥΠΞϯτଆ Ͱॺ໊͠ɺτϥϯβΫγϣϯͷൃߦΛαʔόʔଆͰ࣮ߦ͢ΔλΠ ϓ Front Node Server DB 署名付 Tx
ΧετσΟܕ Ϣʔβʔͷݤอɺॺ໊ɺτϥϯβΫγϣϯͷൃߦΛશͯαʔ όʔଆͰ࣮ߦ͢ΔλΠϓ Front Node Server DB Tx
Φʔφʔϑϧݖݶܕ ϢʔβʔͷݤอͤͣɺΦʔφݖݶΛ࣋ͬͨΞυϨεΛ༻͍ͯ αʔόʔଆͰτϥϯβΫγϣϯͷൃߦΛ࣮ߦ͢ΔλΠϓ ˞ϢʔβʔͷΥϨοτΞυϨεͱΞΧϯτใͷඥ͚ΛαʔόʔଆͰ͓࣋ͬͯ͘έʔε͋Δ Front Node Server DB Tx PXOFS
VTFS
ͲͷΞʔΩςΫνϟʹ͢Δ͖͔ λʔήοτ͕ҰൠϢʔβʔͷ߹ɺΧετσΟܕPSΦʔφʔϑ ϧݖݶܕʹ͢Δ # ϚωʔδυαʔϏε͕͑ΔέʔεͰɺ,BMFJEPΛ͏ͷ͕Ұ൪ָ ݤཧτϥϯβΫγϣϯཤྺཧ͕ෆཁɺ"1*ͰίϯτϥΫτ͕ίʔϧͰ͖Δ ݤฆࣦ࣌ʹϦΧόϦʔͰ͖Δ%*%ͳͲΛಋೖͰ͖Δ߹ϑϩϯ τ݁ܕΨεߦܕ༗ޮ # ͨͩ͠ɺΞʔΩςΫνϟͱͯ͠ෳࡶʹͳΔ
৭ʑͳͭΒΈ
τϥϯβΫγϣϯཤྺͷཧ લఏ # αʔόʔαΠυͰτϥϯβΫγϣϯΛൃߦ͢Δ # ύϒϦοΫνΣʔϯ ͭΒΈͱରԠ # ϢʔβʔʹτϥϯβΫγϣϯ͕֬ఆͨ͠ͷ͔Ͳ͏͔௨͢ΔͨΊʹτ ϥϯβΫγϣϯͷཤྺͱεςʔλεΛ%#ʹอ࣋͢Δඞཁ͕͋ΔͨΊɺ
ఆظతʹτϥϯβΫγϣϯΛࢹ͢Δඞཁ͕͋Δɻ # ޮΛߟ͑ͯશτϥϯβΫγϣϯͷεςʔλεΛࢹͤͣΠϕϯτ ͷࢹΛߦ͏͜ͱ͕ଟ͍͕ɺXFCKTͷXFCTPDLFUͷίωΫγϣϯ ͨ·ʹΕΔ͠ɺରΠϕϯτ͕૿͑ΔͱΧΦεʹͳΓ͕ͪɻ
τϥϯβΫγϣϯཤྺͷཧ export class HogeService { : connect(): void { const
provider = new Web3.providers.WebsocketProvider(GETH.HOST); const reconnect = () => { const interval = this.isReconnection ? 1000 : 0; setTimeout(() => { this.isReconnection = true; this.connect(); this.observer.next(false); }, interval); }; provider.on("error", () => reconnect()); provider.on("end", () => reconnect()); provider.on("connect", () => { this.isReconnection = false; this.observer.next(true); }); this.web3 = new Web3(provider); } on(): Observable<any> { const observable = new Observable((observer: Subscriber<any>) => { this.observer = observer; return; }); return observable; } : } export class Hoge { : async run(): Promise<void> { this.hogeService.on().subscribe(async (isConnected: boolean) => { if (isConnected) { this.watchEvents(); this.fetchPastBlocks(); } }); this.web3Service.connect(); } : }
%#ͱετϨʔδͷ࿈ܞ લఏ # ύϒϦοΫνΣʔϯϓϥΠϕʔτνΣʔϯ ͭΒΈͱରԠ # ݕࡧҰཡςʔϒϧͷදࣔ࣌ͷརศੑ্ͷͨΊʹɺετϨʔδʹॻ ͖ࠐΜͩσʔλΛ%#ʹ࿈ܞ͢Δඞཁ͕͋Δɻ # %#ͷॻ͖ࠐΈΛτϥϯβΫγϣϯͷൃߦΛಉ࣌ʹ͢Δ߹ɺΤ
ϥʔϋϯυϦϯά͕͍͠ɻ # ΠϕϯτΛࢹͯ͠%#ʹॻ͖ࠐΉ߹ɺڞ௨ԽͰ͖ͳ͍ͱࢹର ͕૿͑ͯॲཧ͕ΧΦεʹͳΓ͕ͪɻͲ͏͠Α͏ͳ͍ɻ
(BT-JNJU લఏ # αʔόʔαΠυͰτϥϯβΫγϣϯΛൃߦ͢Δ # ύϒϦοΫνΣʔϯ ͭΒΈͱରԠ # 8FCKTͷFTUJNBUF(BTΛ༻͍ͯHBT-JNJUΛઃఆ͍͕ͨ͠ɺ࣮ࡍͷফ අHBTΛԼճͬͨΓɺ#MPDLͷHBT-JNJUΛ͑ͯΤϥʔΛు͍ͨΓͯ͠
҆ఆ͠ͳ͍͜ͱ͕ͨ·ʹ͋Δɻ # ݁ہ࣮ࡍͷফඅHBTʹগ͠ΛόοϑΝΛ࣋ͨͨ͠ݻఆͱ͢Δͷ͕҆ ఆͦ͠͏ɻͨͩফඅHBTΛࢉग़͢Δͷ͕໘ɻ
/PODF લఏ # αʔόʔαΠυͰτϥϯβΫγϣϯΛൃߦ͢Δ # ύϒϦοΫνΣʔϯϓϥΠϕʔτνΣʔϯ ͭΒΈͱରԠ # ͭͷϓϩηεͰෳͷίϯτϥΫτͷϝιουΛಉ࣌ʹ࣮ߦ͢Δ ߹ɺ/PODFΛਖ਼͘͠ΠϯΫϦϝϯτ͠ͳ͍ͱΤϥʔʹɻ
# ͨͩͭͣͭ͠ॲཧ͕ऴΘΔͷΛ͍ͬͯͯͱͯඇޮɻ # ಉ࣮࣌ߦ࣌ΠϯΫϦ͢ΔλΠϛϯάΛ͢Δඞཁ͕͋Δɻ
/PODF export class SampleService { : call(): void { const
provider = new Web3.providers.WebsocketProvider(GETH.HOST); : let nonce = await this.web3Service.getPendingTxCount(ADDRESS); const getNonce = () => { const rv = nonce; nonce += 1; return rv; }; await Promise.all([ this.web3Service.send( contract, ‘setFoo’, { foo: 'bar' }, getNonce() ), this.web3Service.send( contract, 'setHage’, { hage: true }, getNonce() ), ]); } : }
ίϯτϥΫτංେԽ લఏ # ύϒϦοΫνΣʔϯ ͭΒΈͱରԠ # &3$ɺͳͲΛࢀরΛ͢ΔΑ͏ͳίϯτϥΫτΛ࡞͢ Δ߹ɺ୯७ʹJNQPSU͢ΔͱJNQPSUͨ͠ίϯτϥΫταΠζ͕ංେ Խͯ͠͠·͏ɻ #
ΠϯλʔϑΣʔε͚ͩJNQPSUͯ͠ΠϯελϯεԽͯ͠͠·͑ղܾʂ
ίϯτϥΫτංେԽ pragma solidity ^0.5.0; : contract IERC20 { function balanceOf(address
address) public returns (uint256); } contract HogeContract { function balanceOf(address token, address holder) external { return IERC20(token).balanceOf(holder); } : }
ಈ࡞֬ೝਏ͗͢ લఏ # ͳ͠ ͭΒΈͱରԠ # ґଘ͢ΔίϯτϥΫτ͕૿͑Δͱɺ3FNJYͩͱಈ࡞͢Δঢ়ଶ͍࣋ͬͯ ͘ͷ͕େมɻ # ͞ΒʹίϯτϥΫτΛԿίʔϧ͍ͯ͠ΔͱϑϦʔζͯ͠ಈ͔ͳ͘
ͳΔ͜ͱɻɻ # ͦ͜Ͱ4PMJEJUZͦ͜ςετۦಈ։ൃɻςετΛॻ͍͔ͯΒಈ͘Α͏ʹί ϯτϥΫτΛमਖ਼͠Α͏ʂ
ಈ࡞֬ೝਏ͗͢ const FooMarket = artifacts.require('FooMarket'); const HogeToken = artifacts.require('HogeToken'); :
contract('FooMarket', function ([owner, alice]) { beforeEach(async function () { this.HodeToken = await HogeToken.new(); this.FooMarket = await FooMarket.new(this.HodeToken.address, { from: owner }); await this.FooMarket.setWhitelisted(owner, true, { from: owner }); await this.FooMarket.setWhitelisted(alice, true, { from: owner }); }); describe('transfer hoge token', function () { it('token balance should be changed', async function () { await this.HogeToken.mint(alice, 100, { from: owner }); assert(await this.FooMarket.transfer(alice, bob, 100, { from: owner })); const aliceBalance = await this.HogeToken.balanceOf(alice); const bobBalance = await this.HogeToken.balanceOf(bob); assert.equal(aliceBalance, 0); assert.equal(bobBalance, 100); }); }); : });
4PMJEJUZͷ͕ͤ͘ڧ͗͢ લఏ # ͳ͠ ͨͩͷͭΒΈ # جຊGPS͑ͳ͍ɻͦͷͨΊಾͷঢ়ଶΛཧ͢Δม͕૿͑ͯ͠· ͏͜ͱ͕ଟʑ͋Δɻ # ྻͷআͷ༷͕͍·͍ͪͰਏ͍ɻྻͷॱ൪͕୲อ͞Εͳ͍ಾͷ
ํ๏͕ඞཁʹͳΔͷͰɺ·ͨঢ়ଶΛཧ͢Δม͕૿͑ͯ͠·͏ɻ # ͦͯ͠TUBDLUPPEFFQɻɻɻ
4PMJEJUZͷ͕ͤ͘ڧ͗͢ contract Hoge { uint256[] private targetValues; mapping(uint256 => uint256)
private targetValuesIndex; mapping(uint256 => bool) private valueStatus; function add(uint256 _targetId) public { require(!exists(_targetId)); targetValuesIndex[_targetId] = targetValues.push(_targetId) - 1; valueStatus[_targetId] = true; } function remove(uint256 _targetId) public { require(exists(_targetId)); uint256 targetIndex = targetValuesIndex[_targetId]; uint256 lastIndex = targetValues.length - 1; uint256 lastTargetId = targetValues[lastIndex]; valueStatus[_targetId] = false; targetValues[targetIndex] = lastTargetId; targetValues.length--; targetValuesIndex[lastTargetId] = targetIndex; targetValuesIndex[_targetId] = 0; } function exists(uint256 _targetId) public view returns (bool) { return valueStatus[_targetId]; } }
݁ہҰ൪ͷղܾࡦ
ίϯτϥΫτΛॻ͔ͳ͍
!CJHB