文章目录

  • 摘要
  • 动机
  • 详述
    • neo
    • neo-vm
    • 智能合约示例
  • 原理
  • 向后兼容性
  • 实现

摘要

此NEP提案概述了一种机制,通过该机制,智能合约能够调用直到运行时才知道的其他智能合约,而不仅限于调用在编译时定义的智能合约。为了保持智能合约与未来动态分片过程接口的能力,包括一份用于构建智能合约的提案详述会表示智能合约是否需要动态合约调用功能。

动机

此NEP的动机是为让智能合约(SC)的的作者能够为编译时不可知的SC提供接口。例如,操作NEP-5 token的分散交换的SC可以调用在运行时才确定的token的SC的transferFrom方法。目前,这样的SC需要对所有支持的NEP-5 token地址进行硬编码,并在添加新token时重新发布。以太坊上的许多SC都需要此功能,包括任何符合ERC223 token标准的功能。通过让SC作者能够在运行时指定SC与之交互,类似于更先进的以太坊合约中包含的功能将更容易开发和维护。
值得注意的是,向NEO添加动态SC调用会影响可伸缩性。通过动态SC调用,我们不用再事先知道将调用哪些其他SC,因此VM状态的子集必须可用于执行才能成功。这使得动态分片更难实现。
为了克服可扩展性的缺点,该提议在区块链上创建时为每个SC添加一个设定,以表示它是否需要动态调用功能。该设定将允许所有现存的合约和大多数未来合约在预先已知的存储上下文中执行,因此更适合于动态分片,同时还使SC更强大和更具表现力。
考虑到动态调用功能的可扩展性缺陷,该NEP建议了一个需要此功能的SC的更新费用结构。下面列出了更新费用结构的样例实现。

详述

该提案概述了Neo项目的三个部分的变更,并提供了如何在SC中使用此变更的示例:
•neo
•neo-vm
•neo编译器
•智能合约实例
下面列出的变更并非试图详尽无遗,而是概述每个库中所需的重要变更。

neo

为了让一份SC表示其是否能够动态调用其他SC,该NEP建议在neo.Core.ContractState对象中添加以下属性,且默认值为false
public bool HasDynamicInvoke
HasDynamicInvoke属性
为了使实现与当前的Neo协议保持互操作,HasDynamicInvoke属性将被序列化为字节标志跟在现有的HasStorage属性之后:

    [Flags]public enum ContractPropertyState : byte{NoProperty = 0,HasStorage = 1 << 0,HasDynamicInvoke = 1 << 1,}
