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.

来源: habr.com

添加评论