1 bug. 10 years ago. 3.6 million ETH stolen.
That was The DAO hack. June 2016.
And the bug had already been identified before the attack happened.
I am 24% done with the @CyfrinUpdraft Smart contract Security course and @ethereum history is unraveling.
May is almost done.
46% into the @cyfrinupdraft Smart Contract Security course.
Started the month at 24%. Slow? Maybe.
But every percent is a concept that will protect real money. Here is what I learned this month
New month 😎. New opportunities. 🚀
Starting June with an exciting challenge: joining @iCog_Labs as an AI Intern on the Hyperion MOSES Team.
Time to learn, build, experiment, and get deep into Symbolic AI, MeTTa, and Hyperon.
Let's see where this journey leads.
1 bug. 10 years ago. 3.6 million ETH stolen.
That was The DAO hack. June 2016.
And the bug had already been identified before the attack happened.
I am 24% done with the @CyfrinUpdraft Smart contract Security course and @ethereum history is unraveling.
1 bug. 10 years ago. 3.6 million ETH stolen.
That was The DAO hack. June 2016.
And the bug had already been identified before the attack happened.
I am 24% done with the @CyfrinUpdraft Smart contract Security course and @ethereum history is unraveling.
May is almost done.
46% into the @cyfrinupdraft Smart Contract Security course.
Started the month at 24%. Slow? Maybe.
But every percent is a concept that will protect real money. Here is what I learned this month
3. I had a big audit mindset shift:
I stop asking "does this function work?" and started asking "what assumptions break when the components interact?"
The "two rights make a wrong" lesson.
Component A and Component B works perfectly separate. Together they create a vulnerability.
The Sushi batch() vulnerability showed how dangerous this gets.
Imagine buying unlimited coffee for the price of one.
ETH sent: 1
ETH credited: 3
delegatecall preserved msg.value across every call. Same ETH counted three times.
2. There is delegatecall.
Normal call creates a new execution context.
delegatecall preserves the caller's context, i.e the msg.sender, msg.value, storage all stay the same.
Think of it as: run another contract's function without leaving your own house.
Every input is either user controlled or validator influenced.
The Meebits exploit proved it.
Larva Labs used on-chain randomness to assign rare NFTs.
An attacker figured out the pattern:
Mint → check rarity → bad rarity? → revert() → retry