兹有以下合约 git
public static object Main(string method, object[] args)
{
if (Runtime.Trigger == TriggerType.Verification)
{
if (method == "0214")
return true;
}
return false;
} github
他的avm以下,他是一个鉴权合约,不须要发布他。 typescript
55c56b6c766b00527ac46c766b51527ac4616168164e656f2e52756e74696d652e47657454726967676572009c6c766b52527ac46c766b52c3642a00616c766b00c30430323134876c766b53527ac46c766b53c3640e00516c766b54527ac4620f0061006c766b54527ac46203006c766b54c3616c7566 json
ScriptHash:0x86cf7371f5511257f682cc47be48563a3ff03f51 c#
Address:APBUyZNkemciUQurabSQBnnma7kGGhUPPL app
在TestNet 上已经向此地址转帐不少个gas了,谁拿走算谁的。 函数
该任务在多个大牛集中的地方放了24个小时,无人拿走。称为不可能的任务名至实归。 工具
这篇文字是一篇劝退文,劝你绕开鉴权合约的开发,先学习应用合约的开发。 学习
官网(neo.org)文档的学习曲线已经不是陡峭,而是断崖式。 测试
我采样了一番,竟然没有发现有人跟随此文档顺利完成了鉴权合约的学习。
因而我怀着抱着满满的对本身学习能力的自信,去攀登这作陡峭的大山,打算学成归来再教大家如何学习鉴权归来。
我回来了,也是断崖上跳下来的。
这两笔是我从悬赏帐户里面取出来的钱。
那么我成功了?部分红功,在尝试使用NEOGUI取这两笔钱的路上,我彻底凉了。
我使用的是NEL Thinsdk-cs 的例子钱包取出来的(https://github.com/NewEconoLab/neo-thinsdk-cs)
完成这个任务以后,我才得出了以下结论:
建议你们绕开鉴权合约的开发,先学习应用合约的开发。
其难度主要在于须要理解的概念多,neogui配合不足。若是你看到这里,仍是绝不气馁,坚持要攀登这座大山,咱们一块儿日后谈。
悬赏合约是一个密码合约
public static object Main(string method, object[] args)
{
if (Runtime.Trigger == TriggerType.Verification)
{
if (method == "0214")
return true;
}
return false;
}
他只有在第一个参数为0214,而且Runtime.Trigger==Verification时,返回true。
对鉴权合约来讲,返回true这笔交易才能成立。
想起来很简单,从哪里传入这个0214呢?这就得把整个交易和鉴权合约这一块都说一说了。
鉴权合约是在交易验证阶段执行的,若是鉴权合约没有返回true,那么这笔交易直接验证失败,没法被写入区块,也就不可能查询到这笔交易。
鉴权合约和应用合约有着本质上的不一样,应用合约必定是验证成功写入的区块中执行。
NEO交易有输入和输出。这是UTXO模型的事情,交易的输入是一个列表,其中每一项是对一个UTXO的引用。交易的输出是制造新的UTXO。
交易的输入输出就是钱,销毁输入,制造输出,对UTXO迷糊的同窗能够不用看了,拐回去搞清楚UTXO。
交易包含以下内容:
这些共同构成未签名合约。
你是否是发现了,没有鉴权合约什么事情啊?鉴权合约呢?
你记得签名么?你必定知道给别人转帐,要用你的私钥,对交易进行签名吧。
这其实,就是鉴权合约的一种特例。
1.取决于一个交易有几个输入地址(也就是出钱的人),就必须有几个对应的见证人(witness)。
2.对交易进行签名,就是添加对应转帐发起人的见证人
3.NEO是一个完整的智能合约系统,每个见证人都是两段脚本,一段叫校验脚本,一段叫执行脚本。
以上三点是否是有些晕乎,别急,还有更晕乎的
1.NEO的每个帐户地址都是一段脚本,该脚本是一个两条指令的智能合约,伪代码为:
Push publickey
Syscall Checkwitness
该脚本的hash值就是用户地址,一般用户地址用该hash值加盐加验证作base58以后的字符串形式表达。字符串形式和hash值彻底等价。
由此可知,NEO的地址,就是智能合约的hash值。反过来也成立,NEO每一个智能合约的hash值,都是一个地址。
因此,我能够向一个智能合约转帐,也能够从一个智能合约取钱,由于个人地址,其实也是一个智能合约地址。
2.见证人的校验脚本就是该地址对应的智能合约,且不可修改,hash不同通不过校验。
3.见证人的执行脚本是用来像校验脚本提供参数的智能合约。
因此咱们再来看从个人地址给别人转帐发生了什么。
1.给别人转帐,必须输入里面由来自个人地址的utxo
2.构造交易
3.添加见证人,校验脚本就是个人脚本
4.设置见证人执行脚本,他是一个一条指令的智能合约,伪代码为:
Push signdata
5.发送包含交易数据和见证人数据的rawdata
6.校验交易,执行脚本 push signdata,结束,校验脚本 push 本身的pubkey,而后checksig,该函数两个参数,正好是signdata 和 pubkey,检查,若是成功,交易成立。不然交易不成立。
签名是否是比你想的要复杂不少呢。
搞清楚见证人和交易的关系以后,咱们才可能顺利的从悬赏合约中拿走钱
那就构造一笔转帐交易
输入n个,从悬赏合约地址里找到utxo 作输入
输出1,给本身的地址
输出2可选:能够给悬赏地址找零
见证人:校验脚本=悬赏合约
执行脚本=参数
由于参数为一个 string 一个array
倒叙push
伪代码为
Push0 //加入0
Pack // 用上面的0 建立array,表示空array
Push bytes("0214".as bytes())//push "0214"
二进制为:00c10430323134
信息都告诉你了,那么拼个自定义合约就好了呗。
NEOGUI不是有工具吗,F12调出,是的,去测试吧,保证愉快。你就能理解断崖式学习曲线是怎么回事了。
并且就算你上面都作对了,你也拿不走。
我在此处纳闷了好久,而后我一行行的跟进了NEO底层
这有一个限制,执行脚本里面只能容许push指令,不然直接脚本执行失败了,鉴权合约失败,交易不成立。
咱们刚才的执行脚本伪代码为
Push0 //加入0
Pack // 用上面的0 建立array,表示空array
Push bytes("0214".as bytes())//push "0214"
二进制为:00c10430323134
有一个pack,超出容许范围,交易必定失败。
那么咱们知道了,鉴权合约里面是没办法引用array 类型的参数了。
好在悬赏合约的第二个参数其实没有使用,随便推个啥就行
咱们把执行脚本改成
Push0 //加入0
Push bytes("0214".as bytes())//push "0214"
二进制为:000430323134
好了,若是你颇有耐心,去玩NEOGUI 和 F12吧。
你若是看了一些NEO智能合约的资料,你也许会发现,这个合约没发布呀。
智能合约是不须要发布的,智能合约是不须要发布的,你能够直接调用,没问题。
那么什么状况要发布呢,这个智能合约要被appcall 调用的话,他必须被发布到链上,支付昂贵的费用。应用合约基本上都是这种,为了方便反复调用,还有内部存储。
加上全部这些,从应用合约入门,仍是比鉴权合约入门简单不少。
鉴权合约不用发布。
这是NEL(一个 NEO中国开发者社区 组织)
为了开发轻钱包准备的 sdk的例子
C#版本
https://github.com/NewEconoLab/neo-thinsdk-cs
typescript版本
https://github.com/NewEconoLab/neo-thinsdk-ts
咱们来演示一下,用这个例子钱包,如何更顺畅的学习鉴权合约
NEL公众号有发布过这个钱包转帐的方法
http://www.cnblogs.com/crazylights/p/8338117.htm
点下面的 thinWallet test,就是一個轻钱包测试了
由于咱们取悬红,其实并不须要loadkey,就是打开钱包,咱们不须要任何人签名就能把钱给取了
在Input区域点右键,能够用智能合约增长一个UTXO
将悬红合约copy进来,或者点击loadavm 从avm读取
则能够看到合约的地址显示在下边
而后点refresh utxo,能够获得宣红合约的utxo,选一个
咱们选91.8这个
而后看到输入有了
输出多了一个(changeback)表示是找零,咱们是好青年,不全拿走
见证人(witness)也自动添加了一个(sc)是智能合约简称
在输出区域 右键,添加一个输出
填好转给谁,币种(gas),多少
而后输出自动调整找零
试试签名发出,发不出去,告诉你见证人的执行脚本还没配置
选中见证人,在见证人区域 右键
黄色是校验脚本,他就是悬赏合约自己,不能够修改
红色是执行脚本的配置,咱们用一个json替代不直观的配置
String 加了点规则
(str)开头表示这是个字符串
(int)开头表示这是个biginteger
还有(bin)(int160)(int256)
很好懂吧。
点击Gencode 就生成了执行脚本,可是咱们已知,带Array的执行脚本不容许,改一下。
好,点ok
回来点签名并广播
Done,成功,
获得一个交易id对话框
随便去哪里查,均可以看到悬红里的钱已经取出了。
悬红里还留了不少钱,留给那些想要探索的人,请不要一次取完。