Chương trình liên kết phi tập trung mã nguồn mở trên chuỗi khối Waves

Một chương trình liên kết phi tập trung trên chuỗi khối Waves, được nhóm Bettex triển khai như một phần tài trợ của Waves Labs.

Bài viết không có tính chất quảng cáo! Chương trình này là nguồn mở, việc sử dụng và phân phối nó là miễn phí. Việc sử dụng chương trình sẽ kích thích sự phát triển của các ứng dụng dApp và nói chung là thúc đẩy quá trình phân cấp, mang lại lợi ích cho mọi người dùng Internet.

Chương trình liên kết phi tập trung mã nguồn mở trên chuỗi khối Waves

DApp được trình bày dành cho các chương trình liên kết là một mẫu dành cho các dự án bao gồm liên kết như một phần chức năng của chúng. Mã có thể được sử dụng làm mẫu để sao chép, làm thư viện hoặc làm tập hợp các ý tưởng để triển khai kỹ thuật.

Về chức năng, đây là hệ thống liên kết thông thường thực hiện đăng ký với người giới thiệu, tích lũy phần thưởng đa cấp cho người giới thiệu và tạo động lực đăng ký vào hệ thống (hoàn tiền). Hệ thống này là một dApp “thuần túy”, nghĩa là ứng dụng web tương tác trực tiếp với blockchain mà không cần có phần phụ trợ, cơ sở dữ liệu riêng, v.v.

Các kỹ thuật được sử dụng cũng có thể hữu ích trong nhiều dự án khác:

  • Gọi tài khoản thông minh vào nợ và trả nợ ngay lập tức (tại thời điểm cuộc gọi không có mã thông báo nào trên tài khoản để thanh toán cho cuộc gọi, nhưng chúng xuất hiện ở đó do cuộc gọi).
  • PoW-captcha - bảo vệ chống lại các cuộc gọi tự động tần số cao đến các chức năng tài khoản thông minh - tương tự như captcha, nhưng thông qua bằng chứng về việc sử dụng tài nguyên máy tính.
  • Truy vấn khóa dữ liệu bằng cách sử dụng mẫu.

Ứng dụng này bao gồm:

  • mã tài khoản thông minh bằng ngôn ngữ Ride4dapps (theo kế hoạch, được hợp nhất vào tài khoản thông minh chính mà chức năng liên kết cần được triển khai);
  • js triển khai mức độ trừu tượng trên API WAVES NODE REST;
  • mã trên khung vuejs, đây là một ví dụ về việc sử dụng thư viện và mã RIDE.

Hãy để chúng tôi mô tả tất cả các tính năng được liệt kê.

Gọi tài khoản thông minh để đòi nợ trả ngay

Việc gọi InvokeScript yêu cầu thanh toán một khoản phí từ tài khoản bắt đầu giao dịch. Đây không phải là vấn đề nếu bạn đang tạo một dự án dành cho những người đam mê blockchain có một số lượng mã thông báo WAVES nhất định trong tài khoản của họ, nhưng nếu sản phẩm hướng đến mục đích sử dụng của công chúng thì điều này sẽ trở thành một vấn đề nghiêm trọng. Sau cùng, người dùng phải quan tâm đến việc mua mã thông báo WAVES (hoặc một tài sản phù hợp khác có thể được sử dụng để thanh toán cho các giao dịch), điều này làm tăng rào cản đáng kể để tham gia vào dự án. Chúng tôi có thể phân phối tài sản cho những người dùng có khả năng thanh toán cho các giao dịch và đối mặt với nguy cơ bị lạm dụng khi hệ thống tự động được tạo ra để bơm tài sản lưu động ra khỏi hệ thống của chúng tôi.

Sẽ rất thuận tiện nếu có thể gọi InvokeScript “với chi phí của người nhận” (tài khoản thông minh mà tập lệnh được cài đặt trên đó) và khả năng như vậy, mặc dù không phải theo cách rõ ràng, vẫn tồn tại.

Nếu bên trong InvokeScript, bạn thực hiện ScriptTransfer tới địa chỉ của người gọi để bù đắp cho số token đã chi tiêu thì cuộc gọi như vậy sẽ thành công, ngay cả khi tại thời điểm cuộc gọi không có tài sản nào trên tài khoản cuộc gọi. Điều này có thể thực hiện được vì việc kiểm tra đủ số token được thực hiện sau khi giao dịch được thực hiện, thay vì trước đó, để các giao dịch có thể được thực hiện bằng tín dụng, tùy thuộc vào việc hoàn trả ngay lập tức.

