智能合约介绍! S% Z* K4 @# [2 k X5 B
什么是智能合约
智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议。区块链技术给我们带来了一个去中心化的,不可篡改的,高可靠性的系统,在这种环境下,智能合约才大有用武之地。智能合约是区块链最重要的特性之一,也是区块链能够被称为颠覆性技术的主要原因。
NEO 智能合约有哪些特点
NEO 智能合约 2.0包括以下特性:确定性、高性能、拓展性。其合约类型包括:验证合约、函数合约和应用合约。
从性能角度来说,NEO 采用了轻量级的 NeoVM(NEO Virtual Machine)作为其智能合约的执行环境,其启动速度非常快,占用资源也很小,适合像智能合约这样短小的程序。通过 JIT(即时编译器)技术对热点智能合约进行静态编译和缓存可以显著提升。NEO 虚拟机的指令集中内建提供了一系列的密码学指令,以优化智能合约中用到密码学算法时的执行效率。此外,数据操作指令直接对数组及复杂数据结构提供支持。这些都会提升 NEO 智能合约 2.0的运行性能。
NEO 智能合约 2.0实现可拓展性的方法是通过高并发和动态分区的形式,结合其低耦合的设计完成的。低耦合合约程序在一个虚拟机(NEO 虚拟机)中执行,并通过交互服务层与外部通信。因此,对智能合约功能的绝大部分升级,都可以通过增加交互服务层的 API 来实现。( F3 }7 `1 B9 @" z
用什么语言编写智能合约
从语言角度看 NEO 智能合约 2.0与以太坊的区别更为直观:与以太坊原创的 Solidity 语言不同,NEO 智能合约开发者可以直接使用几乎任何他们擅长的高级语言来进行 NEO 智能合约的开发工作。NEO 提供了这些语言的编译器和插件,用于将高级语言编译成 NEO 虚拟机所支持的指令集。由于编译器会针对 MSIL(微软中间语言)来进行编译,所以理论上任何.Net 中的语言或者可被转译成 MSIL 的语言都可以直接支持。
当前已经支持的语言有:* U# T/ A) t4 ^' D9 { b' F
未来计划陆续加入的高级语言还包括:4 a) B; w* s7 k3 g+ n* D
多种高级语言的支持,使得 90% 以上的开发者无需学习新的语言即可参与到 NEO 智能合约的开发中来,甚至可将现有业务系统中的代码直接移植到区块链上。这将大大增加未来区块链的全面普及。
最后从调试角度看,通常智能合约的开发过程是非常困难的,重要的原因之一是此前的智能合约缺乏良好的调试和测试方法。NEO 在 NeoVM 层面提供了程序调试功能的支持,使得开发 NEO 智能合约 2.0变得更方便快捷。. H+ s# o2 B" M# ]% K- s
智能合约的触发; H. G* }+ ^2 q2 C
NEO 的智能合约有两种触发方式:
一个合约可以同时由以上两种方式触发。由于鉴权触发的合约是UTXO模型的鉴证过程,是在交易被写入区块之前执行。如果合约返回false或者发生异常,则交易不会被写入区块。
而由交易调用触发的合约,它的调用时机是交易被写入区块以后,此时无论应用合约返回为何以及是否失败,交易都已经发生,无法影响交易中的 UTXO 资产状态。
NeoVM 虚拟机
NeoVM 是执行 NEO 智能合约代码的虚拟机。这里所讲述的虚拟机概念比较狭义,并非是借助于操作系统对物理机器的一种模拟,这里的虚拟机与 vmware 或者 Hyper-V 不同,是针对具体语言所实现的虚拟机。
例如在 java 的 JVM 或者 .Net 的 CLR 中,java 或者 .Net 源码会被编译成相关字节码,然后在对应虚拟机上运行, JVM 或 CLR 会对这些字节码进行取指令,译码,执行,结果回写等操作,这些步骤和真实物理机器上的概念都很相似。相对应的二进制指令仍然是在物理机器上运行,物理机器从内存中取指令,通过总线传输到 CPU,然后译码、执行、结果存储。
虚拟机架构
上图是 NEO 虚拟机(NeoVM)的系统架构图,其中虚线框中的部署是虚拟机的核心。
执行引擎
左侧绿色的是虚拟机执行引擎(相当于 CPU),它可以执行常见的指令,例如流程控制、栈操作、位操作、算数运算、逻辑运算、密码学方法等,还可以通过系统调用,与互操作服务层(下文会介绍)进行交互。
计算栈 q4 ]" l8 l0 S! W! D- q7 k+ O
中间灰色的部分是虚拟机的计算栈(相当于内存),如今虚拟机的实现方式有两种,基于栈的和基于寄存器的,这两种实现方式各有优劣,也都有标志性的产品。基于栈的虚拟机,有 JVM,CPython 以及 .Net CLR。基于寄存器的,有 Dalvik 以及 Lua5.0。基于栈的虚拟机有一个计算栈的概念,虚拟机在进行真正的运算时都是直接与计算栈(Evaluation Stack)进行交互。
由于执行时默认都是从操作数栈上取数据,那么就无需指定操作数。例如,x86 汇编 ”ADD EAX, EBX”,就需要指定这次运算需要从什么地方取操作数,执行完结果存放在何处。但是基于栈的虚拟机的指令就无需指定,例如加法操作就一个简单的 ”Add” 就可以了,因为默认操作数存放在操作数栈上,直接从操作数栈上 pop 出两条数据直接执行加法运算,运算后的结果默认存放在栈顶。1 e" v) z' ~9 |4 w$ U. }/ S2 g
互操作服务层
右侧蓝色的部分是虚拟机的互操作服务层(相当于外设)。目前互操作服务层提供了智能合约所能访问区块链数据的一些 API,利用这些 API,可以访问区块信息、交易信息、合约信息、资产信息等。; I0 Z2 J$ }/ @& }( \2 C b
除此之外互操作服务层还为每个合约提供了一个持久化存储区的功能。NEO 的每个智能合约在创建的时候都可选地启用一个私有存储区,存储区是 key-value 形式的,NEO 智能合约由合约的被调用者决定持久化存储区的上下文,而非调用者来决定。当然,调用者需要将自己的存储上下文传给被调用者(即完成授权)后,被调用者才可以执行读写操作。
收费模式
NEO 智能合约在部署或者执行的时候都要缴纳一定的手续费,分为部署费用和执行费用。& |7 y2 i! {3 o: W/ a& B
部署费用是指开发者将一个智能合约部署到区块链上需要向区块链系统支付一定的费用(目前是 500 Gas)。 q& E# V ~1 A0 ~: m
执行费用是指每执行一条智能合约的指令都会向 NEO 系统支付一定的执行费用。具体收费标准请参阅 智能合约费用。) O6 P4 e0 ^& m. d6 P2 y
一些简单的智能合约$ b# M2 ~0 y* ?, O" F* ]6 Y; z
下面是一些简单的智能合约:
public static bool Main()
{7 v/ @$ I, o/ _% V# V8 U
return true;
}" K1 @& o, z5 L0 C
该合约的返回值永远为 true,表示任何人都可以花费这个合约地址里的资产(可以理解为撒钱)。; C* t$ {3 n' U4 q, R2 ]: ^
NEO 钱包客户端有删除资产功能,当你删除了一个资产,这个资产实际上发送到了一个指定地址中,这个地址就是上述智能合约所生成的合约地址,任何人都可以花费这个地址里的资产,当然这个地址里的资产都是别人不想要的资产。
public static bool Main()1 t/ T/ a: X8 m
{5 q4 z1 `: Q* ^0 {
return false;
}+ J% n* O5 z9 H: r- b! |' q
该合约的返回值永远为 false,表示这个合约里的资产无人能使用(可以理解为烧钱或销毁一笔资产),比如里面可以存储一些已注销的公司的股权。* E; H/ m' K4 t3 K
更多示例请查看:+ I6 k8 J2 b6 Q! ?
Hello World
Lock(锁仓合约)' ?) f; h) A' d7 e/ ~, d
Domain(域名系统)