ซีรีย์ Web3 สำหรับผู้เริ่มต้น: เคล็ดลับการพัฒนาสัญญาที่ฉันได้เรียนรู้จากโค้ด Uniswap
เมื่อไม่นานนี้ ฉันได้เขียนบทช่วยสอนเกี่ยวกับการพัฒนาระบบแลกเปลี่ยนแบบกระจายอำนาจ https://github.com/WTFAcademy/WTF-Dapp โดยอ้างอิงถึงการนำโค้ดของ Uniswap V3 ไปใช้งานจริง และได้เรียนรู้ประเด็นความรู้มากมาย ฉันเคยพัฒนาสัญญา NFT ง่ายๆ มาก่อน และนี่เป็นครั้งแรกที่ฉันได้ลองพัฒนาสัญญา Defi ฉันเชื่อว่าเคล็ดลับเหล่านี้จะมีประโยชน์มากสำหรับมือใหม่ที่ต้องการเรียนรู้การพัฒนาสัญญา
ผู้พัฒนาสัญญาสามารถติดต่อโดยตรงได้ที่ https://github.com/WTFAcademy/WTF-Dapp เพื่อร่วมสร้างโค้ดและสร้างความแตกต่างให้กับ Web3~
ต่อไปเรามาดูเคล็ดลับเล็กๆ น้อยๆ เหล่านี้กันบ้าง ซึ่งบางอย่างอาจเรียกได้ว่าเป็นเคล็ดลับเสริมทักษะก็ได้
สามารถกำหนดที่อยู่สัญญาการใช้งานสัญญาได้อย่างชัดเจน
เมื่อเราปรับใช้สัญญา เรามักจะได้รับที่อยู่แบบสุ่ม เนื่องจากเกี่ยวข้องกับ nonce จึงยากที่จะคาดเดาที่อยู่สัญญา อย่างไรก็ตาม ใน Uniswap เรามีข้อกำหนดดังกล่าว: เราต้องอนุมานที่อยู่สัญญาผ่านคู่ธุรกรรมและข้อมูลที่เกี่ยวข้อง ซึ่งมีประโยชน์มากในหลายกรณี เช่น การกำหนดอำนาจธุรกรรมหรือการรับที่อยู่ของกลุ่ม
ใน Uniswap สัญญาจะถูกสร้างขึ้นโดยใช้โค้ดเช่น pool = address(new Uniswap V3 Pool{salt: keccak 256(abi.encode(token 0, token 1, fee))}());. โดยการเพิ่มเกลือเพื่อสร้างสัญญาโดยใช้ สร้าง 2 ( https://github.com/AmazingAng/WTF-Solidity/blob/main/25_Create2/readme.md ) ข้อดีคือที่อยู่สัญญาที่สร้างขึ้นนั้นสามารถคาดเดาได้ ตรรกะของการสร้างที่อยู่คือ ที่อยู่ใหม่ = แฮช (0x FF, ที่อยู่ของผู้สร้าง, เกลือ, รหัสเริ่มต้น)
คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในหลักสูตร WTF-DApp ที่ https://github.com/WTFAcademy/WTF-Dapp/blob/main/P103_Factory/readme.md .
ใช้ประโยชน์จากฟังก์ชั่นการโทรกลับให้ดี
ใน Solidity สัญญาสามารถเรียกซึ่งกันและกันได้ มีสถานการณ์ที่ A เรียก B ในวิธีการหนึ่ง และ B เรียกกลับ A ในวิธีการที่เรียก ซึ่งมีประโยชน์มากในบางสถานการณ์เช่นกัน
ใน Uniswap เมื่อคุณเรียกใช้เมธอด swap ของสัญญา Uniswap V3 Pool ระบบจะเรียก swapCallback กลับ และคอลแบ็กจะส่งผ่านในข้อมูลที่คำนวณ โทเค็น จำเป็นจริง ๆ สำหรับธุรกรรมนี้ ผู้เรียกต้องโอนโทเค็นที่จำเป็นสำหรับธุรกรรมไปยัง Uniswap V3 Pool ในคอลแบ็ก แทนที่จะแยกเมธอดสลับออกเป็นสองส่วนให้ผู้เรียกเรียก วิธีนี้ช่วยให้มั่นใจถึงความปลอดภัยของเมธอดสลับและช่วยให้มั่นใจว่าตรรกะทั้งหมดได้รับการดำเนินการอย่างสมบูรณ์โดยไม่ต้องใช้ระเบียนตัวแปรที่ยุ่งยากเพื่อรับประกันความปลอดภัย
ตัวอย่างโค้ดเป็นดังต่อไปนี้:
You can learn more about the trading part of the course ที่ https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md .
ใช้ข้อยกเว้นในการส่งข้อมูลและพยายามจับเพื่อนำการประมาณธุรกรรมไปใช้
เมื่ออ้างอิงถึงรหัส Uniswap เราพบว่าใน https://github.com/Uniswap/v3-periphery/blob/main/contracts/lens/Quoter.sol สัญญา วิธีการสลับของ Uniswap V3 Pool ถูกห่อไว้ใน try catch และดำเนินการ:
เหตุใดจึงเป็นเช่นนั้น เนื่องจากเราจำเป็นต้องจำลองวิธีการสลับเพื่อประมาณจำนวนโทเค็นที่จำเป็นสำหรับธุรกรรม แต่เนื่องจากการแลกเปลี่ยนโทเค็นจะไม่เกิดขึ้นจริงในระหว่างการประมาณ จึงต้องมีการรายงานข้อผิดพลาด ใน Uniswap วิธีการนี้จะแสดงข้อผิดพลาดพิเศษในฟังก์ชันการเรียกกลับของธุรกรรม จากนั้นจึงจับข้อผิดพลาดและวิเคราะห์ข้อมูลที่จำเป็นจากข้อความแสดงข้อผิดพลาด
ดูเหมือนเป็นการแฮ็ก แต่ก็ใช้งานได้จริงมาก ด้วยวิธีนี้ ไม่จำเป็นต้องปรับเปลี่ยนวิธีการสลับตามความต้องการของธุรกรรมที่ประเมินไว้ และตรรกะก็ง่ายกว่า ในหลักสูตรของเรา เรายังอ้างถึงตรรกะนี้เพื่อนำสัญญาไปใช้ https://github.com/WTFAcademy/WTF-Dapp/blob/main/demo-contract/contracts/wtfswap/SwapRouter.sol .
การใช้ตัวเลขขนาดใหญ่เพื่อแก้ปัญหาความแม่นยำ
มีตรรกะการคำนวณมากมายในโค้ด Uniswap เช่น การคำนวณโทเค็นที่แลกเปลี่ยนตามราคาและสภาพคล่องปัจจุบัน ในกระบวนการนี้ เราต้องหลีกเลี่ยงการสูญเสียความแม่นยำระหว่างการดำเนินการหาร ใน Uniswap กระบวนการคำนวณมักใช้
โค้ดมีดังต่อไปนี้ (คำนวณจำนวนโทเค็นที่จำเป็นสำหรับการทำธุรกรรมผ่านราคาและสภาพคล่อง):
อย่างที่คุณเห็น ก่อนอื่น ราคาใน Uniswap จะถูกคูณด้วยรากที่สองของ 2 ^ 96 (สอดคล้องกับ sqrtRatioAX 96 และ sqrtRatioBX 96 ในโค้ดด้านบน) จากนั้นสภาพคล่องจะถูกเลื่อนไปทางซ้ายเพื่อคำนวณตัวเศษ 1 ในการคำนวณต่อไปนี้ 2 ^ 96 จะถูกลบออกจากกระบวนการคำนวณเพื่อให้ได้ผลลัพธ์สุดท้าย
แน่นอนว่าไม่ว่าจะเกิดอะไรขึ้นก็ตาม ความแม่นยำก็ยังคงสูญเสียไปตามทฤษฎี แต่ในกรณีนี้ หน่วยที่เล็กที่สุดจะสูญหายไป ซึ่งก็ถือว่ายอมรับได้
หากต้องการข้อมูลเพิ่มเติมสามารถเรียนรู้ได้จากหลักสูตรนี้ ที่ https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md .
คำนวณรายได้โดยใช้การแบ่งปัน
ใน Uniswap เราจำเป็นต้องบันทึกรายได้ค่าธรรมเนียมของผู้ให้บริการสภาพคล่อง (LP) เห็นได้ชัดว่าเราไม่สามารถบันทึกค่าธรรมเนียมสำหรับ LP แต่ละรายการในแต่ละธุรกรรมได้ ซึ่งจะต้องใช้ก๊าซจำนวนมาก แล้วจะจัดการกับเรื่องนี้อย่างไร?
ใน Uniswap เราจะเห็นได้ว่าโครงสร้างดังต่อไปนี้ เด็ดขาดเน็ดอยู่ในตำแหน่ง:
ประกอบด้วย feeGrowthInside0LastX128 และ feeGrowthInside1LastX128 ซึ่งบันทึกค่าธรรมเนียมที่แต่ละสภาพคล่องควรจะได้รับเมื่อแต่ละตำแหน่ง (Position) ถอนค่าธรรมเนียมครั้งล่าสุด
พูดอย่างง่ายๆ ก็คือ ฉันเพียงแค่ต้องบันทึกค่าธรรมเนียมทั้งหมดและค่าธรรมเนียมที่ควรจัดสรรให้กับสภาพคล่องแต่ละรายการเท่านั้น เพื่อว่าเมื่อ LP ถอนค่าธรรมเนียม เขาจะสามารถคำนวณได้ว่าเขาจะถอนค่าธรรมเนียมได้เท่าไรตามสภาพคล่องในมือของเขา เหมือนกับว่าคุณถือหุ้นของบริษัท เมื่อคุณต้องการถอนรายได้จากหุ้น คุณจำเป็นต้องทราบเฉพาะรายได้ต่อหุ้นของบริษัทในอดีตและรายได้ที่คุณถอนออกครั้งล่าสุดเท่านั้น
ก่อนหน้านี้เราได้แนะนำวิธีการคำนวณกำไร stETH ในบทความแล้ว การออกแบบสัญญาที่ชาญฉลาด ลองดูว่า stETH แจกจ่ายผลกำไรโดยอัตโนมัติทุกวันได้อย่างไร ให้ ETH ของคุณเข้าร่วมในการเดิมพันเพื่อรับผลประโยชน์ที่มั่นคง และมีหลักการคล้ายๆ กัน
ไม่จำเป็นต้องรับข้อมูลทั้งหมดจากเครือข่าย
การจัดเก็บข้อมูลแบบออนเชนนั้นมีราคาค่อนข้างแพง ดังนั้นเราจึงไม่จำเป็นต้องจัดเก็บข้อมูลทั้งหมดแบบออนเชนหรือรับข้อมูลเหล่านั้นจากเชน ตัวอย่างเช่น อินเทอร์เฟซจำนวนมากที่เรียกใช้โดยเว็บไซต์ฟรอนต์เอนด์ของ Uniswap นั้นเป็นอินเทอร์เฟซ Web2 แบบดั้งเดิม
รายการของกลุ่มธุรกรรม ข้อมูลเกี่ยวกับกลุ่มธุรกรรม ฯลฯ สามารถจัดเก็บในฐานข้อมูลทั่วไปได้ บางส่วนอาจต้องซิงโครไนซ์จากเชนเป็นประจำ แต่เราไม่จำเป็นต้องเรียกใช้อินเทอร์เฟซ RPC ที่จัดเตรียมโดยเชนหรือบริการโหนดแบบเรียลไทม์เพื่อรับข้อมูลที่เกี่ยวข้อง
แน่นอนว่าซัพพลายเออร์บล็อคเชน PRC จำนวนมากในปัจจุบันมีอินเทอร์เฟซขั้นสูงบางอย่าง คุณสามารถรับข้อมูลบางอย่างได้เร็วกว่าและถูกกว่า ซึ่งก็คล้ายกัน ตัวอย่างเช่น ZAN มีอินเทอร์เฟซที่คล้ายกับการรับ NFT ทั้งหมดภายใต้ผู้ใช้บางคน ข้อมูลนี้สามารถแคชได้เพื่อปรับปรุงประสิทธิภาพและประสิทธิผล คุณสามารถเยี่ยมชม https://zan.top/service/advance-api เพื่อให้ได้เพิ่มมากขึ้น
แน่นอนว่าธุรกรรมสำคัญจะต้องดำเนินการแบบออนไลน์
เรียนรู้วิธีการแยกสัญญาและใช้สัญญาแบบมาตรฐานที่มีอยู่ เช่น ERC 721
โปรเจ็กต์หนึ่งๆ อาจประกอบด้วยสัญญาที่นำไปใช้จริงหลายฉบับ แม้ว่าจะมีสัญญาที่นำไปใช้จริงเพียงฉบับเดียว โค้ดของเราสามารถแบ่งสัญญาออกเป็นสัญญาหลายฉบับสำหรับการบำรุงรักษาผ่านการสืบทอด
ตัวอย่างเช่นใน Uniswap https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol สัญญาได้รับการสืบทอดจากสัญญาต่างๆ มากมาย และโค้ดก็เป็นดังนี้:
เมื่อคุณดูการใช้งานสัญญาอนุญาต ERC 721 คุณจะพบว่ามีการใช้สัญญา @openzeppelin/contracts/token/ERC 721/ERC 721.sol โดยตรง ซึ่งทำให้สะดวกต่อการจัดการตำแหน่งผ่าน NFT และในทางกลับกัน ยังสามารถใช้สัญญามาตรฐานที่มีอยู่เพื่อปรับปรุงประสิทธิภาพในการพัฒนาสัญญาได้อีกด้วย
ในหลักสูตรของเราคุณสามารถเรียนรู้ https://github.com/WTFAcademy/WTF-Dapp/blob/main/P 108 _ผู้จัดการตำแหน่ง /readme.md และพยายามพัฒนาสัญญา ERC 721 ที่เรียบง่ายเพื่อจัดการตำแหน่ง
สรุป
ไม่ว่าคุณจะอ่านบทความมากเพียงใด การพัฒนามันขึ้นมาเองนั้นไม่สามารถทำได้จริง ในกระบวนการพยายามนำเวอร์ชันที่เรียบง่ายของการแลกเปลี่ยนแบบกระจายอำนาจมาใช้เอง คุณจะมีความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับการนำโค้ด Uniswap ไปใช้งานและเรียนรู้จุดความรู้เพิ่มเติมที่คุณจะได้รับจากโครงการจริง
หลักสูตร WTF-DApp เป็นหลักสูตรโอเพ่นซอร์สที่จัดทำร่วมกันโดยชุมชนนักพัฒนา ZAN และชุมชนนักพัฒนา WTF Academy หากคุณสนใจในการพัฒนาโครงการ Web3 และ Defi คุณสามารถอ้างอิงหลักสูตรภาคปฏิบัติของเราได้ https://github.com/WTFAcademy/WTF-Dapp และทำตามขั้นตอนการแลกเปลี่ยนแบบง่ายๆ เชื่อว่าจะช่วยคุณได้แน่นอน~
บทความนี้เขียนโดย Fisher (บัญชี X @หยูเต้า 1024 ) ของทีม ZAN (บัญชี X @zan_team ).
บทความนี้มีที่มาจากอินเทอร์เน็ต: Web3 Beginner Series: เคล็ดลับการพัฒนาสัญญาที่ฉันเรียนรู้จากรหัส Uniswap
ที่เกี่ยวข้อง: การค้นหาอัญมณี 100x ถัดไป: วิธีสร้างรายได้จาก Pump.fun ด้วย ChatGPT
ผู้เขียนดั้งเดิม: CMed หมายเหตุบรรณาธิการ: ในตลาด Pump มีการเปิดตัวโทเค็นใหม่ทุกขณะ ในขณะที่คนอื่น ๆ ในตลาดยังคงค้นหาเข็มในมัดหญ้าเพื่อค้นหา memecoin ที่สามารถสร้างผลตอบแทนส่วนเกินได้ @AlphaBatcher ได้ใช้ Chatgpt เพื่อทำการซื้อขายที่แม่นยำโดยอัตโนมัติแล้ว วิธีการนี้ไม่ต้องการเงินทุนจำนวนมากหรือทักษะการเขียนโปรแกรมที่แข็งแกร่ง เราสามารถใช้ AI เพื่อเพิ่มศักยภาพในการลงทุน memecoin ของเราได้ ต่อไปนี้คือข้อความต้นฉบับ (เพื่อให้อ่านและเข้าใจง่ายขึ้น เนื้อหาต้นฉบับถูกลบและจัดระเบียบใหม่): ฉันเพิ่งสร้าง $2300 ใน 1 นาทีโดยใช้ ChatGPT และ PumpFun ในขณะที่คนอื่น ๆ ยังคงมองหาโอกาสใน memecoins ฉันได้ทำการซื้อขายที่แม่นยำโดยอัตโนมัติแล้ว คุณเพียงแค่ต้องการ 0.2 SOL เพื่อเริ่มต้น และไม่มีทักษะการเขียนโปรแกรมใด ๆ ...