Waves 區塊鏈上的開源去中心化聯盟計劃

一個基於 Waves 區塊鏈的去中心化聯屬計劃,作為 Bettex 團隊資助的 Waves Labs 的一部分實施。

帖子不受讚助! 該程序是開源的,其使用和分發都是免費的。 該程序的使用刺激了 dApp 應用程序的開發,並且總體上促進了去中心化,這對網絡的每個用戶都有利。

Waves 區塊鏈上的開源去中心化聯盟計劃

所提供的聯屬計劃 dApp 是包含聯屬營銷作為其功能一部分的項目的模板。 代碼可以作為複制的模板,也可以作為庫,也可以作為技術實現的一套思路。

從功能上來說,這是一個普通的會員系統,實現了推薦人註冊、推薦報酬的多級累計以及系統註冊動機(返現)。 該系統是一個“純粹”的dApp,即Web應用程序直接與區塊鏈交互,沒有自己的後端、數據庫等。

使用的技術在許多其他項目中也很有用:

  • 以信用方式呼叫智能賬戶並立即還款(呼叫時,賬戶上沒有代幣用於支付呼叫費用,但它們會作為呼叫結果出現在此處)。
  • PoW-captcha - 防止智能賬戶功能的高頻自動調用 - 與驗證碼類似,但通過計算資源的使用證明。
  • 通過模板請求數據密鑰。

該應用程序包括:

  • ride4dapps 語言中的智能帳戶代碼(按計劃,已合併到主智能帳戶中,您需要為其實現附屬功能);
  • Node.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 驗證碼

工作量證明驗證碼的想法並不新鮮,並且已經在各種項目中實施,包括基於 WAVES 的項目。 這個想法的要點是,為了執行浪費項目資源的操作,調用者也必須花費自己的資源,這使得資源耗盡攻擊的成本相當高。 為了非常簡單且低成本地驗證交易發送者已經解決了 PoW 問題,需要進行交易 ID 檢查:

if take(toBase58String(i.transactionId), 3) != “123” then throw(“工作證明失敗”) else

為了進行交易,調用者必須選擇這樣的參數,使其 base58 代碼 (id) 以數字 123 開頭,這對應於平均幾十秒的處理器時間,對於我們的任務來說通常是合理的。 如果需要更簡單或更複雜的 PoW,那麼可以通過明顯的方式輕鬆修改任務。

通過模板查詢數據key

為了將區塊鏈用作數據庫,擁有使用模板以 key-val 形式查詢數據庫的 API 工具至關重要。 這樣的工具包於2019年XNUMX月上旬作為參數出現 ?火柴 在 REST API 請求時 /地址/數據?匹配=正則表達式。 現在,如果我們需要從 Web 應用程序獲取多個密鑰,而不是一次性獲取所有密鑰,而只是獲取一組密鑰,那麼我們可以通過密鑰名稱進行選擇。 例如,在該項目中,提款交易編碼為

withdraw_${userAddress}_${txid}

它允許您使用模板獲取任何給定地址提取資金的交易列表:

?matches=withdraw_${userAddress}_.*

現在讓我們分析最終解決方案的組成部分。

vue.js 代碼

該代碼是一個工作演示,接近真實項目。 它通過Waves Keeper實現登錄,並與affiliate.js庫配合使用,在系統中註冊用戶、查詢交易數據,還允許您將賺取的資金提取到用戶的帳戶。

Waves 區塊鏈上的開源去中心化聯盟計劃

RIDE 上的代碼

包括註冊、充值和提現功能。

註冊函數在系統中註冊用戶。 它有兩個參數:referer(referr的地址)和函數代碼中未使用的salt參數,該參數用於選擇交易id(PoW-captcha任務)。

該函數(與該項目中的其他函數一樣)使用借用技術,該函數的結果是為調用該函數提供費用。 借助該解決方案,剛剛創建錢包的用戶可以立即使用系統,而不必為獲取或接收允許他支付交易費用的資產的問題感到困惑。

註冊函數的結果是兩條記錄:

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

這允許向前和向後查找(給定用戶的推薦人和給定用戶的所有推薦)。

基金功能更多的是開發實際功能的模板。 在所呈現的形式中,它將交易轉移的所有資金分配到第一、第二、第三級的推薦人賬戶、“現金返還”賬戶和“找零”賬戶(分配到之前分配期間剩餘的所有資金)。帳戶到達這裡)。

現金返還是激勵最終用戶參與推薦系統的一種手段。 系統以“返現”形式支付的佣金部分,用戶可以像推薦獎勵一樣提取。

使用推薦系統時,應修改資金功能,將其內置到系統運行的智能賬戶的主要邏輯中。 例如,如果為進行的投注支付推薦獎勵,則應將資金功能內置到進行投注的邏輯中(或執行另一個目標操作以支付獎勵)。 此功能中編碼了三個級別的推薦獎勵。 如果您想製作更多或更少的關卡,那麼這也會在代碼中得到糾正。 獎勵百分比由level1-level3常量設置,在代碼中計算為 數量*等級/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 庫,它是聯屬數據模型和WAVES NODE REST API 之間的橋樑。 實現一個獨立於框架的抽象層(可以使用任何一個)。 活動函數(註冊、撤回)假設系統中安裝了 Waves Keeper,庫本身不會檢查這一點。

實現方法:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

這些方法的功能從代碼中描述的名稱、參數和返回數據中顯而易見。 註冊函數需要額外的註釋 - 它啟動事務 ID 選擇週期,以便從 123 開始 - 這是上面描述的 PoW 驗證碼,可以防止大規模註冊。 該函數找到具有所需 ID 的交易,然後通過 Waves Keeper 對其進行簽名。

DEX 附屬計劃可在 GitHub.com.

來源: www.habr.com

添加評論