Waves ブロックチェヌン䞊の分散型オヌプン゜ヌス アフィリ゚むト プログラム

Waves ブロックチェヌン䞊の分散型アフィリ゚むト プログラム。Bettex チヌムによる Waves Labs 助成金の䞀郚ずしお実装されおいたす。

投皿は宣䌝ではありたせん このプログラムはオヌプン゜ヌスであり、䜿甚ず配垃は無料です。 このプログラムを䜿甚するず、dApp アプリケヌションの開発が促進され、䞀般に分散化が促進され、すべおのむンタヌネット ナヌザヌに利益がもたらされたす。

Waves ブロックチェヌン䞊の分散型オヌプン゜ヌス アフィリ゚むト プログラム

提瀺されたアフィリ゚むト プログラム甚の dApp は、機胜の䞀郚ずしおアフィリ゚むトを含むプロゞェクト甚のテンプレヌトです。 コヌドは、コピヌ甚のテンプレヌトずしお、ラむブラリずしお、たたは技術的な実装のためのアむデアのセットずしお䜿甚できたす。

機胜面では、玹介者ぞの登録、玹介に察する倚段階の報酬獲埗、システム登録動機キャッシュバックを実珟した正芏アフィリ゚むトシステムです。 このシステムは「玔粋な」dApp です。぀たり、Web アプリケヌションは独自のバック゚ンドやデヌタベヌスなどを持たずに、ブロックチェヌンず盎接察話したす。

他の倚くのプロゞェクトでも圹立぀テクニックが䜿甚されおいたす。

  • スマヌト アカりントに即時返枈付きの借金をコヌルしたす (コヌルの時点では、コヌルの支払いに必芁なトヌクンがアカりントにありたせんが、コヌルの結果ずしおトヌクンがそこに衚瀺されたす)。
  • PoW-captcha - スマヌト アカりント機胜ぞの高頻床の自動呌び出しに察する保護 - キャプチャに䌌おいたすが、コンピュヌティング リ゜ヌスの䜿甚の蚌明を通じお行われたす。
  • テンプレヌトを䜿甚しおデヌタキヌをク゚リしたす。

アプリケヌションは次のもので構成されたす。

  • ride4dapps 蚀語のスマヌト アカりント コヌド (予定通り、アフィリ゚むト機胜を実装する必芁があるメむンのスマヌト アカりントにマヌゞされたす)。
  • WAVES NODE REST API の抜象化レベルを実装する js ラッパヌ。
  • vuejs フレヌムワヌクのコヌド。ラむブラリず RIDE コヌドの䜿甚䟋です。

リストされたすべおの機胜に぀いお説明したしょう。

すぐに返枈できる借金のスマヌトアカりントを呌び出す

InvokeScript を呌び出すには、トランザクションを開始するアカりントから料金を支払う必芁がありたす。 これは、アカりントに䞀定量の WAVES トヌクンを保有しおいるブロックチェヌンオタク向けのプロゞェクトを䜜成する堎合には問題ありたせんが、補品が䞀般の人々による䜿甚を目的ずしおいる堎合、これは深刻な問題になりたす。 結局のずころ、ナヌザヌは WAVES トヌクン (たたはトランザクションの支払いに䜿甚できる別の適切な資産) の賌入を行う必芁があり、プロゞェクトぞの参入に察するすでにかなりの障壁が高くなりたす。 圓瀟のシステムから流動資産を汲み出す自動システムが䜜成されるず、取匕の支払いができるナヌザヌに資産を配垃できたすが、悪甚のリスクに盎面するこずになりたす。

「受信者 (スクリプトがむンストヌルされおいるスマヌト アカりント) を犠牲にしお」 InvokeScript を呌び出すこずができれば非垞に䟿利です。そのような可胜性は、明らかな方法ではありたせんが、存圚したす。

InvokeScript 内で呌び出し元のアドレスに ScriptTransfer を実行し、消費された料金トヌクンを補填する堎合、呌び出し時に呌び出し偎アカりントに資産がなかったずしおも、そのような呌び出しは成功したす。 これが可胜になるのは、トランザクションが呌び出される前ではなく、呌び出し埌に十分なトヌクンがあるかどうかのチェックが行われるためであり、即時返枈の条件でクレゞット䞊でトランザクションを行うこずができたす。

ScriptTransfer(i.caller、i.fee、unit)

以䞋のコヌドは、スマヌト アカりントの資金を䜿甚しお䜿甚枈み料金を払い戻したす。 この機胜の悪甚を防ぐには、呌び出し元が必芁な資産に、劥圓な範囲内で料金を費やしたこずを確認するチェックを䜿甚する必芁がありたす。

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キャプチャ

proof-of-work キャプチャのアむデア自䜓は新しいものではなく、WAVES に基づいお実装されたプロゞェクトを含む、さたざたなプロゞェクトですでに実装されおいたす。 この考え方は、プロゞェクトのリ゜ヌスを消費するアクションを実行するには、呌び出し元も自分のリ゜ヌスを消費する必芁があるため、リ゜ヌス枯枇攻撃は非垞に高䟡になるずいうこずです。 トランザクションの送信者が PoW 問題を解決したこずを非垞に簡単か぀䜎コストで怜蚌するには、トランザクション ID チェックがありたす。

if take(toBase58String(i.transactionId), 3) != “123” then throw(“proof of work failed”) else

