马蹄(波场)佛萨奇2.0项目系统开发技术介绍讲解方案

简介: 马蹄(波场)佛萨奇2.0项目系统开发技术介绍讲解方案

  有些合约在调用时需要多个签名,其中一个是交易的发起者对支持手续费的签名,其余的都是附加签名。

  在合约编写时,我们通常使用Runtime.CheckWitness(owner)来鉴权调用者地址,其中owner是允许调用的地址,参数类型为ByteArray,未指定的地址调用合约将失败。比如在进行合约升级时,这里的owner是合约管理员。在进行转账时,这里的owner是转出人(付款人)。

  当合约中写了Runtime.CheckWitness(owner)时,调用合约时就要传入owner的签名。这个签名就是附加签名了。

  在Neo-CLI中,我们可以通过invoke命令附加签名。

  invoke<scriptHash><operation>contractParameters=nullsignerAccounts=null

  在Neo-GUI中,在调用合约时,可以点击下方的附加签名,选择公钥然后点击签名来进行附加签名。

  在通过转账命令调用NEP-17合约的transfer方法时,钱包会自动对from字段进行附加签名。此时不需要手动添加。

  合约之间的互相调用

  在Neo N3中,所有的合约都可以动态调用,且合约编写更加简单。

  public class Contract1:SmartContract

  {

  delegate object Dyncall(string method,object[]args);

  //如果是小端序,使用ByteArray格式

  //[InitialValue("694425c17f1ebb7c65de3026c831eb4c49d6d7be",ContractParameterType.ByteArray)]

  //private static readonly UInt160 ScriptHash;

  //如果是大端序,使用Hash160格式

  [InitialValue("0xbed7d6494ceb31c82630de657cbb1e7fc1254469",ContractParameterType.Hash160)]

  public static UInt160 ScriptHash;

  public static object Main(string operation,object[]args)

  {

  if(operation=="name")

  {

  return Contract.Call(ScriptHash,"name",CallFlags.ReadOnly,new object[0]);

  }

  if(operation=="totalSupply")

  {

  return Contract.Call(ScriptHash,"totalSupply",CallFlags.ReadOnly,new object[0]);

  }

  return true;

  }

  }

  关键语句Contract.Call(scriptHash,method,flags,params)。

  scriptHash:被调用合约的脚本散列,ByteArray类型,小端序。

  method:被调用合约的方法,如name、balanceOf、transfer等,字符串类型。

  flags:调用合约方法时允许的权限,参考(CallFlags枚举)。

  params:被调用合约的方法的参数列表,数组类型。

  权限相关字段

  在合约的Manifest文件中定义了三个与权限相关的字段,参见下表。通过Groups和Trusts字段,钱包会根据合约之间是否可信,或者合约是否在同一组中来决定是否给用户安全警告。而Permissions和签名作用域决定了合约之间能否互相调用。关于签名作用域,请参考invokefunction方法的参数说明。

  字段类型说明

  Groups ContractGroup[]定义一组相互信任的合约,由公钥和对合约Hash的签名组成。

  Permissions ContractPermission[]该字段是一个包含一个权限对象的数组,定义了该合约想要调用的其它合约及其方法。其中合约可以是ScriptHash,Group,或通配符。方法是方法名或通配符。没有在manifest中声明的合约或方法将无法被合约调用。

  Trusts WildcardContainer<UInt160>定义该合约信任的其它合约,合约可以是ScriptHash,Group,或通配符*。如果一个合约是可信的,当合约调用时,用户界面将不会给出任何警告。

相关文章
|
8月前
|
JavaScript Linux iOS开发
Motrix:Star46.4k,有了这个开源项目你的烦恼基本少了一半?一款开源功能全面的下载管理器,用上它妈妈再也不用担心下载速度啦~~~
嗨,大家好,我是小华同学。今天为大家介绍一款全能下载管理器——Motrix。它支持HTTP、FTP、BitTorrent等多种协议,拥有简洁易用的界面和强大的下载功能,包括选择性下载、多线程加速、自动更新Tracker列表等,适用于工作、学习和娱乐场景。欢迎关注我们,获取更多优质开源项目和高效工具。
332 15
Motrix:Star46.4k,有了这个开源项目你的烦恼基本少了一半?一款开源功能全面的下载管理器,用上它妈妈再也不用担心下载速度啦~~~
|
11月前
|
小程序 JavaScript 开发工具
微信小程序——全局数据共享
【10月更文挑战第5天】
|
9月前
|
数据采集 人工智能 运维
AI辅助的系统监控和预测:新时代的运维利器
AI辅助的系统监控和预测:新时代的运维利器
357 9
|
11月前
|
JavaScript 前端开发 安全
跨域解决方案有哪些?
本文介绍了多种跨域解决方案,包括JSONP、CORS、postMessage、WebSocket、document.domain+iframe、window.name、location.hash、Node.js代理、Nginx代理和CORS Anywhere。每种方法都有其适用场景和优缺点,如JSONP简单但只支持GET请求,CORS安全但兼容性稍差,WebSocket适用于实时通信但需服务器支持。开发者可根据具体需求选择合适的跨域方案。
294 3
跨域解决方案有哪些?
|
11月前
|
Android开发 iOS开发 UED
安卓与iOS的较量:谁才是智能手机市场的王者?
本文将深入探讨安卓和iOS两大智能手机操作系统之间的竞争关系,分析它们各自的优势和劣势。通过对比两者在市场份额、用户体验、应用生态等方面的表现,我们将揭示出谁才是真正的市场领导者。无论你是安卓粉丝还是iOS忠实用户,这篇文章都将为你提供一些有趣的观点和见解。
|
机器学习/深度学习 数据采集 人工智能
机器学习在金融领域的应用及其挑战
【8月更文挑战第18天】本文将探讨机器学习技术在金融行业中的运用,以及在实际应用过程中遇到的挑战和问题。我们将从算法选择、数据处理、模型解释性及伦理法规四个方面进行详细讨论,并给出相应的解决建议。
222 1
|
网络协议 算法 安全
【专栏】RIP是一种古老的内部网关协议,使用距离矢量算法,基于跳数更新路由表,最古老的距离矢量协议
【4月更文挑战第28天】RIP是一种古老的内部网关协议,使用距离矢量算法,基于跳数更新路由表。其工作原理包括周期性更新、度量标准、路由表更新和防止计数到无穷问题的技术。RIP简单易用,适合小规模网络,但在大规模网络中效率低且有限制。随着OSPF和EIGRP等协议的发展,RIP在大型网络中的应用减少,但在中小型网络和遗留系统中仍有其地位。RIPv2的改进提高了安全性与灵活性。尽管逐渐被替代,RIP在理解路由协议基本概念和历史中仍具价值。
416 1
|
缓存 Java 应用服务中间件
常见的限流降级方案
【1月更文挑战第21天】
|
搜索推荐 算法 Android开发
盘点 Material Design 3 带来的新变化
盘点 Material Design 3 带来的新变化
375 1
|
存储 算法 C++
括号序列:使用C++检查括号有效性
括号序列:使用C++检查括号有效性
270 0