Waves区块链上的去中心化会员计划,是Bettex团队在Waves Labs资助下实施的一部分。
该帖子不是广告! 该程序是开源的,其使用和分发是免费的。 程序的应用促进了dApp应用程序的开发,并总体上促进了分散化,这对网络的每个用户都是有益的。

dApp为会员计划引入的是用于模板的项目模板,这些会员将会员作为其功能的一部分。 该代码可用作复制的模板,库或技术实施的一套思路。
在功能方面,这是一个常规的会员系统,可实现注册,并带有推荐人的指示,推荐人奖励的多级累积以及系统中注册的动机(现金返还)。 该系统是“纯” dApp,即Web应用程序直接与区块链进行交互,而无需后端,数据库等。
使用的技术在许多其他项目中也可能有用:
- 以即时还款方式以信用方式呼叫智能帐户(在通话时,该帐户上没有代币来支付通话费用,但代币会出现在通话中)。
- PoW验证码-防止对智能帐户功能进行高频自动调用-类似于验证码,但要通过计算资源使用证明。
- 通过模板请求数据密钥。
该应用程序包括:
- 使用ride4dapps语言设计的智能帐户代码(根据设计,该代码已合并到主要的智能帐户中,您需要为其实现会员功能);
- 通过WAVES NODE REST API实现抽象级别的js包装器;
- 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)
验证码工作量证明验证码的概念并不是什么新鲜事物,并且已经在各种项目中实施,包括那些在WAVES基础上实施的项目。 想法是,对于浪费我们项目资源的操作,调用者还必须花费自己的资源,这使得对资源耗尽的攻击变得相当昂贵。 为了非常简单且低成本地验证交易的发送者已解决PoW任务,请检查交易ID:
如果接受(toBase58String(i.transactionId),3)!=“ 123”,则抛出(“工作证明失败”),否则为了进行交易,调用者必须选择这样的参数,以便其base58代码(id)从123开始,这对应于平均数十秒的处理器时间,通常对于我们的任务而言是合理的。 如果需要更简单或更复杂的PoW,则该任务很容易以明显的方式进行改进。
通过模板请求数据密钥为了将区块链用作数据库,拥有API工具作为关键值模板来查询数据库至关重要。 这样的工具包作为REST API请求
/地址/数据的
?Matches参数
?出现在2019年7月初
?Matches = regexp 。 现在,如果我们不需要一次从一个Web应用程序中获取一个键,也不是一次从所有应用程序中获取所有键,而仅是某个组,那么我们可以通过键名进行选择。 例如,在此项目中,取款交易被编码为
withdraw_${userAddress}_${txid}
通过该模板,您可以根据模板获取针对任何给定地址提取资金的交易清单:
?matches=withdraw_${userAddress}_.*
现在,我们将分析交钥匙解决方案的组成部分。
Vue.js代码该代码是接近实际项目的有效演示。 它通过Waves Keeper实现登录,并与affiliate.js库一起使用,借助该库,它可以在系统中注册用户,轮询交易数据,还允许您将赚取的资金提取到用户的帐户中。
乘车代码它包括注册,注资和提款功能。
注册功能向用户系统注册。 它有两个参数:Referer(引用地址)和salt参数,在功能代码中未使用该参数来选择事务ID(PoW-captcha任务)。
该功能(与该项目中的其他功能一样)使用了借用技术,该功能的结果是为调用该功能筹集了一笔费用。 由于这一决定,刚刚创建钱包的用户可以立即使用该系统,而不必为购买或接收允许您支付交易费的资产而感到困惑。
注册功能的结果是两个条目:
${owner)_referer = referer ${referer}_referral_${owner} = owner
这样可以进行直接搜索和反向搜索(此用户的推荐人以及该用户的所有推荐人)。
基金功能更可能是开发真实功能的模板。 在呈现的表格中,它将所有通过交易转移的资金分配到推荐人1、2、3的帐户中,再分配到“现金返还”帐户和“更改”帐户中(分配给以前的帐户时剩下的一切都在这里)。
现金返还是一种刺激最终用户参与推荐系统的方法。 用户可以以“返现”的形式提取系统支付的部分佣金,方式与推荐的奖励相同。
使用推荐系统时,应修改资金功能,并将其内置到系统将在其上运行的智能帐户的主要逻辑中。 例如,如果为下注支付了介绍费,则应将资金功能内置到下注的逻辑中(或执行其他有针对性的操作,并为此支付费用)。 此功能对推荐奖励的三个级别进行编码。 如果您需要执行更多或更少的级别,那么代码中也会对此进行更正。 薪酬百分比由level1-level3常数设置,在代码中被认为是
数量* level / 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上
获得 。