トランザクションを実行するには、呌び出し元は、base58 コヌド (id) が数字 123 で始たるようにパラメヌタヌを遞択する必芁がありたす。これは、平均しお数十秒のプロセッサヌ時間に盞圓し、䞀般にこのタスクにずっお劥圓な倀です。 より単玔な、たたはより耇雑な PoW が必芁な堎合、タスクは明らかな方法で簡単に倉曎できたす。

テンプレヌトを䜿甚しおデヌタキヌをク゚リする

ブロックチェヌンをデヌタベヌスずしお䜿甚するには、テンプレヌトに基づいおデヌタベヌスを key-val ずしおク゚リするための API ツヌルが䞍可欠です。 このようなツヌルキットは、パラメヌタヌの圢匏で 2019 幎 XNUMX 月初めに登堎したした。 ?䞀臎 REST APIリク゚スト時 /addresses/data?matches=regexp。 ここで、Web アプリケヌションから耇数のキヌを取埗する必芁があり、すべおのキヌを䞀床に取埗するのではなく、䞀郚のグルヌプのみを取埗する必芁がある堎合は、キヌ名で遞択できたす。 たずえば、このプロゞェクトでは、出金トランザクションは次のように゚ンコヌドされたす。

withdraw_${userAddress}_${txid}

これにより、テンプレヌトを䜿甚しお、特定のアドレスの資金を匕き出すためのトランザクションのリストを取埗できたす。

?matches=withdraw_${userAddress}_.*

次に、完成した゜リュヌションのコンポヌネントを芋おみたしょう。

Vuejsコヌド

このコヌドは、実際のプロゞェクトに近い動䜜デモです。 Waves Keeper を介しおログむンを実装し、affiliate.js ラむブラリず連携しお、システムぞのナヌザヌの登録、トランザクション デヌタのク゚リを実行し、獲埗した資金をナヌザヌのアカりントに匕き出すこずもできたす。

Waves ブロックチェヌン䞊の分散型オヌプン゜ヌス アフィリ゚むト プログラム

RIDEのコヌド

登録、入金、出金の機胜で構成されたす。

register 関数は、システムにナヌザヌを登録したす。 これには、referer (参照元アドレス) ず、トランザクション ID (PoW-captcha タスク) を遞択するために必芁な関数コヌドでは䜿甚されない Salt パラメヌタヌの XNUMX ぀のパラメヌタヌがありたす。

この関数は (このプロゞェクトの他の関数ず同様に) デット コヌル手法を䜿甚しおおり、関数の結果ずしお、この関数を呌び出すための料金の支払いに資金を提䟛したす。 この゜リュヌションのおかげで、りォレットを䜜成したばかりのナヌザヌはすぐにシステムを操䜜できるようになり、取匕手数料を支払うための資産の賌入や受け取りに぀いお心配する必芁がなくなりたす。

登録関数の結果は XNUMX ぀のレコヌドになりたす。

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

これにより、前方および逆方向の怜玢 (特定のナヌザヌの参照元および特定のナヌザヌのすべおの玹介) が可胜になりたす。

ファンド機胜は、実際の機胜を開発するためのテンプレヌトのようなものです。 提瀺されおいるように、トランザクションによっお転送されたすべおの資金が取埗され、レベル 1、2、3 の玹介者のアカりント、「キャッシュバック」アカりントおよび「倉曎」アカりントに分配されたす (以前のアカりントぞの分配䞭に残ったすべおの資金が送られおきたす)ここ。

キャッシュバックは、゚ンドナヌザヌに玹介システムぞの参加を促す手段です。 ナヌザヌは玹介報酬ず同様に、システムが支払った手数料の䞀郚を「キャッシュバック」の圢で匕き出すこずができたす。

玹介システムを䜿甚する堎合、ファンド機胜を倉曎し、システムが動䜜するスマヌト アカりントのメむン ロゞックに統合する必芁がありたす。 たずえば、行われた賭けに察しお玹介報酬が支払われる堎合、賭けが行われるロゞックにファンド関数を組み蟌む必芁がありたす (たたは、報酬が支払われる別の察象アクションが実行されたす)。 この関数には、1 レベルの玹介報酬がコヌド化されおいたす。 䜜成するレベルを増枛する必芁がある堎合は、これもコヌド内で修正されたす。 報酬のパヌセンテヌゞはレベル 3  レベル XNUMX の定数によっお蚭定され、コヌドでは次のように蚈算されたす。 量 * レベル / 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

アプリケヌション

アプリケヌションの䞻芁郚分は、アフィリ゚むト デヌタ モデルず WAVES NODE REST API の間のブリッゞである、affiliate.js ラむブラリです。 フレヌムワヌクに䟝存しない抜象化レベルを実装したす (任意の抜象化レベルを䜿甚できたす)。 アクティブな機胜 (登録、匕き出し) は、Waves Keeper がシステムにむンストヌルされおいるこずを前提ずし、ラむブラリ自䜓はこれをチェックしたせん。

メ゜ッドを実装したす。

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

メ゜ッドの機胜は名前から明らかであり、パラメヌタヌず返されるデヌタはコヌドで説明されおいたす。 register 関数には远加のコメントが必芁です。123 から始たるようにトランザクション ID を遞択するサむクルが開始されたす。これは、倧量の登録から保護する前述の PoW-captcha です。 この関数は、必芁な ID を持぀トランザクションを怜玢し、Waves Keeper を通じおそれに眲名したす。

DEX アフィリ゚むト プログラムは次の堎所で利甚できたす。 GitHub.com.

出所 habr.com

コメントを远加したす