บ่นโค้ดใน Smart Contract ของ Pancake Bunny

อันนี้จะบ่นสั้นๆ คือวันนี้อยากรู้ว่า Pancake Bunny มันพลาดตรงไหน แล้วเห็นโค้ดชุดนึงที่น่าพูดถึง

คือออกตัวก่อน เวลาเขียน Smart contract มันจะมีเรื่องค่า Gas ซึ่งมันมีผลให้การเขียนโค้ดแบบปกติอาจจะสิ้นเปลือง จุดนี้ผมยังไม่เข้าใจมาก และที่เขาเขียนมันอาจจะ…


This content originally appeared on DEV Community and was authored by Chakrit Likitkhajorn

อันนี้จะบ่นสั้นๆ คือวันนี้อยากรู้ว่า Pancake Bunny มันพลาดตรงไหน แล้วเห็นโค้ดชุดนึงที่น่าพูดถึง

คือออกตัวก่อน เวลาเขียน Smart contract มันจะมีเรื่องค่า Gas ซึ่งมันมีผลให้การเขียนโค้ดแบบปกติอาจจะสิ้นเปลือง จุดนี้ผมยังไม่เข้าใจมาก และที่เขาเขียนมันอาจจะดีที่สุดในโดเมน Smart Contract แล้วก็ได้นะครับ

แต่ถ้าเราเอามาเขียนในภาษาอื่นๆ ที่ไม่มีค่า Gas อย่าลอกเขามาทื่อๆ นะ

จากภาพนี้

Src

