NEO智能合约开发(二)再续不可能的任务
NEO智能合约开发中,应用合约比较简单,是的你没看错,应用合约比较简单。
应用合约三部曲,发布、调用、看结果。除了看结果工具比较缺乏,发布调用neogui最起码可以支撑你测试。
鉴权合约比较麻烦,因为neogui不能支持你很好的测试鉴权合约。
这是一个难点,上一次我们让你试着用鉴权合约往外取钱了,一个密码,有了密码谁都能取钱。就那,用neogui去取并不容易,对吧。
这一次我们继续探讨这个话题,一个更有价值的应用场景。
如何限制一个用户能从智能合约里取出多少钱?
不用担心,如果到这里你啥都看不懂,很正常。我估计中国真的理解了NEO的鉴权机制的人一双手就数的过来。一个正常的NEO学习机制,应该是:
- 先开发一个钱包客户端
- 然后了解应用合约的调用,用自己的钱包客户端,自己写的的scriptbuilder,去完成应用合约的调用。
- 了解鉴权合约,写一些鉴权合约,用自己的钱包客户端拼交易,测试他们。
NEO官网上提供的信息太少,不看NEO源代码,没有正常人类能通过NEO官网的资料学会这些内容。
如果你还没有到这个阶段,这篇文字还不适合你,去做一些应该做的事情吧。
限制取钱机制有什么意义
比如说,Nep5的ico机制,用户投入NEO,得到Nep5代币。这就是一个自动贩卖机机制。你给我gas或者neo,我给你游戏币。用UTXO资产,购买NEP5资产,或者其它什么东西。
那么NEO现在提供的ico模板,是没有退货机制的。因为比较难实现,不好限制用户从ico合约里面能取出多少钱。
这就是意义,能做到限制取多少钱,就能实现ICO自动化退货机制。
换个比方,售货机机制还有很多作用,比如我帮我的朋友存一笔钱,他生日到了可以取走。
比如两个人打赌,猜一下五个区块以后的一个随机数的单双,聪明的你马上懂了,实现了用户能从智能合约里面取出多少UTXO资产的限制,就可以直接用UTXO资产进行各种不可描述的赌博业务。
再往远了想一想,一个全自动化的交易所,用GAS买入某种NEO代币,等他涨了再卖掉,把GAS取出来。我还没有看过蓝鲸涛公布源码,neox的源码我也没有研究。那这就是他们实现用户自己提取UTXO资产的一个核心机制。
这有什么困难的?
很难,第一反应就是storage直接存个值,取得时候存一下,根据这个值,就可以实现任意限制逻辑。
想的美。
100个GAS在这放着,有本事去取呀。
放心你取不出来。
这个合约表面上看谁都能取,但是Storage.Put 引发异常,实际上谁也取不出来。
你看,你想的最美的通过Storage去限制取多少,做不到。在鉴权合约触发时,Storage.Put 整个不能用。
回想一下ICO模板,是不是没有实现全自动的退款,准确点说就是没有实现任意用户从智能合约提取NEO。就是这个原因。
那就没有办法了嘛?
有一个金句,办法总比困难多。
如果你只是简单的纵览一下,可能会觉得存储这条路被堵住了,一切都不可行了。
让我们仔细来看一下这个逻辑
- 需要有个限制取钱的机制,取完就不能再取
- 需要用Stroage来控制这个机制
- 鉴权合约执行时不能Storage.Put
看起来好像逻辑链断了,但是当我们想起来UTXO资产本身的一个特质,这个链条就会再次接上。一个UTXO只能被使用一次,没错就是他。这个不正好可以用来控制用户能取多少钱了么?
一、需要有个限制取钱的机制(给每个取钱的用户一个专属的UTXO只能他取)
二、需要用Stroage来控制这个机制(storage直接存一个map<utxo,targetaddr>,限制一个utxo只能向一个固定地址转账)
三、鉴权合约执行时不能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附加上超级管理员的鉴证脚本。
- 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资产的机制,并写代码进行了验证。
此机制可用于:
- 使用NEO的UTXO资产如NEO、GAS 进行ICO的退货机制。
- 扩展上一条,可自动贩卖某种数字资产以及退货。
- 使用NEO的UTXO资产进行的彩票、下注等活动。
- 去中心化交易所的实现。
等
NEO智能合约开发(二)再续不可能的任务的更多相关文章
- NEO智能合约开发(一)不可能完成的任务
悬赏任务 兹有如下合约 public static object Main(string method, object[] args) { if (Runtime.Trigger == Trigger ...
- EOS智能合约开发(二):EOS创建和管理钱包
上节介绍了EOS智能合约开发之EOS环境搭建及启动节点 那么,节点启动后我们要做的第一件事儿是什么呢?就是我们首先要有账号,但是有账号的前提是什么呢?倒不是先创建账号,而是先要有自己的一组私钥,有了私 ...
- EOS智能合约开发(四):智能合约部署及调试(附编程示例)
EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...
- EOS智能合约开发(三):EOS创建和管理账号
没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保 ...
- 五一劳动节,讲讲NEO智能合约的调试
之前我们说过NEO智能合约的调试问题,过去了一段时间,有很多东西都发生了比较大的变化.让我们重新再来探讨一下这个话题. 先说日期,2018年4月27日,马上迎来劳动节. 以后可能还会再次谈论这个话 ...
- 用 C# 编写 NEO 智能合约
工具 -> 扩展和更新安装 NeoContractPlugin 插件 打开 Visual Studio 2017,打开 工具, 扩展和更新 ,在左侧点击 联机 ,搜索 Neo,安装 NeoCon ...
- 智能合约开发环境搭建及Hello World合约
如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...
- 智能合约开发solidity编程语言开发一个以太坊应用区块链投票实例
智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力.智能合约其实是"执行合 ...
- 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明
以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明 为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3.对象.底层实 ...
随机推荐
- 【Noip2015】斗地主
题目 #include<bits/stdc++.h> using namespace std; int pai[20],T; //pai[]统计牌的数量 int n; int ans; v ...
- 一.Django 学习 —— 环境搭建
Ⅰ.前言 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C. 我们先搭建一个Django项目运行的环境. 需要准备的有: 1- Py ...
- 休眠(1):sleep和wait的区别
1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. 2.sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际 ...
- dubbo核心要点及下载(dubbo二)
一.dubbo核心要点 1):服务是围绕服务提供方和服务消费方的,服务提供方实现服务,服务消费方调用服务. 2):服务注册 对于服务提供方它需要发布服务,而由于应用系统的复杂性,服务的数量.类型不断的 ...
- ArcGis Python脚本——根据接图表批量裁切分幅影像
年前写了一个用渔网工具制作图幅接图表的文章,链接在这里: 使用ArcMap做一个1:5000标准分幅图并编号 本文提供一个使用ArcMap利用接图表图斑裁切一幅影像为多幅的方法. 第一步,将接图表拆分 ...
- Spring IOC容器对bean的生命周期进行管理的过程
1.通过构造器或者工厂方法创建bean的实例 2.为bean的属性设置值和对其他bean的引用 3.将bean的实例传递给bean的后置处理器BeanPostProcessor的postProcess ...
- ext.net单元格内容换行显示
增加style .x-grid3-cell-inner { white-space: normal; }
- [物理学与PDEs]第2章习题6 有旋的 Navier-Stokes 方程组
试证明: 由 Navier-Stokes 方程组描述的流体运动一般总是有旋的, 即若 $\rot{\bf u}={\bf 0}$, 则 Navier-Stokes 方程组 (3. 4)-(3. 5) ...
- https协议的简单理解
本片文章梳理三个知识点: 1.对称加密和非对称加密的区别 2.https协议的请求流程 3.http协议和https协议的区别 一.对称加密和非对称加密 对称加密:加密和解密使用同一密钥. 非对称加密 ...
- 工作经验-类型转换[ java.lang.String]
错误代码: logger.info("1"); Map<String,String> zxmap = (Map) zxList.get(0); ybty.setFyze ...