โปรแกรมพันธมิตรแบบกระจายอำนาจบนบล็อกเชน Waves ดำเนินการโดยเป็นส่วนหนึ่งของทุน Waves Labs โดยทีมงาน Bettex
โพสนี้ไม่ใช่การโฆษณา! โปรแกรมนี้เป็นโอเพ่นซอร์ส การใช้งานและการแจกจ่ายฟรี การใช้โปรแกรมช่วยกระตุ้นการพัฒนาแอปพลิเคชัน dApp และโดยทั่วไปจะส่งเสริมการกระจายอำนาจ ซึ่งเป็นประโยชน์ต่อผู้ใช้อินเทอร์เน็ตทุกคน
dApp สำหรับโปรแกรมพันธมิตรที่นำเสนอเป็นเทมเพลตสำหรับโครงการที่มีพันธมิตรเป็นส่วนหนึ่งของฟังก์ชันการทำงาน โค้ดนี้สามารถใช้เป็นเทมเพลตสำหรับการคัดลอก เป็นไลบรารี หรือเป็นชุดแนวคิดสำหรับการนำไปใช้ทางเทคนิค
ในแง่ของฟังก์ชันการทำงาน นี่คือระบบพันธมิตรปกติที่ใช้การลงทะเบียนกับผู้อ้างอิง การสะสมรางวัลหลายระดับสำหรับการอ้างอิง และแรงจูงใจในการลงทะเบียนในระบบ (เงินคืน) ระบบนี้เป็น dApp ที่ "บริสุทธิ์" กล่าวคือ เว็บแอปพลิเคชันโต้ตอบโดยตรงกับบล็อกเชน โดยไม่ต้องมีแบ็กเอนด์ ฐานข้อมูล ฯลฯ
เทคนิคที่ใช้ซึ่งมีประโยชน์ในโครงการอื่นๆ อีกมากมาย:
- การเรียกบัญชีอัจฉริยะให้เป็นหนี้พร้อมการชำระคืนทันที (ในขณะที่โทรไม่มีโทเค็นในบัญชีเพื่อชำระค่าโทร แต่ปรากฏอยู่ที่นั่นอันเป็นผลมาจากการโทร)
- PoW-captcha - การป้องกันการโทรอัตโนมัติความถี่สูงไปยังฟังก์ชั่นบัญชีอัจฉริยะ - คล้ายกับ captcha แต่ผ่านการพิสูจน์การใช้ทรัพยากรการคำนวณ
- ค้นหาคีย์ข้อมูลโดยใช้เทมเพลต
ใบสมัครประกอบด้วย:
- รหัสบัญชีอัจฉริยะในภาษา ride4dapps (ซึ่งตามที่วางแผนไว้ จะรวมเข้ากับบัญชีอัจฉริยะหลักที่จำเป็นต้องใช้ฟังก์ชันการทำงานของพันธมิตร)
- wrapper.js ที่ใช้ระดับนามธรรมเหนือ WAVES NODE REST API
- โค้ดบนเฟรมเวิร์ก vuejs ซึ่งเป็นตัวอย่างการใช้ไลบรารีและโค้ด RIDE
ให้เราอธิบายคุณสมบัติทั้งหมดที่ระบุไว้
เรียกบัญชีอัจฉริยะสำหรับหนี้พร้อมชำระคืนทันที
การโทร InvokeScript ต้องชำระค่าธรรมเนียมจากบัญชีที่เริ่มการทำธุรกรรม นี่ไม่ใช่ปัญหาหากคุณกำลังสร้างโปรเจ็กต์สำหรับผู้ที่ชื่นชอบบล็อกเชนซึ่งมีโทเค็น WAVES จำนวนหนึ่งในบัญชีของพวกเขา แต่หากผลิตภัณฑ์นี้มุ่งเป้าไปที่การใช้งานโดยบุคคลทั่วไป นี่จะกลายเป็นปัญหาร้ายแรง ท้ายที่สุดแล้ว ผู้ใช้จะต้องดูแลการซื้อโทเค็น WAVES (หรือสินทรัพย์อื่นที่เหมาะสมที่สามารถใช้เพื่อชำระค่าธุรกรรม) ซึ่งจะเพิ่มอุปสรรคสำคัญในการเข้าสู่โครงการ เราสามารถแจกจ่ายสินทรัพย์ให้กับผู้ใช้ที่สามารถชำระเงินสำหรับการทำธุรกรรมและเผชิญกับความเสี่ยงในการใช้งานในทางที่ผิดเมื่อมีการสร้างระบบอัตโนมัติเพื่อสูบสินทรัพย์สภาพคล่องออกจากระบบของเรา
จะสะดวกมากหากเป็นไปได้ที่จะเรียก InvokeScript "โดยเสียค่าใช้จ่ายของผู้รับ" (บัญชีอัจฉริยะที่ติดตั้งสคริปต์) และมีความเป็นไปได้ดังกล่าวแม้ว่าจะไม่ชัดเจนก็ตาม
หากภายใน InvokeScript คุณสร้าง ScriptTransfer ไปยังที่อยู่ของผู้โทร ซึ่งจะชดเชยโทเค็นค่าธรรมเนียมที่ใช้ไป การโทรดังกล่าวจะสำเร็จ แม้ว่าในเวลาของการโทรจะไม่มีทรัพย์สินในบัญชีการโทรก็ตาม สิ่งนี้เป็นไปได้เนื่องจากการตรวจสอบโทเค็นที่เพียงพอจะดำเนินการหลังจากการเรียกธุรกรรม แทนที่จะตรวจสอบก่อนหน้า เพื่อให้สามารถทำธุรกรรมด้วยเครดิต โดยต้องชำระคืนทันที
ScriptTransfer (i.caller, i.fee, หน่วย)
รหัสด้านล่างจะคืนค่าธรรมเนียมที่ใช้ไปโดยใช้กองทุนบัญชีอัจฉริยะ เพื่อป้องกันการใช้ฟีเจอร์นี้ในทางที่ผิด จำเป็นต้องใช้เช็คว่าผู้โทรชำระค่าธรรมเนียมในสินทรัพย์ที่ต้องการและอยู่ภายในขอบเขตที่เหมาะสม:
func checkFee(i:Invocation) = {
if i.fee > maxFee then throw(“unreasonable large fee”) else
if i.feeAssetId != unit then throw(“fee must be in WAVES”) else true
}
นอกจากนี้ เพื่อป้องกันการสิ้นเปลืองเงินทุนอย่างมุ่งร้ายและไร้สติ จึงจำเป็นต้องมีการป้องกันการโทรอัตโนมัติ (PoW-captcha)
PoW-แคปต์ชา
แนวคิดของ captcha แบบพิสูจน์การทำงานไม่ใช่เรื่องใหม่และมีการใช้งานแล้วในโครงการต่าง ๆ รวมถึงที่ดำเนินการบนพื้นฐานของ WAVES แนวคิดก็คือ ในการดำเนินการที่ใช้ทรัพยากรของโครงการของเรา ผู้เรียกจะต้องใช้ทรัพยากรของตนเองด้วย ซึ่งทำให้การโจมตีที่ทำให้ทรัพยากรหมดสิ้นมีราคาค่อนข้างแพง เพื่อการตรวจสอบที่ง่ายและต้นทุนต่ำว่าผู้ส่งธุรกรรมได้แก้ไขปัญหา PoW แล้ว จะมีการตรวจสอบรหัสธุรกรรม:
ถ้าใช้ (toBase58String(i.transactionId), 3) != “123” แล้วโยน (“หลักฐานการทำงานล้มเหลว”) อย่างอื่น
ในการทำธุรกรรม ผู้เรียกจะต้องเลือกพารามิเตอร์ดังกล่าวเพื่อให้รหัส base58 (id) ขึ้นต้นด้วยตัวเลข 123 ซึ่งสอดคล้องกับเวลาประมวลผลโดยเฉลี่ยสองสามสิบวินาทีและโดยทั่วไปก็สมเหตุสมผลสำหรับงานของเรา หากต้องการ PoW ที่ง่ายกว่าหรือซับซ้อนกว่านั้น ก็สามารถแก้ไขงานได้อย่างง่ายดายในลักษณะที่ชัดเจน
ค้นหาคีย์ข้อมูลโดยใช้เทมเพลต
ในการใช้บล็อกเชนเป็นฐานข้อมูล จำเป็นอย่างยิ่งที่จะต้องมีเครื่องมือ API สำหรับการสืบค้นฐานข้อมูลในรูปแบบคีย์-วาลตามเทมเพลต ชุดเครื่องมือดังกล่าวปรากฏเมื่อต้นเดือนกรกฎาคม 2019 ในรูปแบบของพารามิเตอร์ ?ตรงกัน ตามคำขอ REST API /addresses/data?matches=regexp. ตอนนี้ หากเราต้องการรับคีย์มากกว่าหนึ่งคีย์จากเว็บแอปพลิเคชันและไม่ใช่คีย์ทั้งหมดพร้อมกัน แต่เพียงบางกลุ่ม เราก็สามารถเลือกตามชื่อคีย์ได้ ตัวอย่างเช่น ในโครงการนี้ ธุรกรรมการถอนเงินจะถูกเข้ารหัสเป็น
withdraw_${userAddress}_${txid}
ซึ่งช่วยให้คุณได้รับรายการธุรกรรมสำหรับการถอนเงินสำหรับที่อยู่ที่ระบุโดยใช้เทมเพลต:
?matches=withdraw_${userAddress}_.*
ตอนนี้เรามาดูส่วนประกอบของโซลูชันที่เสร็จสมบูรณ์แล้ว
รหัส Vuejs
รหัสเป็นการสาธิตการทำงานที่ใกล้เคียงกับโครงการจริง ใช้การเข้าสู่ระบบผ่าน Waves Keeper และทำงานร่วมกับไลบรารีของaffiliate.js ซึ่งจะลงทะเบียนผู้ใช้ในระบบ ค้นหาข้อมูลธุรกรรม และยังช่วยให้คุณสามารถถอนเงินที่ได้รับไปยังบัญชีของผู้ใช้ได้
รหัสสำหรับ RIDE
ประกอบด้วยฟังก์ชั่นการลงทะเบียน กองทุน และถอนเงิน
ฟังก์ชั่น register จะลงทะเบียนผู้ใช้ในระบบ มีพารามิเตอร์สองตัว: ผู้อ้างอิง (ที่อยู่ผู้อ้างอิง) และพารามิเตอร์เกลือ ซึ่งไม่ได้ใช้ในโค้ดฟังก์ชัน ซึ่งจำเป็นสำหรับการเลือกรหัสธุรกรรม (งาน PoW-captcha)
ฟังก์ชัน (เช่นเดียวกับฟังก์ชันอื่นๆ จากโปรเจ็กต์นี้) ใช้เทคนิคการเรียกหนี้ ผลลัพธ์ของฟังก์ชันคือเพื่อเป็นเงินทุนในการชำระค่าธรรมเนียมในการเรียกใช้ฟังก์ชันนี้ ต้องขอบคุณโซลูชันนี้ ผู้ใช้ที่เพิ่งสร้างกระเป๋าเงินสามารถทำงานกับระบบได้ทันที และไม่ต้องกังวลกับการซื้อหรือรับสินทรัพย์ที่อนุญาตให้เขาชำระค่าธรรมเนียมการทำธุรกรรม
ผลลัพธ์ของฟังก์ชันการลงทะเบียนคือสองระเบียน:
${owner)_referer = referer
${referer}_referral_${owner} = owner
ซึ่งช่วยให้สามารถค้นหาไปข้างหน้าและย้อนกลับได้ (ผู้อ้างอิงของผู้ใช้ที่กำหนดและการอ้างอิงทั้งหมดของผู้ใช้ที่กำหนด)
ฟังก์ชั่นกองทุนเป็นมากกว่าแม่แบบสำหรับการพัฒนาฟังก์ชั่นการใช้งานจริง ในรูปแบบที่นำเสนอ จะนำเงินทั้งหมดที่โอนโดยการทำธุรกรรมและกระจายไปยังบัญชีของผู้อ้างอิงระดับ 1, 2, 3 ไปยังบัญชี “คืนเงิน” และบัญชี “การเปลี่ยนแปลง” (ทุกสิ่งที่เหลืออยู่เมื่อแจกจ่ายไปยังบัญชีก่อนหน้า บัญชีอยู่ที่นี่)
เงินคืนเป็นวิธีการจูงใจผู้ใช้ให้เข้าร่วมในระบบการอ้างอิง ผู้ใช้สามารถถอนส่วนหนึ่งของค่าคอมมิชชันที่จ่ายโดยระบบในรูปแบบของ “เงินคืน” เช่นเดียวกับรางวัลสำหรับการอ้างอิง
เมื่อใช้ระบบการอ้างอิง ฟังก์ชันกองทุนควรได้รับการแก้ไขและรวมเข้ากับตรรกะหลักของบัญชีอัจฉริยะที่ระบบจะทำงาน ตัวอย่างเช่น หากมีการจ่ายรางวัลการอ้างอิงสำหรับการเดิมพัน ฟังก์ชันกองทุนควรถูกสร้างไว้ในตรรกะของการวางเดิมพัน (หรือการดำเนินการอื่นที่กำหนดเป้าหมายไว้จะดำเนินการซึ่งจะมีการจ่ายรางวัล) รางวัลผู้อ้างอิงสามระดับจะถูกเข้ารหัสไว้ในฟังก์ชันนี้ หากคุณต้องการสร้างระดับมากขึ้นหรือน้อยลง สิ่งนี้จะได้รับการแก้ไขในโค้ดด้วย เปอร์เซ็นต์รางวัลถูกกำหนดโดยค่าคงที่ระดับ 1-ระดับ 3 ในโค้ดจะคำนวณเป็น จำนวน * ระดับ / 1000นั่นคือค่า 1 สอดคล้องกับ 0,1% (ซึ่งสามารถเปลี่ยนแปลงได้ในโค้ด)
การเรียกใช้ฟังก์ชันจะเปลี่ยนยอดเงินในบัญชีและสร้างรายการเพื่อวัตถุประสงค์ในการบันทึกของแบบฟอร์ม:
fund_address_txid = address:owner:inc:level:timestamp
Для получения timestamp (текущего времени) используется такая вот связка
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}
นั่นคือเวลาในการทำธุรกรรมคือเวลาของบล็อกที่บล็อกนั้นตั้งอยู่ สิ่งนี้มีความน่าเชื่อถือมากกว่าการใช้การประทับเวลาจากธุรกรรม โดยเฉพาะอย่างยิ่งเนื่องจากไม่สามารถใช้งานได้จากสิ่งที่เรียกได้
ฟังก์ชั่นการถอนจะแสดงรางวัลสะสมทั้งหมดไปยังบัญชีของผู้ใช้ สร้างรายการเพื่อวัตถุประสงค์ในการบันทึก:
# withdraw log: withdraw_user_txid=amount:timestamp
ใบสมัคร
ส่วนหลักของแอปพลิเคชันคือไลบรารี Affiliate.js ซึ่งเป็นสะพานเชื่อมระหว่างโมเดลข้อมูล Affiliate และ WAVES NODE REST API ใช้ระดับนามธรรมโดยไม่ขึ้นกับกรอบงาน (สามารถใช้อันใดก็ได้) ฟังก์ชั่นที่ใช้งานอยู่ (ลงทะเบียน, ถอน) ถือว่ามีการติดตั้ง Waves Keeper บนระบบ โดยตัวไลบรารีเองไม่ได้ตรวจสอบสิ่งนี้
ใช้วิธีการ:
fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register
การทำงานของวิธีการนั้นชัดเจนจากชื่อ พารามิเตอร์และข้อมูลที่ส่งคืนอธิบายไว้ในโค้ด ฟังก์ชันรีจิสเตอร์จำเป็นต้องมีความคิดเห็นเพิ่มเติม โดยจะเริ่มรอบการเลือกรหัสธุรกรรมเพื่อเริ่มต้นที่ 123 นี่คือ PoW-captcha ที่อธิบายไว้ข้างต้น ซึ่งป้องกันการลงทะเบียนจำนวนมาก ฟังก์ชันค้นหาธุรกรรมที่มีรหัสที่ต้องการ จากนั้นลงนามผ่าน Waves Keeper
โปรแกรมพันธมิตร DEX มีจำหน่ายที่
ที่มา: will.com