ScriptTransfer(i.caller, i.fee, đơn vị)

Mã bên dưới hoàn trả phí đã chi bằng cách sử dụng tiền tài khoản thông minh. Để bảo vệ khỏi việc lạm dụng tính năng này, cần sử dụng séc để đảm bảo người gọi chi tiêu phí vào tài sản được yêu cầu và trong giới hạn hợp lý:

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
}

Ngoài ra, để bảo vệ khỏi sự lãng phí tiền bạc một cách độc hại và vô nghĩa, cần phải có tính năng bảo vệ cuộc gọi tự động (PoW-captcha).

PoW-captcha

Ý tưởng về hình ảnh xác thực bằng chứng công việc không phải là mới và đã được triển khai trong nhiều dự án khác nhau, bao gồm cả những dự án được triển khai trên cơ sở WAVES. Ý tưởng là để thực hiện một hành động tiêu tốn tài nguyên của dự án của chúng ta, người gọi cũng phải sử dụng tài nguyên của chính mình, điều này khiến cho một cuộc tấn công làm cạn kiệt tài nguyên trở nên khá tốn kém. Để xác thực rất dễ dàng và chi phí thấp rằng người gửi giao dịch đã giải quyết được vấn đề PoW, hãy thực hiện kiểm tra id giao dịch:

nếu take(toBase58String(i.transactionId), 3) != “123” thì ném(“bằng chứng công việc không thành công”) else

Để thực hiện giao dịch, người gọi phải chọn các tham số sao cho mã base58 (id) của nó bắt đầu bằng các số 123, tương ứng trung bình với thời gian xử lý trung bình vài chục giây và nhìn chung là hợp lý cho nhiệm vụ của chúng tôi. Nếu yêu cầu PoW đơn giản hơn hoặc phức tạp hơn thì tác vụ có thể dễ dàng sửa đổi một cách rõ ràng.

Truy vấn khóa dữ liệu bằng cách sử dụng mẫu

Để sử dụng blockchain làm cơ sở dữ liệu, điều quan trọng là phải có các công cụ API để truy vấn cơ sở dữ liệu dưới dạng khóa-val dựa trên các mẫu. Bộ công cụ như vậy xuất hiện vào đầu tháng 2019 năm XNUMX dưới dạng tham số ?diêm theo yêu cầu API REST /địa chỉ/dữ liệu?matches=regexp. Bây giờ, nếu chúng ta cần lấy nhiều khóa từ một ứng dụng web chứ không phải tất cả các khóa cùng một lúc mà chỉ một số nhóm, thì chúng ta có thể thực hiện lựa chọn theo tên khóa. Ví dụ: trong dự án này, các giao dịch rút tiền được mã hóa thành

withdraw_${userAddress}_${txid}

cho phép bạn nhận danh sách các giao dịch rút tiền cho bất kỳ địa chỉ cụ thể nào bằng cách sử dụng mẫu:

?matches=withdraw_${userAddress}_.*

Bây giờ chúng ta hãy xem xét các thành phần của giải pháp đã hoàn thành.

Mã Vuejs

Mã này là một bản demo hoạt động gần với dự án thực. Nó triển khai đăng nhập thông qua Waves Keeper và hoạt động với thư viện Affiliate.js, thư viện này đăng ký người dùng trong hệ thống, truy vấn dữ liệu giao dịch và cũng cho phép bạn rút tiền kiếm được vào tài khoản của người dùng.

Chương trình liên kết phi tập trung mã nguồn mở trên chuỗi khối Waves

Mã cho RIDE

Bao gồm các chức năng đăng ký, cấp vốn và rút tiền.

Chức năng đăng ký đăng ký một người dùng trên hệ thống. Nó có hai tham số: tham số giới thiệu (địa chỉ người giới thiệu) và tham số muối, không được sử dụng trong mã chức năng, cần thiết để chọn id giao dịch (tác vụ PoW-captcha).

