NEO智能合约开发(二)再续不可能的任务

NEO智能合约开发中,应用合约比较简单,是的你没看错,应用合约比较简单。html

应用合约三部曲,发布、调用、看结果。除了看结果工具比较缺少,发布调用neogui最起码能够支撑你测试。框架

鉴权合约比较麻烦,由于neogui不能支持你很好的测试鉴权合约。函数

这是一个难点,上一次咱们让你试着用鉴权合约往外取钱了,一个密码,有了密码谁都能取钱。就那,用neogui去取并不容易,对吧。工具

这一次咱们继续探讨这个话题,一个更有价值的应用场景。学习

如何限制一个用户能从智能合约里取出多少钱?测试

不用担忧,若是到这里你啥都看不懂,很正常。我估计中国真的理解了NEO的鉴权机制的人一双手就数的过来。一个正常的NEO学习机制,应该是:ui

  1. 先开发一个钱包客户端
  2. 而后了解应用合约的调用,用本身的钱包客户端,本身写的的scriptbuilder,去完成应用合约的调用。
  3. 了解鉴权合约,写一些鉴权合约,用本身的钱包客户端拼交易,测试他们。

NEO官网上提供的信息太少,不看NEO源代码,没有正常人类能经过NEO官网的资料学会这些内容。cdn

若是你尚未到这个阶段,这篇文字还不适合你,去作一些应该作的事情吧。htm

限制取钱机制有什么意义

好比说,Nep5的ico机制,用户投入NEO,获得Nep5代币。这就是一个自动贩卖机机制。你给我gas或者neo,我给你游戏币。用UTXO资产,购买NEP5资产,或者其它什么东西。blog

那么NEO如今提供的ico模板,是没有退货机制的。由于比较难实现,很差限制用户从ico合约里面能取出多少钱。

这就是意义,能作到限制取多少钱,就能实现ICO自动化退货机制。

换个比方,售货机机制还有不少做用,好比我帮个人朋友存一笔钱,他生日到了能够取走。

好比两我的打du,猜一下五个区块之后的一个随机数的单双,聪明的你立刻懂了,实现了用户能从智能合约里面取出多少UTXO资产的限制,就能够直接用UTXO资产进行各类不可描述的du博业务。

再往远了想想,一个全自动化的交易所,用GAS买入某种NEO代币,等他涨了再卖掉,把GAS取出来。我尚未看过蓝鲸涛公布源码,neox的源码我也没有研究。那这就是他们实现用户本身提取UTXO资产的一个核心机制。

这有什么困难的?

很难,第一反应就是storage直接存个值,取得时候存一下,根据这个值,就能够实现任意限制逻辑。

想的美。

100个GAS在这放着,有本事去取呀。

放心你取不出来。

这个合约表面上看谁都能取,可是Storage.Put 引起异常,实际上谁也取不出来。

你看,你想的最美的经过Storage去限制取多少,作不到。在鉴权合约触发时,Storage.Put 整个不能用。

回想一下ICO模板,是否是没有实现全自动的退款,准确点说就是没有实现任意用户从智能合约提取NEO。就是这个缘由。

那就没有办法了嘛?

有一个金句,办法总比困难多。

若是你只是简单的纵览一下,可能会以为存储这条路被堵住了,一切都不可行了。

让咱们仔细来看一下这个逻辑

  1. 须要有个限制取钱的机制,取完就不能再取
  2. 须要用Stroage来控制这个机制
  3. 鉴权合约执行时不能Storage.Put

看起来好像逻辑链断了,可是当咱们想起来UTXO资产自己的一个特质,这个链条就会再次接上。一个UTXO只能被使用一次,没错就是他。这个不正好能够用来控制用户能取多少钱了么?

1、须要有个限制取钱的机制(给每一个取钱的用户一个专属的UTXO只能他取)

2、须要用Stroage来控制这个机制(storage直接存一个map<utxo,targetaddr>,限制一个utxo只能向一个固定地址转帐)

3、鉴权合约执行时不能Storage.put(可是能够Storage.get 呀,bingo)

咱们把思路稍微调整了一下,就接上了。咱们不须要storage直接控制一个用户能取多少钱。1.用storage 控制一个utxo能往哪一个地址转帐,这能够实现。

2.一个utxo只能转帐一次,这是自然的。

这两条加一块儿,这个自助提取UTXO资产的逻辑就通了。

用两笔交易实现自助提取UTXO资产。

第一笔,资产不离开智能合约,智能合约向自身转帐,生成某用户专用的UTXO,同时作invoke应用合约,记录将此UTXO专用化。

第二笔,取钱,用此专用UTXO向用户地址转帐。

实践一下

直接看代码

这里只是为了探究这个机制,咱们将第一步设定为由超级管理员给用户撒钱。你仔细想一想,实现个用户本身从本身的NEP5地址退钱,和这并没太大区别。咱们不要让那么多代码来干扰咱们实现核心机制。

第一步

用这个智能合约本身给本身转帐

如图,就是Gas1000,转给本身100GAS,找零900Gas这笔,钱没有离开智能合约地址。

而后超级管理员给超级管理员转帐 30536.6 GAS这笔,超级管理员也没出钱。

而后同时调用智能合约,将该笔交易第0个输出的UTXO,设定为只能向地址

AcfW….转帐,如图

因为使用了智能合约,须要一个SC的witness,以下图,随便传俩参数,不能用Array

让咱们分析下上面作了什么

1.智能合约给本身转帐,第零个输出是个utxo,100gas,那就意味着,咱们容许AcfW…这个地址从智能合约地址里面转走100GAS

2.超级管理员给本身转帐,这个不产生直接价值

他只是为了让鉴权合约能走到这里,附加上超级管理员的鉴证,就随便怎么转都行。

也可使用交易的Attribute附加上超级管理员的鉴证脚本。

  1. APPcall givemoney(0,Acfw…)

就是这部分代码了,将本交易的hash和本交易的第0个输出编成一个Key。

你也许注意到我写了一个ConvertN函数,由于整数的byte[] 形态是什么不太稳定,我须要他是肯定的,要否则0000 00 和空byte[] 都表示0,那key就乱套了

而后你看到我直接stroage.put 将目标地址存了起来。这就是第一步。

制造一个100GAS的UTXO,而且在Storage里记录下来给谁。

第二步

第二步就简单了,这交易不须要任何人签名

,智能合约的鉴证脚本也是随便填就行

而后你就能够取到钱啦。

分析一下

我把这段鉴权合约分为了三个部分

红色部分是判断,这笔交易,只容许有一个输入一个输出,不然你取不走钱。固然你用循环能够处理更复杂的状况,记住咱们只是在探究这个机制。

黄色部分是从存储里取到这个UTXO容许的目标

蓝色部分是判断这笔交易的输出目标和Storage里存的是否一致。

一致,钱你拿走,UTXO销毁。

不一致,交易不成立,UTXO还在那里。

咱们作了什么

综上所述,咱们提出了一种能够在NEO框架上实现用户在智能合约限制下提取UTXO资产的机制,并写代码进行了验证。

此机制可用于:

  1. 使用NEO的UTXO资产如NEO、GAS 进行ICO的退货机制。
  2. 扩展上一条,可自动贩卖某种数字资产以及退货。
  3. 使用NEO的UTXO资产进行的彩票、下注等活动。
  4. 去中心化交易所的实现。


技术群交流:795681763

原文:https://www.cnblogs.com/crazylights/p/8457392.html

相关文章
相关标签/搜索