public class ContractState : StateBase, ICloneable<ContractState>{
...
public ContractPropertyState ContractProperties;
public bool HasStorage => ContractProperties.HasFlag(ContractPropertyState.HasStorage)
public bool HasDynamicInvoke => ContractProperties.HasFlag(ContractPropertyState.HasDynamicInvoke)
…public override void Serialize(BinaryWriter writer){base.Serialize(writer);writer.WriteVarBytes(Script);writer.WriteVarBytes(ParameterList.Cast<byte>().ToArray());writer.Write((byte)ReturnType);writer.Write(ContractProperties);   // currently is writer.Write(HasStorage)writer.WriteVarString(Name);writer.WriteVarString(CodeVersion);writer.WriteVarString(Author);writer.WriteVarString(Email);writer.WriteVarString(Description);}以下在neo.SmartContract.ApplicationEngine中的变更用于计量合约创建不同的Gas费用。没有额外附加功能的合约创建费用会被降低,而那些HasDynamicInvoke或HasStorage属性为true的合约创建会产生额外的费用。protected virtual long GetPriceForSysCall(){// lines omitted...
case "Neo.Contract.Create":case "Neo.Contract.Migrate":case "AntShares.Contract.Create":case "AntShares.Contract.Migrate":long fee = 100L;ContractState contract = PeekContractState() // this would need to be implementedif( contract.HasStorage ) {fee += 400L}if( contract.HasDynamicInvoke ) {fee += 500L;}return fee * 100000000L / ratio;
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253复制代码

neo-vm

本详细提案给NEO虚拟机添加了一个新OpCode,代表相对于静态的动态AppCall的使用
DYNAMICCALL = 0xFA
DYNAMICCALL OpCode 在neo.VM.ExecutionEngine.ExecuteOp 方法的执行也按照以下方式不同于现有的APPCALL和TAILCALL OpCodes

                case OpCode.APPCALL:case OpCode.TAILCALL:case OpCode.DYNAMICCALL:{if (table == null){State |= VMState.FAULT;return;}
byte[] script_hash = null;
if ( opcode == OpCode.DYNAMICCALL ) {
script_hash = EvaluationStack.Pop().GetByteArray();if ( script_hash.Length != 20 ) {State |= VMState.FAULTreturn;}
} else {
script_hash = context.OpReader.ReadBytes(20);}
byte[] script = table.GetScript(script_hash);if (script == null){State |= VMState.FAULT;return;}if (opcode == OpCode.TAILCALL || opcode == OpCode.DYNAMICCALL)InvocationStack.Pop().Dispose();LoadScript(script);}break;
123456789101112131415161718192021222324252627282930313233复制代码

neo编译器
将方法调用转换为DYNAMICCALL的示例方法如下:

else if (calltype == CallType.DYNAMICCALL){_ConvertPush(callhash, null, to)_Convert1by1(VM.OpCode.DYNAMICCALL, null, to);
}
12345复制代码

智能合约示例

以下是一个SC演示了所提案功能的简单使用

using Neo.SmartContract.Framework.Services.Neo;
namespace Neo.SmartContract
{public class DynamicTotalSupply : Framework.SmartContract{public static int Main(byte[] contract_hash){if( contract_hash.Length == 20 ) {BigInteger totalSupply = DynamicCall( contract_hash, 'totalSupply')return totalSupply;}return 0;}}
}
12345678910111213141516171819复制代码

原理

用动态SC调用来动态分片(以太坊已经提出了许多解决方案)并不是不可能的,尽管这会增添已经很困难的任务。
仅仅因为我们事先知道计算调用图并不意味着我们能够成功地完美分配资源,没有重叠的子集。仍然可能需要实现分片之间的通信,如以太坊提案中那样。
考虑到这一点,不向SC添加任何关于是否需要动态调用的元数据并实现动态应用程序调用是有可能的,因为它们可以以相同的方式执行和延申。
但是,即使在可以实现一个系统可以动态SC调用和动态分片这种情况下,本提案仍认为存储HasDynamicInvoke属性在该实现中可能是很有用的。
存储此属性还能使系统对使用HasDynamicInvoke属性发布的SC收取不同的费用。

向后兼容性

本NEP介绍了一套不影响现有SC的新功能。
通过利用现有字节来指示SC是否需要存储区或添加额外标记,我们能够在不影响现有网络协议的情况下维持现有功能和添加该新功能。

实现

• neo-project/neo: https://github.com/neo-project/neo/blob/master/neo/SmartContract/ApplicationEngine.cs
• neo-project/neo-vm: https://github.com/neo-project/neo-vm/blob/master/src/neo-vm/ExecutionEngine.cs

原文链接: https://github.com/neo-project/proposals/blob/master/nep-4.mediawiki

转载于:https://my.oschina.net/u/3630365/blog/2987596

NEO改进协议提案4(NEP-4)相关推荐

  1. NEO改进协议提案1(NEP-1)

    文章目录 什么是NEP NEP基本原理 NEP类型 NEP工作流程 怎么才是一个合格的NEP NEP格式和模板 NEP序言 附件 NEP所有权转让 NEP编辑者 NEP编辑者的职责和工作流程 历史 什 ...

  2. NEO改进协议提案9(NEP-9)

    文章目录 摘要 动机 详述 原生资产转移URI URI键 可用URI 键 映射 NEO 交易属性键 参考原生资产地址 例子 智能合约调用URI NEP-5 token 转移 URI Keys 例子 原 ...

  3. NEO改进协议提案6(NEP-6)

    文章目录 摘要 动机 基本原理 详述 钱包 Scrypt参数 账户 合约 向后兼容性 实现 摘要 本NEP描述了一个钱包标准用于钱包文件在NEO多种实现间的兼容. 动机 目前,不同的客户端程序生成不同 ...

  4. NEO改进协议提案7(NEP-7)

    文章目录 摘要 动机 原理 详述 鉴权触发器 鉴权R触发器 应用触发器 应用R触发器 后兼容性 实现 摘要 触发器是一种触发智能合约执行的机制.本NEP定义四种类型的触发器, 他们是鉴权触发器.鉴权R ...

  5. NEO改进协议提案5(NEP-5)

    文章目录 摘要 动机 详述 方法 totalSupply name symbol decimals balanceOf transfer 事件 transfer 实现 摘要 NEP-5提案概述了NEO ...

  6. NEO改进协议提案2(NEP-2)

    文章目录 摘要 动机 基本原理 详述 前缀 建议详述 加密步骤 解密步骤 向后兼容性 测试用例 实现 摘要 提出了一种以58字符 Base58Check编码的可打印字符串的形式对密码保密型私钥记录进行 ...

  7. NEO改进协议提案2(NEP-2) 1

    文章目录 摘要 动机 基本原理 详述 前缀 建议详述 加密步骤 解密步骤 向后兼容性 测试用例 实现 摘要 提出了一种以58字符 Base58Check编码的可打印字符串的形式对密码保密型私钥记录进行 ...

  8. 改进协议 BIP32-39-44概述

    BIP44 调研可行性调研 By Blake chen BIP 44 协议提出背景 签名算法是区块链系统中具有密码学属性的基础核心支撑算法.其资产确权.账户验证.身份确认.以及生成公私钥对进入区块链世 ...

  9. 【MORE协议】基于MORE的改进协议设计的MATLAB仿真

    0.完整源码获得方式 方式1:微信或者QQ联系博主 方式2:订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码 1.软件版本 MATLAB2021a 2.本算法理论知识 随着无线通信 ...

最新文章

  1. 5分钟教你Windows 10中将“运行”固定到开始菜单
  2. 解决AndroidStudio导入项目卡在gradle加载界面
  3. SAP WM初阶之2-Step Picking创建的Group查询报表
  4. 利用运行时设置UITextField 光标颜色
  5. 对话国际农民丰收节贸易会-林育庆:菲律宾谋定中国农业
  6. rsync同步文件到远程主机
  7. sqlserver ssms ctrl+e快捷键问题
  8. Swift之Codable自定义解析将任意数据类型解析为想要的类型
  9. 从零写一个编译器(一):输入系统和词法分析
  10. php结合redis实现高并发下的抢购、秒杀功能
  11. 如此如此,怎能师夷长技以制夷!
  12. 流行学习与拉普拉斯变换的推导
  13. office2007过期后没有输入序列号对话框的激活方法
  14. 关于WIN11使用SecoClient接收返回码超时问题
  15. EViews简介、下载安装教程
  16. JVM——字节码指令(转)
  17. 数据有效性跨表引用的解决
  18. BIM土建插件墙齐梁板操作,实现墙、柱的顶部、底部对齐
  19. Android 打包apk出错问题
  20. 全球公认的作息时间表

热门文章

  1. 一个普通大学生的嵌入式软件开发学习之路
  2. PNP NPN sot-23 封装的 EBC 对应 关系
  3. 微信小程序6-云开发-云数据库
  4. Android高级架构工程师:2019年火爆全网的flutter,今年真的凉了吗?你是怎么看的
  5. 区块链手机密集发布,又是一场无厘头的炒作?
  6. 幕布使用教程原自B站
  7. linux中kvm有什么功能,KVM基本功能
  8. 语音转文字如何在线转换的?
  9. Unity3D摄像机跟随物体移动的代码控制
  10. 福建力得温控器_福建力得干式变压器温度控制器LD-B10-10FP(B)