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

?

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

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

?

鉴权合约比较麻烦,因为neogui不能支持你很好的测试鉴权合约。

?

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

?

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

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

?

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

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

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。就是这个原因。

那就没有办法了嘛?

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

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

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

?

  1. 需要有个限制取钱的机制,取完就不能再取
  2. 需要用Stroage来控制这个机制
  3. 鉴权合约执行时不能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附加上超级管理员的鉴证脚本。

  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. 去中心化交易所的实现。

?

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

时间: 2024-08-11 02:33:03

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

EOS智能合约开发(三):EOS创建和管理账号

没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保存在区块链上的人类可读的标志符. 创建账号的命令: $ cleos createaccount eosio ${new_account} ${owner_key} ${active_key} 其中eosio是超级用户,需要靠超级用户来创建其它的新用户,eosio后面就是你的新用户的用户名. 除了新的

郑重告之:智能合约开发实训营第4期学员招募正式启动!

各位同学,抱歉久等了- 这是终于到来的<以太坊智能合约全栈开发>实战特训营第四期的正式招募通知. <以太坊智能合约全栈开发>实战特训营是由硅谷密探和 celer network 共同打造的全球第一档·智能合约全栈开发实战课程,也是目前唯一一个实现来自中.美.澳.英.日.韩等多国学员在线互动学习的区块链技术实战特训课程. 为了保证教学质量,如今已调整为每期仅招募100人,参与有门槛,需经过层层审核,录取通过率一度不到10%,并非所有人都适合参与. 拉至文末可直接进行报名. 请点击此处

以太坊智能合约开发工具 Truffle 最佳入门指导1

Truffle是以太坊(Ethereum)智能合约开发的瑞士军刀,小巧好用,上手简单. 本篇文章主要展示如何用Truffle 开发第一个Ethereum智能合约. 1.准备工作:(本人针对window环境,如果是mac 或linux可以自行搜索其他教程) a.安装git bash :http://gitforwindows.org/ b.安装npm:https://jingyan.baidu.com/article/a17d528506d7f58098c8f2b0.html 2.安装Truffl

智能合约开发环境搭建及Hello World合约

如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇.就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约开发环境开始,讲解智能合约的Hello World如何编写. 开发环境搭建 Solidity安装 强烈建议新手使用Browser-Solidity来进行开发.Browser-Solidity是一个基于浏览器的Solidity,就可以不用安装Solidity,本文的Hello World教程也将基于Br

2018年以太坊智能合约开发语言Solidity最佳IDEs

Solidity是一种以智能合约为导向的编程语言.这是一种只有四年的年轻语言,旨在帮助开发基于以太坊数字货币的智能合约. 理解它官方文档应该是学习Solidity的最佳来源:solidity.readthedocs.io 想在以太坊的网络上建立自己的加密货币吗?想拥有自己的初始代码产品吗?以下是您今天可以使用的最佳Solidity IDE. Remix IDE Remix IDE是基于浏览器的,并且集成了编译器.没有服务器端组件. 官网: https://remix.ethereum.orggi

如何用python和flask以太坊智能合约开发

将数据存储在数据库中是任何软件应用程序不可或缺的一部分.无论如何控制该数据库都有一个该数据的主控.区块链技术将数据存储到区块链网络内的区块中.因此,只要某个节点与网络同步,它们就会获得区块中数据的副本.因此,该技术中没有特定的数据主控. 在本教程中,我们将编写一份智能合约(我将进一步解释),以便在区块链上保留用户数据.我们将使用python web3(web3的python库)来开发和部署智能合约.一旦我们在区块链上部署了智能合约.我们将使用flask API与智能合约进行交互以存储一些数据/信

fabric 智能合约开发

1.智能合约状态图 2.实现功能,通过背书,签收机制实现任务在各部门流转 3.相关sdk Chaincode接口 {Init,Invoke}方法 ChaincodeStubInterface接口 1.GetTxTimestamp 2.CreateCompositeKey       3.GetQueryResult 4.GetHistoryForKey 5.SetEvent 6.GetStateByPartialCompositeKey 7.GetFunctionAndParameters 8.

hyperledger fabric 智能合约开发

智能合约部分 太困了,休假的时候再把图贴上 ..... 运行在docker容器里面,如果需要调试只能通过打日志log方式 一个合约,就是一个用户用go/java/ node编写的文件(包括:字符,方法,返回信息) 块中 (chaincode目录下),一个合约只能对应一个目录 下面目录有用go/java/node语言开发智能合约的代码 下面网址可以查看channel跟存入的数据等(一个合约跟一个channel会生成一个库) 一个channel下可以安装多个合约,每个合约都会生成一个数据库 安装合约

星云链智能合约开发(八):智能合约中调用内置库

BigNumber BigNumber 模块构建于 bignumber.js之上,用来处理任意精度的十进制和非十进制运算.合约可以直接使用 BigNumber 来处理交易和其他转账操作中涉及到的数值计算. var value = new BigNumber(0); value.plus(1); - Storage storage 模块用来支持Nebulas上的数据持久化存储.功能上类似于传统的键值存储系统,当然存储不是免费的,需要消耗一定的 GAS.LocalContractStorage 是可