Waves ãããã¯ãã§ãŒã³äžã®åæ£åã¢ãã£ãªãšã€ã ããã°ã©ã ãBettex ããŒã ã«ãã Waves Labs å©æéã®äžéšãšããŠå®è£ ãããŠããŸãã
æçš¿ã¯å®£äŒã§ã¯ãããŸããïŒ ãã®ããã°ã©ã ã¯ãªãŒãã³ãœãŒã¹ã§ããã䜿çšãšé åžã¯ç¡æã§ãã ãã®ããã°ã©ã ã䜿çšãããšãdApp ã¢ããªã±ãŒã·ã§ã³ã®éçºãä¿é²ãããäžè¬ã«åæ£åãä¿é²ããããã¹ãŠã®ã€ã³ã¿ãŒããã ãŠãŒã¶ãŒã«å©çãããããããŸãã
æ瀺ãããã¢ãã£ãªãšã€ã ããã°ã©ã çšã® 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 ã©ã€ãã©ãªãšé£æºããŠãã·ã¹ãã ãžã®ãŠãŒã¶ãŒã®ç»é²ããã©ã³ã¶ã¯ã·ã§ã³ ããŒã¿ã®ã¯ãšãªãå®è¡ããç²åŸããè³éããŠãŒã¶ãŒã®ã¢ã«ãŠã³ãã«åŒãåºãããšãã§ããŸãã
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 ã¢ãã£ãªãšã€ã ããã°ã©ã ã¯æ¬¡ã®å Žæã§å©çšã§ããŸãã
åºæïŒ habr.com