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
Stack Too Deepを攻略する
Search
Tomo
November 29, 2019
Programming
65
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Stack Too Deepを攻略する
2019/11/29
blockchain.tokyo#23 登壇資料
Tomo
November 29, 2019
Other Decks in Programming
See All in Programming
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
160
Jetpack Compose Mechanisms
skydoves
3
820
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
410
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
ActionController meets Protocol Buffers
sorah
0
520
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
420
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
290
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
AmebaブログはKMPから卒業します
kmars0605
0
180
Kotlinの15年とServer-Side Kotlin
n_takehata
1
150
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Evolving SEO for Evolving Search Engines
ryanjones
0
330
Utilizing Notion as your number one productivity tool
mfonobong
4
620
Producing Creativity
orderedlist
PRO
348
41k
HDC tutorial
michielstock
2
960
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
620
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Skip the Path - Find Your Career Trail
mkilby
1
260
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
Transcript
Stack too Deepを 攻略する Tomoaki Blockchain.Tokyo#23
自己紹介 早稲田ブロックチェーン研究開発団体Bitbears(代表) LayerX (エンジニア) Tomoaki @tapioca_pudd 所属: 趣味: スポーツ全般 (野球、フットサル)
最近はサウナにハマっています
問題 下のコントラクトを実行するとどうなるでしょう https://medium.com/coinmonks/stack-too-deep-error-in-solidity-608d1bd6a1ea
ちーん
visibilityをprivateにしてみる private
visibilityをprivateにしてみる private Compiled Successfully
あ、でも直接 呼べなくなった (笑)
よーし、 別の関数から 呼ぶゾ!
別のfunctionから呼んでみる
別のfunctionから呼んでみる Stack too Deep
問題を整理します
satck too deepは関数が引数を多く持ちすぎた 時 ”など” に起きるエラー
Stack too deepはどんな時に起きるのか
なぜこんなエラーが起きるのか? https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf そもそもEthereum Virtual Machineにはdataを保存できる場所は3つがあります。
EVMの全体像 https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
今回注目するのはStack https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf 右図のようにEVMのStackは256ビットの elementを1024個持っており、operationsと やりとりできるのはstackの上から16個の elementまでに限られています。 したがって、16番目より下のelementを参照 する処理を実行しようとするとリーチできる " 深さ"を超えることになり"stack too
deep"エ ラーとなる、というからくりです。 Stackの限界
https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf 右図のようにEVMのStackは256ビットの elementを1024個持っており、operationsと やりとりできるのはstackの上から16個の elementまでに限られています。 したがって、16番目より下のelementを参照 する処理を実行しようとするとリーチできる " 深さ"を超えることになり"stack too
deep"エ ラーとなる、というからくりです。 Stackの限界 操作可能 領域 17番目にアクセス
https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf 右図のようにEVMのStackは256ビットの elementを1024個持っており、operationsと やりとりできるのはstackの上から16個の elementまでに限られています。 したがって、16番目より下のelementを参照 する処理を実行しようとするとリーチできる " 深さ"を超えることになり"stack too
deep"エ ラーとなる、というからくりです。 Stackの限界 16 17番目にアクセス Stack too Deep
Stackの中を覗く Stackの操作はopcodeによって行われます。 https://ethereum.github.io/yellowpaper/paper.pdf
アヤシイ処理を探す アヤシイ処理①: DUPn アヤシイ処理②: SWAPn n番目のstackのアイテムを複製して 0番目の stackにpushする n番目のstackのアイテムと0番目のstackのアイ テムを入れ替える
実際にopcodeを見てみる こちらのコントラクトをコンパイルする https://medium.com/coinmonks/stack-too-deep-error-in-solidity-608d1bd6a1ea
実際にopcodeを見てみる こちらのコントラクトをコンパイルする https://medium.com/coinmonks/stack-too-deep-error-in-solidity-608d1bd6a1ea
実際にopcodeを見てみる こちらのコントラクトをコンパイルする https://medium.com/coinmonks/stack-too-deep-error-in-solidity-608d1bd6a1ea 1 Stack too Deep
実際にopcodeを見てみる "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO
PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xE898288F EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x200 DUP2 LT ISZERO PUSH2 0x47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF5 JUMP JUMPDEST STOP JUMPDEST PUSH32 0xFCF771399D75A67A6D0E730AE98D34C40B6BFE6EBF8053B98DDF4DA8C2706250 DUP16 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP INVALID LOG2 PUSH6 0x627A7A723158 KECCAK256 0xd0 MSIZE 0xf8 LOG1 JUMPI 0xd7 0xde SWAP12 PUSH21 0xD49F18B31A9480E20D14DCB2889E4522875FF6A451 PUSH32 0x2564736F6C634300050B00320000000000000000000000000000000000000000 ",
実際にopcodeを見てみる "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO
PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xE898288F EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x200 DUP2 LT ISZERO PUSH2 0x47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF5 JUMP JUMPDEST STOP JUMPDEST PUSH32 0xFCF771399D75A67A6D0E730AE98D34C40B6BFE6EBF8053B98DDF4DA8C2706250 DUP16 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP INVALID LOG2 PUSH6 0x627A7A723158 KECCAK256 0xd0 MSIZE 0xf8 LOG1 JUMPI 0xd7 0xde SWAP12 PUSH21 0xD49F18B31A9480E20D14DCB2889E4522875FF6A451 PUSH32 0x2564736F6C634300050B00320000000000000000000000000000000000000000 ", DUP16を発見
debuggerを見てみる (DUP16実行時) DUP16
debuggerを見てみる (DUP16実行時) DUP16 引数 event ターゲット
satck too deepを防ぐためにはDUP16とSWAP16 以内の処理で実装する 知見
じゃあ、 どうすればいいの (笑)
ケースバイケースなので 一般解は特にない
関数の引数を多くとりたい時 解決策 1) 引数をstructにする 2) 関数を分割する 3) 引数をエンコードする
関数の引数を多くとりたい時 解決策 1) 引数をstructにする 2) 関数を分割する 3) 引数をエンコードする
関数分割 (Atomic性を保つversion) 関数A 関数B mapping 完了event発火 1つ目の関数をで作成したデータを一旦マッピングでセーブして次の関数 でデータの作成の続きを行う。
引数エンコード コントラクト オフチェーン abi.encoderで エンコード abi.encoderで デコード バイト列 web3.js ethers.js
変数などのvisibilityをprivateにするといいこと があるかも Zombiee[] public zombiees; struct structの持てるプロパティが12個(くらい)
変数などのvisibilityをprivateにするといいこと があるかも Zombiee[] private zombiees; struct structがプロパティを無限に(たくさん)取れるようになった
最後に 皆さんに クリスマスプレゼントです
拍手!!!!!
今からめっちゃ情報量の多いゾンビ を作ります struct Zombiee { //プロパティは18個 uint256 id; string firstName;
string middleName; string lastName; string favoriteFood; string placeOfBirth; string job; string nickName; uint256 age; uint256 height; uint256 weight; uint256 BMI; uint256 bloodPressure; uint256 footSize; uint256 motherAge; uint256 fatherAge; uint256 favoriteNumber; bool married; }
しかし、stack too deepエラー が現れた!! 君の力を貸してくれ!!
問題 以下のコントラクトのエラーを修正せよ tomo25 STD_Quiz/contracts/STD_Quiz_3.sol
WE ARE HIRING !!!