มาลองอ่าน code OpenZeppelin’s PaymentSplitter กัน

Nattawat Songsom
3 min readNov 15, 2021

--

วันนี้เราจะมาลองอ่าน PaymentSplitter กัน ตาม link

เราจะไม่แก้ code ต้นฉบับเลย ดังนั้นจะได้ scenario ดังนี้

นาย A และนาย B เป็นหุ้นส่วนเปิดร้านกาแฟด้วยกันในอัตราส่วน 6 : 4 โดยทั้งคู่ต้องการ smart contract ในการรวบรวมกำไร (เป็นเงินสกุล eth) จากการเปิดร้านเอาไว้เป็นกองเดียว โดยการถอนจะถอนกำไรทั้งหมดของตัวเองทีเดียวเลย เช่นตอนนี้มีกำไร 100 a ต้องถอนได้ 60 เลย ไม่สามารถถอนออกมา 30 ได้

note จะใช้คำว่า a และ b แทน address ไปเลย เพื่อความเข้าใจง่าย

มาเริ่มจากการ deploy กัน ตัวแปรใน storage จะเปลี่ยนไปตามภาพ

ตอนนี้เราจะเก็บ address ของ payee แต่ละคน รวมถึงจำนวนหุ้นส่วนที่ payee คนนั้นมี และ จำนวนหุ้นของทุกคนรวมกัน ได้ละ โดยใช้ code ตามนี้

contructor
บันทึก address และจำนวนหุ้น อัพเดทจำนวนหุ้นทั้งหมดในระบบ

เมื่อยังไม่มีใครถอนเงินจาก smart contract ทำให้ storage มีค่าดั้งเดิมตามนี้

ต่อมา โอนกำไรจากร้านกาแฟ มาใน smart contract เป็นจำนวน 100 eth

โดยใช้ code ฟังชันก์ receive

จะได้ balance เป็น 100

ต่อมานาย a ต้องการถอนเงินทั้งหมดของตนออกจาก smart contract จะเกิด process ดังนี้

โดยตัวแปรใน storage จะเปลี่ยนไปตามนี้

ต่อมามีกำไรจากร้านกาแฟเข้ามาอีก 100

… a ต้องการถอนเงินอีก จะได้ process ตามนี้

โดยใน storage ค่าจะเปลี่ยนไปตามนี้

จะเห็นได้ว่า เงินทั้งหมดที่เคยโอนเข้ามาใน smart contract = 100 + 100 = 200

เป็นของ a = 200 * 6 / 10 = 120

และเป็นของ b =200 * 4 / 10 = 80

ซึ่ง 80 ของ b ยังอยู่ใน smart contract ครบ เพราะ b ยังไม่ได้ถอนเลยนั่นเอง

… โอเค code ที่ใช้จะเป็นตามนี้

release
pendingRequest

โอเค จริงๆมี code ที่ใช้ในการโอนเงินสกุลอื่นที่ไม่ใช่ eth ด้วย ไว้มาดูกันอีกทีละกัน

--

--

No responses yet