(ต้นทาง https://peckshield.medium.com/pancakebunny-incident-root-cause-analysis-7099f413cc9b)

ขอลอกส่วนนี้มา

if (IPancakePair(asset).token0() == WBNB) {
  valueInBNB = amount.mul(reserve0).mul(2).div(IPancakePair(asset).totalSupply());
  valueInUSD = valueInBNB.mul(priceOfBNB()).div(1e18);
} else if (IPancakePair(asset).token1() == WBNB) {
  valueInBNB = amount.mul(reserve1).mul(2).div(IPancakePair(asset).totalSupply());
  valueInUSD = valueInBNB.mul(priceOfBNB()).div(1e18);
}
// ต่อ ไม่ได้เอามาด้วย

จาก

valueInBNB = amount.mul(reserve0).mul(2).div(IPancakePair(asset).totalSupply());

// และ 

`valueInBNB = amount.mul(reserve1).mul(2).div(IPancakePair(asset).totalSupply());

สองบรรทัดนี้เหมือนกันเด๊ะๆ เลยแค่ใช้ reserve คนละตัว แล้วพอรวมกับ if token1() == WBNB ทำให้รู้ว่าจุดประสงค์ของโค้ดนี้คือมันต้องการจะเอา Reserve ของ WBNB มาใช้ในสูตร amount * reserve * 2 / totalSupply() นั่นแหละครับ

ดังนั้นการเขียนให้เจตนาตรงนี้เคลียร์กว่า ทำได้แบบนี้

uint reserveBNB
if (IPancakePair(asset).token0() == WBNB) {
  reserveBNB = reserve0
} else if (IPancakePair(asset).token1() == WBNB) {
  reserveBNB = reserve1
}

valueInBNB = amount.mul(reserveBNB).mul(2).div(IPancakePair(asset).totalSupply());

โค้ดชุดหลังมันทำให้อ่านปราดเดียวรู้เลยว่า มันมีสูตรคำนวนแค่สูตรเดียวนะ และสูตรต้องการค่า BNB ที่อยู่ใน Pool มาใช้งานนะ ต่างกับชุดแรกที่ต้องเพ่งนานมากกว่าจะรู้ว่า "อ้อ สูตรเหมือนกันนั่นแหละไม่มีอะไรหรอก แค่ต้องเลือก Reserve มาให้ถูกที่" ผมเพ่งหลายนาทีกว่าจะถึงบางอ้อ

ผมเดาว่าที่เขาไม่เขียนแบบนี้เพราะจริงๆ มันมี Condition ที่ 3 แล้วใน Solidity การเช็ค if ทุกครั้งมันมีค่า Gas ซึ่งผมไม่เชี่ยวชาญพอที่จะบอกได้ว่าโค้ดแบบนี้ในบริบทของ Solidity ดีหรือไม่ดี อาจจะดีสุดแล้วก็ได้พอเอาเรื่องความประหยัดเข้ามาร่วม

แต่อยากจะบอกโปรแกรมเมอร์ที่เขียนโปรแกรมทั่วๆ ไปว่า โค้ดแบบนี้จริงๆ อย่าลอกไปใช้ในภาษาที่ไม่ติดเรื่องค่า Gas นะครับ มันอ่านยากครับ


This content originally appeared on DEV Community and was authored by Chakrit Likitkhajorn


Print Share Comment Cite Upload Translate Updates
APA

Chakrit Likitkhajorn | Sciencx (2021-05-20T05:59:39+00:00) บ่นโค้ดใน Smart Contract ของ Pancake Bunny. Retrieved from https://www.scien.cx/2021/05/20/%e0%b8%9a%e0%b9%88%e0%b8%99%e0%b9%82%e0%b8%84%e0%b9%89%e0%b8%94%e0%b9%83%e0%b8%99-smart-contract-%e0%b8%82%e0%b8%ad%e0%b8%87-pancake-bunny/

MLA
" » บ่นโค้ดใน Smart Contract ของ Pancake Bunny." Chakrit Likitkhajorn | Sciencx - Thursday May 20, 2021, https://www.scien.cx/2021/05/20/%e0%b8%9a%e0%b9%88%e0%b8%99%e0%b9%82%e0%b8%84%e0%b9%89%e0%b8%94%e0%b9%83%e0%b8%99-smart-contract-%e0%b8%82%e0%b8%ad%e0%b8%87-pancake-bunny/
HARVARD
Chakrit Likitkhajorn | Sciencx Thursday May 20, 2021 » บ่นโค้ดใน Smart Contract ของ Pancake Bunny., viewed ,<https://www.scien.cx/2021/05/20/%e0%b8%9a%e0%b9%88%e0%b8%99%e0%b9%82%e0%b8%84%e0%b9%89%e0%b8%94%e0%b9%83%e0%b8%99-smart-contract-%e0%b8%82%e0%b8%ad%e0%b8%87-pancake-bunny/>
VANCOUVER
Chakrit Likitkhajorn | Sciencx - » บ่นโค้ดใน Smart Contract ของ Pancake Bunny. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2021/05/20/%e0%b8%9a%e0%b9%88%e0%b8%99%e0%b9%82%e0%b8%84%e0%b9%89%e0%b8%94%e0%b9%83%e0%b8%99-smart-contract-%e0%b8%82%e0%b8%ad%e0%b8%87-pancake-bunny/
CHICAGO
" » บ่นโค้ดใน Smart Contract ของ Pancake Bunny." Chakrit Likitkhajorn | Sciencx - Accessed . https://www.scien.cx/2021/05/20/%e0%b8%9a%e0%b9%88%e0%b8%99%e0%b9%82%e0%b8%84%e0%b9%89%e0%b8%94%e0%b9%83%e0%b8%99-smart-contract-%e0%b8%82%e0%b8%ad%e0%b8%87-pancake-bunny/
IEEE
" » บ่นโค้ดใน Smart Contract ของ Pancake Bunny." Chakrit Likitkhajorn | Sciencx [Online]. Available: https://www.scien.cx/2021/05/20/%e0%b8%9a%e0%b9%88%e0%b8%99%e0%b9%82%e0%b8%84%e0%b9%89%e0%b8%94%e0%b9%83%e0%b8%99-smart-contract-%e0%b8%82%e0%b8%ad%e0%b8%87-pancake-bunny/. [Accessed: ]
rf:citation
» บ่นโค้ดใน Smart Contract ของ Pancake Bunny | Chakrit Likitkhajorn | Sciencx | https://www.scien.cx/2021/05/20/%e0%b8%9a%e0%b9%88%e0%b8%99%e0%b9%82%e0%b8%84%e0%b9%89%e0%b8%94%e0%b9%83%e0%b8%99-smart-contract-%e0%b8%82%e0%b8%ad%e0%b8%87-pancake-bunny/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.