Hàm này (giống như các hàm khác trong dự án này) sử dụng kỹ thuật gọi nợ, kết quả của hàm này là tài trợ cho việc thanh toán phí gọi hàm này. Nhờ giải pháp này, người dùng vừa tạo ví có thể làm việc ngay với hệ thống và không phải lo lắng về việc mua hoặc nhận tài sản cho phép anh ta trả phí giao dịch.

Kết quả của hàm đăng ký là hai bản ghi:

${owner)_referer = referer
${referer}_referral_${owner} = owner

Điều này cho phép tìm kiếm tiến và lùi (liên kết giới thiệu của một người dùng nhất định và tất cả các giới thiệu của một người dùng nhất định).

Chức năng quỹ giống như một khuôn mẫu để phát triển chức năng thực tế. Ở dạng được trình bày, nó lấy tất cả số tiền được chuyển qua giao dịch và phân phối chúng vào tài khoản của người giới thiệu cấp 1, 2, 3, vào tài khoản “hoàn tiền” và tài khoản “thay đổi” (mọi thứ còn lại khi được phân phối cho tài khoản trước đó). tài khoản ở đây).

Hoàn tiền là một phương tiện thúc đẩy người dùng cuối tham gia vào hệ thống giới thiệu. Người dùng có thể rút một phần hoa hồng do hệ thống trả dưới hình thức “hoàn tiền” giống như phần thưởng cho những người được giới thiệu.

Khi sử dụng hệ thống giới thiệu, chức năng quỹ phải được sửa đổi và tích hợp vào logic chính của tài khoản thông minh mà hệ thống sẽ hoạt động. Ví dụ: nếu phần thưởng giới thiệu được trả cho một lần đặt cược đã thực hiện thì chức năng quỹ phải được tích hợp vào logic nơi đặt cược (hoặc một hành động được nhắm mục tiêu khác được thực hiện để trả phần thưởng). Ba cấp độ phần thưởng giới thiệu được mã hóa vào chức năng này. Nếu bạn cần tạo nhiều hoặc ít cấp độ hơn thì điều này cũng được sửa trong mã. Tỷ lệ phần trăm phần thưởng được đặt theo hằng số cấp 1-cấp 3; trong mã, nó được tính như sau: số tiền * cấp độ / 1000, nghĩa là giá trị 1 tương ứng với 0,1% (điều này cũng có thể được thay đổi trong mã).

Việc gọi hàm sẽ thay đổi số dư tài khoản và cũng tạo các mục nhập cho mục đích ghi nhật ký của biểu mẫu:

fund_address_txid = address:owner:inc:level:timestamp
Для получения timestamp (текущего времени) используется такая вот связка
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}

Nghĩa là, thời gian giao dịch là thời gian của khối chứa nó. Điều này đáng tin cậy hơn việc sử dụng dấu thời gian từ chính giao dịch, đặc biệt vì nó không có sẵn trong lệnh gọi.
Chức năng rút tiền hiển thị tất cả phần thưởng tích lũy vào tài khoản của người dùng. Tạo các mục cho mục đích ghi nhật ký:

# withdraw log: withdraw_user_txid=amount:timestamp

Ứng dụng

Phần chính của ứng dụng là thư viện Affiliate.js, là cầu nối giữa các mô hình dữ liệu liên kết và API WAVES NODE REST. Triển khai một mức độ trừu tượng độc lập với khung công tác (có thể sử dụng bất kỳ mức độ trừu tượng nào). Các chức năng hoạt động (đăng ký, rút ​​tiền) giả định rằng Waves Keeper đã được cài đặt trên hệ thống; bản thân thư viện không kiểm tra điều này.

Thực hiện các phương pháp:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Chức năng của các phương thức được thể hiện rõ ràng qua tên gọi; các tham số và dữ liệu trả về được mô tả trong mã. Chức năng đăng ký yêu cầu nhận xét bổ sung - nó bắt đầu một chu kỳ chọn id giao dịch để bắt đầu ở 123 - đây là PoW-captcha được mô tả ở trên, giúp bảo vệ khỏi đăng ký hàng loạt. Hàm này tìm thấy một giao dịch có id được yêu cầu và sau đó ký nó thông qua Waves Keeper.

Chương trình liên kết DEX có sẵn tại GitHub.com.

Nguồn: www.habr.com

Thêm một lời nhận xét